Skip to content

Commit

Permalink
Separate game log from game data packets
Browse files Browse the repository at this point in the history
  • Loading branch information
DoubleF3lix committed Aug 14, 2024
1 parent cd7b09d commit b5c51d2
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 18 deletions.
4 changes: 2 additions & 2 deletions src/components/ChatBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { IRootState } from "~/store/Store";
import { addChatMessage, populateChatFromPacket } from "~/store/ChatSlice";

import { ChatMessageType } from "~/types/ChatMessageType";
import { ChatMessagesRequest, ChatMessagesSyncPacket, NewChatMessageSentPacket, SendNewChatMessagePacket } from "~/types/PacketType";
import { ChatMessagesRequestPacket, ChatMessagesSyncPacket, NewChatMessageSentPacket, SendNewChatMessagePacket } from "~/types/PacketType";


type ChatBoxArgs = {
Expand Down Expand Up @@ -41,7 +41,7 @@ export default function ChatBox({ visible }: ChatBoxArgs) {
});


const getChatMessagesPacket: ChatMessagesRequest = {packetType: "chatMessagesRequest"};
const getChatMessagesPacket: ChatMessagesRequestPacket = {packetType: "chatMessagesRequest"};
serverConnection.send(getChatMessagesPacket);

return () => {
Expand Down
44 changes: 38 additions & 6 deletions src/components/GameLog.tsx
Original file line number Diff line number Diff line change
@@ -1,30 +1,62 @@
import { useEffect, useRef, } from "react";
import { useSelector } from "react-redux";
import { useContext, useEffect, useRef } from "react";
import { useDispatch, useSelector } from "react-redux";

import WebSocketConnection, { WebSocketServerPacketSubscription } from "~/lib/WebSocketConnection";
import { addGameLogMessage, populateGameLogFromPacket } from "~/store/GameData";

import { ServerConnectionContext } from "~/store/ServerConnectionContext";
import { IRootState } from "~/store/Store";

import { GameLogMessagesRequestPacket, GameLogMessagesSyncPacket, NewGameLogMessageSentPacket } from "~/types/PacketType";


type GameLogArgs = {
visible: boolean
};


export default function ChatBox({ visible }: GameLogArgs) {
const serverConnection = useContext(ServerConnectionContext) as WebSocketConnection;
const gameLog = useSelector((state: IRootState) => (state.gameDataReducer.gameLog));
const dispatch = useDispatch();

const endOfMessages = useRef<HTMLDivElement>(null);

useEffect(() => {
// This should only be called once per client (on page load) in theory, but technically the server can send this whenever it wants
const gameLogMessagesSyncSubscription = serverConnection.subscribeToServerPacket("gameLogMessagesSync", (packet) => {
packet = packet as GameLogMessagesSyncPacket;
dispatch(populateGameLogFromPacket(packet));
});

const gameLogMessageSubscription: WebSocketServerPacketSubscription = serverConnection.subscribeToServerPacket("newGameLogMessageSent", (packet) => {
packet = packet as NewGameLogMessageSentPacket;
dispatch(addGameLogMessage(packet));
});


const getGameLogMessagesPacket: GameLogMessagesRequestPacket = { packetType: "gameLogMessagesRequest" };
serverConnection.send(getGameLogMessagesPacket);

return () => {
serverConnection.unsubscribeFromServerPacket(gameLogMessageSubscription);
serverConnection.unsubscribeFromServerPacket(gameLogMessagesSyncSubscription);
};
}, []);

// Always move to the bottom
useEffect(() => {
endOfMessages.current?.scrollIntoView({behavior: "instant"});
endOfMessages.current?.scrollIntoView({ behavior: "instant" });
}, [gameLog]);

return (
visible ? <>
<br className="mt-1 lg:mt-4"/>
<br className="mt-1 lg:mt-4" />
<div className="-space-y-0 overflow-y-auto break-words text-sm lg:text-base lg:h-screen ">
{gameLog.map((message, index) => <p key={index}>{message.message}</p>)}
<div ref={endOfMessages} id="EOMMarker"></div>
</div>
<br className="mt-1 lg:mt-4"/>
</div>
<br className="mt-1 lg:mt-4" />
<div className="flex-grow"></div>
</> : <></>
);
Expand Down
5 changes: 0 additions & 5 deletions src/components/MainGameUI.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,6 @@ export default function MainGameUI() {
alert(packet.reason);
});

const newGameLogMessageSentSubscription = serverConnection.subscribeToServerPacket("newGameLogMessageSent", (packet) => {
packet = packet as NewGameLogMessageSentPacket;
dispatch(addGameLogMessage(packet));
});


// Trigger the initial UI population *after* we've setup the callbacks
const getGameInfoPacket: GameDataRequestPacket = { packetType: "gameDataRequest" };
Expand Down
8 changes: 5 additions & 3 deletions src/store/GameData.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { createSlice } from "@reduxjs/toolkit";

import { GameDataType } from "~/types/GameDataType";
import { GameDataSyncPacket, NewGameLogMessageSentPacket, NewRoundStartedPacket, PlayerShotAtPacket, TurnStartedPacket } from "~/types/PacketType";
import { GameDataSyncPacket, GameLogMessagesSyncPacket, NewGameLogMessageSentPacket, NewRoundStartedPacket, PlayerShotAtPacket, TurnStartedPacket } from "~/types/PacketType";
import { PlayerType } from "~/types/PlayerType";


Expand Down Expand Up @@ -37,6 +37,9 @@ export const gameDataSlice = createSlice({
setCurrentTurn: (state, action: {payload: TurnStartedPacket}) => {
state.currentTurn = action.payload.username;
},
populateGameLogFromPacket: (state, action: {payload: GameLogMessagesSyncPacket}) => {
state.gameLog = action.payload.messages;
},
addGameLogMessage: (state, action: {payload: NewGameLogMessageSentPacket}) => {
state.gameLog.push(action.payload.message);
},
Expand All @@ -58,10 +61,9 @@ export const gameDataSlice = createSlice({
state.gameStarted = action.payload.gameData.gameStarted;
state.currentTurn = action.payload.gameData.currentTurn;
state.gameID = action.payload.gameData.gameID;
state.gameLog = action.payload.gameData.gameLog;
}
}
});

export const {addPlayer, setClientUsername, setCurrentHost, onGameStarted, setCurrentTurn, addGameLogMessage, newRoundStarted, playerShotAt, populateGameDataFromPacket} = gameDataSlice.actions;
export const {addPlayer, setClientUsername, setCurrentHost, onGameStarted, setCurrentTurn, populateGameLogFromPacket, addGameLogMessage, newRoundStarted, playerShotAt, populateGameDataFromPacket} = gameDataSlice.actions;
export default gameDataSlice.reducer;
15 changes: 13 additions & 2 deletions src/types/PacketType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ export type ChatMessagesSyncPacket = {
messages: ChatMessageType[]
};

export type GameLogMessagesSyncPacket = {
packetType: "gameLogMessagesSync",
messages: GameLogMessageType[]
};

export type ShowAlertPacket = {
packetType: "showAlert",
content: string
Expand Down Expand Up @@ -181,10 +186,14 @@ export type SendNewChatMessagePacket = {
content: string
};

export type ChatMessagesRequest = {
export type ChatMessagesRequestPacket = {
packetType: "chatMessagesRequest"
};

export type GameLogMessagesRequestPacket = {
packetType: "gameLogMessagesRequest"
};

export type ServerPacket = (
| GameDataSyncPacket
| PlayerJoinedPacket
Expand All @@ -205,6 +214,7 @@ export type ServerPacket = (
| StealItemUsedPacket
| NewChatMessageSentPacket
| ChatMessagesSyncPacket
| GameLogMessagesSyncPacket
| ShowAlertPacket
| NewGameLogMessageSentPacket
);
Expand All @@ -223,7 +233,8 @@ export type ClientPacket = (
| UseQuickshotItemPacket
| UseStealItemPacket
| SendNewChatMessagePacket
| ChatMessagesRequest
| ChatMessagesRequestPacket
| GameLogMessagesRequestPacket
);

export type Packet = ServerPacket | ClientPacket;

0 comments on commit b5c51d2

Please sign in to comment.