Pastebin

Topposters Extension

von Kirk (26.09.2020 18:42)
Beschreibung:
listener.php
Snippet erstellt:
26.09.2020 18:42
Snippet wird automatisch gelöscht:
26.10.2020 17:42

Dein Code:
  1. <?php
  2. /**
  3. *
  4. * Top Posters extension for the phpBB Forum Software package.
  5. * @copyright (c) 2008 lefty74 http://lefty74.com and 2017 - 2020 Kirk https://reyno41.bplaced.net/phpbb
  6. * @license GNU General Public License, version 2 (GPL-2.0-only)
  7. *
  8. */
  9.  
  10. namespace kirk\topposters\event;
  11.  
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13.  
  14. class listener implements EventSubscriberInterface
  15. {
  16.         /** @var \phpbb\extension\manager */
  17.         protected $phpbb_ext_manager;
  18.  
  19.         /** @var \phpbb\config\config */
  20.         protected $config;
  21.  
  22.         /** @var \phpbb\db\driver\driver_interface */
  23.         protected $db;
  24.  
  25.         /** @var \phpbb\request\request_interface */
  26.         protected $request;
  27.  
  28.         /** @var \phpbb\template\template */
  29.         protected $template;
  30.  
  31.         /** @var \phpbb\language\language $language Language object */
  32.         protected $language;
  33.  
  34.         /** @var string phpBB root path */
  35.         protected $root_path;
  36.  
  37.         /** @var string PHP extension */
  38.         protected $php_ext;
  39.  
  40.         /**
  41.         * Constructor
  42.         *
  43.         * @param \phpbb\extension\manager                               $phpbb_ext_manager              Extension manager Object
  44.         * @param \phpbb\auth\auth                                               $auth                                   Authentication object
  45.         * @param \phpbb\config\config                                   $config                                 Config object
  46.         * @param \phpbb\db\driver\driver_interface              $db                                             Database object
  47.         * @param \phpbb\request\request                                 $request                                Request object
  48.         * @param \phpbb\template\template                               $template                               Template object
  49.         * @param \phpbb\language\language                               $language                               The language object
  50.         * @param string                                                                 $phpbb_root_path                phpbb_root_path
  51.         * @param string                                                                 $php_ext                                php_ext
  52.         *
  53.         */
  54.         public function __construct(\phpbb\extension\manager $phpbb_ext_manager, \phpbb\auth\auth $auth, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\request\request_interface $request, \phpbb\template\template $template, \phpbb\language\language $language, $root_path, $php_ext, \phpbb\collapsiblecategories\operator\operator $operator = null)
  55.         {
  56.                 $this->phpbb_ext_manager        = $phpbb_ext_manager;
  57.                 $this->auth                                     = $auth;
  58.                 $this->config                           = $config;
  59.                 $this->db                                       = $db;
  60.                 $this->request                          = $request;
  61.                 $this->template                         = $template;
  62.                 $this->language                         = $language;
  63.                 $this->root_path                        = $root_path;
  64.                 $this->php_ext                          = $php_ext;
  65.                 $this->operator                         = $operator;
  66.         }
  67.  
  68.         static public function getSubscribedEvents()
  69.         {
  70.                 return array(
  71.                         'core.user_setup'                               => 'load_language_on_setup',
  72.                         'core.permissions'                              => 'permissions',
  73.                         'core.page_header'                              => 'show_topposters',
  74.                         'core.page_footer'                              => 'display_topposters',
  75.                         'core.page_header_after'                => 'collaps',
  76.                         'core.display_forums_after'             => 'statblock_enable',
  77.                 );
  78.         }
  79.  
  80.         /**
  81.         * Load language during user setup
  82.         *
  83.         * @param object $event The event object
  84.         * @return null
  85.         */
  86.         public function load_language_on_setup($event)
  87.         {
  88.                 $lang_set_ext = $event['lang_set_ext'];
  89.                 $lang_set_ext[] = array(
  90.                         'ext_name'      => 'kirk/topposters',
  91.                         'lang_set'      => 'topposters',
  92.                 );
  93.                 $event['lang_set_ext'] = $lang_set_ext;
  94.         }
  95.  
  96.         /**
  97.         * Load permission event
  98.         */
  99.         public function permissions($event)
  100.         {
  101.                 $permissions = $event['permissions'];
  102.                 $permissions['u_show_topposters'] = array('lang' => 'ACL_U_SHOW_TOPPOSTERS', 'cat' => 'misc');
  103.                 $event['permissions'] = $permissions;
  104.         }
  105.  
  106.         public function show_topposters($event)
  107.         {
  108.                 if ($this->auth->acl_get('u_show_topposters'))
  109.                 {
  110.                         $topposters_excl_adm = $this->config['topposters_excl_adm'];
  111.                         $topposters_excl_mod = $this->config['topposters_excl_mod'];
  112.                         $topposters_excl_hours = $this->config['topposters_excl_hours'];
  113.                         $topposters_all = $this->config['topposters_all'];
  114.                         $topposters_enable_hours = $this->config['topposters_enable_hours'];
  115.                         $topposters_hours = $this->config['topposters_hours'];
  116.                         $topposters_enable= $this->config['topposters_enable'];
  117.                         $topposters_testmode = $this->config['topposters_testmode'];
  118.                         $topposters_numbers = $this->config['topposters_number'];
  119.                         $topposters_position = $this->config['topposters_position'];
  120.                         $topposters_hour = $this->config['topposters_hours'] == 1;
  121.                         $topposters_hours = $this->config['topposters_hours'];
  122.  
  123.                         $this->template->assign_vars(array(
  124.                                 'TOPPOSTERS_EXCL_ADM'           => $topposters_excl_adm,
  125.                                 'TOPPOSTERS_EXCL_MOD'           => $topposters_excl_mod,
  126.                                 'TOPPOSTERS_EXCL_HOURS'         => $topposters_excl_hours,
  127.                                 'TOPPOSTERS_ALL'                        => $topposters_all,
  128.                                 'TOPPOSTERS_ENABLE_HOURS'       => $topposters_enable_hours,
  129.                                 'TOPPOSTERS_HOURS'                      => $topposters_hours,
  130.                                 'TOPPOSTERS_ENABLE'                     => $topposters_enable,
  131.                                 'TOPPOSTERS_TESTMODE'           => $topposters_testmode,
  132.                                 'TOPPOSTERS_NUMBER'                     => $topposters_numbers,
  133.                                 'TOPPOSTERS_POSITION'           => $topposters_position,
  134.                                 'OUR_TOPPOSTERS'                        => sprintf($this->language->lang('OUR_TOPPOSTERS', $topposters_numbers)),
  135.                                 'TOPPOSTERS_HOURS'                      => ($topposters_hour) ? $this->language->lang('TOPPOSTERS_HOUR') : sprintf($this->language->lang('TOPPOSTERS_HOURS'),$topposters_hours),
  136.                         ));
  137.                 }
  138.         }
  139.  
  140.         public function display_topposters($event)
  141.         {
  142.                 $user_ids = array();
  143.                 $user_ids = ($this->config['topposters_excl_ids']) ? explode(",", $this->config['topposters_excl_ids']) : array();
  144.  
  145.                 $acl_am = array();
  146.  
  147.                 if ($this->config['topposters_excl_adm'])
  148.                 {
  149.                         $acl_am[] = 'a_';
  150.                 }
  151.                 if ($this->config['topposters_excl_mod'])
  152.                 {
  153.                         $acl_am[] = 'm_';
  154.                 }
  155.  
  156.                 $exclude_ids_ary = array();
  157.                 $topposters_list = $topposters_hours_list = '';
  158.  
  159.                 if (sizeof($acl_am))
  160.                 {
  161.                         $user_ary = $this->auth->acl_get_list(false, $acl_am, false);
  162.  
  163.                         foreach ($user_ary as $forum_id => $forum_ary)
  164.                         {
  165.                                 foreach ($forum_ary as $auth_option => $id_ary)
  166.                                 {
  167.                                         $exclude_ids_ary = array_merge($exclude_ids_ary, $id_ary);
  168.                                 }
  169.                         }
  170.                 }
  171.  
  172.                 $exclude_ids_ary = array_merge($exclude_ids_ary, $user_ids);
  173.                 $exclude_ids_ary = array_unique($exclude_ids_ary);
  174.                 $exclude_ids_ary_hours = ($this->config['topposters_excl_hours']) ? $exclude_ids_ary : $user_ids;
  175.                 $excluded_ids = (sizeof($exclude_ids_ary)) ? 'AND ' . $this->db->sql_in_set('user_id', $exclude_ids_ary, true) : '';
  176.                 $excluded_ids_hours = (sizeof($exclude_ids_ary_hours)) ? 'AND ' . $this->db->sql_in_set('user_id', $exclude_ids_ary_hours, true) : '';
  177.                 $topposters = $this->config['topposters_total'];
  178.  
  179.                 // count top x posters
  180.                 $sql = 'SELECT username, user_id, user_type, user_colour, user_posts
  181.                         FROM ' . USERS_TABLE . '
  182.                         WHERE user_id <> ' . (int) ANONYMOUS . '
  183.                                         AND user_type <> ' . (int) USER_IGNORE . '
  184.                                                 AND user_posts > 0
  185.                                                         ' . $this->db->sql_escape($excluded_ids) . '
  186.                         ORDER BY user_posts DESC';
  187.                                 $result = $this->db->sql_query_limit($sql, $this->config['topposters_number'], 0, 0);
  188.                                 //delete the above line and uncomment below line if you want to cache the query for an hour
  189.                                 //$result = $this->db->sql_query_limit($sql, $this->config['topposters_number'], 0, 3600);
  190.  
  191.                 while (($row = $this->db->sql_fetchrow($result)))
  192.                 {
  193.                         $this->template->assign_block_vars('topposters_total', array(
  194.                                 'S_SEARCH_ACTION'       => append_sid("{$this->root_path}search.{$this->php_ext}", 'author_id=' . $row['user_id'] . '&amp;sr=posts'),
  195.                                 'USERNAME_FULL'         => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
  196.                                 'POSTER_POSTS'          => $row['user_posts'],
  197.                         ));
  198.                 }
  199.                         $this->db->sql_freeresult($result);
  200.  
  201.                 // count x top posters in the last x hours
  202.                 if ($this->config['topposters_hours'])
  203.                 {
  204.                         $xhours = ($this->config['topposters_hours'] * 3600 );
  205.  
  206.                         $time = time() - $xhours;
  207.                         $sql = 'SELECT u.user_id, u.username, u.user_type, u.user_colour, COUNT(p.post_id) as total_posts
  208.                                         FROM ' . USERS_TABLE . ' u, ' . POSTS_TABLE . ' p
  209.                                         WHERE p.post_time > ' . (int) $time . '
  210.                                                 AND u.user_id = p.poster_id
  211.                                                         AND u.user_id <> ' . (int) ANONYMOUS . '
  212.                                                                 AND u.user_type <> ' . (int) USER_IGNORE . '
  213.                                                                         ' . $this->db->sql_escape($excluded_ids_hours) . '
  214.                                         GROUP BY u.user_id
  215.                                         ORDER BY total_posts DESC';
  216.                                 $result = $this->db->sql_query_limit($sql, $topposters, 0, 0);
  217.                                 //delete the above line and uncomment below line if you want to cache the query for an hour
  218.                                 //$result = $this->db->sql_query_limit($sql, $topposters, 0, 3600);
  219.  
  220.                         while ($row = $this->db->sql_fetchrow($result))
  221.                         {
  222.                                 $this->template->assign_block_vars('topposters_hours', array(
  223.                                         'S_SEARCH_ACTION'       => append_sid("{$this->root_path}search.{$this->php_ext}", 'author_id=' . $row['user_id'] . '&amp;sr=posts'),
  224.                                         'USERNAME_FULL'         => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
  225.                                         'POSTER_POSTS'          => $row['total_posts'],
  226.                                 ));
  227.                         }
  228.                         $this->db->sql_freeresult($result);
  229.                 }
  230.         }
  231.  
  232.         public function collaps($event)
  233.         {
  234.                 if ($this->operator !== null)
  235.                 {
  236.                         $fid = 'topposters'; // can be any unique string to identify your extension's collapsible element
  237.                         $this->template->assign_vars(array(
  238.                                 'S_TOPPOSTERS_HIDDEN' => $this->operator->is_collapsed($fid),
  239.                                 'U_TOPPOSTERS_COLLAPSE_URL' => $this->operator->get_collapsible_link($fid),
  240.                         ));
  241.                 }
  242.         }
  243.  
  244.         // Check if Statistics BLock Extension is enable
  245.         public function statblock_enable($event)
  246.         {
  247.                 $ext_statblock = 'kirk/statblock';
  248.                 if ($this->phpbb_ext_manager->is_enabled($ext_statblock))
  249.                 {
  250.                         $this->template->assign_vars(array(
  251.                                 'S_STATBLOCK_ENABLE'                    => $ext_statblock,
  252.                         ));
  253.                 }
  254.         }
  255. }

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. Alternativ kannst du den gesamten Eintrag auch als Datei herunterladen.