gamelet-cli
Version:
Download project from code.gamelet.com, edit/test in vscode and sync back to server.
392 lines • 42.6 kB
JavaScript
"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(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJvb21NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZlci9tYW5hZ2Vycy9HYW1lcm9vbU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQW1EO0FBQ25ELG1EQUFnRDtBQUdoRCxtREFBNkQ7QUFDN0QsNkRBQTBEO0FBQzFELHlEQUF3RTtBQUV4RSxxREFBa0Q7QUFDbEQscURBQWlFO0FBQ2pFLCtDQUE0QztBQUU1QyxvREFBaUQ7QUFFakQsTUFBYSxlQUFnQixTQUFRLHlCQUFXO0lBVTVDLFlBQW9CLE1BQTBCO1FBQzFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRFQsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFSdEMsZ0JBQVcsR0FBZ0MsRUFBRSxDQUFDO1FBRXREOzs7V0FHRztRQUNLLGdCQUFXLEdBQW1ELEVBQUUsQ0FBQztJQUl6RSxDQUFDO0lBRU8sdUJBQXVCO1FBQzNCLElBQUksSUFBSSxHQUFXLHVCQUFVLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNCLElBQUksR0FBRyx1QkFBVSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFZO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxJQUFZO1FBQzVDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUMvQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJ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