UNPKG

gamelet-cli

Version:

Download project from code.gamelet.com, edit/test in vscode and sync back to server.

392 lines 42.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GameroomManager = void 0; const ObjectUtil_1 = require("./../utils/ObjectUtil"); const ClientManager_1 = require("./ClientManager"); const Message_1 = require("./../messages/Message"); const GameroomBase_1 = require("./../entities/GameroomBase"); const ListFilter_1 = require("./../entities/ListFilter"); const Gamezone_1 = require("./../entities/Gamezone"); const Gameroom_1 = require("./../entities/Gameroom"); const ManagerBase_1 = require("./ManagerBase"); const StringUtil_1 = require("../utils/StringUtil"); class GameroomManager extends ManagerBase_1.ManagerBase { constructor(server) { super('GameroomManager'); this.server = server; this.gameroomMap = {}; /** * first key: client key * second key: gameZone code */ this.gamezoneMap = {}; } generateNewGameroomCode() { let code = StringUtil_1.StringUtil.generateRandomString(10); while (this.getGameroom(code)) { code = StringUtil_1.StringUtil.generateRandomString(10); } return code; } getGameroom(code) { return this.gameroomMap[code]; } getGameroomByName(zoneCode, name) { for (let code in this.gameroomMap) { let room = this.gameroomMap[code]; if (room.name == name && room.gamezone.code == zoneCode) { return room; } } return null; } getOrCreateGamezone(client, code) { let zoneMap = this.gamezoneMap[client.key]; if (zoneMap) { return zoneMap[code] || this.createGameZone(client, code); } else { this.gamezoneMap[client.key] = {}; } return this.createGameZone(client, code); } getGamezone(client, code) { let zoneMap = this.gamezoneMap[client.key]; return zoneMap && zoneMap[code]; } getClientZone(client) { return this.getOrCreateGamezone(client, '/Sys/Ch'); } createGameZone(client, code) { let zone = new Gamezone_1.Gamezone(code, this.server, client); this.gamezoneMap[client.key][code] = zone; zone.once(GameroomBase_1.GameroomBase.EVENT.DISPOSED, () => { delete this.gamezoneMap[client.key][code]; }); zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_REMOVED, (p) => { zone.broadcast(Message_1.Message.forPlayerLeftZone(zone.code, p.code)); }); zone.on(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED, () => { zone.broadcast(Message_1.Message.forZoneStatusChanged(zone)); }); zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATE_CHANGED, (p, key, value) => { zone.broadcast(Message_1.Message.forZonePlayerStateChanged(zone.code, p.code, key, value, zone.getBrainer().code)); }); zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATES_CHANGED, (p, states) => { zone.broadcast(Message_1.Message.forZonePlayerStatesChanged(zone.code, p.code, states, zone.getBrainer().code)); }); zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, (p, value, brainerCode) => { zone.broadcast(Message_1.Message.forZonePlayerSyncedChanged(zone.code, p.code, value, brainerCode)); }); return zone; } createOrJoinGameroom(player, gamezoneCode, gameroomName, password, maxPlayers, state, stateJson, allowGuest) { let gameroom = this.getGameroomByName(gamezoneCode, gameroomName); if (gameroom) { return this.joinGameroom(player, gameroom.code, password); } else { return this.createGameroom(player, gamezoneCode, gameroomName, password, maxPlayers, state, stateJson, allowGuest); } } createGameroom(player, gamezoneCode, gameroomName, password, maxPlayers, state, stateJson, allowGuest) { this.designContract(!player.getGameroom(), 'Already in a gameroom'); let gamezone = this.getOrCreateGamezone(player.client, gamezoneCode); let gameroom = new Gameroom_1.Gameroom(this.server, player.client, this.generateNewGameroomCode(), player, gamezone, gameroomName, password, maxPlayers, state, stateJson, allowGuest); this.gameroomMap[gameroom.code] = gameroom; gameroom.once(GameroomBase_1.GameroomBase.EVENT.DISPOSED, () => { delete this.gameroomMap[gameroom.code]; gamezone.broadcast(Message_1.Message.forRoomClosed(gameroom)); }); gamezone.addGameroom(gameroom); gameroom.addPlayer(player); gamezone.broadcast(Message_1.Message.forRoomCreated(gameroom)); gameroom.on(GameroomBase_1.GameroomBase.EVENT.BRAINER_CHANGED, () => { if (gameroom.getBrainer()) { gameroom.broadcast(Message_1.Message.forRoomBrainerChanged(gameroom)); } }); gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_ADDED, (p) => { gameroom.broadcast(Message_1.Message.forPlayerJoinedRoom(gameroom.code, p)); }); gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_REMOVED, (p) => { gameroom.broadcast(Message_1.Message.forPlayerLeftRoom(gameroom.code, p.code)); }); gameroom.on(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED, () => { gameroom.broadcast(Message_1.Message.forRoomStatusChanged(gameroom)); gamezone.broadcast(Message_1.Message.forRoomStatusChanged(gameroom)); }); gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATE_CHANGED, (p, key, value) => { gameroom.broadcast(Message_1.Message.forRoomPlayerStateChanged(gameroom.code, p.code, key, value)); }); gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATES_CHANGED, (p, states) => { gameroom.broadcast(Message_1.Message.forRoomPlayerStatesChanged(gameroom.code, p.code, states)); }); gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, (p, value, brainerCode) => { gameroom.broadcast(Message_1.Message.forRoomPlayerSyncedChanged(gameroom.code, p.code, value, brainerCode)); }); return Promise.resolve(gameroom); } joinGameroom(player, gameroomCode, password) { this.designContract(!player.getGameroom(), 'Already in a gameroom'); let gameroom = this.getGameroom(gameroomCode); this.designContract(gameroom, 'Gameroom not found'); this.designContract(gameroom.state == Gameroom_1.GameroomState.OPEN, 'The room is currently not open for joining.'); this.designContract(!gameroom.password || gameroom.password == password, 'Password not matched'); gameroom.addPlayer(player); return Promise.resolve(gameroom); } leaveGameroom(player, gameroomCode) { let gameroom = gameroomCode ? this.getGameroom(gameroomCode) : player.getGameroom(); this.designContract(gameroom, 'Gameroom not found'); gameroom.removePlayer(player); return Promise.resolve(gameroom.code); } enterGamezone(player, gamezoneCode) { let gamezone = this.getOrCreateGamezone(player.client, gamezoneCode); gamezone.addPlayer(player); return Promise.resolve(gamezone); } leaveGamezone(player, gamezoneCode) { let gamezone = this.getGamezone(player.client, gamezoneCode); if (gamezone) { gamezone.removePlayer(player); } return Promise.resolve(true); } queryGameroom(player, gameroomCode) { let gameroom = this.getGameroom(gameroomCode); this.designContract(gameroom, 'The gameroom is closed.'); this.designContract(gameroom.client == player.client, 'The gameroom is not in your current game.'); return Promise.resolve(gameroom); } listGamerooms(client, gamezoneCode, length, filter) { length = Math.min(100, length); let gamezone = this.getGamezone(client, gamezoneCode); if (gamezone) { return Promise.resolve(gamezone.listGamerooms((0, ListFilter_1.parsePropFilter)(filter), length)); } else { return Promise.resolve([]); } } listPlayersInGameroom(player) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); return Promise.resolve(gameroom.listPlayers()); } listPlayersOfGameroom(_player, gameroomCode) { let gameroom = this.getGameroom(gameroomCode); this.designContract(gameroom, 'The gameroom is closed.'); return Promise.resolve(gameroom.listPlayers()); } setGameroomState(player, state, stateJson) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); this.designContract(gameroom.getBrainer() == player, 'Not the decision maker.'); gameroom.state = state; stateJson && ObjectUtil_1.ObjectUtil.safeAssign(gameroom.stateJson, stateJson); gameroom.emit(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED); return Promise.resolve(gameroom); } setGameroomStateJson(player, stateJson) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); this.designContract(gameroom.getBrainer() == player, 'Not the decision maker.'); stateJson && ObjectUtil_1.ObjectUtil.safeAssign(gameroom.stateJson, stateJson); gameroom.emit(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED); return Promise.resolve(gameroom); } setRoomPlayerState(player, key, value) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); gameroom.setPlayerState(player, key, value); return Promise.resolve(true); } setRoomPlayerStates(player, states) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); gameroom.setPlayerStates(player, states); return Promise.resolve(true); } setRoomPlayerSynced(player, value, updateBrainer) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); return gameroom.setPlayerSynced(player, value, updateBrainer) .then(() => gameroom.getBrainer().code); } updateRoomBrainer(player) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); this.designContract(gameroom.getBrainer() == player, 'Not the decision maker.'); return gameroom.updateBrainer(true) .then(brainer => brainer.code); } broadcastToRoom(player, gameroomCode, data) { let gameroom = this.getGameroom(gameroomCode); this.designContract(gameroom, 'The gameroom is closed.'); gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ROOM, player.code, gameroom.code, data), player); return Promise.resolve(gameroom.playersCount); } broadcastToRoom2(player, gameroomCode, data) { let gameroom = this.getGameroom(gameroomCode); this.designContract(gameroom, 'The gameroom is closed.'); gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ROOM, player.code, gameroom.code, data), player); return Promise.resolve({ p: gameroom.playersCount, t: Date.now(), }); } broadcastInRoom(player, data) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_ROOM, player.code, gameroom.code, data), player); return Promise.resolve(gameroom.playersCount); } broadcastInRoom2(player, data) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_ROOM, player.code, gameroom.code, data), player); return Promise.resolve({ p: gameroom.playersCount, t: Date.now(), }); } broadcastToZone(player, gamezoneCode, data) { let gamezone = this.getGamezone(player.client, gamezoneCode); if (gamezone) { gamezone.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ZONE, player.code, gamezone.code, data), player); return Promise.resolve(gamezone.playersCount); } else { return Promise.resolve(0); } } broadcastToZone2(player, gamezoneCode, data) { let gamezone = this.getGamezone(player.client, gamezoneCode); if (gamezone) { gamezone.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ZONE, player.code, gamezone.code, data), player); return Promise.resolve({ p: gamezone.playersCount, t: Date.now(), }); } else { return Promise.resolve({ p: 0, t: Date.now(), }); } } broadcastInProject(monitor, project, data) { let msg = Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_PROJECT, monitor.code, '', data); let count = 0; for (let client of project.listClients()) { let gamezone = this.getClientZone(client); gamezone.broadcast(msg); count += client.playersCount; } return Promise.resolve(count); } broadcastInGamelet(monitor, data) { let msg = Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_GAMELET, monitor.code, '', data); let count = 0; for (let project of ClientManager_1.clientManager.listProjects()) { for (let client of project.listClients()) { let gamezone = this.getClientZone(client); gamezone.broadcast(msg); count += client.playersCount; } } return Promise.resolve(count); } sendDataToRoommate(player, playerCode, data) { let gameroom = player.getGameroom(); this.designContract(gameroom, 'Not in any gameroom'); let target = gameroom.getPlayer(playerCode); this.designContract(target, 'Target player not in this gameroom'); return target.send(Message_1.Message.forDataToRoommate(player, data)); } sendDataToRoomDecisionmaker(player, gameroomCode, data) { let gameroom = this.getGameroom(gameroomCode); this.designContract(gameroom, 'The gameroom is closed.'); let target = gameroom.getBrainer(); this.designContract(target, 'Decision maker not in the gameroom'); let senderRoom = player.getGameroom(); return target.send(Message_1.Message.forDataToRoomDecisionmaker(player, senderRoom ? senderRoom.code : '', gameroom.code, data)); } setZonePlayerState(player, zoneCode, key, value) { let gamezone = this.getGamezone(player.client, zoneCode); this.designContract(gamezone, 'The zone does not exist.'); gamezone.setPlayerState(player, key, value); return Promise.resolve(true); } setZonePlayerStates(player, zoneCode, states) { let gamezone = this.getGamezone(player.client, zoneCode); this.designContract(gamezone, 'The zone does not exist.'); gamezone.setPlayerStates(player, states); return Promise.resolve(true); } setZonePlayerSynced(player, zoneCode, value, updateBrainer) { let gamezone = this.getGamezone(player.client, zoneCode); this.designContract(gamezone, 'The zone does not exist.'); return gamezone.setPlayerSynced(player, value, updateBrainer) .then(() => gamezone.getBrainer().code); } getZonePlayerStates(player, zoneCode, playerCode) { let gamezone = this.getGamezone(player.client, zoneCode); this.designContract(gamezone, 'The zone does not exist.'); let target = gamezone.getPlayer(playerCode); this.designContract(target, 'The player is not in the zone.'); return Promise.resolve(gamezone.getPlayerStates(target)); } getZonePlayersStates(player, zoneCode) { let gamezone = this.getGamezone(player.client, zoneCode); this.designContract(gamezone, 'The zone does not exist.'); return Promise.resolve(gamezone.getPlayersStates()); } setZoneStates(player, zoneCode, stateJson) { let gamezone = this.getGamezone(player.client, zoneCode); this.designContract(gamezone, 'The zone does not exist.'); this.designContract(gamezone.includesPlayer(player), 'You are not in the zone'); stateJson && ObjectUtil_1.ObjectUtil.safeAssign(gamezone.stateJson, stateJson); gamezone.emit(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED); return Promise.resolve(gamezone); } getZoneStatistics(client, zoneCode) { let statistics = { code: zoneCode, players: 0, rooms: { open: { count: 0, players: 0 }, locked: { count: 0, players: 0 }, over: { count: 0, players: 0 }, all: { count: 0, players: 0 } } }; let zone = this.getGamezone(client, zoneCode); if (zone) { statistics.players = zone.playersCount; let rooms = zone.listAllGamerooms(); statistics.rooms.all.count = rooms.length; for (let room of rooms) { if (room.state == Gameroom_1.GameroomState.OPEN) { ++statistics.rooms.open.count; statistics.rooms.open.players += room.playersCount; } else if (room.state == Gameroom_1.GameroomState.LOCKED) { ++statistics.rooms.locked.count; statistics.rooms.locked.players += room.playersCount; } else if (room.state == Gameroom_1.GameroomState.OVER) { ++statistics.rooms.over.count; statistics.rooms.over.players += room.playersCount; } statistics.rooms.all.players += room.playersCount; } } return Promise.resolve(statistics); } } exports.GameroomManager = GameroomManager; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJvb21NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZlci9tYW5hZ2Vycy9HYW1lcm9vbU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQW1EO0FBQ25ELG1EQUFnRDtBQUdoRCxtREFBNkQ7QUFDN0QsNkRBQTBEO0FBQzFELHlEQUF3RTtBQUV4RSxxREFBa0Q7QUFDbEQscURBQWlFO0FBQ2pFLCtDQUE0QztBQUU1QyxvREFBaUQ7QUFFakQsTUFBYSxlQUFnQixTQUFRLHlCQUFXO0lBVTVDLFlBQW9CLE1BQTBCO1FBQzFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRFQsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFSdEMsZ0JBQVcsR0FBZ0MsRUFBRSxDQUFDO1FBRXREOzs7V0FHRztRQUNLLGdCQUFXLEdBQW1ELEVBQUUsQ0FBQztJQUl6RSxDQUFDO0lBRU8sdUJBQXVCO1FBQzNCLElBQUksSUFBSSxHQUFXLHVCQUFVLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxHQUFHLHVCQUFVLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBWTtRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUM1QyxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksSUFBSSxD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