public function query() {
$args = func_get_args();
$statement = $this->db->prepare(array_shift($args));
- if ($args) call_user_func_array(array($statement, 'bind_param'), &$args);
+ #if ($args) call_user_func_array(array($statement, 'bind_param'), &$args);
+ if ($args) call_user_func_array(array($statement, 'bind_param'), $args);
$statement->execute();
$statement->store_result();
$statement->store_result();
public function insert() {
$args = func_get_args();
$statement = $this->db->prepare(array_shift($args));
- call_user_func_array(array($statement, 'bind_param'), &$args);
+ call_user_func_array(array($statement, 'bind_param'), $args);
$statement->execute();
return $this->db->insert_id;
}
public function update() {
$args = func_get_args();
$statement = $this->db->prepare(array_shift($args));
- call_user_func_array(array($statement, 'bind_param'), &$args);
+ call_user_func_array(array($statement, 'bind_param'), $args);
$statement->execute();
return $this->db->insert_id;
}
'si', $_GET['name'], $this->universe->rooms[$x][$y]['id']);
$_SESSION['id'] = $id;
//$others = $this->query('SELECT id, room FROM players WHERE id != ?', 'i', $this->player->id);
- return array('x' => $x, 'y' => $y, 'id' => $id, 'name' => $name, 'poll' => $this->poll());
+ return array('x' => $x, 'y' => $y, 'id' => $id, 'poll' => $this->poll());
}
private function yell($msg) {
+ if (!$msg) $this->error('400', 'expected `msg` field');
$this->insert(
'INSERT INTO messages (message,type,room,source) VALUES(?,?,?,?)',
'ssii', $msg, 'yell', $this->player->room, $this->player->id);
}
private function say($msg) {
+ if (!$msg) $this->error('400', 'expected `dest` field');
$this->insert(
'INSERT INTO messages (message,type,room,source) VALUES(?,?,?,?)',
'ssii', $msg, 'say', $this->player->room, $this->player->id);
}
- private function move() {
+ private function tell($dest, $msg) {
+ if (!$dest || !$msg) $this->error('400', 'expected `dest` and `msg` fields');
+ $player = $this->query('SELECT id FROM players where name = ?', 's', $dest);
+ if (!($player && $player['id']))
+ $this->error(400, "could not find a player with `name` == $dest");
+ $this->insert(
+ 'INSERT INTO messages (message,type,destination,source) VALUES(?,?,?,?)',
+ 'ssii', $msg, 'say', $player['id'], $this->player->id);
+ }
+
+ private function move($direction) {
+ $directions = array(
+ 'north' => array('x' => $this->player->x, 'y' => $this->player->y-1),
+ 'east' => array('x' => $this->player->x+1, 'y' => $this->player->y),
+ 'south' => array('x' => $this->player->x, 'y' => $this->player->y+1),
+ 'west' => array('x' => $this->player->x-1, 'y' => $this->player->y),
+ );
+ if ($directions[$direction]) {
+ $rooms = $this->query(
+ 'SELECT id, state, description FROM rooms WHERE x = ? and y = ?',
+ 'ii', $directions[$direction]['x'], $directions[$direction]['y']);
+ if ($rooms[0] && !$rooms[0]['state']) {
+ $this->update('UPDATE players SET room = ? WHERE players.id = ?',
+ 'si', $rooms[0]['id'], $this->player->id);
+ return array('description' => $rooms[0]['description']);
+ } else {
+ $this->error(403, 'your path is blocked');
+ }
+ } else
+ $this->error(400, 'expected `direction` field with value {north|east|south|west}');
}
private function poll() {
public function command($cmd) {
if (!$_GET['cmd'])
$this->error(400, 'Missing command: expected `cmd` field');
- if ($_GET['cmd'] != 'join' && $_GET['cmd'] != 'start' && !isset($_SESSION['id']))
+ if (($_GET['cmd'] != 'join' && $_GET['cmd'] != 'kick')
+ && $_GET['cmd'] != 'start' && !isset($_SESSION['id']))
$this->error(401, 'Missing user ID: please join first');
if (isset($_SESSION['id'])) $this->player = new player($this);
switch ($cmd) {
$this->response($this->join());
break;
case 'move':
- $this->response(array('valid' => $this->move()));
+ $this->response($this->move($_GET['direction']));
break;
case 'tell':
- $this->tell();
+ $this->tell($_GET['msg']);
break;
case 'yell':
$this->yell($_GET['msg']);
break;
case 'say':
- $this->say();
+ $this->say($_GET['msg']);
break;
case 'tell':
- $this->tell();
+ $this->tell($_GET['dest'], $_GET['msg']);
break;
case 'poll':
- echo json_encode($this->poll());
+ $this->response($this->poll());
+ break;
+ case 'kick':
+ $this->update('DELETE FROM players');
break;
default:
- $this->error(400, 'Unknown command');
+ $this->error(400, 'unknown command');
}
}
private function error($status, $msg) {
header("HTTP/1.0 $status");
echo $msg;
+ exit;
}
}