diff --git a/client/src/socket.js b/client/src/socket.js index 9b78de48..8285f8d3 100644 --- a/client/src/socket.js +++ b/client/src/socket.js @@ -45,6 +45,10 @@ function createSocket(events) { send({ method: 'account_cryps', params: {} }); } + function sendAccountPlayers() { + send({ method: 'account_players', params: {} }); + } + function sendAccountZone() { send({ method: 'account_zone', params: {} }); } @@ -150,6 +154,7 @@ function createSocket(events) { account = login; events.setAccount(login); sendAccountCryps(); + sendAccountPlayers(); } function accountCryps(response) { @@ -219,12 +224,12 @@ function createSocket(events) { // decode binary msg from server const blob = new Uint8Array(event.data); const res = cbor.decode(blob); + const { method, params } = res; console.log(res); // check for error and split into response type and data if (res.err) return errHandler(res.err); - const { method, params } = res; if (!handlers[method]) return errorToast(`${method} handler missing`); return handlers[method](params); } @@ -274,6 +279,7 @@ function createSocket(events) { sendAccountCreate, sendAccountDemo, sendAccountCryps, + sendAccountPlayers, sendAccountZone, sendGameState, sendGamePve, diff --git a/server/WORKLOG.md b/server/WORKLOG.md index 3f970e8a..85b0c07b 100644 --- a/server/WORKLOG.md +++ b/server/WORKLOG.md @@ -43,9 +43,11 @@ round system for games * notifications * elo + leaderboards - +$$$ * Items * Colour scheme + * Highlight (dota) colour + * fx colours + styles # Db maintenance diff --git a/server/src/account.rs b/server/src/account.rs index 23e21af0..4b10d6fe 100644 --- a/server/src/account.rs +++ b/server/src/account.rs @@ -13,6 +13,7 @@ use cryp::{Cryp, CrypRecover, cryp_write, cryp_recover}; use game::Game; // use zone::{Zone, zone_delete}; use skill::{Skill}; +use player::{Player, player_delete}; use failure::Error; use failure::err_msg; @@ -234,4 +235,31 @@ pub fn account_game_history(tx: &mut Transaction, account: &Account) -> Result Result, Error> { + let query = " + SELECT data, id + FROM players + WHERE account = $1; + "; + let result = tx + .query(query, &[&account.id])?; + + let mut list = vec![]; + + for row in result.into_iter() { + let bytes: Vec = row.get(0); + let id = row.get(1); + + match from_slice::(&bytes) { + Ok(i) => list.push(i), + Err(_e) => { + player_delete(tx, id)?; + } + }; + } + + list.sort_by_key(|c| c.id); + + return Ok(list); +} \ No newline at end of file diff --git a/server/src/player.rs b/server/src/player.rs index 54d6aa6b..3009b447 100644 --- a/server/src/player.rs +++ b/server/src/player.rs @@ -102,6 +102,25 @@ pub fn player_update(tx: &mut Transaction, player: Player) -> Result Result<(), Error> { + let query = " + DELETE + FROM players + WHERE id = $1; + "; + + let result = tx + .execute(query, &[&id])?; + + if result != 1 { + return Err(format_err!("unable to delete player {:?}", id)); + } + + println!("player deleted {:?}", id); + + return Ok(()); +} + pub fn player_state(params: PlayerStateParams, tx: &mut Transaction, account: &Account) -> Result { player_get(tx, account.id, params.instance_id) } diff --git a/server/src/rpc.rs b/server/src/rpc.rs index f7310ea3..d10635d9 100644 --- a/server/src/rpc.rs +++ b/server/src/rpc.rs @@ -17,7 +17,7 @@ use failure::err_msg; use net::Db; use cryp::{Cryp, cryp_spawn, cryp_learn}; use game::{Game, game_state, game_pve, game_skill}; -use account::{Account, account_create, account_login, account_from_token, account_cryps}; +use account::{Account, account_create, account_login, account_from_token, account_cryps, account_players}; use skill::{Skill}; // use zone::{Zone, zone_create, zone_join, zone_close}; use spec::{Spec}; @@ -64,6 +64,7 @@ impl Rpc { // auth methods "account_cryps" => Rpc::account_cryps(data, &mut tx, account.unwrap(), client), + "account_players" => Rpc::account_players(data, &mut tx, account.unwrap(), client), // "account_zone" => Rpc::account_zone(data, &mut tx, account.unwrap(), client), "cryp_spawn" => Rpc::cryp_spawn(data, &mut tx, account.unwrap(), client), @@ -220,6 +221,13 @@ impl Rpc { }) } + fn account_players(_data: Vec, tx: &mut Transaction, account: Account, _client: &mut WebSocket) -> Result { + Ok(RpcResponse { + method: "account_players".to_string(), + params: RpcResult::PlayerList(account_players(tx, &account)?) + }) + } + // fn account_zone(_data: Vec, tx: &mut Transaction, account: Account, _client: &mut WebSocket) -> Result { // Ok(RpcResponse { // method: "zone_state".to_string(), @@ -374,6 +382,7 @@ pub enum RpcResult { // ZoneState(Zone), // ZoneClose(()), + PlayerList(Vec), PlayerState(Player), }