this repo has no description
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}