class Conexion { constructor(url, sala) { this.sala = sala; this.url = url; this.conectar(); this.timeout; $("#texto").keypress((e) => { var code = (e.keyCode ? e.keyCode : e.which); if (code == 13) { this.enviar_mensaje(); return true; } }); } conectar() { let usuario = encodeURIComponent(obtenerCookie("usuario")); let contrasenya = encodeURIComponent(obtenerCookie("contrasenya")); let pais = 'en_US'; this.webSocket = new WebSocket(this.url + '?pais=' + pais + '&usuario=' + usuario + '&contrasenya=' + contrasenya); this.webSocket.onopen = (message) => { this.wsOpen(message);}; this.webSocket.onmessage = (message) => { this.wsGetMessage(message);}; this.webSocket.onclose = (message) => { this.wsClose(message);}; this.webSocket.onerror = (message) => { this.wsError(message);}; } reconectar() { this.webSocket.close(); this.sala.vaciar_sala(); this.conectar(); } enviar_mensaje() { this.sala.juego.escribir_mensaje('', $("#texto").val().trim()); this.enviar("texto", encodeURIComponent($("#texto").val().trim())); $("#texto").val(""); $("#texto").focus(); } wsOpen(message) {} wsGetMessage(message) { console.log(message.data); const indice = message.data.indexOf(','); const accion = message.data.substring(0, indice); const params = message.data.substring(indice + 1); switch (accion) { case 'aceptar_partido': // Aceptar partido (color, duracion, rival) var split = params.split(","); this.sala.aceptar_partido(split[0], split[1], split[2]); break; case 'actualizar_tiempos': // Actualizar tiempos var tiempos = params.split('-'); this.sala.juego.actualizar_tiempos(parseInt(tiempos[0]), parseInt(tiempos[1])); this.sala.juego.pintar_tiempos(); break; case 'conexion_abierta': // Conexión abierta { jugadores, partidos, jugador, rival, color } this.sala.accion_conexion_abierta(JSON.parse(params)); break; case 'invitacion_cancelada': // quien this.sala.accion_invitacion_cancelada(params); break; case 'manda_tactica': // Rival manda táctica this.sala.juego.manda_tactica(JSON.parse(params)); break; case 'mostrar_ranking': // Ranking this.sala.juego.accion_mostrar_ranking(JSON.parse(params)); break; case 'movimiento_rival': // Movimiento del rival (moviomiento) this.sala.juego.movimiento_rival(JSON.parse(params)); break; case 'movimientos_turno_rival': // Fin de turno (tiempo_blancas-tiempo_negras,estado@moviomientos) var split = params.split('@'); var split2 = split[0].split(','); var tiempos = split2[0].split('-'); this.sala.juego.movimientos_turno_rival(parseInt(tiempos[0]), parseInt(tiempos[1]), split2[1], JSON.parse(split[1])); break; case 'movimientos_turno_bot': // Fin de turno (tiempo_blancas-tiempo_negras,estado@moviomientos) // Aquí se mandan los movimientos, no el tablero var split = params.split('@'); var split2 = split[0].split(','); var tiempos = split2[0].split('-'); this.sala.juego.movimientos_turno_bot(parseInt(tiempos[0]), parseInt(tiempos[1]), split2[1], JSON.parse(split[1])); break; case 'nuevo_observador': // Nuevo observador (nombre) this.sala.nuevo_observador(params); break; case 'nuevo_partido': // nuevo_partido (duracion, nombre_blancas, nombre_negras) var split = params.split(','); this.sala.nuevo_partido(split[0], split[1], split[2]); break; case 'nuevo_usuario': this.sala.accion_nuevo_usuario(JSON.parse(params)); break; case 'observar_partido': // Observar partido (blancas-negras, tiempo_blancas-tiempo_negras, duracion@tablero) // Tb para reconectar var split_params = params.split('@'); var split = split_params[0].split(','); var nombres = split[0].split('-'); var tiempos = split[1].split('-'); var duracion = split[2]; var estado = split[3]; var tablero = split_params[1]; this.sala.juego.observar_partido(nombres[0], nombres[1], parseInt(tiempos[0]), parseInt(tiempos[1]), parseInt(duracion), parseInt(estado), JSON.parse(tablero)); break; case 'partido_aceptado': // Partido aceptado -> informar (duracion, blancas-negras) var split = params.split(','); var jugadores = split[1].split('-'); this.sala.informar_partido(split[0], jugadores[0], jugadores[1]); break; case 'partido_cancelado': // Partido cancelado { jugador, jugadores, partidos } this.sala.juego.partido_cancelado(JSON.parse(params)); break; case 'partido_finalizado': // (tiempo_blancas-tiempo_negras, ganador, puntos_blancas, puntos_negras) var split = params.split(','); var tiempos = split[0].split('-'); this.sala.juego.partido_finalizado(parseInt(tiempos[0]), parseInt(tiempos[1]), split[1], parseInt(split[2]), parseInt(split[3])); break; case 'partido_privado': // Partido privado { color, duracion, rival } this.sala.partido_privado(JSON.parse(params)); break; case 'poner_away': // Poner away this.sala.poner_away(params); break; case 'ping': this.enviar('pong', null); break; case 'quitar_away': // Quitar away this.sala.quitar_away(params); break; case 'texto': // Texto (quien, mensaje) var split = params.split(','); this.sala.juego.escribir_mensaje(split[0], decodeURIComponent(split[1])); break; case 'usuario_desconectado': this.sala.usuario_desconectado(params); break; case 'volver_a_jugar': // Volver a jugar this.sala.juego.volver_a_jugar(); break; default: alert('Acción incorrecta: ' + accion); } } wsClose(message) { console.log(message.code, message.reason); this.sala.juego.escribir_servidor(null, '???connection.disconnected???'); this.sala.vaciar_sala(); if (message.code == 1001 || message.code == 1002 || message.code == 1003 || message.code == 1008) { // 1001 = La sesión ha caducado // 1002 = Nombre o contraseña incorrectos, http 500 // 1003 = Se ha realizado otra conexión desde la misma sesión // 1008 = Nombre o contraseña incorrectos $('.modal-footer .bootbox-accept').prop('disabled', false); $('#span_email').hide(); this.mostrar_reconectar(); mostrar_mensaje(message.reason, true); } else { // 1012 = No hay jugador en la sesión location.reload(); } } mostrar_reconectar() { $('#boton_nuevo').hide(); $('#boton_cancelar').hide(); $('#boton_reconectar').show(); } wsError(message) { showToast.show(message.reason, 4000); console.log('Error: ' + message); reconectar(); } enviar(accion, params) { var data = { accion: accion, params: params }; this.webSocket.send(JSON.stringify(data)); } }