feature: add channel listen_game_events

This commit is contained in:
Halit Aksoy 2022-09-02 00:11:48 +03:00
parent 35750af200
commit 4c0a8877b6
2 changed files with 27 additions and 10 deletions

View File

@ -8,4 +8,6 @@ export const channel_on_game_crashed = "on_game_crashed"
export const channel_on_game_user_leave = "on_game_user_leave" export const channel_on_game_user_leave = "on_game_user_leave"
export const channel_ping = "ping" export const channel_ping = "ping"
export const channel_pong = "pong" export const channel_pong = "pong"
export const channel_on_user_connection_change = "channel_on_user_connection_change" export const channel_on_user_connection_change = "channel_on_user_connection_change"
export const channel_listen_game_events = "channel_listen_game_events"
export const channel_unlisten_game_events = "channel_unlisten_game_events"

View File

@ -17,7 +17,7 @@ import LoadingComponent from '../components/LoadingComponent';
import PageContainer from '../components/PageContainer'; import PageContainer from '../components/PageContainer';
import Row from '../components/Row'; import Row from '../components/Row';
import UserStatus from '../components/UserStatus'; import UserStatus from '../components/UserStatus';
import { channel_on_game_update, channel_on_game_crashed, channel_on_game_user_leave, channel_on_user_connection_change, channel_leave_game, channel_game_move } from '../const/channel_names'; import { channel_on_game_update, channel_on_game_crashed, channel_on_game_user_leave, channel_on_user_connection_change, channel_leave_game, channel_game_move, channel_listen_game_events, channel_unlisten_game_events } from '../const/channel_names';
import { Context } from '../context/context'; import { Context } from '../context/context';
import useWindowDimensions from '../hooks/useWindowDimensions'; import useWindowDimensions from '../hooks/useWindowDimensions';
import { ConnectionState } from '../models/ConnectionState'; import { ConnectionState } from '../models/ConnectionState';
@ -61,7 +61,12 @@ const GamePage: FunctionComponent<{
const [gameLoadingState, setLoadingStateGame] = useState<LoadingState<Game>>(LoadingState.Unset()); const [gameLoadingState, setLoadingStateGame] = useState<LoadingState<Game>>(LoadingState.Unset());
const checkIsSpectator = (game: Game) => userKey !== game.mancalaGame.player1Id && userKey !== game.mancalaGame.player2Id;
const mancalaGame: MancalaGame | undefined = game?.mancalaGame; const mancalaGame: MancalaGame | undefined = game?.mancalaGame;
const isSpectator = game ? checkIsSpectator(game) : undefined;
const isPlayer2 = !isSpectator && userKey === mancalaGame?.player2Id;
const onGameUpdate = (pitAnimator: PitAnimator, newGame: Game) => { const onGameUpdate = (pitAnimator: PitAnimator, newGame: Game) => {
setGame(newGame); setGame(newGame);
@ -100,13 +105,15 @@ const GamePage: FunctionComponent<{
setGameUsersConnectionInfo(gameUsersConnectionInfo); setGameUsersConnectionInfo(gameUsersConnectionInfo);
}; };
const listenMessages = (pitAnimator: PitAnimator): () => void => { const listenMessages = (game: Game, pitAnimator: PitAnimator): () => void => {
const _onGameUpdate = (message: object) => onGameUpdateEvent(pitAnimator, message); const _onGameUpdate = (message: object) => onGameUpdateEvent(pitAnimator, message);
context.rtmt.listenMessage(channel_on_game_update, _onGameUpdate); context.rtmt.listenMessage(channel_on_game_update, _onGameUpdate);
context.rtmt.listenMessage(channel_on_game_crashed, onGameCrashed); context.rtmt.listenMessage(channel_on_game_crashed, onGameCrashed);
context.rtmt.listenMessage(channel_on_game_user_leave, onGameUserLeave); context.rtmt.listenMessage(channel_on_game_user_leave, onGameUserLeave);
context.rtmt.listenMessage(channel_on_user_connection_change, onUserConnectionChange) context.rtmt.listenMessage(channel_on_user_connection_change, onUserConnectionChange);
checkIsSpectator(game) && userKey && context.rtmt.sendMessage(channel_listen_game_events, game.id);
return () => { return () => {
checkIsSpectator(game) && userKey && context.rtmt.sendMessage(channel_unlisten_game_events, game.id);
context.rtmt.unlistenMessage(channel_on_game_update, _onGameUpdate); context.rtmt.unlistenMessage(channel_on_game_update, _onGameUpdate);
context.rtmt.unlistenMessage(channel_on_game_crashed, onGameCrashed); context.rtmt.unlistenMessage(channel_on_game_crashed, onGameCrashed);
context.rtmt.unlistenMessage(channel_on_game_user_leave, onGameUserLeave); context.rtmt.unlistenMessage(channel_on_game_user_leave, onGameUserLeave);
@ -140,20 +147,28 @@ const GamePage: FunctionComponent<{
}; };
const onPitSelect = (index: number, pit: Pit) => { const onPitSelect = (index: number, pit: Pit) => {
if (!game || isSpectator || !userKey) {
return;
}
const pitIndexForUser = index % (game.mancalaGame.board.totalPitCount() / 2);
if (game.mancalaGame.getPlayerIdByIndex(index) !== userKey ||
!game.mancalaGame.canPlayerMove(userKey, pitIndexForUser)) {
return;
}
if (checkHasAnOngoingAction()) { if (checkHasAnOngoingAction()) {
return; return;
} }
setHasOngoingAction(true); setHasOngoingAction(true);
if (!boardViewModel) return; if (!boardViewModel) return;
//TODO : stoneCount comes from view model! //TODO: this check should be in mancala.js
if (pit.stoneCount === 0) { if (pit.stoneCount === 0) {
//TODO : warn user //TODO : warn user
return; return;
} }
boardViewModel.pits[getBoardIndex(index)].pitColor = boardViewModel.pits[getBoardIndex(pitIndexForUser)].pitColor =
context.themeManager.theme.pitSelectedColor; context.themeManager.theme.pitSelectedColor;
updateBoardViewModel(boardViewModel); updateBoardViewModel(boardViewModel);
const gameMove: GameMove = { index: index }; const gameMove: GameMove = { index: pitIndexForUser };
context.rtmt.sendMessage(channel_game_move, gameMove); context.rtmt.sendMessage(channel_game_move, gameMove);
}; };
@ -166,7 +181,7 @@ const GamePage: FunctionComponent<{
pitAnimator = new PitAnimator(context, updateBoardViewModel); pitAnimator = new PitAnimator(context, updateBoardViewModel);
setPitAnimator(pitAnimator); setPitAnimator(pitAnimator);
onGameUpdate(pitAnimator, game); onGameUpdate(pitAnimator, game);
unlistenMessages = listenMessages(pitAnimator); unlistenMessages = listenMessages(game, pitAnimator);
setLoadingStateGame(LoadingState.Loaded({ value: game })) setLoadingStateGame(LoadingState.Loaded({ value: game }))
} else { } else {
setLoadingStateGame(LoadingState.Error({ errorMessage: context.texts.GameNotFound })) setLoadingStateGame(LoadingState.Error({ errorMessage: context.texts.GameNotFound }))
@ -242,12 +257,12 @@ const GamePage: FunctionComponent<{
</BoardToolbar> </BoardToolbar>
{showBoardView && ( {showBoardView && (
<BoardView <BoardView
userKey={userKey}
game={game} game={game}
boardId={boardId} boardId={boardId}
boardViewModel={boardViewModel} boardViewModel={boardViewModel}
context={context} context={context}
onPitSelect={onPitSelect} /> onPitSelect={onPitSelect}
revert={isPlayer2} />
)} )}
<Center> <Center>
<LoadingComponent context={context} loadingState={gameLoadingState}></LoadingComponent> <LoadingComponent context={context} loadingState={gameLoadingState}></LoadingComponent>