GameController
a phpmae:Class in werewolves.lukasrosenstock.net
Public PHP Methods
-
showPage($gameId)No documentation available.
-
transmitVote($gameId)No documentation available.
-
dealCards($auth, $gameId, $deck)No documentation available.
-
resetVoting($auth, $gameId)No documentation available.
-
observe($gameId)No documentation available.
Source Code
<?php
use Exception;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\RequestInterface;
use Webmozart\Assert\Assert;
/**
* Implementation for coid://werewolves.lukasrosenstock.net/GameController
*/
class GameController {
const BASE_ID = 'appkTRVIjuKAKcquF';
private $airtable;
private $authkey;
private $playerUiTemplate;
private $request;
private $pusherProvider;
public function __construct(ContainerInterface $container,
RequestInterface $request, PusherProvider $pusherProvider) {
$this->airtableApi = $container->get('airtable');
$this->authkey = $container->get('authkey');
$this->playerUiTemplate = $container->get('playerUi');
$this->request = $request;
$this->pusherProvider = $pusherProvider;
}
public function showPage($gameId) {
try {
$gameData = json_decode($this->airtableApi->get(self::BASE_ID.'/'.$gameId)->getBody(), true);
$request = $this->request->getParsedBody();
$pageVars = [
'page' => isset($request['action']) ? $request['action'] : 'home',
'gameId' => $gameId
];
switch ($request['action']) {
case "register":
// Register for a game
if (!isset($request['player_name']) || strlen(trim($request['player_name'])) < 2) {
$pageVars['error'] = "Invalid name.";
$pageVars['page'] = 'home';
} else {
try {
// Add player to Airtable
$record = json_decode($this->airtableApi->post(
self::BASE_ID.'/'.$gameId, [
'json' => [
'fields' => [
'Player Name' => $request['player_name']
]
]
])->getBody(), true);
$pageVars['player_id'] = $record['id'];
$pageVars['player_auth'] = hash_hmac('sha1', $record['id'], $this->authKey);
$pageVars['player_name'] = $request['player_name'];
} catch (Exception $e) {
$pageVars['error'] = "Registration failed: " . $e->getMessage();
$pageVars['page'] = 'home';
}
}
break;
case "reveal":
// Reveal own identity
if (isset($request['player_id']) && isset($request['player_auth'])
&& $request['player_auth'] == hash_hmac('sha1', $request['player_id'], $this->authKey)) {
$pageVars['player_data'] = [];
$pageVars['player_id'] = $request['player_id'];
$pageVars['player_auth'] = $request['player_auth'];
foreach ($gameData['records'] as $r) {
$pageVars['player_data'][$r['id']] = $r['fields']['Player Name'];
if ($r['id'] == $request['player_id'])
$pageVars['player_name'] = $r['fields']['Player Name'];
if ($r['id'] == $request['player_id'] && isset($r['fields']['Character'])) {
$pageVars['role'] = $r['fields']['Character'];
$pageVars['faction'] = $r['fields']['Faction'];
}
}
if (!isset($pageVars['role'])) {
$pageVars['error'] = "Role has not been assigned!";
$pageVars['page'] = 'register';
}
} else {
$pageVars['error'] = "Invalid session!";
$pageVars['page'] = 'register';
}
}
} catch (Exception $e) {
$pageVars = [ 'page' => 'invalid_game' ];
}
return $this->playerUiTemplate->render($pageVars);
}
public function transmitVote($gameId) {
try {
$request = $this->request->getParsedBody();
Assert::keyExists($request, 'player_id');
Assert::keyExists($request, 'player_auth');
Assert::keyExists($request, 'target_id');
Assert::eq($request['player_auth'], hash_hmac('sha1', $request['player_id'], $this->authKey),
"Authorization failure.");
$gameData = json_decode($this->airtableApi->get(self::BASE_ID.'/'.$gameId)->getBody(), true);
foreach ($gameData['records'] as $r)
if ($r['id'] == $request['target_id']) {
$this->pusherProvider->triggerEvent('VoteCast', $request['player_id'].'|'.$request['target_id'], $gameId);
return [
'success' => true
];
}
return [
'success' => false
];
} catch (Exception $e) {
return [
'success' => false,
'error' => $e->getMessage()
];
}
}
public function dealCards($auth, $gameId, $deck) {
if ($auth != $this->authkey)
return "You are not authorized to deal cards.";
$cards = explode(',', $deck);
$gameData = json_decode($this->airtableApi->get(self::BASE_ID.'/'.$gameId)->getBody(), true);
$playerCount = count($gameData['records']);
if ($playerCount < count($cards))
return "Deck has too many cards.";
while (count($cards) < $playerCount)
$cards[] = 'Villager';
shuffle($cards);
$i = 0;
foreach ($gameData['records'] as $r) {
$this->airtableApi->patch(
self::BASE_ID.'/'.$gameId.'/'.$r['id'], [
'json' => [
'fields' => [
'Character' => $cards[$i]
]
]
]);
$i++;
}
return "Cards dealt.";
}
public function resetVoting($auth, $gameId) {
if ($auth != $this->authkey)
return "You are not authorized to reset voting.";
return $this->pusherProvider->triggerEvent('VoteReset', '', $gameId);
}
public function observe($gameId) {
try {
$gameData = json_decode($this->airtableApi->get(self::BASE_ID.'/'.$gameId)->getBody(), true);
$request = $this->request->getParsedBody();
$pageVars = [
'page' => 'reveal',
'gameId' => $gameId
];
$pageVars['player_data'] = [];
$pageVars['player_id'] = 'NARRATOR';
$pageVars['player_auth'] = 'NARRATOR';
foreach ($gameData['records'] as $r)
$pageVars['player_data'][$r['id']] = $r['fields']['Player Name'];
} catch (Exception $e) {
$pageVars = [ 'page' => 'invalid_game' ];
}
return $this->playerUiTemplate->render($pageVars);
}
}
Meta
- URI / COID
- coid://werewolves.lukasrosenstock.net/GameController content_copy
- Revision
- 25-4b045691d3206f98d6c30c86f9378dc4 content_copy
- Short ID
- werewolves:GameController content_copy
- Reference URL
- https://coid.link/werewolves.lukasrosenstock.net/GameController content_copy
- Last updated
- 2022-02-03 16:38 (UTC)
- Created at
- 2020-10-28 23:11 (UTC)
RDF
Objects in this namespace
- werewolves.lukasrosenstock.net
- GameController