_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 []; } }