-
- spawn new construct
-
-
+
+ {subInfo()}
);
diff --git a/client/src/components/account.status.jsx b/client/src/components/account.status.jsx
index fce012cf..422d2233 100644
--- a/client/src/components/account.status.jsx
+++ b/client/src/components/account.status.jsx
@@ -13,11 +13,18 @@ function pingColour(ping) {
const addState = connect(
function receiveState(state) {
const {
+ ws,
account,
ping,
} = state;
+ function sendAccountStates() {
+ ws.sendEmailState();
+ ws.sendSubscriptionState();
+ }
+
return {
+ sendAccountStates,
account,
ping,
};
@@ -49,10 +56,16 @@ function AccountStatus(args) {
account,
ping,
accountPage,
+ sendAccountStates,
} = args;
if (!account) return null;
+ function accountClick() {
+ sendAccountStates();
+ accountPage();
+ }
+
return (
@@ -61,7 +74,7 @@ function AccountStatus(args) {
{ping}ms
-
+
);
}
diff --git a/client/src/components/stripe.buttons.jsx b/client/src/components/stripe.buttons.jsx
index e660e4a9..7d15770e 100644
--- a/client/src/components/stripe.buttons.jsx
+++ b/client/src/components/stripe.buttons.jsx
@@ -8,7 +8,7 @@ function BitsBtn(args) {
} = args;
function subscribeClick() {
stripe.redirectToCheckout({
- items: [{ plan: 'plan_FGmRwawcOJJ7Nv', quantity: 1 }],
+ items: [{ plan: 'plan_Fhl9r7UdMadjGi', quantity: 1 }],
successUrl: 'http://localhost',
cancelUrl: 'http://localhost',
clientReferenceId: account.id,
diff --git a/client/src/components/team.ctrl.jsx b/client/src/components/team.ctrl.jsx
index fb45db9e..ba13edf1 100644
--- a/client/src/components/team.ctrl.jsx
+++ b/client/src/components/team.ctrl.jsx
@@ -6,6 +6,8 @@ const actions = require('./../actions');
const addState = connect(
function receiveState(state) {
const {
+ constructs,
+ teamPage,
teamSelect,
ws,
} = state;
@@ -15,18 +17,34 @@ const addState = connect(
}
return {
+ constructLength: constructs.length,
sendAccountSetTeam,
+ teamPage,
teamSelect,
};
},
+
+ function receiveDispatch(dispatch) {
+ function setTeamPage(value) {
+ return dispatch(actions.setTeamPage(value));
+ }
+ return {
+ setTeamPage,
+ };
+ }
);
function TeamCtrl(args) {
const {
- teamSelect,
+ constructLength,
sendAccountSetTeam,
+ setTeamPage,
+ teamPage,
+ teamSelect,
} = args;
+ const disableDecrement = teamPage === 0;
+ const disableIncrement = (teamPage + 1) * 6 >= constructLength;
return (
);
}
diff --git a/client/src/components/team.jsx b/client/src/components/team.jsx
index af48f6ca..cb88b526 100644
--- a/client/src/components/team.jsx
+++ b/client/src/components/team.jsx
@@ -7,7 +7,7 @@ const { ConstructAvatar } = require('./construct');
const addState = connect(
function receiveState(state) {
- const { ws, constructs, teamSelect } = state;
+ const { ws, constructs, teamPage, teamSelect } = state;
function sendConstructSpawn(name) {
return ws.sendMtxConstructSpawn(name);
@@ -15,6 +15,7 @@ const addState = connect(
return {
constructs,
+ teamPage,
teamSelect,
};
},
@@ -32,6 +33,7 @@ const addState = connect(
function Team(args) {
const {
constructs,
+ teamPage,
teamSelect,
setTeam,
} = args;
@@ -54,8 +56,12 @@ function Team(args) {
teamSelect[insert] = id;
return setTeam(teamSelect);
}
+ console.log(constructs.length);
+ const dispConstructs = constructs.length >= ((teamPage + 1) * 6)
+ ? constructs.slice(teamPage * 6, (teamPage + 1) * 6)
+ : constructs.slice(teamPage * 6, constructs.length);
- const constructPanels = constructs.map(construct => {
+ const constructPanels = dispConstructs.map(construct => {
const colour = teamSelect.indexOf(construct.id);
const selected = colour > -1;
diff --git a/client/src/events.jsx b/client/src/events.jsx
index 15f9f35b..876d184b 100644
--- a/client/src/events.jsx
+++ b/client/src/events.jsx
@@ -3,8 +3,17 @@ const eachSeries = require('async/eachSeries');
const actions = require('./actions');
const { TIMES } = require('./constants');
const animations = require('./animations.utils');
+const { infoToast, errorToast } = require('./utils');
function registerEvents(store) {
+ function notify(msg) {
+ return infoToast(msg);
+ }
+
+ function error(msg) {
+ return errorToast(msg);
+ }
+
function setPing(ping) {
store.dispatch(actions.setPing(ping));
}
@@ -18,6 +27,14 @@ function registerEvents(store) {
setNav('play');
}
+ function setSubscription(sub) {
+ const { subscription } = store.getState();
+ if (subscription && sub.cancel_at_period_end) {
+ notify('Your subscription has been cancelled. Thank you for your support.');
+ }
+ store.dispatch(actions.setSubscription(sub));
+ }
+
function setConstructList(constructs) {
store.dispatch(actions.setConstructs(constructs));
}
@@ -222,7 +239,10 @@ function registerEvents(store) {
setPing,
setShop,
setTeam,
+ setSubscription,
setWs,
+
+ notify,
};
}
diff --git a/client/src/reducers.jsx b/client/src/reducers.jsx
index 8c9beb5b..35c45a64 100644
--- a/client/src/reducers.jsx
+++ b/client/src/reducers.jsx
@@ -44,7 +44,10 @@ module.exports = {
skip: createReducer(false, 'SET_SKIP'),
shop: createReducer(false, 'SET_SHOP'),
+ subscription: createReducer(null, 'SET_SUBSCRIPTION'),
+
team: createReducer([], 'SET_TEAM'),
+ teamPage: createReducer(0, 'SET_TEAM_PAGE'),
teamSelect: createReducer([null, null, null], 'SET_TEAM_SELECT'),
vboxHighlight: createReducer([], 'SET_VBOX_HIGHLIGHT'),
diff --git a/client/src/socket.jsx b/client/src/socket.jsx
index 4fe78845..b8e919b9 100644
--- a/client/src/socket.jsx
+++ b/client/src/socket.jsx
@@ -54,6 +54,10 @@ function createSocket(events) {
send(['AccountSetTeam', { ids }]);
}
+ function sendSubscriptionEnding(ending) {
+ send(['SubscriptionEnding', { ending }]);
+ }
+
function sendGameState(id) {
send(['GameState', { id }]);
}
@@ -139,6 +143,15 @@ function createSocket(events) {
function sendMtxConstructSpawn() {
send(['MtxConstructSpawn', {}]);
}
+
+ function sendEmailState() {
+ send(['EmailState', {}]);
+ }
+
+ function sendSubscriptionState() {
+ send(['SubscriptionState', {}]);
+ }
+
// -------------
// Incoming
// -------------
@@ -166,6 +179,11 @@ function createSocket(events) {
events.setTeam(constructs);
}
+ function onSubscriptionState(sub) {
+ // events.subscriptionState(`Subscription cancelled. Your subscription will remain active until ${exp}. Thank you for your support.`);
+ events.setSubscription(sub);
+ }
+
function onConstructSpawn(construct) {
events.setNewConstruct(construct);
}
@@ -200,6 +218,7 @@ function createSocket(events) {
AccountTeam: onAccountTeam,
AccountInstances: onAccountInstances,
AccountShop: onAccountShop,
+ SubscriptionState: onSubscriptionState,
ConstructSpawn: onConstructSpawn,
GameState: onGameState,
EmailState: onEmailState,
@@ -296,6 +315,7 @@ function createSocket(events) {
sendAccountInstances,
sendAccountSetTeam,
+
sendGameState,
sendGameReady,
sendGameSkill,
@@ -315,6 +335,10 @@ function createSocket(events) {
sendItemInfo,
+ sendEmailState,
+ sendSubscriptionState,
+ sendSubscriptionEnding,
+
sendMtxApply,
sendMtxBuy,
sendMtxConstructSpawn,
diff --git a/etc/mnml.SAMPLE.env b/etc/mnml.SAMPLE.env
deleted file mode 100644
index c2ee78ae..00000000
--- a/etc/mnml.SAMPLE.env
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-export MNML_USER=$(whoami)
-export MNML_PG_PASSWORD=$(openssl rand -base64 16)
-export MNML_PG_HOST="localhost"
-
diff --git a/etc/mnml/gs.SAMPLE.conf b/etc/mnml/gs.conf
similarity index 72%
rename from etc/mnml/gs.SAMPLE.conf
rename to etc/mnml/gs.conf
index 20435945..1597df41 100644
--- a/etc/mnml/gs.SAMPLE.conf
+++ b/etc/mnml/gs.conf
@@ -3,3 +3,6 @@ DATABASE_URL=postgres://mnml:password@somewhere/mnml
MAIL_ADDRESS=machines@mnml.gg
MAIL_DOMAIN=vinyl.mnml.gg
MAIL_PASSWORD=mmmmmmmmmmmmmmmm
+
+STRIPE_SECRET=shhhhhhhhhh
+STRIPE_WH_SECRET=SHHHHHHH
diff --git a/ops/package.json b/ops/package.json
index 2b7cd67a..1eb603d9 100755
--- a/ops/package.json
+++ b/ops/package.json
@@ -1,6 +1,6 @@
{
"name": "mnml-ops",
- "version": "0.3.0",
+ "version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
diff --git a/server/Cargo.toml b/server/Cargo.toml
index f66c0f87..caea8b7e 100644
--- a/server/Cargo.toml
+++ b/server/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "mnml"
-version = "0.3.0"
+version = "1.0.0"
authors = ["ntr
"]
[dependencies]
@@ -38,4 +38,5 @@ ws = "0.8"
lettre = "0.9"
lettre_email = "0.9"
-stripe-rust = { version = "0.10.4", features = ["webhooks"] }
+stripe-rust = "0.10"
+# stripe-rust = { path = "/home/ntr/code/stripe-rs" }
diff --git a/server/src/events.rs b/server/src/events.rs
index eb5e12d5..f37b97bd 100644
--- a/server/src/events.rs
+++ b/server/src/events.rs
@@ -132,7 +132,7 @@ impl Events {
match self.clients.get_mut(&id) {
Some(client) => {
client.subs.insert(obj);
- info!("client subscriptions={:?}", client.subs.len());
+ info!("client={:?} subscriptions={:?}", id, client.subs.len());
Ok(())
},
None => return Err(format_err!("unknown client {:?}", id))
diff --git a/server/src/main.rs b/server/src/main.rs
index b452f137..cad0c1f7 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -146,6 +146,8 @@ fn main() {
let pg_pool = pool.clone();
let mailer = mail::listen(mail_rx);
+ let stripe = payments::stripe_client();
+
spawn(move || http::start(http_pool, mailer));
spawn(move || warden.listen());
spawn(move || warden::upkeep_tick(warden_tick_tx));
@@ -154,5 +156,5 @@ fn main() {
// the main thread becomes this ws listener
let rpc_pool = pool.clone();
- rpc::start(rpc_pool, rpc_events_tx);
+ rpc::start(rpc_pool, rpc_events_tx, stripe);
}
diff --git a/server/src/payments.rs b/server/src/payments.rs
index 7f02388c..f5dbd6f8 100644
--- a/server/src/payments.rs
+++ b/server/src/payments.rs
@@ -1,8 +1,9 @@
+use std::env;
use std::io::Read;
use http::State;
use iron::prelude::*;
-use iron::response::HttpResponse;
+
use iron::status;
use persistent::Read as Readable;
@@ -12,15 +13,16 @@ use postgres::transaction::Transaction;
use failure::Error;
use failure::err_msg;
-use stripe::{Event, EventObject, CheckoutSession, SubscriptionStatus};
+use stripe::{Client, Event, EventObject, CheckoutSession, SubscriptionStatus, Subscription};
use http::{MnmlHttpError};
-use pg::{PgPool};
+use pg::{Db, PgPool};
use account;
+use account::Account;
pub fn subscription_account(tx: &mut Transaction, sub: String) -> Result {
let query = "
- SELECT account
+ SELECT account, customer, checkout, subscription
FROM stripe_subscriptions
WHERE subscription = $1;
";
@@ -34,6 +36,69 @@ pub fn subscription_account(tx: &mut Transaction, sub: String) -> Result Result