serverjs/Server/remoteFunctions.js

 'use strict';

/**
* @module
*/

/**
* Создает функции для вызова клиентами.
* @param  {Server} server сервер, которые вызвается клиентами
* @return {object<function>}        Копии функций, описанных ниже.
*/
module.exports = function(server){
	return {

		/**
		* Принимает выполненое действие от клиента
		* @param  {object} action действие
		*/
		recieveCompleteAction(action){
			if(!action){
				return;
			}
			let player = server.players[this.connection.id];
			if(player){
				player.sendResponse(action);
			}
		},

		/**
		* Принимает пустой ответ от клиента
		*/
		recieveResponse(){
			let player = server.players[this.connection.id];
			if(player){
				player.sendResponse();
			}
		},

		/**
		* Переподключает клиента к существующему экземпляру игрока
		* @param  {string} connId старый id клиента
		*/
		reconnectClient(connId){
			let newConnId = this.connection.id;
			let player = server.players[connId];

			// Переподключаем клиента, если экземпляр игрока:
			// 	отключен (может быть открыто несколько вкладок)
			// 	находится в игре
			// 	игра в процессе (не идет голосование за рестарт)

			if(player && !player.connected && player.game && player.game.isRunning){
				server.players[newConnId] = player;
				server.deletePlayer(connId);
				player.updateRemote(newConnId, server.clients[newConnId].remote);
			}
			// Иначе сообщаем игроку, что переподключиться нельзя
			else{
				let str = 'Can\'t reconnect ' + connId + ': ';
				if(!player){
					str += 'player not found';
				}
				else if(player.connected){
					str += 'player already connected';
				}
				else if(!player.game){
					str += 'player not in a game';
				}
				else if(!player.game.isRunning){
					str += 'game has ended';
				}
				server.log.notice(str);
				let newPlayer = server.players[newConnId];

				// Если новый игрок успел подключиться к чему-то до окончания подключения
				server.manager.freePlayer(newPlayer);

				// Сообщаем игроку, что переподключиться не удалось
				newPlayer.updateRemote();
			}
		},

		/**
		* Финализация переподключения игрока.
		* Запрашивает полную информацию об игре от игры и разрешает экземпляру
		* игрока передавать информацию от игры клиенту.
		*/
		requestGameInfo(){
			let player = server.players[this.connection.id];
			if(player){
				server.manager.reconnectPlayer(player);
			}
		},

		/**
		* Отправляет игроку список очередей.
		* @param  {number} page       страница очередей
		* @param  {number} pagination кол-во очередей на страницу
		*/
		requestQueueList(page, pagination, hideStarted){
			let player = server.players[this.connection.id];
			if(!player){
				return;
			}
			let action = server.manager.getQueueList(page, pagination, hideStarted);
			player.recieveMenuNotification(action);
		},

		/**
		* Передает менеджеру очередей информацию для создания новой очереди.
		* @param {Boolean} isPrivate   является ли очередь скрытой
		* @param {string}  gameMode    режим игры
		* @param {object}  queueConfig      конфигурация очереди
		* @param {object}  [gameRules] конфигурация игры
		*/
		createCustomQueue(isPrivate, gameMode, queueConfig, gameRules){
			let player = server.players[this.connection.id];
			if(!player){
				return;
			}
			server.manager.addCustomQueue(player, isPrivate, gameMode, queueConfig, gameRules);
		},

		/**
		* Подключает игрока к очереди по id.
		* @param  {string} id
		*/
		joinCustomQueue(id){
			let player = server.players[this.connection.id];
			if(player){
				server.manager.addPlayerToCustomQueue(player, id);
			}
		},

		/**
		* Добавляет игрока в очередь
		*/
		quickQueueUpClient(){
			let player = server.players[this.connection.id];
			if(player){
				server.manager.addPlayerToQuickQueue(player);
			}
		},

		/**
		* Сообщает менеджеру очередей, что нужно запустить очередь в которой находится игрок с ботами.
		*/
		voteForPrematureStart(){
			let player = server.players[this.connection.id];
			if(!player || !player.queue){
				return;
			}
			player.queue.voteForPrematureStart(player);
		},

		/**
		* Сообщает менеджеру, что нужно убрать игрока из игры.
		*/
		concedeClient(){
			let player = server.players[this.connection.id];
			if(player){
				server.manager.freePlayer(player);
			}
		},

		/**
		* Сообщает игре, в которой находится игрок, что курсор находится над картой с указанным id.
		* @param  {string} cid id карты
		*/
		hoverOverCard(cid){
			let player = server.players[this.connection.id];
			if(player && player.game){
				player.game.hoverOverCard(player, cid);
			}
		},

		/**
		* Сообщает игре, в которой находится игрок, что курсор больше не находится над картой с указанным id.
		* @param  {string} [cid] id карты
		*/
		hoverOutCard(cid){
			let player = server.players[this.connection.id];
			if(player && player.game){
				player.game.hoverOutCard(player, cid);
			}
		},

		changeClientName(name){
			server.changePlayerName(this.connection.id, name);
		}
	};
};