diff --git a/check.php b/check.php
index 4f39d64..0744180 100644
--- a/check.php
+++ b/check.php
@@ -6,7 +6,7 @@ use PDOException;
require_once './includes/page.php';
class Check {
- public function run($name) {
+ public function run($name, $from) {
// validate user input
if (strlen($name) > 16 || !preg_match("/^[0-9a-zA-Z_]{1,16}$/", $name)) {
$this->println("Invalid name.");
@@ -28,6 +28,17 @@ class Check {
$this->println("$name has not joined before.");
return;
}
+ $href = "history.php?uuid=$uuid";
+
+ // sanitize $_POST['table'] ($from)
+ $from_type = $page->type_info($from);
+ $type = $from_type['type'];
+ if ($type !== null) {
+ $href .= "&from=" . lcfirst($from_type['title']);
+ }
+
+ echo "";
+ /*
$table = $page->settings->table['bans'];
$stmt = $page->conn->prepare("SELECT * FROM $table WHERE (uuid=? AND active=" . Settings::$TRUE . ") LIMIT 1");
@@ -51,6 +62,7 @@ class Check {
$this->println("Banned permanently.");
}
}
+ */
} catch (PDOException $ex) {
die($ex->getMessage());
}
@@ -61,7 +73,7 @@ class Check {
}
}
-if (isset($_POST['name'], $_POST['table'])) {
+if (isset($_GET['name'], $_GET['table'])) {
$check = new Check();
- $check->run($_POST['name']);
+ $check->run($_GET['name'], $_GET['table']);
}
diff --git a/history.php b/history.php
new file mode 100644
index 0000000..69497f6
--- /dev/null
+++ b/history.php
@@ -0,0 +1,154 @@
+conn->prepare("SELECT COUNT(*) AS count FROM $table WHERE uuid=:uuid");
+ $count_st->bindParam(":uuid", $uuid, PDO::PARAM_STR);
+ if ($count_st->execute() && ($row = $count_st->fetch()) !== null) {
+ $counts[$table] = $row['count'];
+ }
+
+ $st = $page->conn->prepare("SELECT * FROM $table WHERE uuid=:uuid ORDER BY time");
+
+ $st->bindParam(":uuid", $uuid, PDO::PARAM_STR);
+ // Incompatible with pager as rows are usort()'d
+ // $st->bindParam(':limit', $limit, PDO::PARAM_INT);
+
+ if ($st->execute()) {
+ while ($row = $st->fetch(PDO::FETCH_ASSOC)) {
+ $row['__table__'] = $table;
+ array_push($array, $row);
+ }
+ }
+ }
+
+ /**
+ * usort() function for rows in the database
+ * @param PDORow $a
+ * @param PDORow $b
+ * @return int
+ */
+ static function cmp_row_date($a, $b) {
+ $a = $a['time'];
+ $b = $b['time'];
+ if ($a === $b) {
+ return 0;
+ }
+ return ($a < $b) ? 1 : -1;
+ }
+}
+
+$page = new Page("history");
+
+if (!isset($_GET['uuid'])) {
+ die("Missing arguments (uuid).");
+}
+
+$uuid = $_GET['uuid'];
+$name = $page->get_name($uuid);
+
+if ($name === null) {
+ die("Player not found in database.");
+}
+
+$page->name = "Recent Punishments for $name";
+$page->print_title();
+$page->print_page_header();
+
+try {
+ $all = array();
+ $counts = array();
+
+ History::push($page, $all, 'bans', $uuid, $counts);
+ History::push($page, $all, 'mutes', $uuid, $counts);
+ History::push($page, $all, 'warnings', $uuid, $counts);
+ History::push($page, $all, 'kicks', $uuid, $counts);
+
+ $total = 0;
+ foreach ($counts as $count) {
+ $total += $count;
+ }
+
+ usort($all, array("litebans\\History", "cmp_row_date"));
+
+ if (!empty($all)) {
+ $page->table_begin();
+ $page->table_print_headers(array("Type", "Player", "Moderator", "Reason", "Date", "Expires"));
+
+ $offset = 0;
+ $limit = $page->settings->limit_per_page;
+
+ if ($page->settings->show_pager) {
+ $current_page = $page->page - 1;
+ $offset = ($limit * $current_page);
+ $limit += $offset;
+ }
+
+ $i = 0;
+ foreach ($all as $row) {
+ $i++;
+ if ($page->settings->show_pager && $i < $offset) {
+ continue;
+ }
+ if ($i > $limit) break;
+
+ $type = $row['__table__'];
+ $page->set_info($page->type_info($type));
+
+ $style = 'style="font-size: 13px;"';
+
+ $label_type = $page->type;
+ $label_name = Info::create($row, $page, $label_type)->name(); //ucfirst($label_type);
+ $label = "$label_name";
+
+ $page->print_table_rows($row, array(
+ 'Type' => $label,
+ 'Player' => $page->get_avatar($name, $row['uuid']),
+ 'Moderator' => $page->get_avatar($page->get_banner_name($row), $row['banned_by_uuid']),
+ 'Reason' => $page->clean($row['reason']),
+ 'Date' => $page->millis_to_date($row['time']),
+ 'Expires' => $page->expiry($row),
+ ));
+ }
+
+ $page->table_end();
+ // print pager
+ if ($page->settings->show_pager) {
+ $page->name = "history";
+ $page->print_pager($total, "&uuid=$uuid");
+ }
+ } else {
+ echo "No punishments found.
";
+ }
+
+ if (isset($_GET['from'])) {
+ // sanitize $_GET['from']
+ $info = $page->type_info($_GET['from']);
+ if ($info['type'] !== null) {
+ $title = $info['title'];
+ $href = lcfirst($title) . ".php";
+ echo "Return to $title";
+ }
+ }
+
+ $page->print_footer();
+} catch (PDOException $ex) {
+ die($ex->getMessage());
+}
diff --git a/includes/css/custom.css b/includes/css/custom.css
index 7476822..2ec243a 100644
--- a/includes/css/custom.css
+++ b/includes/css/custom.css
@@ -41,3 +41,19 @@ a:focus {
tr.hover {
cursor: pointer;
}
+
+.label-ban {
+ background-color: darkred;
+}
+
+.label-mute {
+ background-color: dimgrey;
+}
+
+.label-warn {
+ background-color: darkorange;
+}
+
+.label-kick {
+ background-color: tomato;
+}
diff --git a/includes/page.php b/includes/page.php
index f12d137..d1c4258 100644
--- a/includes/page.php
+++ b/includes/page.php
@@ -24,28 +24,14 @@ class Page {
}
}
$this->name = $name;
- switch ($name) {
- case "ban":
- case "bans":
- $this->type = "ban";
- $this->table = $settings->table['bans'];
- break;
- case "mute":
- case "mutes":
- $this->type = "mute";
- $this->table = $settings->table['mutes'];
- break;
- case "warn":
- case "warnings":
- $this->type = "warn";
- $this->table = $settings->table['warnings'];
- break;
- case "kick":
- case "kicks":
- $this->type = "kick";
- $this->table = $settings->table['kicks'];
- break;
- }
+
+ $this->type = null;
+ $this->table = null;
+ $this->title = null;
+
+ $info = $this->type_info($name);
+ $this->set_info($info);
+
$this->permanent = array(
'ban' => 'Permanent Ban',
'mute' => 'Permanent Mute',
@@ -60,6 +46,46 @@ class Page {
);
}
+ public function type_info($type) {
+ $settings = $this->settings;
+ switch ($type) {
+ case "ban":
+ case "bans":
+ return array(
+ "type" => "ban",
+ "table" => $settings->table['bans'],
+ "title" => "Bans",
+ );
+ case "mute":
+ case "mutes":
+ return array(
+ "type" => "mute",
+ "table" => $settings->table['mutes'],
+ "title" => "Mutes",
+ );
+ case "warn":
+ case "warnings":
+ return array(
+ "type" => "warn",
+ "table" => $settings->table['warnings'],
+ "title" => "Warnings",
+ );
+ case "kick":
+ case "kicks":
+ return array(
+ "type" => "kick",
+ "table" => $settings->table['kicks'],
+ "title" => "Kicks",
+ );
+ default:
+ return array(
+ "type" => null,
+ "table" => null,
+ "title" => null,
+ );
+ }
+ }
+
function run_query() {
try {
$table = $this->table;
@@ -86,12 +112,14 @@ class Page {
}
/**
- * Returns an tag representing the Minecraft avatar for a specific name or UUID.
+ * Returns HTML representing the Minecraft avatar for a specific name or UUID.
* @param $name
* @param $uuid
+ * @param bool $name_under
+ * @param string $name_repl
* @return string
*/
- function get_avatar($name, $uuid) {
+ function get_avatar($name, $uuid, $name_under = true, $name_repl = null) {
if (strlen($uuid) === 36 && $uuid[14] === '3') {
// Avatars cannot be associated with offline mode UUIDs (version 3)
$uuid = $name;
@@ -101,6 +129,12 @@ class Page {
$src = $this->settings->console_image;
$name = $this->settings->console_name;
}
+ if ($name_repl !== null) {
+ $name = $name_repl;
+ }
+ if ($name_under) {
+ return "
$name