Commit
This commit is contained in:
		
							parent
							
								
									32d3733fd6
								
							
						
					
					
						commit
						4205af4e8c
					
				| @ -11,4 +11,5 @@ return [ | ||||
|             'charset' => 'utf8mb4', | ||||
|         ], | ||||
|    ], | ||||
|    "baton_cooldown" => 30 | ||||
| ]; | ||||
| @ -62,7 +62,7 @@ class User | ||||
|             throw new Exception("Can't get power level without being logged in!"); | ||||
|         } | ||||
|         $sth = $this->database->conn->prepare( | ||||
|             'SELECT Nivå FROM brukertabell WHERE Navn = ? AND Passord = ?' | ||||
|             'SELECT Nivå FROM brukertabell WHERE Brukernavn = ? AND Passord = ?' | ||||
|         ); | ||||
|         $sth->execute([$this->username, $this->password]); | ||||
|         $row = $sth->fetch(PDO::FETCH_ASSOC); | ||||
| @ -91,7 +91,7 @@ class User | ||||
|     private function authenticate(string $username, string $password): bool | ||||
|     { | ||||
|         $sth = $this->database->conn->prepare( | ||||
|             'SELECT * FROM brukertabell WHERE Navn = ? AND Passord = ?' | ||||
|             'SELECT * FROM brukertabell WHERE Brukernavn = ? AND Passord = ?' | ||||
|         ); | ||||
|         $sth->execute([$username, $password]); | ||||
|         if ($sth->rowCount()) | ||||
|  | ||||
| @ -54,7 +54,7 @@ class BatonReader | ||||
|         } | ||||
| 
 | ||||
|         $diff = $new_time->date->getTimestamp() - $prev_time->date->getTimestamp(); | ||||
|         if ($diff <= $timeout) | ||||
|         if ($diff < $timeout) | ||||
|         { | ||||
|             $this->time_mapper->delete($new_time->id); // i mean... it works?
 | ||||
|             return 2; | ||||
|  | ||||
| @ -11,9 +11,13 @@ Denne siden krever JavaScript | ||||
| Laster inn... | ||||
| </div> | ||||
| 
 | ||||
| <script src="../static/js/ResultService.js"></script> | ||||
| <script src="<?=$this->config['root_url']?>static/js/ResultService.js"></script> | ||||
| <script> | ||||
| document.addEventListener('DOMContentLoaded', () => { | ||||
|     new ResultService(alertBox, rankingTable, '../api/race/results.php?h='); | ||||
| 
 | ||||
|     alertBox     = document.getElementById("alertBox"); | ||||
|     rankingTable = document.getElementById("rankingTable"); | ||||
| 
 | ||||
|     new ResultService(alertBox, rankingTable, '<?=$this->config['root_url']?>api/race/results.php?h='); | ||||
| }); | ||||
| </script> | ||||
| @ -4,7 +4,7 @@ | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title><?=htmlspecialchars($title);?> – Stafett for livet</title>
 | ||||
|     <title><?=htmlspecialchars($title);?> – Stafett for livet tellesystem</title>
 | ||||
| 
 | ||||
|     <link rel="stylesheet" href="<?=$this->config['root_url']?>static/style/main.css"> | ||||
|     <link rel="icon" href="<?=$this->config['root_url']?>static/img/cropped-kf-propell-ikon-32x32.png"> | ||||
|  | ||||
							
								
								
									
										12
									
								
								public/api/race/baton.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								public/api/race/baton.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| <?php require '../../../app/inc.php'; | ||||
| 
 | ||||
| $baton_reader = $app->model('BatonReader'); | ||||
| 
 | ||||
| $cardnumber = (string)filter_input(INPUT_GET, 'cardnumber'); | ||||
| 
 | ||||
| $app->api( | ||||
|     $baton_reader->receive( | ||||
|         $cardnumber, | ||||
|         $app->config['baton_cooldown'] | ||||
|     ) | ||||
| ); | ||||
| @ -1,10 +1,6 @@ | ||||
| <?php $app = require '../../../app/inc.php'; | ||||
| /** | ||||
|  * We originally wanted to use SSE for this, but the hosting provider | ||||
|  * did not support that so we resorted to simple polling instead | ||||
|  *  | ||||
|  * This page compiles a set of times and sends it if the provided hash of  | ||||
|  * the data is not equal. | ||||
|  * Magique | ||||
|  */ | ||||
| 
 | ||||
| use App\Teamtable\TeamMapper; | ||||
| @ -17,7 +13,7 @@ $prev_hash = filter_input(INPUT_GET, 'h'); | ||||
| 
 | ||||
| $teams    = []; | ||||
| $team_map = []; | ||||
| $times    = []; | ||||
| $laps     = []; | ||||
| $time_ref = NULL; | ||||
| 
 | ||||
| foreach ($time_mapper->getAll() as $time) | ||||
| @ -33,7 +29,6 @@ foreach ($time_mapper->getAll() as $time) | ||||
|         $team_map[$team->id] = [ | ||||
|             "name"    => htmlspecialchars($team->name), | ||||
|             "company" => htmlspecialchars($team->company), | ||||
|             "rounds"  => htmlspecialchars($team->rounds), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
| @ -47,7 +42,7 @@ foreach ($time_mapper->getAll() as $time) | ||||
|         "time" => ($time->date->getTimestamp() - $time_ref) | ||||
|     ]; | ||||
| 
 | ||||
|     array_push($times, $row); | ||||
|     array_push($laps, $row); | ||||
| } | ||||
| 
 | ||||
| $data = [ | ||||
| @ -55,7 +50,7 @@ $data = [ | ||||
|         "team" => $team_map, | ||||
|         "time_reference" => $time_ref | ||||
|     ], | ||||
|     "times" => $times | ||||
|     "laps" => $laps | ||||
| ]; | ||||
| 
 | ||||
| $hash = hash('crc32', serialize($data)); | ||||
| @ -67,5 +62,5 @@ if ($prev_hash !== $hash) | ||||
|             "data" => $data | ||||
|         ]); | ||||
| } | ||||
| // return nothing
 | ||||
| 
 | ||||
| http_response_code(204); | ||||
| @ -11,7 +11,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') | ||||
|         $cardnumber = (string)$_POST['cardnumber']; | ||||
| 
 | ||||
|         try { | ||||
|             $code = $baton_reader->receive($cardnumber, -1); | ||||
|             $code = $baton_reader->receive($cardnumber, $app->config['baton_cooldown']); | ||||
|             switch ($code) { | ||||
|                 case 0: | ||||
|                     $app->session->flash('Opprettet nytt lag', 'success'); | ||||
|  | ||||
| @ -1,21 +1,35 @@ | ||||
| class ResultService  | ||||
| { | ||||
|     constructor(alertBox, rankingTable, endpoint) | ||||
|     { | ||||
|         this.alertBox     = alertBox; | ||||
| /** | ||||
|  * Yea i know but it works for now | ||||
|  */ | ||||
| 
 | ||||
| class ResultService  { | ||||
| 
 | ||||
|     constructor(alertBox, rankingTable, endpoint) { | ||||
| 
 | ||||
|         this.alertBox = alertBox; | ||||
| 
 | ||||
|         this.rankingTable = rankingTable; | ||||
|         this.endpoint     = endpoint; | ||||
| 
 | ||||
|         this.endpoint = endpoint; | ||||
| 
 | ||||
|         this.hash = 0; | ||||
| 
 | ||||
|         this.loop(); | ||||
|     } | ||||
| 
 | ||||
|     async loop() | ||||
|     { | ||||
|     async loop() { | ||||
|         try { | ||||
| 
 | ||||
|             await this.updateTable(); | ||||
|              | ||||
|             this.alertBox.classList.add("hidden"); | ||||
| 
 | ||||
|         } catch (error) { | ||||
| 
 | ||||
|             console.log(error); | ||||
| 
 | ||||
|             this.hash = 0; | ||||
| 
 | ||||
|             this.alertBox.innerHTML = "<b>Noe gikk galt: </b>" + error; | ||||
|             this.alertBox.classList.remove("hidden"); | ||||
|         } | ||||
| @ -25,21 +39,54 @@ class ResultService | ||||
|         }, 1000); | ||||
|     } | ||||
| 
 | ||||
|     async updateTable() | ||||
|     { | ||||
|     async updateTable() { | ||||
| 
 | ||||
|         let response = await fetch(this.endpoint + this.hash); | ||||
| 
 | ||||
|         if (response.status === 204) | ||||
|         { | ||||
|         if (response.status === 204) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         let json = await response.json(); | ||||
|         let JSONResponse = await response.json(); | ||||
| 
 | ||||
|         this.hash = json.hash; | ||||
|         this.hash = JSONResponse.hash; | ||||
| 
 | ||||
|         let data = json.data; | ||||
|         data.times = data.times.reverse(); | ||||
|         let tableRows = []; | ||||
|         let tempLaps  = []; | ||||
|         JSONResponse.data.laps.forEach(lap => { | ||||
| 
 | ||||
|             let roundTripTime = null; | ||||
| 
 | ||||
|             let prevLap = tempLaps[lap.id]; | ||||
| 
 | ||||
|             let round = 0; | ||||
| 
 | ||||
|             if (prevLap) { | ||||
|                 roundTripTime = lap.time - prevLap.time; | ||||
| 
 | ||||
|                 prevLap.round += 1; | ||||
| 
 | ||||
|                 lap.round = prevLap.round; | ||||
| 
 | ||||
|                 round = lap.round; | ||||
|             } else { | ||||
|                 lap.round = 0; | ||||
|             } | ||||
| 
 | ||||
|             tempLaps[lap.id] = lap; | ||||
| 
 | ||||
|             tableRows.push({ | ||||
|                 team: { | ||||
|                     name: JSONResponse.data.map.team[lap.id].name, | ||||
|                     company: JSONResponse.data.map.team[lap.id].company | ||||
|                 }, | ||||
|                 trip: roundTripTime, | ||||
|                 time: lap.time + JSONResponse.data.map.time_reference, | ||||
|                 round: round | ||||
|             }); | ||||
|         }); | ||||
| 
 | ||||
|         tableRows = tableRows.reverse(); | ||||
| 
 | ||||
|         let tableHTML = ""; | ||||
|         tableHTML += "<table>"; | ||||
| @ -47,20 +94,22 @@ class ResultService | ||||
|         tableHTML += "<th>#</th>"; | ||||
|         tableHTML += "<th>Lag</th>"; | ||||
|         tableHTML += "<th>Bedrift</th>"; | ||||
|         tableHTML += "<th>Runde</th>"; | ||||
|         tableHTML += "<th>Tid</th>"; | ||||
|         tableHTML += "<th>Runder</th>"; | ||||
|         tableHTML += "<th>Passert</th>"; | ||||
|         tableHTML += "</tr>"; | ||||
| 
 | ||||
|         let iterator = 0; | ||||
|         data.times.forEach(element => { | ||||
|             iterator++; | ||||
|         let iterator = tableRows.length + 1; | ||||
|         tableRows.forEach(row => { | ||||
|             iterator--; | ||||
| 
 | ||||
|             tableHTML += "<tr>"; | ||||
|             tableHTML += "<td>" + iterator + "</td>"; | ||||
|             tableHTML += "<td>" + data.map.team[element.id].name + "</td>"; | ||||
|             tableHTML += "<td>" + data.map.team[element.id].company + "</td>"; | ||||
|             tableHTML += "<td>" + element.time + "</td>"; | ||||
|             tableHTML += "<td>" + data.map.team[element.id].rounds+ "</td>"; | ||||
|             tableHTML += "<td>" + row.team.name + "</td>"; | ||||
|             tableHTML += "<td>" + row.team.company + "</td>"; | ||||
|             tableHTML += "<td>" + ((row.round === 0) ? 'START' : row.round) + "</td>"; | ||||
|             tableHTML += "<td>" + ((row.trip === null) ? 'START' : row.trip) + "</td>"; | ||||
|             tableHTML += "<td>" + (new Date(row.time * 1000).toLocaleString()) + "</td>"; | ||||
|             tableHTML += "</tr>"; | ||||
|         }); | ||||
| 
 | ||||
| @ -68,4 +117,5 @@ class ResultService | ||||
| 
 | ||||
|         this.rankingTable.innerHTML = tableHTML; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user