lang);
require_once './lang/en_US.utf8.php';
$this->defaultlang = new DefaultLang();
require_once './lang/' . $settings->lang . '.php';
if (class_exists("Lang")) {
$this->lang = new Lang();
} else {
$this->lang = $this->defaultlang;
}
$this->time = microtime(true);
if ($header) {
require_once './inc/header.php';
}
$this->conn = $settings->conn;
$this->settings = $settings;
$this->uuid_name_cache = array();
$this->page = 1;
if (isset($_GET['page'])) {
$page = $_GET['page']; // user input
if (filter_var($page, FILTER_VALIDATE_INT)) {
$this->page = max(0, (int)$page);
}
}
$this->name = $name;
$this->type = null;
$this->table = null;
$this->title = null;
$info = $this->type_info($name);
$this->set_info($info);
$this->permanent = array(
'ban' => $this->t("generic.permanent") . " " . $this->t("generic.ban"),
'mute' => $this->t("generic.permanent") . " " . $this->t("generic.mute"),
'warn' => $this->t("generic.permanent"),
'kick' => null,
);
$this->expired = array(
'ban' => $this->t("page.expired.ban"),
'mute' => $this->t("page.expired.mute"),
'warn' => $this->t("page.expired.warning"),
'kick' => null,
);
$this->expired_by = array(
'ban' => $this->t("page.expired.ban-by"),
'mute' => $this->t("page.expired.mute-by"),
'warn' => $this->t("page.expired.warning"),
'kick' => null,
);
if ($header) {
$h = new Header($this);
$this->header = $h;
$h->print_header();
}
$this->table_headers_printed = false;
}
public function t($str) {
if (array_key_exists($str, $this->lang->array)) {
return $this->lang->array[$str];
}
if (array_key_exists($str, $this->defaultlang->array)) {
return $this->defaultlang->array[$str];
}
return "404";
}
public function type_info($type) {
$settings = $this->settings;
switch ($type) {
case "ban":
case "bans":
return array(
"type" => "ban",
"table" => $settings->table['bans'],
"title" => $this->t("title.bans"),
);
case "mute":
case "mutes":
return array(
"type" => "mute",
"table" => $settings->table['mutes'],
"title" => $this->t("title.mutes"),
);
case "warn":
case "warnings":
return array(
"type" => "warn",
"table" => $settings->table['warnings'],
"title" => $this->t("title.warnings"),
);
case "kick":
case "kicks":
return array(
"type" => "kick",
"table" => $settings->table['kicks'],
"title" => $this->t("title.kicks"),
);
default:
return array(
"type" => null,
"table" => null,
"title" => null,
);
}
}
/**
* @param $info
*/
function set_info($info) {
$this->type = $info['type'];
$this->table = $info['table'];
$this->title = $info['title'];
}
function run_query() {
try {
$table = $this->table;
$limit = $this->settings->limit_per_page;
$offset = 0;
if ($this->settings->show_pager) {
$page = $this->page - 1;
$offset = ($limit * $page);
}
$sel = $this->get_selection($table);
$where = $this->where_append($this->name === "kicks" ? "" : $this->settings->active_query);
$where .= "(uuid <> '#offline#' AND uuid IS NOT NULL)";
$query = "SELECT $sel FROM $table $where GROUP BY $table.id ORDER BY time DESC LIMIT :limit OFFSET :offset";
$st = $this->conn->prepare($query);
$st->bindParam(':offset', $offset, PDO::PARAM_INT);
$st->bindParam(':limit', $limit, PDO::PARAM_INT);
$st->execute();
$rows = $st->fetchAll();
$st->closeCursor();
return $rows;
} catch (PDOException $ex) {
Settings::handle_error($this->settings, $ex);
}
}
function get_selection($table) {
// Under certain versions of PHP, there is a bug with BIT columns.
// An empty string is returned no matter what the value is.
// Workaround: cast to unsigned.
$selection = "id,uuid,reason,banned_by_name,banned_by_uuid,time,until,server_origin,server_scope,CAST(active AS UNSIGNED) AS active,CAST(ipban AS UNSIGNED) AS ipban";
if ($table === $this->settings->table['warnings']) {
$selection .= ",CAST(warned AS UNSIGNED) AS warned";
}
if ($table !== $this->settings->table['kicks']) {
$selection .= ",removed_by_uuid,removed_by_name,removed_by_date";
}
return $selection;
}
/**
* Returns HTML representing the Minecraft avatar for a specific name or UUID.
* @return string
*/
function get_avatar($name, $uuid, $name_under = true, $name_repl = null, $name_left = true) {
if ($name_under) {
$name_under = $this->settings->avatar_names_below;
}
$avatar_source = $this->settings->avatar_source;
if (strlen($uuid) === 36 && $uuid[14] === '3') {
$avatar_source = $this->settings->avatar_source_offline_mode;
// Avatars cannot be associated with offline mode UUIDs (version 3)
if (!$this->settings->avatar_allow_offline_mode_uuids) {
$uuid = $name;
}
}
$uuid = str_replace("-", "", $uuid);
$src = str_replace('{name}', $name, str_replace('{uuid}', $uuid, $avatar_source));
if (in_array($name, $this->settings->console_aliases) || $name === $this->settings->console_name) {
$src = $this->settings->console_image;
$name = $this->settings->console_name;
}
if ($name_repl !== null) {
$name = $name_repl;
}
$img = "";
$str = "{$img}$name";
if ($name_under) {
$str = "{$img}
$name";
return "
$str
"; } if ($name_left) { return "$str
"; } return $str; } /** * Returns the banner name for a specific row in the database * using their UUID->name if possible, otherwise returns their last recorded name. * @param row * @return string */ function get_banner_name($row) { $uuid = $row['banned_by_uuid']; $display_name = $row['banned_by_name']; $console_aliases = $this->settings->console_aliases; if (in_array($uuid, $console_aliases) || in_array($row['banned_by_name'], $console_aliases)) { return $this->settings->console_name; } $name = $this->get_name($uuid); if ($name !== null) { return $name; } return $this->clean($display_name); } /** * Returns the last name for a UUID, or null if their name is not recorded in the database. * @param string * @return null|string */ function get_name($uuid) { if ($uuid === null || $uuid === "" || strrpos($uuid, "#", -strlen($uuid)) !== false) return null; if (in_array($uuid, $this->settings->console_aliases)) { return $this->settings->console_name; } if (array_key_exists($uuid, $this->uuid_name_cache)) return $this->uuid_name_cache[$uuid]; $result = null; $history = $this->settings->table['history']; $stmt = $this->conn->prepare("SELECT name FROM $history WHERE uuid=? ORDER BY date DESC LIMIT 1"); if ($stmt->execute(array($uuid)) && $row = $stmt->fetch()) { $result = $row['name']; } $stmt->closeCursor(); $this->uuid_name_cache[$uuid] = $result; return $result; } /** * Prepares text to be displayed on the web interface. * Removes chat colours, replaces newlines with proper HTML, and sanitizes the text. * @param string * @return string|null */ function clean($text) { if ($text === null) return null; if (strstr($text, "\xa7") || strstr($text, "&")) { $text = preg_replace("/(?i)(\x{00a7}|&)[0-9A-FK-OR]/u", "", $text); } $text = htmlspecialchars($text, ENT_QUOTES, "UTF-8"); if (strstr($text, "\n")) { $text = preg_replace("/\n/", "