Todo comienza cuando un usuario solicita ser emparejado para un juego mediante un evento a travez de un socket (1_in_matchEngine_requestGame). Cuando el servidor recibe la solicitud, se verifica que se este escuchando el 'bote' (es un arreglo con objetos [userRequestToPlay]#userrequesttoplay) ) desde firebase, y si no se esta escuchando, se realiza el llamado para cargar el estado del bote. Posteriormente, se verifica si en el bote se tiene otro usuario con el que se pueda realizar el match. Si no se tiene, se adiciona el usuario al bote y queda a la espera de que llegue otros usuario con el que se pueda emparejar. Si se ha logrado emparejar, se crea una partida y se envía la información de la partida a los usuarios del match por otro socket (2_out_matchEngine_readyMatch) , y se remueven los usuarios del bote. A su vez se registra la partida en firebase y se crea el reloj (se almacena en un arreglo clock) para la partida. Luego se crea un objeto (chessInstance) que se almacena en un arreglo para realizar validaciones sobre los movimientos enviados para la partida.
Enviar jugada: La jugada se recibe por el socket 3_in_game_move se procesa según el objeto (chessInstance), si es valida, se detiene el reloj y se envía la jugada al otro usuario; emitiendo la jugada por el socket 4_out_game_move(move):. Si no es valida, se envía un mensaje de error al usuario por ese mismo socket (por definir estructura de error). Se modifica la partida en firebase y se actualiza el reloj correspondiente.
1_in_matchEngine_requestGame (userRequestToPlay):
Cuando un usuario solicita emparejarse para jugar.
2_out_matchEngine_readyMatch(game)):
Comunica al usuario que se ha emparejado con otro usuario. y envía la información de la partida.
3_in_game_move(move):
Recibe la jugada que debe ser procesada para una partida en especifico
4_out_game_move(move):
Emite una jugada realizada en una partida
5_out_clock_update(clock):
Emite la actualización del tiempo en un reloj
6_out_game_end(endGame):
- uidUser: string;
- time: number; // tiempo para el juego ejm: 10 minutes
- timeIncrement: number; // Cantidad de milisegundos para incrementar en cada jugada
- lang: string; // 2 caracteres
- elo: number;
- color: white | black | random;
- country: string; // 3 caracteres
- createAt: number; //(auto generado al ingresar al bote) / fecha para dar prioridad si lleva mucho tiempo esperando
- uid: string //(auto generado)
- white: UserRequestToPlay;
- black: UserRequestToPlay;
- timeControl: number; // tiempo para el juego ejm: 10 minutes
- createAt: number;
- uidChessInstance: string; //(auto generado)
- uid: string;
- result: string; // '1-0' | '0-1' | '1/5 1/5' | '*'
- motive: string; // 'blackCountdown' | 'whiteCountdown' | 'blackOut' | 'whiteOut' | 'whiteResign' | 'blackResign' | '#' | 'whiteTimeOut' | 'blackTimeOut'
- uidGame: string;
- intervalClockWhiteCountDown: any;
- intervalClockBlackCountDown: any;
- intervalClockWhite: any;
- intervalClockBlack: any;
- currentTimeWhite: number;
- currentTimeBlack: number;
- totalTime: number;
- timeIncrement: number;
- createAt: number;
- uid: string;
- time: number;
- type: 'white' | 'black' | 'whiteCountDown' | 'blackCountDown';
- uid: string //(auto generado)
- chessInstance: any;
- uidGame: string;
- fens: string[];
- moves: string[];
- uid: string;
- uidGame: string;
- uidUser: string;
- from: string;
- to: string;
- fen: string;
- color: string;
- piece: string;
- sean: string;
- createAt: number;