314 lines
9.8 KiB
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";
|
|
?>
|