this repo has no description
at main 19 kB view raw
1<?php 2 3namespace App\Http\Controllers; 4 5use DateTimeZone; 6use Illuminate\Support\Facades\Date; 7use Illuminate\Http\Request; 8use Illuminate\Routing\Controller; 9use Illuminate\Support\Facades\DB; 10 11function generateSecret() { 12 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 13 $randomString = substr(str_shuffle($characters), 0, 5); 14 15 return $randomString; 16} 17 18class EventsController extends Controller 19{ 20 function store(Request $request) // Skapa ett evenet 21 { 22 // Kolla om eleven är admin 23 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 24 { 25 return view('pages.login'); 26 } 27 28 29 // Få nödvändig data från post requesten 30 $name = $request->post('name'); 31 $startDateText = $request->post('start_date'); 32 $endDateText = $request->post('end_date'); 33 34 // Skicka en error om ett event med namnet redan finns 35 if(!is_null(DB::table('events')->where('name', $name)->first())) 36 { 37 return redirect('/admin/events?error=Det finns redan ett event med det här namnet'); 38 } 39 40 // Skapa laravel carbon objekt av html datum strängen som gavs av requesten 41 $targetTimezone = new DateTimeZone('Europe/Stockholm'); 42 43 $startDate = Date::createFromFormat('Y-m-d\TH:i', $startDateText, $targetTimezone); 44 $endDate = Date::createFromFormat('Y-m-d\TH:i', $endDateText, $targetTimezone); 45 46 // Kolla om det finns ett event som överskrider eventet som försöks skapas 47 $overlapExists = DB::table('events') 48 ->whereRaw(':start_date < end_date AND :end_date > start_date', [ 49 'start_date' => $startDate->toDateTimeString(), 50 'end_date' => $endDate->toDateTimeString(), 51 ]) 52 ->exists(); 53 54 if($overlapExists) 55 { 56 return redirect('/admin/events?error=Ett event kan inte överskrida ett annat event'); 57 } 58 59 // Skapa event 60 DB::table('events')->insert([ 61 'name' => $name, 62 'start_date' => $startDate->toDateTimeString(), 63 'end_date' => $endDate->toDateTimeString() 64 ]); 65 66 return redirect('/admin/events?success=Skapade ett event'); 67 } 68 69 function delete(Request $request, $eventId) 70 { 71 // Kolla om eleven är admin 72 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 73 { 74 return view('pages.login'); 75 } 76 77 DB::table('event_users')->where('event_id', $eventId)->delete(); 78 DB::table('events')->delete($eventId); 79 80 return redirect('/admin/events?success=Tog bort ett event'); 81 } 82 83 function giveTargets(Request $request, $eventId) 84 { 85 // Kolla om eleven är admin 86 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 87 { 88 return view('pages.login'); 89 } 90 91 $userIds = DB::table('event_users') 92 ->where('event_id', $eventId) 93 ->pluck('user_id') 94 ->toArray(); 95 96 // Du kan inte ha dig själv som target 97 if($userIds < 2) 98 { 99 return redirect("/admin/events/$eventId?error=Du kan inte tilldela mål till ett event med mindre än 2 spelare."); 100 } 101 102 // Ge alla targets genom att randomiza listan och sen ge varje spelare nästa person i listan som sin target förutom sista som får första i listan 103 shuffle($userIds); 104 105 for($i = 0; $i < count($userIds); $i++) 106 { 107 $userId = $userIds[$i]; 108 if(count($userIds) > $i + 1) 109 { 110 $targetId = $userIds[$i + 1]; 111 } else { 112 $targetId = $userIds[0]; 113 } 114 DB::table('event_users') 115 ->where('event_id', $eventId) 116 ->where('user_id', $userId) 117 ->update(['target_id' => $targetId, 'secret' => generateSecret()]); 118 } 119 120 DB::table('events')->where('id', $eventId)->update(['targets_assigned' => true]); 121 122 return redirect("/admin/events/$eventId?success=Tilldelade alla mål"); 123 } 124 125 function join(Request $request) 126 { 127 $nearestEvent = DB::table('events') 128 ->select('start_date', 'id') 129 ->where('start_date', '>=', now()) 130 ->orderBy('start_date', 'asc') 131 ->first(); 132 133 if(is_null($nearestEvent)) 134 { 135 return "Inget event är igång för tillfället"; 136 } 137 138 $ongoingEvent = DB::table('events') 139 ->select('id', 'start_date', 'end_date') 140 ->where('start_date', '<=', now()) 141 ->where('end_date', '>', now()) 142 ->orderBy('start_date', 'asc') 143 ->first(); 144 145 if(!is_null($ongoingEvent)) 146 { 147 return "Du kan inte gå med ett event som är igång"; 148 } 149 150 $user = DB::table('event_users')->where([ 151 ['user_id', $_SESSION['qrtag']['id']], 152 ['event_id', $nearestEvent->id] 153 ])->first(); 154 155 if(!is_null($user)) 156 { 157 return "Du har redan gått med i eventet"; 158 } 159 160 DB::table('event_users')->insert([ 161 'user_id' => $_SESSION['qrtag']['id'], 162 'event_id' => $nearestEvent->id, 163 'is_alive' => 1, 164 'secret' => '', 165 'target_id' => 1 166 ]); 167 168 return redirect('/'); 169 } 170 171 function leave(Request $request) 172 { 173 $nearestEvent = DB::table('events') 174 ->select('start_date', 'id') 175 ->where('start_date', '>=', now()) 176 ->orderBy('start_date', 'asc') 177 ->first(); 178 179 if(is_null($nearestEvent)) 180 { 181 return "Inget event är igång för tillfället"; 182 } 183 184 $ongoingEvent = DB::table('events') 185 ->select('id', 'start_date', 'end_date') 186 ->where('start_date', '<=', now()) 187 ->where('end_date', '>', now()) 188 ->orderBy('start_date', 'asc') 189 ->first(); 190 191 if(!is_null($ongoingEvent)) 192 { 193 return "Du kan inte lämna ett event som är igång"; 194 } 195 196 $user = DB::table('event_users')->where([ 197 ['user_id', $_SESSION['qrtag']['id']], 198 ['event_id', $nearestEvent->id] 199 ])->first(); 200 201 if(is_null($user)) 202 { 203 return "Du är inte med i eventet"; 204 } 205 206 DB::table('event_users')->where([ 207 ['user_id', $_SESSION['qrtag']['id']], 208 ['event_id', $nearestEvent->id] 209 ])->delete(); 210 211 return redirect('/'); 212 } 213 214 function update(Request $request, $eventId) 215 { 216 // Kolla om eleven är admin 217 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 218 { 219 return view('pages.login'); 220 } 221 222 223 // Få nödvändig data från post requesten 224 $name = $request->post('name'); 225 $startDateText = $request->post('start_date'); 226 $endDateText = $request->post('end_date'); 227 228 // Skicka en error om ett event med namnet inte finns 229 if(is_null(DB::table('events')->where('id', $eventId)->first())) 230 { 231 return redirect('/admin/events?error=Eventet du försöker redigera finns inte'); 232 } 233 234 // Skapa laravel carbon objekt av html datum strängen som gavs av requesten 235 $targetTimezone = new DateTimeZone('Europe/Stockholm'); 236 237 $startDate = Date::createFromFormat('Y-m-d\TH:i', $startDateText, $targetTimezone); 238 $endDate = Date::createFromFormat('Y-m-d\TH:i', $endDateText, $targetTimezone); 239 240 // Kolla om det finns ett event som överskrider eventet som försöks skapas 241 $overlapExists = DB::table('events') 242 ->whereRaw('? < end_date AND ? > start_date', [ 243 $startDate->toDateTimeString(), 244 $endDate->toDateTimeString(), 245 ]) 246 ->where('id', '!=', $eventId) 247 ->exists(); 248 249 if($overlapExists) 250 { 251 return redirect('/admin/events?error=Redigeringen överskrider ett annat event'); 252 } 253 254 // Skapa event 255 DB::table('events')->update([ 256 'name' => $name, 257 'start_date' => $startDate->toDateTimeString(), 258 'end_date' => $endDate->toDateTimeString() 259 ]); 260 261 return redirect('/admin/events?success=Redigerade ' . $name); 262 } 263 264 function addPlayer(Request $request, $eventId) 265 { 266 // Kolla om eleven är admin 267 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 268 { 269 return view('pages.login'); 270 } 271 272 $username = $request->post('username'); 273 274 // Kolla så att användaren finns 275 $user = DB::table('users')->where('username', $username)->first(); 276 277 if(is_null($user)) 278 { 279 return redirect("/admin/events/$eventId?error=Användarnamnet du försökte lägga till finns inte"); 280 } 281 282 // Kolla så att man inte lägger in en användare som redan finns 283 $alreadyJoined = DB::table('event_users')->where([['user_id', $user->id], ['event_id', $eventId]])->first(); 284 285 if(!is_null($alreadyJoined)) 286 { 287 return redirect("/admin/events/$eventId?error=Användaren du försöker lägga till finns redan"); 288 } 289 290 // Kolla så att det finns en användare att stoppa in vid 291 $randomUser = DB::table('event_users') 292 ->where('is_alive', true) 293 ->where('event_id', $eventId) 294 ->orderBy(DB::raw('RAND()')) 295 ->take(1) 296 ->first(); 297 298 if(is_null($randomUser)) 299 { 300 return redirect("/admin/events/$eventId?error=Det finns ingen stans att lägga till användaren. Försök igen senare"); 301 } 302 303 // Stoppa in användaren vid randomuser 304 DB::table('event_users')->insert([ 305 'user_id' => $user->id, 306 'event_id' => $eventId, 307 'is_alive' => 1, 308 'target_id' => $randomUser->target_id, 309 'secret' => generateSecret() 310 ]); 311 312 DB::table('event_users') 313 ->where('id', $randomUser->id) 314 ->update([ 315 'target_id' => $user->id 316 ]); 317 318 return redirect("/admin/events/$eventId?success=Du la till $username"); 319 } 320 321 function reviveUser(Request $request, $eventId) 322 { 323 // Kolla om eleven är admin 324 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 325 { 326 return view('pages.login'); 327 } 328 329 // Kolla så att useridt gavs 330 $userId = $request->post('user_id'); 331 332 if(is_null($userId)) 333 { 334 return redirect("/admin/events/$eventId?error=Inget userid gavs."); 335 } 336 337 // Kolla så att eventet finns och är igång 338 $event = DB::table('events') 339 ->select('id', 'start_date', 'end_date', 'name', 'winner') 340 ->where('start_date', '<=', now()) 341 ->where('end_date', '>', now()) 342 ->where('id', $eventId) 343 ->orderBy('start_date', 'asc') 344 ->first(); 345 346 if(is_null($event)) 347 { 348 return redirect("/admin/events/$eventId?error=Eventet måste existera och vara igång för att man ska kunna återuppliva."); 349 } 350 351 // Kolla så att spelaren finns 352 $eventUser = DB::table('event_users') 353 ->where('user_id', $userId) 354 ->where('event_id', $eventId) 355 ->first(); 356 357 if(is_null($eventUser)) 358 { 359 return redirect("/admin/events/$eventId?error=Kunde $userId inte hitta en spelare med id:t i eventet."); 360 } 361 362 // Kolla så att man inte återupplivar en levande användaren 363 if($eventUser->is_alive) 364 { 365 return redirect("/admin/events/$eventId?error=Spelaren är redan vid liv."); 366 } 367 368 // Hitta en spelare där man ska stoppa in den ny upplivade spelaren 369 $randomUser = DB::table('event_users') 370 ->where('is_alive', true) 371 ->where('event_id', $eventId) 372 ->where('user_id', '!=', $userId) 373 ->orderBy(DB::raw('RAND()')) 374 ->take(1) 375 ->first(); 376 377 if(is_null($randomUser)) 378 { 379 return redirect("/admin/events/$eventId?error=Det finns ingen stans att lägga till användaren. Försök igen senare"); 380 } 381 382 // Återuppliva användaren i databasen 383 DB::table('event_users') 384 ->where([ 385 ['event_id', $eventId], 386 ['user_id', $userId] 387 ]) 388 ->update([ 389 'is_alive' => 1, 390 'target_id' => $randomUser->target_id, 391 'secret' => generateSecret() 392 ]); 393 394 // Sätt den random spelaren att ha den ny upplivade spelaren som target 395 DB::table('event_users') 396 ->where('id', $randomUser->id) 397 ->update([ 398 'target_id' => $userId 399 ]); 400 401 // Eventuellt att man stänger av att någon har vunnit 402 DB::table('events')->update([ 403 'winner' => null 404 ]); 405 406 return redirect("/admin/events/$eventId?success=Återupplivade användaren"); 407 } 408 409 function killUser(Request $request, $eventId) 410 { 411 // Kolla om eleven är admin 412 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 413 { 414 return view('pages.login'); 415 } 416 417 // Kolla så att useridt gavs 418 $userId = $request->post('user_id'); 419 420 if(is_null($userId)) 421 { 422 return redirect("/admin/events/$eventId?error=Inget userid gavs."); 423 } 424 425 // Kolla så att eventet finns och är igång 426 $event = DB::table('events') 427 ->select('id', 'start_date', 'end_date', 'name', 'winner') 428 ->where('start_date', '<=', now()) 429 ->where('end_date', '>', now()) 430 ->where('id', $eventId) 431 ->orderBy('start_date', 'asc') 432 ->first(); 433 434 if(is_null($event)) 435 { 436 return redirect("/admin/events/$eventId?error=Eventet måste existera och vara igång för att man ska kunna återuppliva."); 437 } 438 439 // Kolla så att spelaren finns 440 $eventUser = DB::table('event_users') 441 ->where('user_id', $userId) 442 ->where('event_id', $eventId) 443 ->first(); 444 445 if(is_null($eventUser)) 446 { 447 return redirect("/admin/events/$eventId?error=Kunde $userId inte hitta en spelare med id:t i eventet."); 448 } 449 450 // Kolla så att man inte mördar en död spelare 451 if(!$eventUser->is_alive) 452 { 453 return redirect("/admin/events/$eventId?error=Spelaren är redan död."); 454 } 455 456 // Gör så att den som har spelaren som ska mördas som target får spelaren som ska mördas target 457 DB::table('event_users') 458 ->where('target_id', $userId) 459 ->update([ 460 'target_id' => $eventUser->target_id 461 ]); 462 463 // Sätt spelaren till död 464 DB::table('event_users') 465 ->where('user_id', $userId) 466 ->update([ 467 'is_alive' => false 468 ]); 469 470 $playersLeft = DB::table('event_users')->where('event_id', $eventId)->where('is_alive', true)->count(); 471 if($playersLeft === 1) 472 { 473 $lastAlivePlayer = DB::table('event_users')->join('users', 'users.id', '=', 'user_id')->where('event_id', $eventId)->where('is_alive', true)->first(); 474 DB::table('events')->where('id', $eventId)->update([ 475 'winner' => $lastAlivePlayer->id 476 ]); 477 478 $message = $lastAlivePlayer->display_name . " har vunnit " . $event->name . "! Grattis!"; 479 480 $options = array( 481 'http' => array( 482 'header' => "Content-type: application/x-www-form-urlencoded", 483 'method' => 'POST', 484 'content' => http_build_query(array('content' => $message)) 485 ) 486 ); 487 $context = stream_context_create($options); 488 $result = file_get_contents($_ENV['DISCORD_WEBHOOK'], false, $context); 489 } 490 491 return redirect("/admin/events/$eventId?success=Dödade användaren"); 492 } 493 494 function reviveAll(Request $request, $eventId) { 495 // Kolla om eleven är admin 496 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin']) 497 { 498 return view('pages.login'); 499 } 500 501 $userIds = DB::table('event_users') 502 ->where('event_id', $eventId) 503 ->pluck('user_id') 504 ->toArray(); 505 506 // Du kan inte ha dig själv som target 507 if($userIds < 2) 508 { 509 return redirect("/admin/events/$eventId?error=Du kan inte tilldela mål till ett event med mindre än 2 spelare."); 510 } 511 512 // Ge alla targets genom att randomiza listan och sen ge varje spelare nästa person i listan som sin target förutom sista som får första i listan 513 shuffle($userIds); 514 515 for($i = 0; $i < count($userIds); $i++) 516 { 517 $userId = $userIds[$i]; 518 if(count($userIds) > $i + 1) 519 { 520 $targetId = $userIds[$i + 1]; 521 } else { 522 $targetId = $userIds[0]; 523 } 524 DB::table('event_users') 525 ->where('event_id', $eventId) 526 ->where('user_id', $userId) 527 ->update(['target_id' => $targetId, 'secret' => generateSecret(), 'is_alive' => true]); 528 } 529 530 // Skicka meddelande till discord webhooken om alla spelare har återupplivats för att inte skapa frågor senare om varför numrena ändras 531 DB::table('events')->where('id', $eventId)->update(['winner' => null]); 532 533 $options = array( 534 'http' => array( 535 'header' => "Content-type: application/x-www-form-urlencoded", 536 'method' => 'POST', 537 'content' => http_build_query(array('content' => "Alla elever har återupplivats!")) 538 ) 539 ); 540 $context = stream_context_create($options); 541 $result = file_get_contents($_ENV['DISCORD_WEBHOOK'], false, $context); 542 543 return redirect("/admin/events/$eventId?success=Återupplivade alla spelare"); 544 } 545}