function guardar_resultado_mesa($request) { $params = $request->get_json_params(); $torneo_id = intval($params['torneo_id'] ?? 0); $mesa_num = intval($params['mesa'] ?? 0); $resultados = isset($params['resultados']) && is_array($params['resultados']) ? $params['resultados'] : []; $user_id = intval($params['user_id'] ?? 0); // ------------------------------------------------- // 1. Seguridad básica // ------------------------------------------------- if (!is_user_logged_in()) { return rest_ensure_response([ 'success' => false, 'message' => 'Debes iniciar sesión.' ]); } $current_user_id = get_current_user_id(); if ($current_user_id !== $user_id) { return rest_ensure_response([ 'success' => false, 'message' => 'No puedes reportar resultados en nombre de otro usuario.' ]); } if ($torneo_id <= 0 || $mesa_num <= 0) { return rest_ensure_response([ 'success' => false, 'message' => 'Torneo o mesa inválidos.' ]); } // ------------------------------------------------- // 2. Obtener torneo // ------------------------------------------------- $datos = obtener_datos_bd_torneo($torneo_id); if (!$datos) { return rest_ensure_response([ 'success' => false, 'message' => 'Torneo no encontrado.' ]); } // ------------------------------------------------- // 3. Verificar estado del torneo // ------------------------------------------------- if ($datos['estado'] !== 'en_curso') { return rest_ensure_response([ 'success' => false, 'message' => 'El torneo no está actualmente en curso.' ]); } if (empty($datos['partidas']) || !is_array($datos['partidas'])) { return rest_ensure_response([ 'success' => false, 'message' => 'No existen partidas activas.' ]); } // ------------------------------------------------- // 4. Buscar la mesa // ------------------------------------------------- $mesa_encontrada = false; foreach ($datos['partidas'] as $k => &$partida) { if (intval($partida['mesa']) !== $mesa_num) { continue; } $mesa_encontrada = true; // ------------------------------------------------- // 5. No permitir modificar partidas terminadas // ------------------------------------------------- if (($partida['estado'] ?? '') === 'completado') { return rest_ensure_response([ 'success' => false, 'message' => 'Esta partida ya está completada y no puede modificarse.' ]); } // ------------------------------------------------- // 6. BYE // ------------------------------------------------- if (!empty($partida['es_bye'])) { return rest_ensure_response([ 'success' => false, 'message' => 'Una partida BYE no requiere reporte.' ]); } // ------------------------------------------------- // 7. Verificar jugadores // ------------------------------------------------- if ( empty($partida['jugadores']) || count($partida['jugadores']) !== 2 ) { return rest_ensure_response([ 'success' => false, 'message' => 'La mesa no tiene exactamente dos jugadores.' ]); } $jugador_ids = []; foreach ($partida['jugadores'] as $jugador) { $jugador_ids[] = intval($jugador['id']); } // El usuario debe pertenecer a esta mesa if (!in_array($current_user_id, $jugador_ids, true)) { return rest_ensure_response([ 'success' => false, 'message' => 'No perteneces a esta mesa.' ]); } // ------------------------------------------------- // 8. Validar que vienen exactamente los dos jugadores // ------------------------------------------------- if (count($resultados) !== 2) { return rest_ensure_response([ 'success' => false, 'message' => 'Debes proporcionar el resultado de ambos jugadores.' ]); } foreach ($jugador_ids as $jugador_id) { if (!array_key_exists($jugador_id, $resultados)) { return rest_ensure_response([ 'success' => false, 'message' => 'Falta el resultado de uno de los jugadores.' ]); } } // ------------------------------------------------- // 9. Convertir y validar puntuaciones // ------------------------------------------------- $puntos = []; foreach ($jugador_ids as $jugador_id) { $valor = $resultados[$jugador_id]; if ( is_array($valor) || is_object($valor) || !is_numeric($valor) ) { return rest_ensure_response([ 'success' => false, 'message' => 'Los resultados contienen valores inválidos.' ]); } $valor = intval($valor); // Para tu sistema actual: 0 a 3 puntos if ($valor < 0 || $valor > 3) { return rest_ensure_response([ 'success' => false, 'message' => 'Cada jugador debe tener entre 0 y 3 puntos.' ]); } $puntos[$jugador_id] = $valor; } $p1 = $puntos[$jugador_ids[0]]; $p2 = $puntos[$jugador_ids[1]]; // ------------------------------------------------- // 10. Validar combinación de resultado // ------------------------------------------------- // // Sistema actual: // // Victoria = 3-0 // Empate = 1-1 // Derrota = 0-3 // // No permitimos: // 3-3 // 2-1 // 2-0 // 3-1 // etc. // $resultado_valido = ( ($p1 === 3 && $p2 === 0) || ($p1 === 0 && $p2 === 3) || ($p1 === 1 && $p2 === 1) ); if (!$resultado_valido) { return rest_ensure_response([ 'success' => false, 'message' => 'Resultado inválido. Usa 3-0 para victoria o 1-1 para empate.' ]); } // ------------------------------------------------- // 11. Guardar resultados // ------------------------------------------------- foreach ($partida['jugadores'] as &$jugador) { $id = intval($jugador['id']); if (isset($puntos[$id])) { $jugador['puntos'] = $puntos[$id]; } // Este jugador confirma el resultado if ($id === $current_user_id) { $jugador['confirmado'] = true; } // Asegurar existencia del campo if (!isset($jugador['confirmado'])) { $jugador['confirmado'] = false; } } unset($jugador); // ------------------------------------------------- // 12. Comprobar confirmaciones // ------------------------------------------------- $todos_confirmaron = true; foreach ($partida['jugadores'] as $jugador) { if (empty($jugador['confirmado'])) { $todos_confirmaron = false; break; } } // ------------------------------------------------- // 13. Cambiar estado // ------------------------------------------------- if ($todos_confirmaron) { $partida['estado'] = 'completado'; $partida['resultado_confirmado'] = true; $partida['fecha_resultado'] = current_time('mysql'); } else { $partida['estado'] = 'pendiente_validacion'; $partida['resultado_confirmado'] = false; } unset($partida); break; } // ------------------------------------------------- // 14. Mesa no encontrada // ------------------------------------------------- if (!$mesa_encontrada) { return rest_ensure_response([ 'success' => false, 'message' => 'No se encontró la mesa indicada.' ]); } // ------------------------------------------------- // 15. Guardar torneo // ------------------------------------------------- guardar_datos_torneo($torneo_id, $datos); return rest_ensure_response([ 'success' => true, 'message' => 'Resultado registrado correctamente.', 'estado' => $datos['partidas'][$k]['estado'] ?? null ]); } https://tecolotegames.com.mx/wp-sitemap-posts-post-1.xmlhttps://tecolotegames.com.mx/wp-sitemap-posts-page-1.xmlhttps://tecolotegames.com.mx/wp-sitemap-posts-product-1.xmlhttps://tecolotegames.com.mx/wp-sitemap-posts-mailpoet_page-1.xmlhttps://tecolotegames.com.mx/wp-sitemap-posts-r3d-1.xmlhttps://tecolotegames.com.mx/wp-sitemap-taxonomies-category-1.xmlhttps://tecolotegames.com.mx/wp-sitemap-taxonomies-product_cat-1.xmlhttps://tecolotegames.com.mx/wp-sitemap-taxonomies-r3d_category-1.xml