diff --git a/server/src/manager/data.rs b/server/src/manager/data.rs index eff3764..185569e 100644 --- a/server/src/manager/data.rs +++ b/server/src/manager/data.rs @@ -471,6 +471,12 @@ pub async fn thread_system(mut app:App, bus:Bus) // Verify that session exists if let Some(session) = app.sessions.get_mut(&request.token) { + if user_id == Some(session.p_dawn.user) { + response.player = 1; + } else if user_id == Some(session.p_dusk.user) { + response.player = 2; + } + // Join game as player if if request.join { diff --git a/server/src/protocol/packet/session_view.rs b/server/src/protocol/packet/session_view.rs index 5bbbee3..7cbd106 100644 --- a/server/src/protocol/packet/session_view.rs +++ b/server/src/protocol/packet/session_view.rs @@ -1,6 +1,6 @@ use crate::{ app::session::SessionToken, - util::pack::pack_u16, + util::pack::{pack_u8, pack_u16}, }; use super::Packet; @@ -41,6 +41,7 @@ impl Packet for PacketSessionView { pub struct PacketSessionViewResponse { pub status:u16, pub token:SessionToken, + pub player:u8, } impl PacketSessionViewResponse { pub fn new() -> Self @@ -48,6 +49,7 @@ impl PacketSessionViewResponse { Self { status:0, token:SessionToken::default(), + player:0, } } } @@ -56,8 +58,12 @@ impl Packet for PacketSessionViewResponse { fn encode(&self) -> Vec { + let mut flags = 0u8; + flags |= self.player; + [ pack_u16(self.status), + pack_u8(flags), self.token.to_vec(), ].concat() } diff --git a/www/js/interface.js b/www/js/interface.js index 540c6b1..a1f9586 100644 --- a/www/js/interface.js +++ b/www/js/interface.js @@ -1072,6 +1072,16 @@ const INTERFACE = { } else { LOAD(SCENES.Browse); } + + switch(INTERFACE_DATA.mode) { + case INTERFACE.Mode.Review: + case INTERFACE.Mode.Player: { + MESSAGE_COMPOSE([ + PACK.u16(OpCode.GameState), + INTERFACE_DATA.token, + ]); + } break; + } }, uninit() { @@ -1112,23 +1122,6 @@ const INTERFACE = { if(data === null) { return; } switch(code) { - - case OpCode.SessionView: { - if(data.status != Status.Ok) { - LOAD(SCENES.Browse); - } - - switch(INTERFACE_DATA.mode) { - case INTERFACE.Mode.Review: - case INTERFACE.Mode.Player: { - MESSAGE_COMPOSE([ - PACK.u16(OpCode.GameState), - INTERFACE_DATA.token, - ]); - } break; - } - } break; - case OpCode.GameState: { if(INTERFACE_DATA.mode == INTERFACE.Mode.Player) { INTERFACE_DATA.player = data.player; diff --git a/www/js/scene.js b/www/js/scene.js index a558255..d2158f6 100644 --- a/www/js/scene.js +++ b/www/js/scene.js @@ -91,8 +91,6 @@ const SCENES = { case Status.Ok: { let b64_token = PACK.base64(data.token); let b64_secret = PACK.base64(data.secret); - console.log(b64_token); - console.log(b64_secret); sessionStorage.setItem("auth", b64_token); sessionStorage.setItem("auth_secret", b64_secret); @@ -568,11 +566,43 @@ const SCENES = { } }, + GameLoad:class{ + constructor() { + this.mode = null; + this.token = null; + this.turn = null; + } + load(data) { + this.mode = data.mode; + this.token = data.token; + if(data.turn !== undefined) { this.turn = data.turn; } + MESSAGE_SESSION_VIEW(this.token, this.mode == INTERFACE.Mode.Player); + return true; + } + message(code, data) { + switch(code) { + case OpCode.SessionView: { + if(data.status == Status.Ok) { + LOAD(SCENES.Game, { + mode:this.mode, + token:this.token, + view:data, + turn:this.turn, + }); + } else { + LOAD(SCENES.Browse); + } + } break; + } + } + }, + Game:class{ constructor() { this.game = null; } load(data) { + // Bottom Buttons let buttons_bottom = [ ]; if(data.mode != INTERFACE.Mode.Review) { let button_resign = UI.button(LANG("resign"), () => { INTERFACE.resign(); }); @@ -583,21 +613,20 @@ const SCENES = { LOAD(SCENES.Browse); })); + // Standard Top Buttons let buttons_top = [ UI.button(LANG("rotate"), () => { INTERFACE.rotate(); }), UI.button(LANG("mirror"), () => { INTERFACE.mirror(); }), ]; - if(data.player != 0) { + // Resume / Review Buttons + if(data.view.player != 0) { if(data.mode == INTERFACE.Mode.Review) { let callback_resume = function() { - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - player:this.player, - turn:-1, mode:INTERFACE.Mode.Player, }); - MESSAGE_SESSION_VIEW(this.token, true); } callback_resume = callback_resume.bind({ token: data.token, @@ -607,13 +636,10 @@ const SCENES = { buttons_top.push(UI.button(LANG("resume"), callback_resume)); } else { let callback_review = function() { - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - turn:-1, - player:this.player, mode:INTERFACE.Mode.Review, }); - MESSAGE_SESSION_VIEW(this.token, false); } callback_review = callback_review.bind({ token: data.token, @@ -624,6 +650,7 @@ const SCENES = { } } + // Practice Button if(data.mode == INTERFACE.Mode.Review) { let play_callback = function() { LOAD(SCENES.GamePractice, { @@ -637,11 +664,12 @@ const SCENES = { token: data.token, player: data.player, }); - buttons_top.push(UI.button(LANG("play"), play_callback)); + buttons_top.push(UI.button(LANG("practice"), play_callback)); } UI.nav(buttons_top, buttons_bottom); + // Turn Indicators, Scroll Bar if(data.mode == INTERFACE.Mode.Review) { let ind_turn = UI.div([UI.text("0 / 0")]); ind_turn.setAttribute("id", "indicator-turn"); @@ -664,13 +692,14 @@ const SCENES = { MAIN.appendChild(UI.div([ slider ], "turn-slider-padding")); } + // Canvas let canvas = document.createElement("canvas"); canvas.setAttribute("id", "game"); MAIN.appendChild(canvas); + // Interface INTERFACE.init(data.token, data.mode); - console.log(data.turn); - if(data.turn != -1) { + if(data.turn !== null) { INTERFACE_DATA.replay_turn = data.turn; } @@ -682,8 +711,6 @@ const SCENES = { } message(code, data) { switch(code) { - case OpCode.SessionCreate: - case OpCode.SessionView: case OpCode.GameState: case OpCode.GamePlay: { INTERFACE.message(code, data); @@ -709,13 +736,11 @@ const SCENES = { if(data !== null) { if(data.history.length > 0) { let callback_review = function() { - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - turn:INTERFACE_DATA.history_begin.length, - player:this.player, mode:INTERFACE.Mode.Review, + turn:INTERFACE_DATA.history_begin.length, }); - MESSAGE_SESSION_VIEW(this.token, false); } callback_review = callback_review.bind({ token: data.token, @@ -962,12 +987,10 @@ const SCENES = { case OpCode.ChallengeAnswer: { if(data.status == Status.Ok) { - - LOAD(SCENES.Game, { - token:data.token, + LOAD(SCENES.GameLoad, { + token:this.token, mode:INTERFACE.Mode.Player, }); - MESSAGE_SESSION_VIEW(data.token, true); } else { SCENE.refresh(); } @@ -1009,13 +1032,10 @@ function LOAD_URL() { case "game": { if(parts[2]) { let token = UNPACK.base64(parts[2] + "="); - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:token, - player:0, - turn:-1, mode:INTERFACE.Mode.Review, }); - MESSAGE_SESSION_VIEW(token, false); } else { LOAD(SCENES.Browse); } diff --git a/www/js/system.js b/www/js/system.js index 60bff3a..1956458 100644 --- a/www/js/system.js +++ b/www/js/system.js @@ -139,7 +139,7 @@ function MESSAGE(event) { } break; case OpCode.SessionList: { - console.log("RECV Session list"); + console.log("RECV SessionList"); if(bytes.length - index >= 2) { data = { @@ -216,18 +216,27 @@ function MESSAGE(event) { } break; case OpCode.SessionView: { - console.log("RECV SessionCreate/Join"); + console.log("RECV SessionView"); - if(bytes.length - index == 10) { + if(bytes.length - index == 11) { data = { status:0, + player:0, token:new Uint8Array(8), }; + // Status result = UNPACK.u16(bytes, index); index = result.index; data.status = result.data; + // Flags + result = UNPACK.u8(bytes, index); + index = result.index; + let flags = result.data; + data.player = flags & 3; + + // Token for(let i = 0; i < 8; ++i) { data.token[i] = bytes[index++]; } } } break; diff --git a/www/js/ui.js b/www/js/ui.js index 7f228ec..ffe82c8 100644 --- a/www/js/ui.js +++ b/www/js/ui.js @@ -189,31 +189,23 @@ const UI = { for(let r = 0; r < records.length; ++r) { let buttons = [ ]; let join_callback = function() { - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - player:this.player, - turn:-1, mode:INTERFACE.Mode.Player, }); - MESSAGE_SESSION_VIEW(this.token, true); }; join_callback = join_callback.bind({ token: records[r].token, - player: records[r].player, }); let spectate_callback = function() { - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - player:this.player, - turn:-1, mode:INTERFACE.Mode.Review, }); - MESSAGE_SESSION_VIEW(this.token, false); }; spectate_callback = spectate_callback.bind({ token: records[r].token, - player: records[r].player, }); if(records[r].player != 0) { @@ -255,25 +247,19 @@ const UI = { let buttons = [ ]; let join_callback = function() { SCENE_FORWARD = SCENE; - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - player:0, - turn:-1, mode:INTERFACE.Mode.Player, }); - MESSAGE_SESSION_VIEW(this.token, true); }; join_callback = join_callback.bind({token: records[r].token}); let spectate_callback = function() { SCENE_FORWARD = SCENE; - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - player:0, - turn:-1, mode:INTERFACE.Mode.Review, }); - MESSAGE_SESSION_VIEW(this.token, false); }; spectate_callback = spectate_callback.bind({token: records[r].token}); @@ -348,10 +334,8 @@ const UI = { let buttons = [ ]; let view_callback = function() { SCENE_FORWARD = SCENE; - LOAD(SCENES.Game, { + LOAD(SCENES.GameLoad, { token:this.token, - player:0, - turn:-1, mode:INTERFACE.Mode.Review, }); MESSAGE_SESSION_VIEW(this.token, false);