// Initialization in the constructor
constructor(props) {
super(props);
...
this.colyseus = new Colyseus.Client('wss://ws.matchscore.ru')
this.GameBotRoom = this.colyseus.joinOrCreate("gamebot", {
user_name: this.state.user_name,
player_a: props.player_a,
player_b: props.player_b,
user_rank: this.state.user_rank,
match_id: this.state.match_id,
game_id: this.state.game_id,
my_time: this.state.my_time,
})
this.GameBotRoom.then(room => {
room.onStateChange.once((state) => {
// console.log("room.onStateChange.once! state", state);
this.setState(state);
});
})
...
}
// Next, listen to events from the client and to the client leaving the room
gameBotRoomRun = () => {
this.GameBotRoom.then(room => {
room.onStateChange((state) => {
if (this.state.my_time_active === 0 && this.state.game_players[this.state.player_active] === this.state.user_name) {
console.log("tttt off")
room.send({ command: "time_off" });
}
this.setState(state);
});
room.onMessage((data) => {
if (data.command === "redirect") {
window.location.replace(data.link);
} else if (data.command === "room_id") {
//console.log("room_id - ", data.room_id);
//console.log("session_id - ", data.session_id);
this.setState({ room_id: data.room_id, session_id: data.session_id });
}
});
room.onLeave((code) => {
console.log("client left the room", code);
this.test01();
});
})
}
// Catch the silk on the element and send it to the server
handleClick = (i) => {
if (this.state.gameStatus) {
if (this.state.squares_valid[i] === this.state.player_active && this.state.game_players[this.state.player_active] === this.state.user_name) {
this.GameBotRoom.then(room => {
room.send({ command: "test", sector: i, xIsNext: this.state.xIsNext });
});
}
}
}
// Everything works great! But I decided to add a response to reconnecting the client (loss of connection)
// Server
async onLeave (client, consented: boolean) {
// flag client as inactive for other users
this.state.players[client.sessionId].connected = false;
try {
if (consented) {
throw new Error("consented leave");
}
// allow disconnected client to reconnect into this room until 20 seconds
await this.allowReconnection(client, 30);
// client returned! let's re-activate it.
this.state.players[client.sessionId].connected = true;
} catch (e) {
// 20 seconds expired. let's remove the client.
delete this.state.players[client.sessionId];
}
}
// Client
serverReconnect = () => {
//localhost
//let client = new Colyseus.Client('ws://localhost:8014')
//server
let client = new Colyseus.Client('wss://ws.matchscore.ru')
client.reconnect(this.state.room_id, this.state.session_id).then(room => {
// console.log("joined successfully", room);
//this.setState({ pingServerTime: 60 });
console.log("serverReconnect!!!")
clearInterval(this.TimerId);
//room.onClick += this.GameBotRoom.onClick
//this.GameBotRoom += room.onClick.onClick
//room.onMessage += this.GameBotRoom.onMessage
//room.onLeave += this.GameBotRoom.onLeave
//room.onMessageCallback
room.onStateChange((state) => {
console.log("onStateChange - serverReconnect");
this.setState(state);
});
//room.send({ command: "message", message: "message!!!" });
});
}
// Reconnecting is working fine, client is being updated! But the previous one
this.GameBotRoom = this.colyseus.joinOrCreate("gamebot", {....
through which all the logic of the game passes, does not send messages to the server, it loses connection and the process goes to serverReconnect
If you add a click response on serverReconnect, then it reconnects (which is expected ... with an error)
A room.onLeave from the initial
this.GameBotRoom.then(room => {
stops working when reconnecting, and in
client.reconnect(this.state.room_id, this.state.session_id).then(room => {
does not work...
Help with advice on how to redirect processing to its original state (I’ve been suffering for two days ...)