this repo has no description
1<?php
2
3namespace App\Http\Controllers;
4
5use DateTimeZone;
6use Illuminate\Http\Request;
7use Illuminate\Routing\Controller;
8use Illuminate\Support\Facades\Date;
9use Illuminate\Support\Facades\DB;
10
11class UsersController extends Controller
12{
13 function updateUser(Request $request, $userId)
14 {
15 // Kolla om användare är admin
16 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin'])
17 {
18 return view('pages.login');
19 }
20
21 $username = $request->post('username');
22
23 // Lite äcklig kod för att kolla om vi ska ta bort användaren istället för att uppdatera
24 // HTML har en konstig spec
25 if(isset($_POST['delete']))
26 {
27 DB::table('event_tags')
28 ->where('user_id', $userId)
29 ->delete();
30
31 DB::table('event_tags')
32 ->where('target_id', $userId)
33 ->delete();
34
35 DB::table('event_users')
36 ->where('user_id', $userId)
37 ->delete();
38
39 DB::table('event_users')
40 ->where('target_id', $userId)
41 ->delete();
42
43 DB::table('users')
44 ->where('id', $userId)
45 ->delete();
46
47 return redirect("/admin/users?success=Användare $username har tagits bort");
48 }
49
50 // Ta datan och kolla så att alla gavs
51 $displayName = $request->post('display_name');
52 $class = $request->post('class');
53 $isAdmin = boolval($request->post('is_admin') == "on");
54
55 if(!isset($username) || !isset($displayName) || !isset($class) || !isset($isAdmin))
56 {
57 return redirect("/admin/users?error=Åtminstånde en nödvändig data punkt har inte getts");
58 }
59
60 $targetTimezone = new DateTimeZone('Europe/Stockholm');
61
62 $currentTime = Date::now($targetTimezone);
63
64 // Uppdatera användaren
65 DB::table('users')
66 ->where('id', $userId)
67 ->update([
68 'username' => $username,
69 'display_name' => $displayName,
70 'class' => $class,
71 'is_admin' => intval($isAdmin),
72 'updated_at' => $currentTime->toDateTimeString()
73 ]);
74
75 return redirect("/admin/users?success=Användare $username har uppdaterats");
76 }
77
78 function store(Request $request)
79 {
80 // Kolla om användare är admin
81 if(!isset($_SESSION['qrtag']['is_admin']) || !$_SESSION['qrtag']['is_admin'])
82 {
83 return view('pages.login');
84 }
85
86 // Ta datan och kolla så att alla gavs
87 $username = $request->post('username');
88 $displayName = $request->post('display_name');
89 $class = $request->post('class');
90 $isAdmin = boolval($request->post('is_admin') == "on");
91
92 if(!isset($username) || !isset($displayName) || !isset($class) || !isset($isAdmin))
93 {
94 return redirect("/admin/users?error=Åtminstånde en nödvändig data punkt har inte getts");
95 }
96
97 // Kolla så att en användare inte redan finns
98 if(!is_null(DB::table('users')->where('username', $username)->first()))
99 {
100 return redirect("/admin/users?error=Användare med användarnamnet finns redan");
101 }
102
103 // skaå användaren
104 DB::table('users')
105 ->insert([
106 'username' => $username,
107 'display_name' => $displayName,
108 'class' => $class,
109 'is_admin' => intval($isAdmin)
110 ]);
111
112 return redirect("/admin/users?success=Användare $username har skapats");
113 }
114
115 // Kulla en person i det nuvarande eventet
116 function tag(Request $request)
117 {
118 // Kolla om en kod är angiven
119 $secret = $request->post('secret') ?? $_GET['secret'] ?? null;
120
121 if(is_null($secret))
122 {
123 return "Ingen kod angiven";
124 }
125
126 if(!isset($_SESSION['qrtag']['id']))
127 {
128 return redirect("/");
129 }
130
131 // Kolla om ett event är igång för tillfället
132 $ongoingEvent = DB::table('events')
133 ->select('id', 'start_date', 'end_date', 'name')
134 ->where('start_date', '<=', now())
135 ->where('end_date', '>', now())
136 ->orderBy('start_date', 'asc')
137 ->first();
138
139 if(is_null($ongoingEvent))
140 {
141 return "Inget event är igång för tillfället";
142 }
143
144 // Kolla om spelaren är vid liv så att man inte kan tagg någon när man är död
145 $user = DB::table('event_users')->where([
146 ['user_id', $_SESSION['qrtag']['id']],
147 ['event_id', $ongoingEvent->id]
148 ])->first();
149
150 if(!$user->is_alive)
151 {
152 return "Du är inte vid liv i spelet";
153 }
154
155 // Kolla hemlisen så att den faktiskt är för targeten
156 $target = DB::table('event_users')
157 ->join('users', 'users.id', '=', 'user_id')
158 ->where([
159 ['user_id', $user->target_id],
160 ['event_id', $ongoingEvent->id]
161 ])->first(['display_name', 'user_id', 'target_id', 'secret']);
162
163 if($target->secret != $secret)
164 {
165 return redirect('/?error=Du taggade fel person');
166 }
167
168 // Sätt så att targeten är död
169 DB::table('event_users')->where([
170 ['user_id', $target->user_id],
171 ['event_id', $ongoingEvent->id]
172 ])->update([
173 'is_alive' => false
174 ]);
175
176 // Sätt spelarens nya target till den gamla targetens target
177 DB::table('event_users')->where([
178 ['user_id', $user->user_id],
179 ['event_id', $ongoingEvent->id]
180 ])->update([
181 'target_id' => $target->target_id
182 ]);
183
184 // Logga taggen så att man kan visa den i /scoreboards
185 DB::table('event_tags')->insert([
186 'user_id' => $user->user_id,
187 'target_id' => $target->user_id,
188 'event_id' => $ongoingEvent->id
189 ]);
190
191 // Skicka en kill log i discorden
192 $user = DB::table('event_users')
193 ->join('users', 'users.id', '=', 'user_id')
194 ->where([
195 ['user_id', $_SESSION['qrtag']['id']],
196 ['event_id', $ongoingEvent->id]
197 ])->first(['display_name', 'user_id', 'target_id']);
198
199 if(isset($_ENV['DISCORD_WEBHOOK']) && $_ENV['DISCORD_WEBHOOK'] != "")
200 {
201 // Kolla om spelaren har vunnit eller inte och sätt meddelandet följaktligen
202 $playersLeft = DB::table('event_users')->where('event_id', $ongoingEvent->id)->where('is_alive', true)->count();
203 if($user->user_id == $user->target_id || $playersLeft === 1)
204 {
205 DB::table('events')->where('id', $ongoingEvent->id)->update([
206 'winner' => $user->user_id
207 ]);
208
209 $message = $user->display_name . " kullade " . $target->display_name . " och vann därmed " . $ongoingEvent->name . "! Grattis!";
210 } else
211 {
212 $message = $user->display_name . " kullade " . $target->display_name . "!\nNu är det $playersLeft spelare kvar.";
213 }
214
215 // Skicka meddelandet till discord genom deras webhook system
216 $options = array(
217 'http' => array(
218 'header' => "Content-type: application/x-www-form-urlencoded",
219 'method' => 'POST',
220 'content' => http_build_query(array('content' => $message))
221 )
222 );
223 $context = stream_context_create($options);
224 $result = file_get_contents($_ENV['DISCORD_WEBHOOK'], false, $context);
225 }
226
227 return redirect('/');
228 }
229
230 // Kolla om en spelare är vid liv i det nuvarande eventet
231 function alive(Request $request, $userId)
232 {
233 $ongoingEvent = DB::table('events')
234 ->select('id', 'start_date', 'end_date')
235 ->where('start_date', '<=', now())
236 ->where('end_date', '>', now())
237 ->orderBy('start_date', 'asc')
238 ->first();
239
240 if(is_null($ongoingEvent))
241 {
242 return "Inget event är igång för tillfället";
243 }
244
245 $user = DB::table('event_users')->where([
246 ['user_id', $userId],
247 ['event_id', $ongoingEvent->id]
248 ])->first();
249
250 return response()->json([
251 "alive" => $user->is_alive
252 ]);
253 }
254}