Webbserverprogrammering 1

Show sourcecode

The following files exists in this folder. Click to view.

webbserver/filmquiz/api/

gamestate.php
roomplayers.php

gamestate.php

162 lines UTF-8 Windows (CRLF)
<?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(010 $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 === && $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
]);