From 228fd8cef73b5723a30f54d5d10840e5cbc46704 Mon Sep 17 00:00:00 2001 From: Halit Aksoy Date: Sat, 23 Jul 2022 00:32:55 +0300 Subject: [PATCH] implement on_user_connection_change --- src/consts/channel_names.ts | 3 ++- src/game/GameManager.ts | 32 +++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/consts/channel_names.ts b/src/consts/channel_names.ts index 55250cf..789d501 100644 --- a/src/consts/channel_names.ts +++ b/src/consts/channel_names.ts @@ -7,4 +7,5 @@ export const channel_on_game_end = "on_game_end" export const channel_on_game_crashed = "on_game_crashed" export const channel_on_game_user_leave = "on_game_user_leave" export const channel_ping = "ping" -export const channel_pong = "pong" \ No newline at end of file +export const channel_pong = "pong" +export const channel_on_user_connection_change = "channel_on_user_connection_change" \ No newline at end of file diff --git a/src/game/GameManager.ts b/src/game/GameManager.ts index a604419..f3bc1a8 100644 --- a/src/game/GameManager.ts +++ b/src/game/GameManager.ts @@ -9,17 +9,19 @@ import { channel_on_game_crashed, channel_on_game_start, channel_on_game_update, - channel_on_game_user_leave + channel_on_game_user_leave, + channel_on_user_connection_change } from "../consts/channel_names"; import { GameMove } from "../models/GameMove"; import { GameCrashManager } from "./GameCrashManager"; import { MatchMaker } from "../matchmaker/MatchMaker"; +import { UserConnectionInfo } from "../models/UserConnectionInfo"; export class GameManager { gameStore: GameStore; rtmt: RTMT; matchMaker: MatchMaker; - + constructor(params: { gameStore: GameStore, rtmt: RTMT, matchMaker: MatchMaker }) { this.gameStore = params.gameStore; this.rtmt = params.rtmt; @@ -30,6 +32,7 @@ export class GameManager { private initialize() { this.listenOnPlayersPaired(); this.listenRtmtMessages(); + this.listenUserConnectionChange(); } private listenRtmtMessages() { @@ -43,7 +46,7 @@ export class GameManager { this.rtmt.listenMessage(channel_leave_game, (userKey: string, message: Object) => { this.onPlayerLeave(userKey) - }); + }); } private onGameMove(userKey: string, gameMove: GameMove) { @@ -108,6 +111,16 @@ export class GameManager { public startGame(game: MancalaGame) { this.rtmt.sendMessage(game.player1Id, channel_on_game_start, game); this.rtmt.sendMessage(game.player2Id, channel_on_game_start, game); + this.sendUserConnectionInfo(game, game.player1Id); + this.sendUserConnectionInfo(game, game.player2Id); + } + + public sendUserConnectionInfo(game: MancalaGame, playerId: string, isOnline?: boolean) { + //todo: reimplement when watch game feature added + const _isOnline = isOnline === undefined ? this.rtmt.isClientOnline(playerId) : isOnline; + const otherUser = game.player1Id === playerId ? game.player2Id : game.player1Id; + const userConnectionInfo: UserConnectionInfo = { userId: playerId, isOnline: _isOnline }; + this.rtmt.sendMessage(otherUser, channel_on_user_connection_change, userConnectionInfo); } public deleteGame(game: MancalaGame) { @@ -116,4 +129,17 @@ export class GameManager { this.gameStore.remove(game.player2Id); } } + + private listenUserConnectionChange() { + this.rtmt.listenOnClientConnectionChange((clientId: string, isOnline: boolean) => { + const game = this.gameStore.get(clientId); + if (game) { + this.sendUserConnectionInfo(game, clientId, isOnline); + if (isOnline) { + const otherUser = game.player1Id === clientId ? game.player2Id : game.player1Id; + this.sendUserConnectionInfo(game, otherUser); + } + } + }); + } } \ No newline at end of file