diff --git a/client/src/actions.jsx b/client/src/actions.jsx
index 149dcb2a..1fde403a 100644
--- a/client/src/actions.jsx
+++ b/client/src/actions.jsx
@@ -16,6 +16,7 @@ export const setConstructs = value => ({ type: 'SET_CONSTRUCTS', value });
export const setConstructRename = value => ({ type: 'SET_CONSTRUCT_RENAME', value });
export const setGame = value => ({ type: 'SET_GAME', value });
export const setInfo = value => ({ type: 'SET_INFO', value });
+export const setEmail = value => ({ type: 'SET_EMAIL', value });
export const setInstance = value => ({ type: 'SET_INSTANCE', value });
export const setInstances = value => ({ type: 'SET_INSTANCES', value });
export const setItemEquip = value => ({ type: 'SET_ITEM_EQUIP', value });
diff --git a/client/src/components/account.management.jsx b/client/src/components/account.management.jsx
index 9f5ae1ba..05a8b04b 100644
--- a/client/src/components/account.management.jsx
+++ b/client/src/components/account.management.jsx
@@ -12,6 +12,7 @@ const addState = connect(
function receiveState(state) {
const {
account,
+ email,
ping,
ws,
} = state;
@@ -51,6 +52,7 @@ const addState = connect(
return {
account,
ping,
+ email,
logout,
setPassword,
setEmail,
@@ -74,6 +76,7 @@ class AccountStatus extends Component {
const {
account,
ping,
+ email,
logout,
setPassword,
setEmail,
@@ -105,9 +108,9 @@ class AccountStatus extends Component {
- Recovery Email
- - {account.email ? account.email : 'No email set'}
+ - {email ? email.email : 'No email set'}
- Status
- - {account.email_confirmed ? 'Confirmed' : 'Unconfirmed'}
+ - {email && email.confirmed ? 'Confirmed' : 'Unconfirmed'}
Result {
+pub fn select(db: &Db, email: &String) -> Result {
let query = "
SELECT id, email, account, confirmed
FROM emails
@@ -127,7 +127,28 @@ pub fn select(db: &Db, email: &String) -> Result {
let account: Uuid = row.get(2);
let confirmed: bool = row.get(3);
- return Ok(UserEmail { id, email, account, confirmed });
+ return Ok(Email { id, email, account, confirmed });
+}
+
+pub fn select_account(db: &Db, account: Uuid) -> Result {
+ let query = "
+ SELECT id, email, account, confirmed
+ FROM emails
+ WHERE account = $1;
+ ";
+
+ let result = db
+ .query(query, &[&account])?;
+
+ let row = result.iter().next()
+ .ok_or(err_msg("email found"))?;
+
+ let id: Uuid = row.get(0);
+ let email: String = row.get(1);
+ let account: Uuid = row.get(2);
+ let confirmed: bool = row.get(3);
+
+ return Ok(Email { id, email, account, confirmed });
}
pub fn set_recovery(tx: &mut Transaction, email: &String) -> Result {
@@ -158,7 +179,7 @@ pub fn set_recovery(tx: &mut Transaction, email: &String) -> Result Result {
+pub fn get_recovery(tx: &mut Transaction, recover_token: &String) -> Result {
// set a new token when recovering to prevent multiple access
let mut rng = thread_rng();
let new_token: String = iter::repeat(())
@@ -186,7 +207,7 @@ pub fn get_recovery(tx: &mut Transaction, recover_token: &String) -> Result Result<(Uuid, String), Error> {
diff --git a/server/src/rpc.rs b/server/src/rpc.rs
index 8320c313..7d596869 100644
--- a/server/src/rpc.rs
+++ b/server/src/rpc.rs
@@ -22,13 +22,15 @@ use game::{Game, game_state, game_skill, game_ready};
use instance::{Instance, instance_state, instance_practice, instance_ready};
use item::{Item, ItemInfoCtr, item_info};
use mtx;
+use mail;
+use mail::Email;
use pg::{Db};
use pg::{PgPool};
use skill::{Skill, dev_resolve, Resolutions};
use vbox::{vbox_accept, vbox_apply, vbox_discard, vbox_combine, vbox_reclaim, vbox_unequip};
use http::{AUTH_CLEAR, TOKEN_HEADER};
-#[derive(Debug,Clone,Serialize,Deserialize)]
+#[derive(Debug,Clone,Serialize)]
pub enum RpcMessage {
AccountState(Account),
AccountConstructs(Vec),
@@ -36,6 +38,7 @@ pub enum RpcMessage {
AccountInstances(Vec),
AccountShop(mtx::Shop),
ConstructSpawn(Construct),
+ EmailState(Email),
GameState(Game),
ItemInfo(ItemInfoCtr),
@@ -225,6 +228,15 @@ impl Handler for Connection {
let db = self.pool.get().unwrap();
let mut tx = db.transaction().unwrap();
+ // email state
+ match mail::select_account(&db, a.id) {
+ Ok(e) => {
+ self.ws.send(RpcMessage::EmailState(e.clone())).unwrap();
+ self.events.send(Event::Subscribe(self.id, e.id)).unwrap();
+ },
+ Err(_) => (),
+ };
+
// send account constructs
let account_constructs = account::constructs(&mut tx, a).unwrap();
self.ws.send(RpcMessage::AccountConstructs(account_constructs)).unwrap();