Move forum to new router model

This commit is contained in:
Sky Johnson 2024-12-13 15:35:06 -06:00
parent d10d69fb1a
commit b5c271e77b
4 changed files with 28 additions and 60 deletions

View File

@ -6,6 +6,11 @@ require_once '../src/lib.php';
require_once '../src/router.php';
require_once '../src/users.php';
require_once '../src/help.php';
require_once '../src/towns.php';
require_once '../src/explore.php';
require_once '../src/fight.php';
require_once '../src/heal.php';
require_once '../src/forum.php';
if (!file_exists('../.installed')) redirect('install.php');
@ -42,11 +47,6 @@ if (!$controlrow["gameopen"]) {
exit;
}
require_once '../src/towns.php';
require_once '../src/explore.php';
require_once '../src/fight.php';
require_once '../src/heal.php';
$r = new Router;
$r->get('/', function() {
@ -73,6 +73,7 @@ Towns\register_routes($r);
Fights\register_routes($r);
Users\register_routes($r);
Help\register_routes($r);
Forum\register_routes($r);
$r->post('/move', 'move');
@ -86,7 +87,7 @@ $r->post('/babblebox', 'babblebox');
// [code, handler, params, middleware]
$l = $r->lookup($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']);
if ($l['code'] !== 200) exit($l['code']);
if ($l['code'] !== 200) exit("Error: {$l['code']}");
if (!empty($l['middleware'])) foreach ($l['middleware'] as $middleware) $middleware();
$l['handler'](...$l['params'] ?? []);

View File

@ -2,59 +2,31 @@
// forum.php :: Internal forums script for the game.
require_once '../src/lib.php';
namespace Forum;
if (!file_exists('../.installed')) redirect('install.php');
use Router;
$controlrow = get_control_row();
// Login (or verify) if not logged in.
if (($userrow = checkcookies()) === false) {
if (isset($_GET['do']) && $_GET['do'] === 'verify') {
header("Location: users.php?do=verify");
exit;
}
header("Location: /login");
exit;
function register_routes(Router $r): Router
{
$r->get('/forum/thread/:x/:x', 'Forum\showthread');
$r->get('/forum/new', 'Forum\newthread');
$r->post('/forum/new', 'Forum\newthread');
$r->post('/forum/reply', 'Forum\reply');
$r->get('/forum/list/:x', 'Forum\donothing');
$r->get('/forum', 'Forum\donothing');
return $r;
}
// Close game.
if ((bool) $controlrow["gameopen"] === false) {
display("The game is currently closed for maintanence. Please check back later.", "Game Closed");
exit;
}
// Force verify if the user isn't verified yet.
if ((bool) $controlrow["verifyemail"] && (bool) $userrow["verify"] === false) {
header("Location: users.php?do=verify");
exit;
}
// Block user if he/she has been banned.
if ($userrow["authlevel"] === 2) {
exit("Your account has been blocked.");
}
$do = explode(':', $_GET['do'] ?? '');
match ($do[0]) {
'thread' => showthread($do[1], $do[2]),
'new' => newthread(),
'reply' => reply(),
'list' => donothing($do[1]),
default => donothing()
};
function donothing($start = 0)
{
$query = db()->query('SELECT * FROM forum WHERE parent=0 ORDER BY newpostdate DESC LIMIT 20 OFFSET ?;', [20 * $start]);
$page = "<table width=\"100%\"><tr><td style=\"padding:1px; background-color:black;\"><table width=\"100%\" style=\"margins:0px;\" cellspacing=\"1\" cellpadding=\"3\"><tr><th colspan=\"3\" style=\"background-color:#dddddd;\"><center><a href=\"forum.php?do=new\">New Thread</a></center></th></tr><tr><th width=\"50%\" style=\"background-color:#dddddd;\">Thread</th><th width=\"10%\" style=\"background-color:#dddddd;\">Replies</th><th style=\"background-color:#dddddd;\">Last Post</th></tr>\n";
$page = "<table width=\"100%\"><tr><td style=\"padding:1px; background-color:black;\"><table width=\"100%\" style=\"margins:0px;\" cellspacing=\"1\" cellpadding=\"3\"><tr><th colspan=\"3\" style=\"background-color:#dddddd;\"><center><a href=\"/forum/new\">New Thread</a></center></th></tr><tr><th width=\"50%\" style=\"background-color:#dddddd;\">Thread</th><th width=\"10%\" style=\"background-color:#dddddd;\">Replies</th><th style=\"background-color:#dddddd;\">Last Post</th></tr>\n";
$hasRows = false;
while ($row = $query->fetchArray(SQLITE3_ASSOC)) {
$hasRows = true;
$page .= "<tr><td style=\"background-color:#ffffff;\"><a href=\"forum.php?do=thread:".$row["id"].":0\">".$row["title"]."</a></td><td style=\"background-color:#ffffff;\">".$row["replies"]."</td><td style=\"background-color:#ffffff;\">".$row["newpostdate"]."</td></tr>\n";
$page .= "<tr><td style=\"background-color:#ffffff;\"><a href=\"/forum/thread/".$row["id"]."/0\">".$row["title"]."</a></td><td style=\"background-color:#ffffff;\">".$row["replies"]."</td><td style=\"background-color:#ffffff;\">".$row["newpostdate"]."</td></tr>\n";
}
if (!$hasRows) {
@ -71,12 +43,12 @@ function showthread($id, $start)
$posts = db()->query('SELECT * FROM forum WHERE id=? OR parent=? ORDER BY id LIMIT 15 OFFSET ?;', [$id, $id, $start * 15]);
$title = db()->query('SELECT title FROM forum WHERE id=? LIMIT 1;', [$id])->fetchArray(SQLITE3_ASSOC);
$page = "<table width=\"100%\"><tr><td style=\"padding:1px; background-color:black;\"><table width=\"100%\" style=\"margins:0px;\" cellspacing=\"1\" cellpadding=\"3\"><tr><td colspan=\"2\" style=\"background-color:#dddddd;\"><b><a href=\"forum.php\">Forum</a> :: ".$title['title']."</b></td></tr>\n";
$page = "<table width=\"100%\"><tr><td style=\"padding:1px; background-color:black;\"><table width=\"100%\" style=\"margins:0px;\" cellspacing=\"1\" cellpadding=\"3\"><tr><td colspan=\"2\" style=\"background-color:#dddddd;\"><b><a href=\"/forum\">Forum</a> :: ".$title['title']."</b></td></tr>\n";
while ($row = $posts->fetchArray(SQLITE3_ASSOC)) {
$page .= "<tr><td width=\"25%\" style=\"background-color:#ffffff; vertical-align:top;\"><span class=\"small\"><b>".$row["author"]."</b><br><br>".prettyforumdate($row["postdate"])."</td><td style=\"background-color:#ffffff; vertical-align:top;\">".nl2br($row["content"])."</td></tr>\n";
}
$page .= "</table></td></tr></table><br>";
$page .= "<table width=\"100%\"><tr><td><b>Reply To This Thread:</b><br><form action=\"forum.php?do=reply\" method=\"post\"><input type=\"hidden\" name=\"parent\" value=\"$id\" /><input type=\"hidden\" name=\"title\" value=\"Re: ".$title["title"]."\" /><textarea name=\"content\" rows=\"7\" cols=\"40\"></textarea><br><input type=\"submit\" name=\"submit\" value=\"Submit\" /> <input type=\"reset\" name=\"reset\" value=\"Reset\" /></form></td></tr></table>";
$page .= "<table width=\"100%\"><tr><td><b>Reply To This Thread:</b><br><form action=\"/forum/reply\" method=\"post\"><input type=\"hidden\" name=\"parent\" value=\"$id\" /><input type=\"hidden\" name=\"title\" value=\"Re: ".$title["title"]."\" /><textarea name=\"content\" rows=\"7\" cols=\"40\"></textarea><br><input type=\"submit\" name=\"submit\" value=\"Submit\" /> <input type=\"reset\" name=\"reset\" value=\"Reset\" /></form></td></tr></table>";
display($page, "Forum");
}
@ -86,7 +58,7 @@ function reply()
global $userrow;
$form = validate($_POST, [
'title' => ['length:2-30', 'alphanum-spaces'],
'title' => [],
'content' => []
]);
@ -100,7 +72,7 @@ function reply()
$userrow['username'], $form['title'], $form['content'], $form['parent']
]);
db()->query('UPDATE forum SET newpostdate=CURRENT_TIMESTAMP, replies=replies + 1 WHERE id=?;', [$form['parent']]);
redirect("forum.php?do=thread:{$form['parent']}:0");
redirect("/forum/thread/{$form['parent']}/0");
}
function newthread()
@ -109,7 +81,7 @@ function newthread()
if (isset($_POST["submit"])) {
$form = validate($_POST, [
'title' => ['length:2-30', 'alphanum-spaces'],
'title' => ['length:2-30'],
'content' => []
]);
@ -121,9 +93,9 @@ function newthread()
db()->query('INSERT INTO forum (author, title, content) VALUES (?, ?, ?);', [
$userrow['username'], $form['title'], $form['content']
]);
redirect('forum.php');
redirect('/forum');
}
$page = "<table width=\"100%\"><tr><td><b>Make A New Post:</b><br><br/ ><form action=\"forum.php?do=new\" method=\"post\">Title:<br><input type=\"text\" name=\"title\" size=\"50\" maxlength=\"50\" /><br><br>Message:<br><textarea name=\"content\" rows=\"7\" cols=\"40\"></textarea><br><br><input type=\"submit\" name=\"submit\" value=\"Submit\" /> <input type=\"reset\" name=\"reset\" value=\"Reset\" /></form></td></tr></table>";
$page = "<table width=\"100%\"><tr><td><b>Make A New Post:</b><br><br/ ><form action=\"/forum/new\" method=\"post\">Title:<br><input type=\"text\" name=\"title\" size=\"50\" maxlength=\"50\" /><br><br>Message:<br><textarea name=\"content\" rows=\"7\" cols=\"40\"></textarea><br><br><input type=\"submit\" name=\"submit\" value=\"Submit\" /> <input type=\"reset\" name=\"reset\" value=\"Reset\" /></form></td></tr></table>";
display($page, "Forum");
}

View File

@ -134,7 +134,7 @@ function display($content, $title, $topnav=true, $leftnav=true, $rightnav=true,
$userrow["currenttown"] = "";
}
$userrow["forumslink"] = "<a href=\"forum.php\">Forum</a><br>";
$userrow["forumslink"] = '<a href="/forum">Forum</a><br>';
// Format various userrow stuffs...
if ($userrow["latitude"] < 0) { $userrow["latitude"] = $userrow["latitude"] * -1 . "S"; } else { $userrow["latitude"] .= "N"; }

View File

@ -174,10 +174,5 @@ class Router
if (!str_starts_with($route, '/')) {
throw new InvalidArgumentException("Route must start with a '/'");
}
// Optional: Check for consecutive dynamic segments or invalid characters
if (preg_match('/(:x.*){2,}/', $route)) {
throw new InvalidArgumentException("Invalid route pattern: consecutive dynamic segments");
}
}
}