forked from Sky/Dragon-Knight
137 lines
5.7 KiB
PHP
137 lines
5.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* This file is a part of the Dragon-Knight project.
|
|
*
|
|
* Copyright (c) 2024-present Sharkk
|
|
*
|
|
* This file is subject to the MIT license that is bundled
|
|
* with this source code in the LICENSE.md file.
|
|
*/
|
|
|
|
namespace DragonKnight\Actions;
|
|
|
|
use DragonKnight\Router;
|
|
|
|
class Forum
|
|
{
|
|
public static function register_routes(Router $r): Router
|
|
{
|
|
$r->get('/forum/thread/:x/:x', 'Forum\showthread');
|
|
$r->form('/forum/new', 'Forum\newthread');
|
|
$r->post('/forum/reply', 'Forum\reply');
|
|
$r->get('/forum/list/:x', 'Forum\donothing');
|
|
$r->get('/forum', 'Forum\donothing');
|
|
|
|
return $r;
|
|
}
|
|
|
|
public static function donothing($start = 0)
|
|
{
|
|
$query = db()->query('SELECT * FROM forum WHERE parent=0 ORDER BY newpostdate DESC LIMIT 20 OFFSET ?;', [20 * $start]);
|
|
$page = <<<HTML
|
|
<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: #ddd;">
|
|
<center><a href="/forum/new" hx-get="/forum/new" hx-target="#middle">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>
|
|
HTML;
|
|
|
|
$hasRows = false;
|
|
|
|
while ($row = $query->fetchArray(SQLITE3_ASSOC)) {
|
|
$hasRows = true;
|
|
$page .= <<<HTML
|
|
<tr>
|
|
<td style="background-color: white;"><a href="/forum/thread/{$row['id']}/0" hx-get="/forum/thread/{$row['id']}/0" hx-target="#middle">{$row['title']}</a></td>
|
|
<td style="background-color: white;">{$row['replies']}</td>
|
|
<td style="background-color: white;">{$row['newpostdate']}</td>
|
|
</tr>
|
|
HTML;
|
|
}
|
|
|
|
if (! $hasRows) {
|
|
$page .= '<tr><td style="background-color:#ffffff;" colspan="3"><b>No threads in forum.</b></td></tr>';
|
|
}
|
|
|
|
$page .= '</table></td></tr></table>';
|
|
|
|
page_title('Forum');
|
|
|
|
return $page;
|
|
}
|
|
|
|
public static 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" hx-get="/forum" hx-target="#middle">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>'.pretty_date($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/reply\" method=\"post\" hx-post=\"/forum/reply\" hx-target=\"#middle\"><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_title('Forum: '.$title['title']);
|
|
|
|
return $page;
|
|
}
|
|
|
|
public static function reply()
|
|
{
|
|
$form = validate($_POST, [
|
|
'title' => [],
|
|
'content' => [],
|
|
]);
|
|
|
|
if (! $form['valid']) {
|
|
exit(ul_from_validate_errors($form['errors']));
|
|
}
|
|
|
|
$form = $form['data'];
|
|
|
|
db()->query('INSERT INTO forum (author, title, content, parent) VALUES (?, ?, ?, ?);', [
|
|
user()->username, $form['title'], $form['content'], $form['parent'],
|
|
]);
|
|
db()->query('UPDATE forum SET newpostdate=CURRENT_TIMESTAMP, replies=replies + 1 WHERE id=?;', [$form['parent']]);
|
|
|
|
return self::showthread($form['parent'], 0);
|
|
}
|
|
|
|
public static function newthread()
|
|
{
|
|
if (isset($_POST['submit'])) {
|
|
$form = validate($_POST, [
|
|
'title' => ['length:2-30'],
|
|
'content' => [],
|
|
]);
|
|
|
|
if (! $form['valid']) {
|
|
exit(ul_from_validate_errors($form['errors']));
|
|
}
|
|
|
|
$form = $form['data'];
|
|
db()->query('INSERT INTO forum (author, title, content) VALUES (?, ?, ?);', [
|
|
user()->username, $form['title'], $form['content'],
|
|
]);
|
|
redirect('/forum/thread/'.db()->lastInsertRowID().'/0');
|
|
}
|
|
|
|
page_title('Form: New Thread');
|
|
|
|
return '<table width="100%"><tr><td><b>Make A New Post:</b><br><br/ ><form action="/forum/new" method="post" hx-post="/forum/new" hx-target="#middle">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>';
|
|
}
|
|
}
|