mirror of
https://github.com/NamelessMC/Nameless
synced 2026-08-18 06:29:04 -04:00
283 lines
13 KiB
PHP
283 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* NamelessMC Forum Module
|
|
*
|
|
* @author Samerton
|
|
* @version 2.3.0
|
|
* @license MIT
|
|
*/
|
|
|
|
class Forum_Module extends Module {
|
|
|
|
private Language $_language;
|
|
private Language $_forum_language;
|
|
|
|
public function __construct(Language $language, Language $forum_language, Pages $pages) {
|
|
$this->_language = $language;
|
|
$this->_forum_language = $forum_language;
|
|
|
|
$name = 'Forum';
|
|
$author = '<a href="https://samerton.dev" target="_blank" rel="nofollow noopener">Samerton</a>';
|
|
$module_version = '2.2.5';
|
|
$nameless_version = '2.2.5';
|
|
|
|
parent::__construct($this, $name, $author, $module_version, $nameless_version);
|
|
|
|
// Define URLs which belong to this module
|
|
$pages->add('Forum', '/panel/forums', 'pages/panel/forums.php');
|
|
$pages->add('Forum', '/panel/forums/labels', 'pages/panel/labels.php');
|
|
$pages->add('Forum', '/panel/forums/settings', 'pages/panel/settings.php');
|
|
|
|
$pages->add('Forum', '/forum', 'pages/forum/index.php', 'forum', true);
|
|
$pages->add('Forum', '/forum/error', 'pages/forum/error.php');
|
|
$pages->add('Forum', '/forum/view', 'pages/forum/view_forum.php');
|
|
$pages->add('Forum', '/forum/topic', 'pages/forum/view_topic.php');
|
|
$pages->add('Forum', '/forum/new', 'pages/forum/new_topic.php');
|
|
$pages->add('Forum', '/forum/spam', 'pages/forum/spam.php');
|
|
$pages->add('Forum', '/forum/report', 'pages/forum/report.php');
|
|
$pages->add('Forum', '/forum/get_quotes', 'pages/forum/get_quotes.php');
|
|
$pages->add('Forum', '/forum/delete_post', 'pages/forum/delete_post.php');
|
|
$pages->add('Forum', '/forum/delete', 'pages/forum/delete.php');
|
|
$pages->add('Forum', '/forum/move', 'pages/forum/move.php');
|
|
$pages->add('Forum', '/forum/merge', 'pages/forum/merge.php');
|
|
$pages->add('Forum', '/forum/edit', 'pages/forum/edit.php');
|
|
$pages->add('Forum', '/forum/lock', 'pages/forum/lock.php');
|
|
$pages->add('Forum', '/forum/stick', 'pages/forum/stick.php');
|
|
$pages->add('Forum', '/forum/search', 'pages/forum/search.php');
|
|
|
|
// UserCP
|
|
$pages->add('Forum', '/user/following_topics', 'pages/user/following_topics.php');
|
|
|
|
// Redirects
|
|
$pages->add('Forum', '/forum/view_topic', 'pages/forum/redirect.php');
|
|
$pages->add('Forum', '/forum/view_forum', 'pages/forum/redirect.php');
|
|
|
|
EventHandler::registerListener(UserDeletedEvent::class, DeleteUserForumHook::class);
|
|
EventHandler::registerListener(GroupClonedEvent::class, CloneGroupForumHook::class);
|
|
|
|
// -- Events
|
|
EventHandler::registerEvent(TopicCreatedEvent::class);
|
|
EventHandler::registerEvent(TopicReplyCreatedEvent::class);
|
|
|
|
// -- Pipelines
|
|
EventHandler::registerEvent(PrePostCreateEvent::class);
|
|
EventHandler::registerEvent(PrePostEditEvent::class);
|
|
EventHandler::registerEvent(PreTopicCreateEvent::class);
|
|
EventHandler::registerEvent(PreTopicEditEvent::class);
|
|
|
|
EventHandler::registerListener(PrePostCreateEvent::class, [MentionsHook::class, 'preCreate']);
|
|
EventHandler::registerListener(PrePostEditEvent::class, [MentionsHook::class, 'preEdit']);
|
|
|
|
EventHandler::registerListener(PreTopicCreateEvent::class, [MentionsHook::class, 'preCreate']);
|
|
EventHandler::registerListener(PreTopicEditEvent::class, [MentionsHook::class, 'preEdit']);
|
|
|
|
if (Util::isModuleEnabled('Members')) {
|
|
MemberListManager::getInstance()->registerListProvider(new MostPostsMemberListProvider($forum_language));
|
|
MemberListManager::getInstance()->registerListProvider(new HighestForumReactionScoresMemberListProvider($forum_language));
|
|
|
|
MemberListManager::getInstance()->registerMemberMetadataProvider(function (User $member) use ($forum_language) {
|
|
return [
|
|
$forum_language->get('forum', 'posts_title') =>
|
|
DB::getInstance()->query(
|
|
'SELECT COUNT(post_content) AS `count` FROM nl2_posts WHERE post_creator = ? AND deleted = 0',
|
|
[$member->data()->id]
|
|
)->first()->count,
|
|
];
|
|
});
|
|
|
|
MemberListManager::getInstance()->registerMemberMetadataProvider(function (User $member) use ($forum_language) {
|
|
return [
|
|
$forum_language->get('forum', 'reaction_score') =>
|
|
DB::getInstance()->query(
|
|
'SELECT COUNT(fr.user_received) AS `count` FROM nl2_forums_reactions fr JOIN nl2_reactions r ON r.id = fr.reaction_id WHERE r.type = 2 AND fr.user_received = ?',
|
|
[$member->data()->id]
|
|
)->first()->count,
|
|
];
|
|
});
|
|
}
|
|
|
|
ReactionContextsManager::getInstance()->provideContext(new ForumPostReactionContext($forum_language));
|
|
|
|
Notification::addType(
|
|
'forum_topic_reply',
|
|
$forum_language->get('forum', 'forum_topic_replies'),
|
|
['alert' => true, 'email' => true],
|
|
);
|
|
|
|
Notification::addType(
|
|
'forum_topic_mention',
|
|
$forum_language->get('forum', 'forum_topic_mentions'),
|
|
['alert' => true, 'email' => true],
|
|
);
|
|
}
|
|
|
|
public function onInstall() {
|
|
// Not necessary for Forum
|
|
}
|
|
|
|
public function onUninstall() {
|
|
|
|
}
|
|
|
|
public function onEnable() {
|
|
// No actions necessary
|
|
}
|
|
|
|
public function onDisable() {
|
|
// No actions necessary
|
|
}
|
|
|
|
public function onPageLoad(
|
|
User $user,
|
|
Pages $pages,
|
|
Cache $cache,
|
|
$smarty,
|
|
iterable $navs,
|
|
Widgets $widgets,
|
|
TemplateBase $template
|
|
) {
|
|
// AdminCP
|
|
PermissionHandler::registerPermissions('Forum', [
|
|
'admincp.forums' => $this->_language->get('moderator', 'staff_cp') . ' » ' . $this->_forum_language->get('forum', 'forum')
|
|
]);
|
|
|
|
// Sitemap
|
|
$pages->registerSitemapMethod([Forum_Sitemap::class, 'generateSitemap']);
|
|
|
|
// Add link to navbar
|
|
$cache->setCache('nav_location');
|
|
$link_location = $cache->fetch('forum_location', 1);
|
|
|
|
$cache->setCache('navbar_order');
|
|
$forum_order = $cache->fetch('forum_order', 2);
|
|
|
|
$cache->setCache('navbar_icons');
|
|
$icon = $cache->fetch('forum_icon', '');
|
|
|
|
switch ($link_location) {
|
|
case 1:
|
|
// Navbar
|
|
$navs[0]->add('forum', $this->_forum_language->get('forum', 'forum'), URL::build('/forum'), 'top', null, $forum_order, $icon);
|
|
break;
|
|
case 2:
|
|
// "More" dropdown
|
|
$navs[0]->addItemToDropdown('more_dropdown', 'forum', $this->_forum_language->get('forum', 'forum'), URL::build('/forum'), 'top', null, $icon, $forum_order);
|
|
break;
|
|
case 3:
|
|
// Footer
|
|
$navs[0]->add('forum', $this->_forum_language->get('forum', 'forum'), URL::build('/forum'), 'footer', null, $forum_order, $icon);
|
|
break;
|
|
}
|
|
|
|
// Widgets
|
|
if ($pages->getActivePage()['widgets'] || (defined('PANEL_PAGE') && str_contains(PANEL_PAGE, 'widget'))) {
|
|
// Latest posts
|
|
$widgets->add(new LatestPostsWidget($this->_forum_language, $template->getEngine(), $cache, $user, $this->_language));
|
|
}
|
|
|
|
// Front end or back end?
|
|
if (defined('FRONT_END')) {
|
|
if (defined('PAGE') && PAGE == 'user_query') {
|
|
$user_id = $template->getEngine()->getVariable('USER_ID');
|
|
|
|
if ($user_id) {
|
|
$forum = new Forum();
|
|
|
|
$template->getEngine()->addVariables([
|
|
'TOPICS' => $this->_forum_language->get('forum', 'x_topics', ['count' => $forum->getTopicCount($user_id)]),
|
|
'POSTS' => $this->_forum_language->get('forum', 'x_posts', ['count' => $forum->getPostCount($user_id)])
|
|
]);
|
|
}
|
|
}
|
|
} else {
|
|
if (defined('BACK_END')) {
|
|
if ($user->hasPermission('admincp.forums')) {
|
|
$navs[2]->add('forum_divider', mb_strtoupper($this->_forum_language->get('forum', 'forum'), 'UTF-8'), 'divider', 'top', null, 12, '');
|
|
$navs[2]->add('forum_settings', $this->_language->get('admin', 'settings'), URL::build('/panel/forums/settings'), 'top', null, 12.1, '<i class="nav-icon fas fa-cogs"></i>');
|
|
$navs[2]->add('forums', $this->_forum_language->get('forum', 'forums'), URL::build('/panel/forums'), 'top', null, 12.2, '<i class="nav-icon fas fa-comments"></i>');
|
|
$navs[2]->add('forum_labels', $this->_forum_language->get('forum', 'labels'), URL::build('/panel/forums/labels'), 'top', null, 12.3, '<i class="nav-icon fas fa-tags"></i>');
|
|
}
|
|
|
|
if (defined('PANEL_PAGE') && PANEL_PAGE == 'dashboard') {
|
|
// Dashboard graph
|
|
|
|
// Get data for topics and posts
|
|
$start_time = strtotime('7 days ago');
|
|
$latest_topics = DB::getInstance()->query(
|
|
<<<SQL
|
|
SELECT DATE_FORMAT(FROM_UNIXTIME(`topic_date`), '%Y-%m-%d') d, COUNT(*) c
|
|
FROM nl2_topics
|
|
WHERE `topic_date` > ? AND `topic_date` < UNIX_TIMESTAMP()
|
|
AND `deleted` = 0
|
|
GROUP BY DATE_FORMAT(FROM_UNIXTIME(`topic_date`), '%Y-%m-%d')
|
|
SQL,
|
|
[$start_time],
|
|
);
|
|
$latest_topics_count = $latest_topics->count();
|
|
$latest_topics = $latest_topics->results();
|
|
|
|
$latest_posts = DB::getInstance()->query(
|
|
<<<SQL
|
|
SELECT DATE_FORMAT(FROM_UNIXTIME(`created`), '%Y-%m-%d') d, COUNT(*) c
|
|
FROM nl2_posts
|
|
WHERE `created` > ? AND `created` < UNIX_TIMESTAMP()
|
|
AND `deleted` = 0
|
|
GROUP BY DATE_FORMAT(FROM_UNIXTIME(`created`), '%Y-%m-%d')
|
|
SQL,
|
|
[$start_time],
|
|
);
|
|
$latest_posts_count = $latest_posts->count();
|
|
$latest_posts = $latest_posts->results();
|
|
|
|
$cache->setCache('dashboard_graph');
|
|
$data = $cache->fetch('forum_data', function () use ($latest_topics, $latest_posts) {
|
|
$data = [];
|
|
|
|
$data['datasets']['topics']['label'] = 'forum_language/forum/topics_title'; // for $forum_language->get('forum', 'topics_title');
|
|
$data['datasets']['topics']['colour'] = '#00931D';
|
|
$data['datasets']['posts']['label'] = 'forum_language/forum/posts_title'; // for $forum_language->get('forum', 'posts_title');
|
|
$data['datasets']['posts']['colour'] = '#ffde0a';
|
|
|
|
if (count($latest_topics)) {
|
|
foreach ($latest_topics as $day) {
|
|
$data['_' . $day->d] = ['topics' => $day->c];
|
|
}
|
|
}
|
|
|
|
if (count($latest_posts)) {
|
|
foreach ($latest_posts as $day) {
|
|
if (isset($data['_' . $day->d])) {
|
|
$data['_' . $day->d]['posts'] = $day->c;
|
|
} else {
|
|
$data['_' . $day->d] = ['posts' => $day->c];
|
|
}
|
|
}
|
|
}
|
|
|
|
$data = Core_Module::fillMissingGraphDays($data, 'topics');
|
|
$data = Core_Module::fillMissingGraphDays($data, 'posts');
|
|
|
|
// Sort by date
|
|
ksort($data);
|
|
|
|
return $data;
|
|
}, 120);
|
|
|
|
Core_Module::addDataToDashboardGraph($this->_language->get('admin', 'overview'), $data);
|
|
|
|
// Dashboard stats
|
|
require_once ROOT_PATH . '/modules/Forum/collections/panel/RecentTopics.php';
|
|
CollectionManager::addItemToCollection('dashboard_stats', new RecentTopicsItem($template->getEngine(), $this->_forum_language, $latest_topics_count));
|
|
|
|
require_once ROOT_PATH . '/modules/Forum/collections/panel/RecentPosts.php';
|
|
CollectionManager::addItemToCollection('dashboard_stats', new RecentPostsItem($template->getEngine(), $this->_forum_language, $latest_posts_count));
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function getDebugInfo(): array {
|
|
return [];
|
|
}
|
|
}
|