From 70847aeff360b50c8d25879d198bbeccd2250f65 Mon Sep 17 00:00:00 2001 From: towards-a-new-leftypol Date: Thu, 3 Aug 2023 17:43:10 -0400 Subject: [PATCH] formatting: retab some files --- inc/bans.php | 576 +++++++++++++++--------------- templates/themes/recent/theme.php | 316 ++++++++-------- 2 files changed, 446 insertions(+), 446 deletions(-) diff --git a/inc/bans.php b/inc/bans.php index e6c79241..b3808613 100644 --- a/inc/bans.php +++ b/inc/bans.php @@ -5,314 +5,314 @@ require_once 'vendor/autoload.php'; use Lifo\IP\CIDR; class Bans { - static public function range_to_string($mask) { - list($ipstart, $ipend) = $mask; - - if (!isset($ipend) || $ipend === false) { - // Not a range. Single IP address. - $ipstr = inet_ntop($ipstart); - return $ipstr; - } - - if (strlen($ipstart) != strlen($ipend)) - return '???'; // What the fuck are you doing, son? - - $range = CIDR::range_to_cidr(inet_ntop($ipstart), inet_ntop($ipend)); - if ($range !== false) - return $range; - - return '???'; - } - - private static function calc_cidr($mask) { - $cidr = new CIDR($mask); - $range = $cidr->getRange(); - - return array(inet_pton($range[0]), inet_pton($range[1])); - } - - public static function parse_time($str) { - if (empty($str)) - return false; - - if (($time = @strtotime($str)) !== false) - return $time; - - if (!preg_match('/^((\d+)\s?ye?a?r?s?)?\s?+((\d+)\s?mon?t?h?s?)?\s?+((\d+)\s?we?e?k?s?)?\s?+((\d+)\s?da?y?s?)?((\d+)\s?ho?u?r?s?)?\s?+((\d+)\s?mi?n?u?t?e?s?)?\s?+((\d+)\s?se?c?o?n?d?s?)?$/', $str, $matches)) - return false; - - $expire = 0; - - if (isset($matches[2])) { - // Years - $expire += (int)$matches[2]*60*60*24*365; - } - if (isset($matches[4])) { - // Months - $expire += (int)$matches[4]*60*60*24*30; - } - if (isset($matches[6])) { - // Weeks - $expire += (int)$matches[6]*60*60*24*7; - } - if (isset($matches[8])) { - // Days - $expire += (int)$matches[8]*60*60*24; - } - if (isset($matches[10])) { - // Hours - $expire += (int)$matches[10]*60*60; - } - if (isset($matches[12])) { - // Minutes - $expire += (int)$matches[12]*60; - } - if (isset($matches[14])) { - // Seconds - $expire += (int)$matches[14]; - } - - return time() + $expire; - } - - static public function parse_range($mask) { - $ipstart = false; - $ipend = false; - - if (preg_match('@^(\d{1,3}\.){1,3}([\d*]{1,3})?$@', $mask) && substr_count($mask, '*') == 1) { - // IPv4 wildcard mask - $parts = explode('.', $mask); - $ipv4 = ''; - foreach ($parts as $part) { - if ($part == '*') { - $ipstart = inet_pton($ipv4 . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.'))); - $ipend = inet_pton($ipv4 . '255' . str_repeat('.255', 3 - substr_count($ipv4, '.'))); - break; - } elseif(($wc = strpos($part, '*')) !== false) { - $ipstart = inet_pton($ipv4 . substr($part, 0, $wc) . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.'))); - $ipend = inet_pton($ipv4 . substr($part, 0, $wc) . '9' . str_repeat('.255', 3 - substr_count($ipv4, '.'))); - break; - } - $ipv4 .= "$part."; - } - } elseif (preg_match('@^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d+$@', $mask)) { - list($ipv4, $bits) = explode('/', $mask); - if ($bits > 32) - return false; - - list($ipstart, $ipend) = self::calc_cidr($mask); - } elseif (preg_match('@^[:a-z\d]+/\d+$@i', $mask)) { - list($ipv6, $bits) = explode('/', $mask); - if ($bits > 128) - return false; - - list($ipstart, $ipend) = self::calc_cidr($mask); - } else { - if (($ipstart = @inet_pton($mask)) === false) - return false; - } - - return array($ipstart, $ipend); - } - - static public function find($ip, $board = false, $get_mod_info = false) { - global $config; - - $query = prepare('SELECT ``bans``.*' . ($get_mod_info ? ', `username`' : '') . ' FROM ``bans`` - ' . ($get_mod_info ? 'LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`' : '') . ' - WHERE - (' . ($board !== false ? '(`board` IS NULL OR `board` = :board) AND' : '') . ' - (`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`))) - ORDER BY `expires` IS NULL, `expires` DESC'); - - if ($board !== false) - $query->bindValue(':board', $board, PDO::PARAM_STR); - - $query->bindValue(':ip', inet_pton($ip)); - $query->execute() or error(db_error($query)); - - $ban_list = array(); - - while ($ban = $query->fetch(PDO::FETCH_ASSOC)) { - if ($ban['expires'] && ($ban['seen'] || !$config['require_ban_view']) && $ban['expires'] < time()) { - self::delete($ban['id']); - } else { - if ($ban['post']) - $ban['post'] = json_decode($ban['post'], true); - $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); - $ban_list[] = $ban; - } - } - - return $ban_list; - } + static public function range_to_string($mask) { + list($ipstart, $ipend) = $mask; + + if (!isset($ipend) || $ipend === false) { + // Not a range. Single IP address. + $ipstr = inet_ntop($ipstart); + return $ipstr; + } + + if (strlen($ipstart) != strlen($ipend)) + return '???'; // What the fuck are you doing, son? + + $range = CIDR::range_to_cidr(inet_ntop($ipstart), inet_ntop($ipend)); + if ($range !== false) + return $range; + + return '???'; + } + + private static function calc_cidr($mask) { + $cidr = new CIDR($mask); + $range = $cidr->getRange(); + + return array(inet_pton($range[0]), inet_pton($range[1])); + } + + public static function parse_time($str) { + if (empty($str)) + return false; + + if (($time = @strtotime($str)) !== false) + return $time; + + if (!preg_match('/^((\d+)\s?ye?a?r?s?)?\s?+((\d+)\s?mon?t?h?s?)?\s?+((\d+)\s?we?e?k?s?)?\s?+((\d+)\s?da?y?s?)?((\d+)\s?ho?u?r?s?)?\s?+((\d+)\s?mi?n?u?t?e?s?)?\s?+((\d+)\s?se?c?o?n?d?s?)?$/', $str, $matches)) + return false; + + $expire = 0; + + if (isset($matches[2])) { + // Years + $expire += (int)$matches[2]*60*60*24*365; + } + if (isset($matches[4])) { + // Months + $expire += (int)$matches[4]*60*60*24*30; + } + if (isset($matches[6])) { + // Weeks + $expire += (int)$matches[6]*60*60*24*7; + } + if (isset($matches[8])) { + // Days + $expire += (int)$matches[8]*60*60*24; + } + if (isset($matches[10])) { + // Hours + $expire += (int)$matches[10]*60*60; + } + if (isset($matches[12])) { + // Minutes + $expire += (int)$matches[12]*60; + } + if (isset($matches[14])) { + // Seconds + $expire += (int)$matches[14]; + } + + return time() + $expire; + } + + static public function parse_range($mask) { + $ipstart = false; + $ipend = false; + + if (preg_match('@^(\d{1,3}\.){1,3}([\d*]{1,3})?$@', $mask) && substr_count($mask, '*') == 1) { + // IPv4 wildcard mask + $parts = explode('.', $mask); + $ipv4 = ''; + foreach ($parts as $part) { + if ($part == '*') { + $ipstart = inet_pton($ipv4 . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.'))); + $ipend = inet_pton($ipv4 . '255' . str_repeat('.255', 3 - substr_count($ipv4, '.'))); + break; + } elseif(($wc = strpos($part, '*')) !== false) { + $ipstart = inet_pton($ipv4 . substr($part, 0, $wc) . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.'))); + $ipend = inet_pton($ipv4 . substr($part, 0, $wc) . '9' . str_repeat('.255', 3 - substr_count($ipv4, '.'))); + break; + } + $ipv4 .= "$part."; + } + } elseif (preg_match('@^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d+$@', $mask)) { + list($ipv4, $bits) = explode('/', $mask); + if ($bits > 32) + return false; + + list($ipstart, $ipend) = self::calc_cidr($mask); + } elseif (preg_match('@^[:a-z\d]+/\d+$@i', $mask)) { + list($ipv6, $bits) = explode('/', $mask); + if ($bits > 128) + return false; + + list($ipstart, $ipend) = self::calc_cidr($mask); + } else { + if (($ipstart = @inet_pton($mask)) === false) + return false; + } + + return array($ipstart, $ipend); + } + + static public function find($ip, $board = false, $get_mod_info = false) { + global $config; + + $query = prepare('SELECT ``bans``.*' . ($get_mod_info ? ', `username`' : '') . ' FROM ``bans`` + ' . ($get_mod_info ? 'LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`' : '') . ' + WHERE + (' . ($board !== false ? '(`board` IS NULL OR `board` = :board) AND' : '') . ' + (`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`))) + ORDER BY `expires` IS NULL, `expires` DESC'); + + if ($board !== false) + $query->bindValue(':board', $board, PDO::PARAM_STR); + + $query->bindValue(':ip', inet_pton($ip)); + $query->execute() or error(db_error($query)); + + $ban_list = array(); + + while ($ban = $query->fetch(PDO::FETCH_ASSOC)) { + if ($ban['expires'] && ($ban['seen'] || !$config['require_ban_view']) && $ban['expires'] < time()) { + self::delete($ban['id']); + } else { + if ($ban['post']) + $ban['post'] = json_decode($ban['post'], true); + $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); + $ban_list[] = $ban; + } + } + + return $ban_list; + } - static public function stream_json($out = false, $filter_ips = false, $filter_staff = false, $board_access = false, $hide_regexes = []) { - $query = query("SELECT ``bans``.*, `username` FROM ``bans`` - LEFT JOIN ``mods`` ON ``mods``.`id` = `creator` - ORDER BY `created` DESC") or error(db_error()); + static public function stream_json($out = false, $filter_ips = false, $filter_staff = false, $board_access = false, $hide_regexes = []) { + $query = query("SELECT ``bans``.*, `username` FROM ``bans`` + LEFT JOIN ``mods`` ON ``mods``.`id` = `creator` + ORDER BY `created` DESC") or error(db_error()); $bans = $query->fetchAll(PDO::FETCH_ASSOC); - if ($board_access && $board_access[0] == '*') $board_access = false; + if ($board_access && $board_access[0] == '*') $board_access = false; - $out ? fputs($out, "[") : print("["); + $out ? fputs($out, "[") : print("["); - $end = end($bans); + $end = end($bans); - foreach ($bans as &$ban) { - $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); + foreach ($bans as &$ban) { + $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); - $hide_message = false; - foreach ($hide_regexes as $regex) { - if(preg_match($regex, $ban['reason'])) { - $hide_message = true; - break; - } - } + $hide_message = false; + foreach ($hide_regexes as $regex) { + if(preg_match($regex, $ban['reason'])) { + $hide_message = true; + break; + } + } - if ($ban['post'] && !$hide_message) { - $post = json_decode($ban['post']); - $ban['message'] = isset($post->body) ? $post->body : 0; - } - unset($ban['ipstart'], $ban['ipend'], $ban['post'], $ban['creator']); + if ($ban['post'] && !$hide_message) { + $post = json_decode($ban['post']); + $ban['message'] = isset($post->body) ? $post->body : 0; + } + unset($ban['ipstart'], $ban['ipend'], $ban['post'], $ban['creator']); - if ($board_access === false || in_array ($ban['board'], $board_access)) { - $ban['access'] = true; - } + if ($board_access === false || in_array ($ban['board'], $board_access)) { + $ban['access'] = true; + } - if (filter_var($ban['mask'], FILTER_VALIDATE_IP) !== false) { - $ban['single_addr'] = true; - } - if ($filter_staff || ($board_access !== false && !in_array($ban['board'], $board_access))) { - $ban['username'] = '?'; - } - if ($filter_ips || ($board_access !== false && !in_array($ban['board'], $board_access))) { - @list($ban['mask'], $subnet) = explode("/", $ban['mask']); - $ban['mask'] = preg_split("/[\.:]/", $ban['mask']); - $ban['mask'] = array_slice($ban['mask'], 0, 2); - $ban['mask'] = implode(".", $ban['mask']); - $ban['mask'] .= ".x.x"; - if (isset ($subnet)) { - $ban['mask'] .= "/$subnet"; - } - $ban['masked'] = true; - } + if (filter_var($ban['mask'], FILTER_VALIDATE_IP) !== false) { + $ban['single_addr'] = true; + } + if ($filter_staff || ($board_access !== false && !in_array($ban['board'], $board_access))) { + $ban['username'] = '?'; + } + if ($filter_ips || ($board_access !== false && !in_array($ban['board'], $board_access))) { + @list($ban['mask'], $subnet) = explode("/", $ban['mask']); + $ban['mask'] = preg_split("/[\.:]/", $ban['mask']); + $ban['mask'] = array_slice($ban['mask'], 0, 2); + $ban['mask'] = implode(".", $ban['mask']); + $ban['mask'] .= ".x.x"; + if (isset ($subnet)) { + $ban['mask'] .= "/$subnet"; + } + $ban['masked'] = true; + } - $json = json_encode($ban); - $out ? fputs($out, $json) : print($json); + $json = json_encode($ban); + $out ? fputs($out, $json) : print($json); - if ($ban['id'] != $end['id']) { - $out ? fputs($out, ",") : print(","); - } - } + if ($ban['id'] != $end['id']) { + $out ? fputs($out, ",") : print(","); + } + } $out ? fputs($out, "]") : print("]"); - } - - static public function seen($ban_id) { - $query = query("UPDATE ``bans`` SET `seen` = 1 WHERE `id` = " . (int)$ban_id) or error(db_error()); + } + + static public function seen($ban_id) { + $query = query("UPDATE ``bans`` SET `seen` = 1 WHERE `id` = " . (int)$ban_id) or error(db_error()); rebuildThemes('bans'); - } - - static public function purge() { - $query = query("DELETE FROM ``bans`` WHERE `expires` IS NOT NULL AND `expires` < " . time() . " AND `seen` = 1") or error(db_error()); - rebuildThemes('bans'); - } - - static public function delete($ban_id, $modlog = false, $boards = false, $dont_rebuild = false) { - global $config; + } + + static public function purge() { + $query = query("DELETE FROM ``bans`` WHERE `expires` IS NOT NULL AND `expires` < " . time() . " AND `seen` = 1") or error(db_error()); + rebuildThemes('bans'); + } + + static public function delete($ban_id, $modlog = false, $boards = false, $dont_rebuild = false) { + global $config; - if ($boards && $boards[0] == '*') $boards = false; + if ($boards && $boards[0] == '*') $boards = false; - if ($modlog) { - $query = query("SELECT `ipstart`, `ipend`, `board` FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error()); - if (!$ban = $query->fetch(PDO::FETCH_ASSOC)) { - // Ban doesn't exist - return false; - } + if ($modlog) { + $query = query("SELECT `ipstart`, `ipend`, `board` FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error()); + if (!$ban = $query->fetch(PDO::FETCH_ASSOC)) { + // Ban doesn't exist + return false; + } - if ($boards !== false && !in_array($ban['board'], $boards)) - error($config['error']['noaccess']); - - $mask = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); - - modLog("Removed ban #{$ban_id} for " . - (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask" : $mask)); - } - - query("DELETE FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error()); + if ($boards !== false && !in_array($ban['board'], $boards)) + error($config['error']['noaccess']); + + $mask = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); + + modLog("Removed ban #{$ban_id} for " . + (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask" : $mask)); + } + + query("DELETE FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error()); - if (!$dont_rebuild) rebuildThemes('bans'); - - return true; - } - - static public function new_ban($mask, $reason, $length = false, $ban_board = false, $mod_id = false, $post = false) { - global $mod, $pdo, $board; - - if ($mod_id === false) { - $mod_id = isset($mod['id']) ? $mod['id'] : -1; - } - - $range = self::parse_range($mask); - $mask = self::range_to_string($range); - - $query = prepare("INSERT INTO ``bans`` VALUES (NULL, :ipstart, :ipend, :time, :expires, :board, :mod, :reason, 0, :post)"); - - $query->bindValue(':ipstart', $range[0]); - if ($range[1] !== false && $range[1] != $range[0]) - $query->bindValue(':ipend', $range[1]); - else - $query->bindValue(':ipend', null, PDO::PARAM_NULL); - - $query->bindValue(':mod', $mod_id); - $query->bindValue(':time', time()); - - if ($reason !== '') { - $reason = escape_markup_modifiers($reason); - markup($reason); - $query->bindValue(':reason', $reason); - } else - $query->bindValue(':reason', null, PDO::PARAM_NULL); - - if ($length) { - if (is_int($length) || ctype_digit($length)) { - $length = time() + $length; - } else { - $length = self::parse_time($length); - } - $query->bindValue(':expires', $length); - } else { - $query->bindValue(':expires', null, PDO::PARAM_NULL); - } - - if ($ban_board) - $query->bindValue(':board', $ban_board); - else - $query->bindValue(':board', null, PDO::PARAM_NULL); - - if ($post) { - $post['board'] = $board['uri']; - $query->bindValue(':post', json_encode($post)); - } else - $query->bindValue(':post', null, PDO::PARAM_NULL); - - $query->execute() or error(db_error($query)); - - if (isset($mod['id']) && $mod['id'] == $mod_id) { - modLog('Created a new ' . - ($length > 0 ? preg_replace('/^(\d+) (\w+?)s?$/', '$1-$2', until($length)) : 'permanent') . - ' ban on ' . - ($ban_board ? '/' . $ban_board . '/' : 'all boards') . - ' for ' . - (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask" : $mask) . - ' (#' . $pdo->lastInsertId() . ')' . - ' with ' . ($reason ? 'reason: ' . utf8tohtml($reason) . '' : 'no reason')); - } + if (!$dont_rebuild) rebuildThemes('bans'); + + return true; + } + + static public function new_ban($mask, $reason, $length = false, $ban_board = false, $mod_id = false, $post = false) { + global $mod, $pdo, $board; + + if ($mod_id === false) { + $mod_id = isset($mod['id']) ? $mod['id'] : -1; + } + + $range = self::parse_range($mask); + $mask = self::range_to_string($range); + + $query = prepare("INSERT INTO ``bans`` VALUES (NULL, :ipstart, :ipend, :time, :expires, :board, :mod, :reason, 0, :post)"); + + $query->bindValue(':ipstart', $range[0]); + if ($range[1] !== false && $range[1] != $range[0]) + $query->bindValue(':ipend', $range[1]); + else + $query->bindValue(':ipend', null, PDO::PARAM_NULL); + + $query->bindValue(':mod', $mod_id); + $query->bindValue(':time', time()); + + if ($reason !== '') { + $reason = escape_markup_modifiers($reason); + markup($reason); + $query->bindValue(':reason', $reason); + } else + $query->bindValue(':reason', null, PDO::PARAM_NULL); + + if ($length) { + if (is_int($length) || ctype_digit($length)) { + $length = time() + $length; + } else { + $length = self::parse_time($length); + } + $query->bindValue(':expires', $length); + } else { + $query->bindValue(':expires', null, PDO::PARAM_NULL); + } + + if ($ban_board) + $query->bindValue(':board', $ban_board); + else + $query->bindValue(':board', null, PDO::PARAM_NULL); + + if ($post) { + $post['board'] = $board['uri']; + $query->bindValue(':post', json_encode($post)); + } else + $query->bindValue(':post', null, PDO::PARAM_NULL); + + $query->execute() or error(db_error($query)); + + if (isset($mod['id']) && $mod['id'] == $mod_id) { + modLog('Created a new ' . + ($length > 0 ? preg_replace('/^(\d+) (\w+?)s?$/', '$1-$2', until($length)) : 'permanent') . + ' ban on ' . + ($ban_board ? '/' . $ban_board . '/' : 'all boards') . + ' for ' . + (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask" : $mask) . + ' (#' . $pdo->lastInsertId() . ')' . + ' with ' . ($reason ? 'reason: ' . utf8tohtml($reason) . '' : 'no reason')); + } - rebuildThemes('bans'); + rebuildThemes('bans'); - return $pdo->lastInsertId(); - } + return $pdo->lastInsertId(); + } } diff --git a/templates/themes/recent/theme.php b/templates/themes/recent/theme.php index bb85df12..3f9d9a16 100644 --- a/templates/themes/recent/theme.php +++ b/templates/themes/recent/theme.php @@ -1,168 +1,168 @@ build($action, $settings); - } - - // Wrap functions in a class so they don't interfere with normal Tinyboard operations - class RecentPosts { - public function build($action, $settings) { - global $config, $_theme; - - if ($action == 'all') { - copy('templates/themes/recent/' . $settings['basecss'], $config['dir']['home'] . "stylesheets/" . $settings['css']); - } - - $this->excluded = explode(' ', $settings['exclude']); - - if ($action == 'all' || $action == 'post' || $action == 'post-thread' || $action == 'post-delete') { - $action = generation_strategy('sb_recent', array()); - if ($action == 'delete') { - file_unlink($config['dir']['home'] . $settings['html']); - } - elseif ($action == 'rebuild') { - file_write($config['dir']['home'] . $settings['html'], $this->homepage($settings)); - } - } - } - - // Build news page - public function homepage($settings) { - global $config, $board; - - $recent_images = Array(); - $recent_posts = Array(); - $stats = Array(); - - $boards = listBoards(); - - $query = ''; - foreach ($boards as &$_board) { - if (in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` WHERE `files` IS NOT NULL UNION ALL ", $_board['uri'], $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_images'], $query); - - if ($query == '') { - error(_("Can't build the RecentPosts theme, because there are no boards to be fetched.")); - } + require 'info.php'; + + function recentposts_build($action, $settings, $board) { + // Possible values for $action: + // - all (rebuild everything, initialization) + // - news (news has been updated) + // - boards (board list changed) + // - post (a post has been made) + // - post-thread (a thread has been made) + + $b = new RecentPosts(); + $b->build($action, $settings); + } + + // Wrap functions in a class so they don't interfere with normal Tinyboard operations + class RecentPosts { + public function build($action, $settings) { + global $config, $_theme; + + if ($action == 'all') { + copy('templates/themes/recent/' . $settings['basecss'], $config['dir']['home'] . "stylesheets/" . $settings['css']); + } + + $this->excluded = explode(' ', $settings['exclude']); + + if ($action == 'all' || $action == 'post' || $action == 'post-thread' || $action == 'post-delete') { + $action = generation_strategy('sb_recent', array()); + if ($action == 'delete') { + file_unlink($config['dir']['home'] . $settings['html']); + } + elseif ($action == 'rebuild') { + file_write($config['dir']['home'] . $settings['html'], $this->homepage($settings)); + } + } + } + + // Build news page + public function homepage($settings) { + global $config, $board; + + $recent_images = Array(); + $recent_posts = Array(); + $stats = Array(); + + $boards = listBoards(); + + $query = ''; + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` WHERE `files` IS NOT NULL UNION ALL ", $_board['uri'], $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_images'], $query); + + if ($query == '') { + error(_("Can't build the RecentPosts theme, because there are no boards to be fetched.")); + } - $query = query($query) or error(db_error()); - - while ($post = $query->fetch(PDO::FETCH_ASSOC)) { - openBoard($post['board']); + $query = query($query) or error(db_error()); + + while ($post = $query->fetch(PDO::FETCH_ASSOC)) { + openBoard($post['board']); - if (isset($post['files'])) - $files = json_decode($post['files']); + if (isset($post['files'])) + $files = json_decode($post['files']); if ($files[0]->file == 'deleted' || $files[0]->thumb == 'file') continue; - - // board settings won't be available in the template file, so generate links now - $post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] - . link_for($post) . '#' . $post['id']; + + // board settings won't be available in the template file, so generate links now + $post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] + . link_for($post) . '#' . $post['id']; - if ($files) { - if ($files[0]->thumb == 'spoiler') { - $tn_size = @getimagesize($config['spoiler_image']); - $post['src'] = $config['spoiler_image']; - $post['thumbwidth'] = $tn_size[0]; - $post['thumbheight'] = $tn_size[1]; - } - else { - $post['src'] = $config['uri_thumb'] . $files[0]->thumb; - $post['thumbwidth'] = $files[0]->thumbwidth; - $post['thumbheight'] = $files[0]->thumbheight; - } - } - - $recent_images[] = $post; - } - - - $query = ''; - foreach ($boards as &$_board) { - if (in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` UNION ALL ", $_board['uri'], $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_posts'], $query); - $query = query($query) or error(db_error()); - - while ($post = $query->fetch(PDO::FETCH_ASSOC)) { - openBoard($post['board']); - - $post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] . link_for($post) . '#' . $post['id']; - if ($post['body'] != "") - $post['snippet'] = pm_snippet($post['body'], 30); - else - $post['snippet'] = "" . _("(no comment)") . ""; - $post['board_name'] = $board['name']; - - $recent_posts[] = $post; - } - - // Total posts - $query = 'SELECT SUM(`top`) FROM ('; - foreach ($boards as &$_board) { - if (in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT MAX(`id`) AS `top` FROM ``posts_%s`` UNION ALL ", $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); - $query = query($query) or error(db_error()); - $stats['total_posts'] = number_format($query->fetchColumn()); - - // Unique IPs - $query = 'SELECT COUNT(DISTINCT(`ip`)) FROM ('; - foreach ($boards as &$_board) { - if (in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT `ip` FROM ``posts_%s`` UNION ALL ", $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); - $query = query($query) or error(db_error()); - $stats['unique_posters'] = number_format($query->fetchColumn()); - - // Active content - $query = 'SELECT DISTINCT(`files`) FROM ('; - foreach ($boards as &$_board) { - if (in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT `files` FROM `posts_%s` WHERE `num_files` > 0 UNION ALL ", $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); - $query = query($query) or error(db_error()); - $files = $query->fetchAll(); - $stats['active_content'] = 0; + if ($files) { + if ($files[0]->thumb == 'spoiler') { + $tn_size = @getimagesize($config['spoiler_image']); + $post['src'] = $config['spoiler_image']; + $post['thumbwidth'] = $tn_size[0]; + $post['thumbheight'] = $tn_size[1]; + } + else { + $post['src'] = $config['uri_thumb'] . $files[0]->thumb; + $post['thumbwidth'] = $files[0]->thumbwidth; + $post['thumbheight'] = $files[0]->thumbheight; + } + } + + $recent_images[] = $post; + } + + + $query = ''; + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` UNION ALL ", $_board['uri'], $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_posts'], $query); + $query = query($query) or error(db_error()); + + while ($post = $query->fetch(PDO::FETCH_ASSOC)) { + openBoard($post['board']); + + $post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] . link_for($post) . '#' . $post['id']; + if ($post['body'] != "") + $post['snippet'] = pm_snippet($post['body'], 30); + else + $post['snippet'] = "" . _("(no comment)") . ""; + $post['board_name'] = $board['name']; + + $recent_posts[] = $post; + } + + // Total posts + $query = 'SELECT SUM(`top`) FROM ('; + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT MAX(`id`) AS `top` FROM ``posts_%s`` UNION ALL ", $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); + $query = query($query) or error(db_error()); + $stats['total_posts'] = number_format($query->fetchColumn()); + + // Unique IPs + $query = 'SELECT COUNT(DISTINCT(`ip`)) FROM ('; + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT `ip` FROM ``posts_%s`` UNION ALL ", $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); + $query = query($query) or error(db_error()); + $stats['unique_posters'] = number_format($query->fetchColumn()); + + // Active content + $query = 'SELECT DISTINCT(`files`) FROM ('; + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT `files` FROM `posts_%s` WHERE `num_files` > 0 UNION ALL ", $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); + $query = query($query) or error(db_error()); + $files = $query->fetchAll(); + $stats['active_content'] = 0; - foreach ($files as &$file) { + foreach ($files as &$file) { preg_match_all('/"size":([0-9]*)/', $file[0], $matches); $stats['active_content'] += array_sum($matches[1]); - } - - $query = query("SELECT * FROM ``news`` ORDER BY `time` DESC" . ($settings['limit_news'] ? ' LIMIT ' . $settings['limit_news'] : '')) or error(db_error()); - $recent_news = $query->fetchAll(PDO::FETCH_ASSOC); - - return Element('themes/recent/recent.html', Array( - 'settings' => $settings, - 'config' => $config, - 'boardlist' => createBoardlist(), - 'recent_images' => $recent_images, - 'recent_posts' => $recent_posts, - 'stats' => $stats, - 'recent_news' => $recent_news, - )); - } - }; - + } + + $query = query("SELECT * FROM ``news`` ORDER BY `time` DESC" . ($settings['limit_news'] ? ' LIMIT ' . $settings['limit_news'] : '')) or error(db_error()); + $recent_news = $query->fetchAll(PDO::FETCH_ASSOC); + + return Element('themes/recent/recent.html', Array( + 'settings' => $settings, + 'config' => $config, + 'boardlist' => createBoardlist(), + 'recent_images' => $recent_images, + 'recent_posts' => $recent_posts, + 'stats' => $stats, + 'recent_news' => $recent_news, + )); + } + }; + ?>