Fix missing Resume button on refresh.

This commit is contained in:
yukirij 2024-10-01 15:31:39 -07:00
parent aca6961036
commit 9dfefd70d0
6 changed files with 88 additions and 70 deletions

View File

@ -471,6 +471,12 @@ pub async fn thread_system(mut app:App, bus:Bus<protocol::QRPacket>)
// Verify that session exists // Verify that session exists
if let Some(session) = app.sessions.get_mut(&request.token) { 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 // Join game as player
if if request.join { if if request.join {

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
app::session::SessionToken, app::session::SessionToken,
util::pack::pack_u16, util::pack::{pack_u8, pack_u16},
}; };
use super::Packet; use super::Packet;
@ -41,6 +41,7 @@ impl Packet for PacketSessionView {
pub struct PacketSessionViewResponse { pub struct PacketSessionViewResponse {
pub status:u16, pub status:u16,
pub token:SessionToken, pub token:SessionToken,
pub player:u8,
} }
impl PacketSessionViewResponse { impl PacketSessionViewResponse {
pub fn new() -> Self pub fn new() -> Self
@ -48,6 +49,7 @@ impl PacketSessionViewResponse {
Self { Self {
status:0, status:0,
token:SessionToken::default(), token:SessionToken::default(),
player:0,
} }
} }
} }
@ -56,8 +58,12 @@ impl Packet for PacketSessionViewResponse {
fn encode(&self) -> Vec<u8> fn encode(&self) -> Vec<u8>
{ {
let mut flags = 0u8;
flags |= self.player;
[ [
pack_u16(self.status), pack_u16(self.status),
pack_u8(flags),
self.token.to_vec(), self.token.to_vec(),
].concat() ].concat()
} }

View File

@ -1072,6 +1072,16 @@ const INTERFACE = {
} else { } else {
LOAD(SCENES.Browse); 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() { uninit() {
@ -1112,23 +1122,6 @@ const INTERFACE = {
if(data === null) { return; } if(data === null) { return; }
switch(code) { 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: { case OpCode.GameState: {
if(INTERFACE_DATA.mode == INTERFACE.Mode.Player) { if(INTERFACE_DATA.mode == INTERFACE.Mode.Player) {
INTERFACE_DATA.player = data.player; INTERFACE_DATA.player = data.player;

View File

@ -91,8 +91,6 @@ const SCENES = {
case Status.Ok: { case Status.Ok: {
let b64_token = PACK.base64(data.token); let b64_token = PACK.base64(data.token);
let b64_secret = PACK.base64(data.secret); let b64_secret = PACK.base64(data.secret);
console.log(b64_token);
console.log(b64_secret);
sessionStorage.setItem("auth", b64_token); sessionStorage.setItem("auth", b64_token);
sessionStorage.setItem("auth_secret", b64_secret); 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{ Game:class{
constructor() { constructor() {
this.game = null; this.game = null;
} }
load(data) { load(data) {
// Bottom Buttons
let buttons_bottom = [ ]; let buttons_bottom = [ ];
if(data.mode != INTERFACE.Mode.Review) { if(data.mode != INTERFACE.Mode.Review) {
let button_resign = UI.button(LANG("resign"), () => { INTERFACE.resign(); }); let button_resign = UI.button(LANG("resign"), () => { INTERFACE.resign(); });
@ -583,21 +613,20 @@ const SCENES = {
LOAD(SCENES.Browse); LOAD(SCENES.Browse);
})); }));
// Standard Top Buttons
let buttons_top = [ let buttons_top = [
UI.button(LANG("rotate"), () => { INTERFACE.rotate(); }), UI.button(LANG("rotate"), () => { INTERFACE.rotate(); }),
UI.button(LANG("mirror"), () => { INTERFACE.mirror(); }), UI.button(LANG("mirror"), () => { INTERFACE.mirror(); }),
]; ];
if(data.player != 0) { // Resume / Review Buttons
if(data.view.player != 0) {
if(data.mode == INTERFACE.Mode.Review) { if(data.mode == INTERFACE.Mode.Review) {
let callback_resume = function() { let callback_resume = function() {
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
player:this.player,
turn:-1,
mode:INTERFACE.Mode.Player, mode:INTERFACE.Mode.Player,
}); });
MESSAGE_SESSION_VIEW(this.token, true);
} }
callback_resume = callback_resume.bind({ callback_resume = callback_resume.bind({
token: data.token, token: data.token,
@ -607,13 +636,10 @@ const SCENES = {
buttons_top.push(UI.button(LANG("resume"), callback_resume)); buttons_top.push(UI.button(LANG("resume"), callback_resume));
} else { } else {
let callback_review = function() { let callback_review = function() {
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
turn:-1,
player:this.player,
mode:INTERFACE.Mode.Review, mode:INTERFACE.Mode.Review,
}); });
MESSAGE_SESSION_VIEW(this.token, false);
} }
callback_review = callback_review.bind({ callback_review = callback_review.bind({
token: data.token, token: data.token,
@ -624,6 +650,7 @@ const SCENES = {
} }
} }
// Practice Button
if(data.mode == INTERFACE.Mode.Review) { if(data.mode == INTERFACE.Mode.Review) {
let play_callback = function() { let play_callback = function() {
LOAD(SCENES.GamePractice, { LOAD(SCENES.GamePractice, {
@ -637,11 +664,12 @@ const SCENES = {
token: data.token, token: data.token,
player: data.player, 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); UI.nav(buttons_top, buttons_bottom);
// Turn Indicators, Scroll Bar
if(data.mode == INTERFACE.Mode.Review) { if(data.mode == INTERFACE.Mode.Review) {
let ind_turn = UI.div([UI.text("0 / 0")]); let ind_turn = UI.div([UI.text("0 / 0")]);
ind_turn.setAttribute("id", "indicator-turn"); ind_turn.setAttribute("id", "indicator-turn");
@ -664,13 +692,14 @@ const SCENES = {
MAIN.appendChild(UI.div([ slider ], "turn-slider-padding")); MAIN.appendChild(UI.div([ slider ], "turn-slider-padding"));
} }
// Canvas
let canvas = document.createElement("canvas"); let canvas = document.createElement("canvas");
canvas.setAttribute("id", "game"); canvas.setAttribute("id", "game");
MAIN.appendChild(canvas); MAIN.appendChild(canvas);
// Interface
INTERFACE.init(data.token, data.mode); INTERFACE.init(data.token, data.mode);
console.log(data.turn); if(data.turn !== null) {
if(data.turn != -1) {
INTERFACE_DATA.replay_turn = data.turn; INTERFACE_DATA.replay_turn = data.turn;
} }
@ -682,8 +711,6 @@ const SCENES = {
} }
message(code, data) { message(code, data) {
switch(code) { switch(code) {
case OpCode.SessionCreate:
case OpCode.SessionView:
case OpCode.GameState: case OpCode.GameState:
case OpCode.GamePlay: { case OpCode.GamePlay: {
INTERFACE.message(code, data); INTERFACE.message(code, data);
@ -709,13 +736,11 @@ const SCENES = {
if(data !== null) { if(data !== null) {
if(data.history.length > 0) { if(data.history.length > 0) {
let callback_review = function() { let callback_review = function() {
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
turn:INTERFACE_DATA.history_begin.length,
player:this.player,
mode:INTERFACE.Mode.Review, mode:INTERFACE.Mode.Review,
turn:INTERFACE_DATA.history_begin.length,
}); });
MESSAGE_SESSION_VIEW(this.token, false);
} }
callback_review = callback_review.bind({ callback_review = callback_review.bind({
token: data.token, token: data.token,
@ -962,12 +987,10 @@ const SCENES = {
case OpCode.ChallengeAnswer: { case OpCode.ChallengeAnswer: {
if(data.status == Status.Ok) { if(data.status == Status.Ok) {
LOAD(SCENES.GameLoad, {
LOAD(SCENES.Game, { token:this.token,
token:data.token,
mode:INTERFACE.Mode.Player, mode:INTERFACE.Mode.Player,
}); });
MESSAGE_SESSION_VIEW(data.token, true);
} else { } else {
SCENE.refresh(); SCENE.refresh();
} }
@ -1009,13 +1032,10 @@ function LOAD_URL() {
case "game": { case "game": {
if(parts[2]) { if(parts[2]) {
let token = UNPACK.base64(parts[2] + "="); let token = UNPACK.base64(parts[2] + "=");
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:token, token:token,
player:0,
turn:-1,
mode:INTERFACE.Mode.Review, mode:INTERFACE.Mode.Review,
}); });
MESSAGE_SESSION_VIEW(token, false);
} else { } else {
LOAD(SCENES.Browse); LOAD(SCENES.Browse);
} }

View File

@ -139,7 +139,7 @@ function MESSAGE(event) {
} break; } break;
case OpCode.SessionList: { case OpCode.SessionList: {
console.log("RECV Session list"); console.log("RECV SessionList");
if(bytes.length - index >= 2) { if(bytes.length - index >= 2) {
data = { data = {
@ -216,18 +216,27 @@ function MESSAGE(event) {
} break; } break;
case OpCode.SessionView: { case OpCode.SessionView: {
console.log("RECV SessionCreate/Join"); console.log("RECV SessionView");
if(bytes.length - index == 10) { if(bytes.length - index == 11) {
data = { data = {
status:0, status:0,
player:0,
token:new Uint8Array(8), token:new Uint8Array(8),
}; };
// Status
result = UNPACK.u16(bytes, index); result = UNPACK.u16(bytes, index);
index = result.index; index = result.index;
data.status = result.data; 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++]; } for(let i = 0; i < 8; ++i) { data.token[i] = bytes[index++]; }
} }
} break; } break;

View File

@ -189,31 +189,23 @@ const UI = {
for(let r = 0; r < records.length; ++r) { for(let r = 0; r < records.length; ++r) {
let buttons = [ ]; let buttons = [ ];
let join_callback = function() { let join_callback = function() {
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
player:this.player,
turn:-1,
mode:INTERFACE.Mode.Player, mode:INTERFACE.Mode.Player,
}); });
MESSAGE_SESSION_VIEW(this.token, true);
}; };
join_callback = join_callback.bind({ join_callback = join_callback.bind({
token: records[r].token, token: records[r].token,
player: records[r].player,
}); });
let spectate_callback = function() { let spectate_callback = function() {
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
player:this.player,
turn:-1,
mode:INTERFACE.Mode.Review, mode:INTERFACE.Mode.Review,
}); });
MESSAGE_SESSION_VIEW(this.token, false);
}; };
spectate_callback = spectate_callback.bind({ spectate_callback = spectate_callback.bind({
token: records[r].token, token: records[r].token,
player: records[r].player,
}); });
if(records[r].player != 0) { if(records[r].player != 0) {
@ -255,25 +247,19 @@ const UI = {
let buttons = [ ]; let buttons = [ ];
let join_callback = function() { let join_callback = function() {
SCENE_FORWARD = SCENE; SCENE_FORWARD = SCENE;
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
player:0,
turn:-1,
mode:INTERFACE.Mode.Player, mode:INTERFACE.Mode.Player,
}); });
MESSAGE_SESSION_VIEW(this.token, true);
}; };
join_callback = join_callback.bind({token: records[r].token}); join_callback = join_callback.bind({token: records[r].token});
let spectate_callback = function() { let spectate_callback = function() {
SCENE_FORWARD = SCENE; SCENE_FORWARD = SCENE;
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
player:0,
turn:-1,
mode:INTERFACE.Mode.Review, mode:INTERFACE.Mode.Review,
}); });
MESSAGE_SESSION_VIEW(this.token, false);
}; };
spectate_callback = spectate_callback.bind({token: records[r].token}); spectate_callback = spectate_callback.bind({token: records[r].token});
@ -348,10 +334,8 @@ const UI = {
let buttons = [ ]; let buttons = [ ];
let view_callback = function() { let view_callback = function() {
SCENE_FORWARD = SCENE; SCENE_FORWARD = SCENE;
LOAD(SCENES.Game, { LOAD(SCENES.GameLoad, {
token:this.token, token:this.token,
player:0,
turn:-1,
mode:INTERFACE.Mode.Review, mode:INTERFACE.Mode.Review,
}); });
MESSAGE_SESSION_VIEW(this.token, false); MESSAGE_SESSION_VIEW(this.token, false);