_language = $language;
$this->_forum_language = $forum_language;
$name = 'Forum';
$author = 'Samerton';
$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, '');
$navs[2]->add('forums', $this->_forum_language->get('forum', 'forums'), URL::build('/panel/forums'), 'top', null, 12.2, '');
$navs[2]->add('forum_labels', $this->_forum_language->get('forum', 'labels'), URL::build('/panel/forums/labels'), 'top', null, 12.3, '');
}
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(
<< ? 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(
<< ? 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 [];
}
}