server.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. 'use strict';
  2. import PlayerId from './players/player-id';
  3. import DuelController from './game-server/duel-controller';
  4. import MariadbConnector from './db/mariadb-connector';
  5. import ServerToolListner from './tools/server-tool-listener';
  6. function Server() {
  7. console.log('Starting 12 heroes server');
  8. const io = require('socket.io');
  9. const server = io.listen(2610);
  10. let mariadbConn = new MariadbConnector();
  11. let authorizedPlayers = new Map();
  12. let connectedPlayers = new Map();
  13. let authorizedPlayersNames = new Set();
  14. // let players = [];
  15. // let addNewPlayer = function (playerSocket, playerName) {
  16. // console.log('players length : ' + players.length + ' : ' + players);
  17. // if (players.length < 2) {
  18. // let newPlayer = new PlayerId(playerSocket, playerName);
  19. // console.log('push player : ' + newPlayer);
  20. // players.push(newPlayer);
  21. // }
  22. // if (players.length === 2) {
  23. // let duelController = new DuelController(players[0], players[1]);
  24. // }
  25. // };
  26. server.on('connection', function (socket) {
  27. console.log("A player connected with id : " + socket.id);
  28. socket.on('disconnect', (reason) => {
  29. if (reason === 'client namespace disconnect') {
  30. console.log("A player disconnected with id : " + socket.id);
  31. let playerName = connectedPlayers.get(socket.id);
  32. if (playerName) {
  33. connectedPlayers.delete(socket.id);
  34. authorizedPlayers.get(playerName).setConnected(false);
  35. authorizedPlayers.get(playerName).setSocket(null);
  36. console.log(playerName + " disconnected");
  37. }
  38. } else {
  39. console.log("disconnected unexpectidly with reason : " + reason);
  40. }
  41. });
  42. socket.on('connect', () => {
  43. console.log("Connected to server");
  44. });
  45. socket.on('auth', async (playerName, callback) => {
  46. console.log(' Received auth message, player name : ' + playerName);
  47. await updatePlayersFromDb();
  48. let response = {};
  49. let kickout = false;
  50. if (!authorizedPlayersNames.has(playerName)) {
  51. response = {
  52. res: "ko",
  53. message: playerName + " Not found"
  54. };
  55. kickout = true;
  56. }
  57. // If the player is already connected and active
  58. else if (authorizedPlayers.get(playerName).isConnected()
  59. && authorizedPlayers.get(playerName).getSocket().connected) {
  60. response = {
  61. res: "ko",
  62. message: playerName + " already connected"
  63. };
  64. kickout = true;
  65. }
  66. else {
  67. // Player marked as connected but socket is down
  68. if (authorizedPlayers.get(playerName).isConnected()) {
  69. authorizedPlayers.get(playerName).getSocket().disconnect(true);
  70. }
  71. response = {
  72. res: "ok",
  73. message: playerName + " connected"
  74. };
  75. authorizedPlayers.get(playerName).setConnected(true);
  76. authorizedPlayers.get(playerName).setSocket(socket);
  77. connectedPlayers.set(socket.id, playerName);
  78. }
  79. callback(response);
  80. if (kickout === true) {
  81. setTimeout(() => {
  82. socket.disconnect(true);
  83. }, 600);
  84. }
  85. });
  86. socket.on('games-list', async (playerName, callback) => {
  87. console.log(' Received games-list message, player name : ' + playerName);
  88. let response = {};
  89. try {
  90. let games = await getNonFinishedGames(playerName);
  91. response = {
  92. res: "ok",
  93. message: games
  94. };
  95. } catch (error) {
  96. response = {
  97. res: "ko",
  98. message: 'Error from server'
  99. };
  100. }
  101. callback(response);
  102. });
  103. socket.on('create-game', async (game, callback) => {
  104. console.log('ICINORMALEMENT');
  105. let response = {};
  106. try {
  107. let games = await addGameDb(game);
  108. response = {
  109. res: "ok",
  110. message: games
  111. };
  112. } catch (error) {
  113. response = {
  114. res: "ko",
  115. message: 'Error from server'
  116. };
  117. }
  118. callback(response);
  119. });
  120. });
  121. let updatePlayersFromDb = async function () {
  122. try {
  123. let usernames = await mariadbConn.getUsernames();
  124. authorizedPlayersNames = new Set(usernames);
  125. console.log('authorizedPlayersNames update : ', authorizedPlayersNames);
  126. authorizedPlayersNames.forEach(name => {
  127. if (!authorizedPlayers.has(name)) {
  128. console.log('New username authorized :', name);
  129. authorizedPlayers.set(name, new PlayerId(name));
  130. }
  131. });
  132. return 'ok';
  133. } catch (error) {
  134. console.log('Error getting usernames from DB : ', error);
  135. return error.Error;
  136. }
  137. };
  138. let getCurrentListAuthorizedPlayers = function () {
  139. return [...authorizedPlayersNames];
  140. };
  141. let addPlayerDb = async function (username) {
  142. console.log('add player in db : ' + username);
  143. try {
  144. let response = await mariadbConn.addPlayer(username);
  145. authorizedPlayersNames.add(username);
  146. authorizedPlayers.set(username, new PlayerId(username));
  147. return 'OK ' + JSON.stringify(response);
  148. } catch (err) {
  149. return 'KO ' + err.message;
  150. }
  151. };
  152. let removePlayerDb = async function (username) {
  153. console.log('remove player in db : ' + username);
  154. try {
  155. let response = await mariadbConn.removePlayer(username);
  156. authorizedPlayersNames.delete(username);
  157. authorizedPlayers.delete(username);
  158. return 'OK ' + JSON.stringify(response);
  159. } catch (err) {
  160. return 'KO ' + err.message;
  161. }
  162. };
  163. let addGameDb = async function (game) {
  164. try {
  165. let response = await mariadbConn.addNewGame(game);
  166. return 'OK ' + JSON.stringify(response);
  167. } catch (err) {
  168. return 'KO ' + err.message;
  169. }
  170. };
  171. let removeGameDb = async function (method, ...args) {
  172. try {
  173. let response;
  174. switch (method) {
  175. case 'byId':
  176. response = await mariadbConn.removeGameById(args[0]);
  177. break;
  178. case 'byPlayer1':
  179. response = await mariadbConn.removeGamesByPlayer1(args[0]);
  180. break;
  181. case 'byPlayerAny':
  182. response = await mariadbConn.removeGamesByPlayerAny(args[0]);
  183. break;
  184. case 'byStatus':
  185. response = await mariadbConn.removeGamesByStatus(args[0]);
  186. break;
  187. case 'byDays':
  188. response = await mariadbConn.removeGamesByDays(args[0]);
  189. break;
  190. case 'finishedByDays':
  191. response = await mariadbConn.removeFinishedGamesByDays(args[0]);
  192. break;
  193. default:
  194. return 'KO : Unknown method to remove game from DB : ' + method;
  195. }
  196. return 'OK ' + JSON.stringify(response);
  197. } catch (err) {
  198. return 'KO ' + err.message;
  199. }
  200. };
  201. let getNonFinishedGames = async function (username) {
  202. try {
  203. let games = await mariadbConn.getNonFinishedGamesForPlayer(username);
  204. return games;
  205. } catch (err) {
  206. console.log('KO : not able to get games : ' + err);
  207. throw err;
  208. }
  209. };
  210. return {
  211. updatePlayersFromDb,
  212. getCurrentListAuthorizedPlayers,
  213. addPlayerDb,
  214. removePlayerDb,
  215. addGameDb,
  216. removeGameDb,
  217. getNonFinishedGames
  218. };
  219. }
  220. let server = new Server();
  221. let serverToolListner = new ServerToolListner(server);
  222. serverToolListner.listen(1664);