Show sourcecode
The following files exists in this folder. Click to view.
gamestate.php
162 lines UTF-8 Windows (CRLF)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
<?php
// Detta api svarar med nuvarande status och skapar även ny runda om det behövs
header('Content-Type: application/json');
include("../dbconnection.php");
/** @var PDO $dbconn */
// Hämta värden från Get- och Post-variabler
$room_id = $_GET['room_id'] ?? $_POST['room_id'];
$user_id = $_POST['user_id'] ?? null;
$guess = $_POST['guess'] ?? null;
// Lista på filmer
$movies = [
["title" => "Stalker", "backdrop" => "https://image.tmdb.org/t/p/original/6yrbWzzrPp7pwz6zHdifspJk8t3.jpg"],
["title" => "Climax", "backdrop" => "https://image.tmdb.org/t/p/original/lLaQVhHquvSQIesEgRODzAj7hXB.jpg"],
["title" => "The Holy Mountain", "backdrop" => "https://image.tmdb.org/t/p/original/oUceCsSe255ZKXCMsHhqXM1xuUp.jpg"],
["title" => "Gummo", "backdrop" => "https://image.tmdb.org/t/p/original/mLdMnoIE4SjMkTkgxayaHH9DS4.jpg"],
["title" => "A Brighter Summer Day", "backdrop" => "https://image.tmdb.org/t/p/original/qMMaTIUTxCcRRrwgNsna8EUAd1z.jpg"],
["title" => "Hellraiser", "backdrop" => "https://image.tmdb.org/t/p/original/jInJNDIyzlYBV79nx8Qb5s2xjfM.jpg"],
["title" => "Wendy and Lucy", "backdrop" => "https://image.tmdb.org/t/p/original/xHYBWtsRVohVgh2PlcSPI6KWvvo.jpg"],
["title" => "Badlands", "backdrop" => "https://image.tmdb.org/t/p/original/5rp9Jydh9RxrvVBW2lr27B8NYiT.jpg"],
["title" => "How To Train Your Dragon", "backdrop" => "https://image.tmdb.org/t/p/original/7DO9lFWT8XoTpk71c5KHsyz10fg.jpg"],
["title" => "Leprechaun", "backdrop" => "https://image.tmdb.org/t/p/original/l7BHbTOKbBgdWCfyz2dEOJHKIK2.jpg"],
["title" => "Autumn Sonata", "backdrop" => "https://image.tmdb.org/t/p/original/jcKzcVXLIpYo1gbRI02N81N630.jpg"],
["title" => "The Thing", "backdrop" => "https://image.tmdb.org/t/p/original/bg6Ma61jUkoALck50dQbKeJHS9U.jpg"],
["title" => "House", "backdrop" => "https://image.tmdb.org/t/p/original/e40Ml5JzFQ0fqNqgGefIanTvKMB.jpg"],
["title" => "Fitzcarraldo", "backdrop" => "https://image.tmdb.org/t/p/original/46iMqI1qzAtnXJxGRNCFwYNYqOo.jpg"],
["title" => "Trainspotting", "backdrop" => "https://image.tmdb.org/t/p/original/wUc83y8kXNdRK66o0HU5X8eBri4.jpg"],
["title" => "A Clockwork Orange", "backdrop" => "https://image.tmdb.org/t/p/original/3w2v0iNPPNeIKOV5wu1NU1DDHHy.jpg"],
["title" => "Morbius", "backdrop" => "https://image.tmdb.org/t/p/original/xFAbQnrV7vsW4obvqfyWoEF1YuZ.jpg"],
["title" => "Battle Royale", "backdrop" => "https://image.tmdb.org/t/p/original/zwu5B32M7FyB6nYwtQN6g9MPXho.jpg"],
["title" => "Mulholland Drive", "backdrop" => "https://image.tmdb.org/t/p/original/y1giivdsGLyo1LCvlsL6mLKyTZ7.jpg"],
["title" => "Eraserhead", "backdrop" => "https://image.tmdb.org/t/p/original/ApB0mF2d5Oqioi3yxjuogiotSLI.jpg"],
["title" => "Inland Empire", "backdrop" => "https://image.tmdb.org/t/p/original/fnr0jAlX0sTwdj1QY4Pt9VCpefb.jpg"],
["title" => "The Battle Of Algiers", "backdrop" => "https://image.tmdb.org/t/p/original/A5sZ1OxIH5StZgqBE9MslgsWjK6.jpg"],
["title" => "Together", "backdrop" => "https://image.tmdb.org/t/p/original/dWsyWkOLYfdAKBbgjc4B0i1Vmia.jpg"],
["title" => "Possesion", "backdrop" => "https://image.tmdb.org/t/p/original/j6d8i2KILyahnoxO9FsDxSYxvkZ.jpg"],
["title" => "Parasite", "backdrop" => "https://image.tmdb.org/t/p/original/TU9NIjwzjoKPwQHoHshkFcQUCG.jpg"],
["title" => "Satantango", "backdrop" => "https://image.tmdb.org/t/p/original/5a4Gmk2HNeefI4Rmwdmbyoy79oy.jpg"],
["title" => "Cure", "backdrop" => "https://image.tmdb.org/t/p/original/pwUuz0mdHynosThheE6Xs9iwVzM.jpg"],
["title" => "Old Joy", "backdrop" => "https://image.tmdb.org/t/p/original/t9lOz9dFflcHo3QjdtDND6cKGnF.jpg"],
["title" => "The Long Goodbye", "backdrop" => "https://image.tmdb.org/t/p/original/fMsvyKj7BrcK5ko4r9x6EuTC21M.jpg"],
["title" => "Robin Hood", "backdrop" => "https://image.tmdb.org/t/p/original/3WeFPoPVIGgMumjgLn0EPIfq53A.jpg"],
["title" => "Enter The Void", "backdrop" => "https://image.tmdb.org/t/p/original/2Mlw0JRNZHXLYxbeJ0LmiCCTiok.jpg"],
["title" => "Donnie Darko", "backdrop" => "https://image.tmdb.org/t/p/original/msCHK5Kh1YbdZ0zPJ2nzPUhhSN9.jpg"],
["title" => "Scarface", "backdrop" => "https://image.tmdb.org/t/p/original/cCvp5Sni75agCtyJkNOMapORUQV.jpg"],
["title" => "The Godfather", "backdrop" => "https://image.tmdb.org/t/p/original/ejdD20cdHNFAYAN2DlqPToXKyzx.jpg"],
["title" => "The Dark Knight", "backdrop" => "https://image.tmdb.org/t/p/original/nMKdUUepR0i5zn0y1T4CsSB5chy.jpg"],
["title" => "Interstellar", "backdrop" => "https://image.tmdb.org/t/p/original/2ssWTSVklAEc98frZUQhgtGHx7s.jpg"],
["title" => "Pulp Fiction", "backdrop" => "https://image.tmdb.org/t/p/original/suaEOtk1N1sgg2MTM7oZd2cfVp3.jpg"],
["title" => "Breathless", "backdrop" => "https://image.tmdb.org/t/p/original/oi7D7gBwTpaDqSx9jaXmkT7Yaai.jpg"],
["title" => "The Piano", "backdrop" => "https://image.tmdb.org/t/p/original/bo96LKNbkNHqWZBYBllrnjbmRBY.jpg"],
["title" => "Lost Highway", "backdrop" => "https://image.tmdb.org/t/p/original/5v3Iubz9lkZwMEG17j0RHPLcwvx.jpg"],
["title" => "Sentimental Value", "backdrop" => "https://image.tmdb.org/t/p/original/mDIMSMXFkOXUyQ2lnmeBu6kDUCH.jpg"],
["title" => "Deep Red", "backdrop" => "https://image.tmdb.org/t/p/original/45gBntOgkEKjyRhUJpdPJI9jzMi.jpg"],
["title" => "The Descent", "backdrop" => "https://image.tmdb.org/t/p/original/lacCkdAeeLhorfLrNd0iFoma3JO.jpg"],
];
// Kolla om det finns en game session för rummet
$stmt = $dbconn->prepare("SELECT * FROM fq_game_sessions WHERE room_id = :room_id");
$stmt->execute([':room_id' => $room_id]);
$session = $stmt->fetch();
// Om det inte finns en game session är detta första rundan
if (!$session) {
// Om det är första rundan, hämta en random film
$movie = $movies[array_rand($movies)];
// Skapa en rad i tabellen fq_game_sessions för denna game session
$dbconn->prepare("
INSERT INTO fq_game_sessions (room_id, current_round, current_movie_title, current_backdrop_path, status, round_started_at)
VALUES (:room_id, 1, :title, :backdrop, 'active', NOW())
")->execute([':room_id' => $room_id, ':title' => $movie['title'], ':backdrop' => $movie['backdrop']]);
$stmt->execute([':room_id' => $room_id]);
$session = $stmt->fetch();
}
// Räkna ut hur mycket tid det är kvar på denna runda
$stmt2 = $dbconn->prepare("SELECT TIMESTAMPDIFF(SECOND, round_started_at, NOW()) as elapsed FROM fq_game_sessions WHERE room_id = :room_id");
$stmt2->execute([':room_id' => $room_id]);
$elapsed = $stmt2->fetchColumn();
$time_left = max(0, 10 - $elapsed);
$message = '';
// Kolla om spelaren svarat och om det är rätt
if ($guess && $session['status'] === 'active' && $time_left > 0) {
// Ta bort mellanslag från gissning och rätt svar och gör till gemener
$guess = strtolower(trim($guess));
$correct_answer = strtolower($session['current_movie_title']);
// Kolla om det är rätt med levenshtein som godkänner ett teckens fel
if (levenshtein($guess, $correct_answer) <= 1) {
$dbconn->prepare("
INSERT INTO fq_scores (session_id, user_id, points)
VALUES (:sid, :uid, 1)
ON DUPLICATE KEY UPDATE points = points + 1
")->execute([':sid' => $session['id'], ':uid' => $user_id]);
$message = "Rätt";
nextRound($dbconn, $session, $movies, $room_id);
$stmt->execute([':room_id' => $room_id]);
$session = $stmt->fetch();
$time_left = 10;
} else {
$message = "Fel, försök igen";
}
}
// Om tiden för rundan gått ut, skriv ut svaret och börja nästa runda
if ($time_left === 0 && $session['status'] === 'active') {
$message = "Time's up! It was: " . $session['current_movie_title'];
nextRound($dbconn, $session, $movies, $room_id);
$stmt->execute([':room_id' => $room_id]);
$session = $stmt->fetch();
$time_left = 10;
}
// Funktion som uppdaterar game session i databasen med nästa runda
function nextRound($dbconn, $session, $movies, $room_id)
{
$next_round = $session['current_round'] + 1;
$status = $next_round > 10 ? 'finished' : 'active';
$movie = $movies[array_rand($movies)];
$dbconn->prepare("
UPDATE fq_game_sessions
SET current_round = :round, status = :status,
current_movie_title = :title, current_backdrop_path = :backdrop,
round_started_at = NOW()
WHERE room_id = :room_id
")->execute([
':round' => $next_round,
':status' => $status,
':title' => $movie['title'],
':backdrop' => $movie['backdrop'],
':room_id' => $room_id
]);
}
// Hämtar hur många poäng spelarna har från databasen
$scores_stmt = $dbconn->prepare("
SELECT u.username, COALESCE(s.points, 0) as points
FROM fq_room_players rp
JOIN fq_users u ON u.id = rp.user_id
LEFT JOIN fq_scores s ON s.session_id = :sid AND s.user_id = rp.user_id
WHERE rp.room_id = :room_id
");
$scores_stmt->execute([':sid' => $session['id'], ':room_id' => $room_id]);
$scores = $scores_stmt->fetchAll(PDO::FETCH_ASSOC);
// Svara som en json med nuvarande status på rundan
echo json_encode([
"round" => $session['current_round'],
"time_left" => $time_left,
"status" => $session['status'],
"backdrop" => $session['current_backdrop_path'],
"message" => $message,
"scores" => $scores
]);