togethere.cloud/private_html/api/match_integration_example.php

314 lines
9.8 KiB
PHP

<?php
/**
* match_integration_example.php
*
* Przykład integracji endpoint'u ustawień z systemem meczy
* Pokazuje jak pracować ze snapshot'ami
*
* Nie uruchamiaj ten plik bezpośrednio - to jest tylko przykład!
*/
// ===== PRZYKŁAD 1: Startup gry - pobierz snapshot =====
echo "PRZYKŁAD 1: Pobierz snapshot na start meczu\n";
echo "=============================================\n\n";
/*
require_once __DIR__ . '/api/DisciplineSettingsModel.php';
$model = new DisciplineSettingsModel($pdo);
// Pobierz snapshot (bieżąca wersja)
$snapshot = $model->getSnapshot('ping-pong');
echo "Snapshot:\n";
echo json_encode($snapshot, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
// Zwróć do gry (JavaScript)
echo "Gra otrzymuje:\n";
echo "- Reguły (pointsToWin, setsToWin, itd.)\n";
echo "- Wersję (do logów)\n";
echo "- Timestamp (do auditowania)\n";
*/
// ===== PRZYKŁAD 2: Zapis snapshot'u w meczu =====
echo "PRZYKŁAD 2: Zapisz snapshot w bazie danych\n";
echo "===========================================\n\n";
/*
// W momencie startu meczu
$matchData = [
'team1_id' => 1,
'team2_id' => 2,
'status' => 'live',
'startTime' => date('Y-m-d H:i:s'),
'settingsSnapshot' => json_encode($snapshot)
];
// INSERT
$stmt = $pdo->prepare(
"INSERT INTO matches
(Team1_ID, Team2_ID, Status, StartTime, SettingsSnapshot)
VALUES (?, ?, ?, ?, ?)"
);
$stmt->execute([
$matchData['team1_id'],
$matchData['team2_id'],
$matchData['status'],
$matchData['startTime'],
$matchData['settingsSnapshot']
]);
echo "Mecz zapisany z snapshot'em ustawień v" . $snapshot['settingsVersion'] . "\n\n";
*/
// ===== PRZYKŁAD 3: Walidacja wyniku przy użyciu snapshot'u =====
echo "PRZYKŁAD 3: Waliduj wynik korzystając ze snapshot'u\n";
echo "====================================================\n\n";
/*
// Pobierz mecz
$stmt = $pdo->prepare("SELECT * FROM matches WHERE id = ?");
$stmt->execute([123]);
$match = $stmt->fetch(PDO::FETCH_ASSOC);
// Dekoduj snapshot ustawień z momentu startu
$settingsSnapshot = json_decode($match['SettingsSnapshot'], true);
echo "Gra skończyła się wynikiem: 2:1 (w setach)\n";
echo "Snapshot reguł z startu:\n";
echo " - pointsToWin: " . $settingsSnapshot['rules']['pointsToWin'] . "\n";
echo " - setsToWin: " . $settingsSnapshot['rules']['setsToWin'] . "\n\n";
// Walidacja
if ($match['score'] !== '2:1') {
echo "❌ Błędny wynik\n";
} else if ($settingsSnapshot['settingsVersion'] !== $match['settingsVersion']) {
echo "⚠️ Ustawienia gry nie zgadzają się z bieżącymi\n";
echo " Ale to OK - snapshot z momentu startu się liczył\n";
} else {
echo "✅ Wynik prawidłowy\n";
}
*/
// ===== PRZYKŁAD 4: Migracja istniejących meczy =====
echo "PRZYKŁAD 4: Migracja meczy na nowe ustawienia\n";
echo "==============================================\n\n";
/*
$model = new DisciplineSettingsModel($pdo);
// Pobierz wszystkie istniejące mecze
$stmt = $pdo->query("SELECT id, SettingsSnapshot FROM matches WHERE SettingsSnapshot IS NULL");
$oldMatches = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Znaleziono " . count($oldMatches) . " meczy bez snapshot'u\n";
// Dodaj snapshot do każdego starego meczu
foreach ($oldMatches as $match) {
// Domniemane ustawienia (np. defaults)
$snapshot = $model->getSnapshot('ping-pong', 1);
$updateStmt = $pdo->prepare("UPDATE matches SET SettingsSnapshot = ? WHERE id = ?");
$updateStmt->execute([json_encode($snapshot), $match['id']]);
}
echo "Migracja ukończona\n\n";
*/
// ===== PRZYKŁAD 5: Porównanie zmiany ustawień =====
echo "PRZYKŁAD 5: Porównaj zmianę ustawień\n";
echo "====================================\n\n";
/*
require_once __DIR__ . '/api/DisciplineSettingsService.php';
$model = new DisciplineSettingsModel($pdo);
$service = new DisciplineSettingsService($model);
// Pobierz bieżące ustawienia
$current = $service->getSettingsForAPI('ping-pong');
// Pobierz dane z formularza (admin zmienia ustawienia)
$newInput = [
'rules' => [
'pointsToWin' => 21, // było 11
'setsToWin' => 3,
'serveRotation' => 2
],
'customization' => $current['customization']
];
// Porównaj przed zmianą
$diff = $service->compareVersions(
$current['rules'],
$newInput['rules']
);
echo "Zmiany ustawień:\n";
echo json_encode($diff, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
// Jeśli są istotne zmiany, powiadom graczy
if (!empty($diff)) {
echo "Powiadomienie dla graczy:\n";
echo "Ustawienia ping-ponga zmienią się o " . date('Y-m-d H:i') . "\n";
foreach ($diff as $field => $change) {
echo " - $field: " . $change['old'] . " → " . $change['new'] . "\n";
}
}
*/
// ===== PRZYKŁAD 6: Analytics - wpływ zmian na gry =====
echo "PRZYKŁAD 6: Analytics - wpływ zmian na gry\n";
echo "==========================================\n\n";
/*
// Statystyki meczy przed zmianą
$stmt = $pdo->query(
"SELECT COUNT(*) as count FROM matches
WHERE discipline = 'ping-pong'
AND settingsVersion = 1
AND status = 'end'"
);
$statsV1 = $stmt->fetch(PDO::FETCH_ASSOC);
echo "Ze starymi ustawieniami (v1): " . $statsV1['count'] . " meczy\n";
// Po zmianie
$stmt = $pdo->query(
"SELECT COUNT(*) as count FROM matches
WHERE discipline = 'ping-pong'
AND settingsVersion = 2
AND status = 'end'"
);
$statsV2 = $stmt->fetch(PDO::FETCH_ASSOC);
echo "Z nowymi ustawieniami (v2): " . $statsV2['count'] . " meczy\n";
// Porównanie czasu trwania meczu
$stmt = $pdo->query(
"SELECT AVG(TIMESTAMPDIFF(MINUTE, StartTime, EndTime)) as avg_duration
FROM matches
WHERE discipline = 'ping-pong'
AND status = 'end'
AND settingsVersion = 1"
);
$durationV1 = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt = $pdo->query(
"SELECT AVG(TIMESTAMPDIFF(MINUTE, StartTime, EndTime)) as avg_duration
FROM matches
WHERE discipline = 'ping-pong'
AND status = 'end'
AND settingsVersion = 2"
);
$durationV2 = $stmt->fetch(PDO::FETCH_ASSOC);
echo "\nŚredni czas meczu:\n";
echo " v1: " . round($durationV1['avg_duration'], 2) . " minut\n";
echo " v2: " . round($durationV2['avg_duration'], 2) . " minut\n";
if ($durationV2['avg_duration'] > $durationV1['avg_duration']) {
echo " → Mecze są dłuższe z nowymi ustawieniami\n";
} else if ($durationV2['avg_duration'] < $durationV1['avg_duration']) {
echo " → Mecze są szybsze z nowymi ustawieniami\n";
}
*/
// ===== PRZYKŁAD 7: Rollback do starszej wersji =====
echo "PRZYKŁAD 7: Przywróć starsze ustawienia\n";
echo "======================================\n\n";
/*
// Pobierz starszą wersję
$oldSettings = $model->getSettingsByVersion('ping-pong', 1);
if ($oldSettings) {
// Przepisz back na obecne
$input = [
'pointsToWin' => $oldSettings['pointsToWin'],
'setsToWin' => $oldSettings['setsToWin'],
'serveRotation' => $oldSettings['serveRotation'],
'specialRules' => $oldSettings['specialRules'],
'customization' => json_decode($oldSettings['customization'], true)
];
$result = $model->updateSettings('ping-pong', $input, $adminId);
echo "✅ Przywrócono ustawienia z wersji " . $oldSettings['settingsVersion'] . "\n";
echo " Nowa wersja: " . $result['settingsVersion'] . "\n";
}
*/
// ===== PRZYKŁAD 8: Testowanie w grze =====
echo "PRZYKŁAD 8: Kod JavaScript - testowanie snapshot'u\n";
echo "===================================================\n\n";
?>
<script>
// Pobierz snapshot z backendu
async function testSettingsSnapshot() {
try {
const response = await fetch(
'/api/discipline-settings.php?discipline=ping-pong&snapshot=true'
);
const result = await response.json();
if (result.success) {
const snapshot = result.snapshot;
console.log('🏓 Ping-Pong Settings Snapshot:');
console.log('Wersja ustawień:', snapshot.settingsVersion);
console.log('Timestamp snapshot:', snapshot.snapshotTimestamp);
console.log('Reguły gry:', snapshot.rules);
console.log('Personalizacja UI:', snapshot.customization);
// Uruchom grę z tymi ustawieniami
return snapshot;
} else {
console.error('Błąd pobierania snapshot:', result.error);
}
} catch (error) {
console.error('Błąd sieciowy:', error);
}
}
// Wyślij wynik meczu z snapshot'em wersji
function submitMatchResult(matchData) {
// matchData powinien zawierać:
// - score: "3:2"
// - settingsVersion: 1 (z snapshot'u)
// - snapshotTimestamp: "..." (dla auditowania)
return fetch('/api/matches_sync.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(matchData)
});
}
// Test
// testSettingsSnapshot().then(snapshot => {
// console.log('Snapshot gotowy do uruchomienia gry');
// console.log(snapshot);
// });
</script>
<?php
// ===== PODSUMOWANIE =====
echo "\nPODSUMOWANIE\n";
echo "============\n\n";
echo "Snapshot to kopja ustawień z momentu startu meczu.\n";
echo "Pozwala:\n";
echo " ✅ Starym meczom zachować stare reguły\n";
echo " ✅ Nowym meczom używać nowych reguł\n";
echo " ✅ Trackować jakie reguły były w każdym meczu\n";
echo " ✅ Porównywać statystyki między wersjami\n";
echo " ✅ Auditować zmiany\n\n";
echo "Bez snapshot'u:\n";
echo " ❌ Admin zmienia ustawienia\n";
echo " ❌ Wszystkie stare mecze 'widzą' nowe reguły\n";
echo " ❌ Historia grana jest niepewna\n\n";
?>