import express, { Request, Response } from "express"; import * as http from 'http'; import WebSocket from "ws" import { decodeText, encodeText } from "./rtmt/byte_util"; import { encode } from "./rtmt/encode_decode_message"; import { RTMTWS } from "./rtmt/rtmt_websocket"; import cors from "cors" import { generateKey } from "./key_factory"; import { MatchMaker } from "./matcmaker"; import { channel_game_move, channel_leave_game, channel_new_game, channel_on_game_start, channel_on_game_update } from "./channel_names"; import { Bytes } from "./rtmt/rtmt"; import { createGame, Game, GameMove } from "./mancala"; const app = express(); app.use(cors()) const server = http.createServer(app); app.get("/", (req: Request, res: Response) => { res.send("Hello World"); }); app.get("/register/", (req: Request, res: Response) => { res.send(generateKey()); }); const port = process.env.PORT || 5000 server.listen(port, () => { console.log(`Server started on port ${port} :)`); }) const rtmt = new RTMTWS() rtmt.initWebSocket(server, (userKey : string) => { const game = gameStore.get(userKey) if(game){ rtmt.sendMessage(userKey, channel_on_game_update, encodeText(JSON.stringify(game))) } }) const matchmaker = new MatchMaker() rtmt.listenMessage(channel_new_game, (userKey: string, message: Bytes) => { matchmaker.find(userKey) }) const gameStore = new Map() matchmaker.onPlayersPaired = (userKey1: string, userKey2: string) => { const game = createGame(userKey1, userKey2) gameStore.set(userKey1, game) gameStore.set(userKey2, game) rtmt.sendMessage(userKey1, channel_on_game_start, encodeText(JSON.stringify(game))) rtmt.sendMessage(userKey2, channel_on_game_start, encodeText(JSON.stringify(game))) } rtmt.listenMessage(channel_game_move, (userKey: string, message: Bytes) => { const gameMove: GameMove = JSON.parse(decodeText(message)) const game = gameStore.get(userKey) if (game) { game.moveByIndex(gameMove.index, game.getPlayerNameByKey(userKey)) rtmt.sendMessage(game.player1, channel_on_game_update, encodeText(JSON.stringify(game))) rtmt.sendMessage(game.player2, channel_on_game_update, encodeText(JSON.stringify(game))) } else { console.log("Game not found!"); } }) rtmt.listenMessage(channel_leave_game, (userKey: string, message: Bytes) => { const game = gameStore.get(userKey) if(game){ gameStore.delete(game.player1) gameStore.delete(game.player2) } })