[ Index ]

PHP Cross Reference of phpBB-3.3.11-deutsch

title

Body

[close]

/ -> viewonline.php (source)

   1  <?php
   2  /**
   3  *
   4  * This file is part of the phpBB Forum Software package.
   5  *
   6  * @copyright (c) phpBB Limited <https://www.phpbb.com>
   7  * @license GNU General Public License, version 2 (GPL-2.0)
   8  *
   9  * For full copyright and license information, please see
  10  * the docs/CREDITS.txt file.
  11  *
  12  */
  13  
  14  /**
  15  * @ignore
  16  */
  17  define('IN_PHPBB', true);
  18  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
  19  $phpEx = substr(strrchr(__FILE__, '.'), 1);
  20  include($phpbb_root_path . 'common.' . $phpEx);
  21  
  22  // Start session management
  23  $user->session_begin();
  24  $auth->acl($user->data);
  25  $user->setup('memberlist');
  26  
  27  // Get and set some variables
  28  $mode        = $request->variable('mode', '');
  29  $session_id    = $request->variable('s', '');
  30  $start        = $request->variable('start', 0);
  31  $sort_key    = $request->variable('sk', 'b');
  32  $sort_dir    = $request->variable('sd', 'd');
  33  $show_guests    = ($config['load_online_guests']) ? $request->variable('sg', 0) : 0;
  34  
  35  // Can this user view profiles/memberlist?
  36  if (!$auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel'))
  37  {
  38      if ($user->data['user_id'] != ANONYMOUS)
  39      {
  40          send_status_line(403, 'Forbidden');
  41          trigger_error('NO_VIEW_USERS');
  42      }
  43  
  44      login_box('', $user->lang['LOGIN_EXPLAIN_VIEWONLINE']);
  45  }
  46  
  47  /* @var $pagination \phpbb\pagination */
  48  $pagination = $phpbb_container->get('pagination');
  49  
  50  /* @var $viewonline_helper \phpbb\viewonline_helper */
  51  $viewonline_helper = $phpbb_container->get('viewonline_helper');
  52  
  53  $sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_JOINED'], 'c' => $user->lang['SORT_LOCATION']);
  54  $sort_key_sql = array('a' => 'u.username_clean', 'b' => 's.session_time', 'c' => 's.session_page');
  55  
  56  // Sorting and order
  57  if (!isset($sort_key_text[$sort_key]))
  58  {
  59      $sort_key = 'b';
  60  }
  61  
  62  $order_by = $sort_key_sql[$sort_key] . ' ' . (($sort_dir == 'a') ? 'ASC' : 'DESC');
  63  
  64  // Whois requested
  65  if ($mode == 'whois' && $auth->acl_get('a_') && $session_id)
  66  {
  67      if (!function_exists('user_get_id_name'))
  68      {
  69          include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
  70      }
  71  
  72      $sql = 'SELECT u.user_id, u.username, u.user_type, s.session_ip
  73          FROM ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . " s
  74          WHERE s.session_id = '" . $db->sql_escape($session_id) . "'
  75              AND    u.user_id = s.session_user_id";
  76      $result = $db->sql_query($sql);
  77  
  78      if ($row = $db->sql_fetchrow($result))
  79      {
  80          $template->assign_var('WHOIS', user_ipwhois($row['session_ip']));
  81      }
  82      $db->sql_freeresult($result);
  83  
  84      // Output the page
  85      page_header($user->lang['WHO_IS_ONLINE']);
  86  
  87      $template->set_filenames(array(
  88          'body' => 'viewonline_whois.html')
  89      );
  90      make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
  91  
  92      page_footer();
  93  }
  94  
  95  $user->update_session_infos();
  96  
  97  // Forum info
  98  $sql_ary = array(
  99      'SELECT'    => 'f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.left_id, f.right_id',
 100      'FROM'        => array(
 101          FORUMS_TABLE    => 'f',
 102      ),
 103      'ORDER_BY'    => 'f.left_id ASC',
 104  );
 105  
 106  /**
 107  * Modify the forum data SQL query for getting additional fields if needed
 108  *
 109  * @event core.viewonline_modify_forum_data_sql
 110  * @var    array    sql_ary            The SQL array
 111  * @since 3.1.5-RC1
 112  */
 113  $vars = array('sql_ary');
 114  extract($phpbb_dispatcher->trigger_event('core.viewonline_modify_forum_data_sql', compact($vars)));
 115  
 116  $result = $db->sql_query($db->sql_build_query('SELECT', $sql_ary), 600);
 117  unset($sql_ary);
 118  
 119  $forum_data = array();
 120  while ($row = $db->sql_fetchrow($result))
 121  {
 122      $forum_data[$row['forum_id']] = $row;
 123  }
 124  $db->sql_freeresult($result);
 125  
 126  $guest_counter = 0;
 127  
 128  // Get number of online guests (if we do not display them)
 129  if (!$show_guests)
 130  {
 131      switch ($db->get_sql_layer())
 132      {
 133          case 'sqlite3':
 134              $sql = 'SELECT COUNT(session_ip) as num_guests
 135                  FROM (
 136                      SELECT DISTINCT session_ip
 137                          FROM ' . SESSIONS_TABLE . '
 138                          WHERE session_user_id = ' . ANONYMOUS . '
 139                              AND session_time >= ' . (time() - ($config['load_online_time'] * 60)) .
 140                  ')';
 141          break;
 142  
 143          default:
 144              $sql = 'SELECT COUNT(DISTINCT session_ip) as num_guests
 145                  FROM ' . SESSIONS_TABLE . '
 146                  WHERE session_user_id = ' . ANONYMOUS . '
 147                      AND session_time >= ' . (time() - ($config['load_online_time'] * 60));
 148          break;
 149      }
 150      $result = $db->sql_query($sql);
 151      $guest_counter = (int) $db->sql_fetchfield('num_guests');
 152      $db->sql_freeresult($result);
 153  }
 154  
 155  // Get user list
 156  $sql_ary = array(
 157      'SELECT'    => 'u.user_id, u.username, u.username_clean, u.user_type, u.user_colour, s.session_id, s.session_time, s.session_page, s.session_ip, s.session_browser, s.session_viewonline, s.session_forum_id',
 158      'FROM'        => array(
 159          USERS_TABLE        => 'u',
 160          SESSIONS_TABLE    => 's',
 161      ),
 162      'WHERE'        => 'u.user_id = s.session_user_id
 163          AND s.session_time >= ' . (time() - ($config['load_online_time'] * 60)) .
 164          ((!$show_guests) ? ' AND s.session_user_id <> ' . ANONYMOUS : ''),
 165      'ORDER_BY'    => $order_by,
 166  );
 167  
 168  /**
 169  * Modify the SQL query for getting the user data to display viewonline list
 170  *
 171  * @event core.viewonline_modify_sql
 172  * @var    array    sql_ary            The SQL array
 173  * @var    bool    show_guests        Do we display guests in the list
 174  * @var    int        guest_counter    Number of guests displayed
 175  * @var    array    forum_data        Array with forum data
 176  * @since 3.1.0-a1
 177  * @changed 3.1.0-a2 Added vars guest_counter and forum_data
 178  */
 179  $vars = array('sql_ary', 'show_guests', 'guest_counter', 'forum_data');
 180  extract($phpbb_dispatcher->trigger_event('core.viewonline_modify_sql', compact($vars)));
 181  
 182  $result = $db->sql_query($db->sql_build_query('SELECT', $sql_ary));
 183  $session_data_rowset = $db->sql_fetchrowset($result);
 184  $db->sql_freeresult($result);
 185  
 186  $prev_id = $prev_ip = $user_list = array();
 187  $logged_visible_online = $logged_hidden_online = $counter = 0;
 188  
 189  /** @var \phpbb\controller\helper $controller_helper */
 190  $controller_helper = $phpbb_container->get('controller.helper');
 191  
 192  /** @var \phpbb\group\helper $group_helper */
 193  $group_helper = $phpbb_container->get('group_helper');
 194  
 195  // Get forum IDs for session pages which have only 't' parameter
 196  $viewonline_helper->get_forum_ids($session_data_rowset);
 197  
 198  foreach ($session_data_rowset as $row)
 199  {
 200      if ($row['user_id'] != ANONYMOUS && !isset($prev_id[$row['user_id']]))
 201      {
 202          $view_online = $s_user_hidden = false;
 203          $user_colour = ($row['user_colour']) ? ' style="color:#' . $row['user_colour'] . '" class="username-coloured"' : '';
 204  
 205          $username_full = ($row['user_type'] != USER_IGNORE) ? get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']) : '<span' . $user_colour . '>' . $row['username'] . '</span>';
 206  
 207          if (!$row['session_viewonline'])
 208          {
 209              $view_online = ($auth->acl_get('u_viewonline') || $row['user_id'] === $user->data['user_id']) ? true : false;
 210              $logged_hidden_online++;
 211  
 212              $username_full = '<em>' . $username_full . '</em>';
 213              $s_user_hidden = true;
 214          }
 215          else
 216          {
 217              $view_online = true;
 218              $logged_visible_online++;
 219          }
 220  
 221          $prev_id[$row['user_id']] = 1;
 222  
 223          if ($view_online)
 224          {
 225              $counter++;
 226          }
 227  
 228          if (!$view_online || $counter > $start + $config['topics_per_page'] || $counter <= $start)
 229          {
 230              continue;
 231          }
 232      }
 233      else if ($show_guests && $row['user_id'] == ANONYMOUS && !isset($prev_ip[$row['session_ip']]))
 234      {
 235          $prev_ip[$row['session_ip']] = 1;
 236          $guest_counter++;
 237          $counter++;
 238  
 239          if ($counter > $start + $config['topics_per_page'] || $counter <= $start)
 240          {
 241              continue;
 242          }
 243  
 244          $s_user_hidden = false;
 245          $username_full = get_username_string('full', $row['user_id'], $user->lang['GUEST']);
 246      }
 247      else
 248      {
 249          continue;
 250      }
 251  
 252      $on_page = $viewonline_helper->get_user_page($row['session_page']);
 253  
 254      switch ($on_page[1])
 255      {
 256          case 'index':
 257              $location = $user->lang['INDEX'];
 258              $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 259          break;
 260  
 261          case $phpbb_adm_relative_path . 'index':
 262              $location = $user->lang['ACP'];
 263              $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 264          break;
 265  
 266          case 'posting':
 267          case 'viewforum':
 268          case 'viewtopic':
 269              $forum_id = $row['session_forum_id'];
 270  
 271              if ($forum_id && $auth->acl_get('f_list', $forum_id))
 272              {
 273                  $location = '';
 274                  $location_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
 275  
 276                  if ($forum_data[$forum_id]['forum_type'] == FORUM_LINK)
 277                  {
 278                      $location = sprintf($user->lang['READING_LINK'], $forum_data[$forum_id]['forum_name']);
 279                      break;
 280                  }
 281  
 282                  switch ($on_page[1])
 283                  {
 284                      case 'posting':
 285                          preg_match('#mode=([a-z]+)#', $row['session_page'], $on_page);
 286                          $posting_mode = (!empty($on_page[1])) ? $on_page[1] : '';
 287  
 288                          switch ($posting_mode)
 289                          {
 290                              case 'reply':
 291                              case 'quote':
 292                                  $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
 293                              break;
 294  
 295                              default:
 296                                  $location = sprintf($user->lang['POSTING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
 297                              break;
 298                          }
 299                      break;
 300  
 301                      case 'viewtopic':
 302                          $location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
 303                      break;
 304  
 305                      case 'viewforum':
 306                          $location = sprintf($user->lang['READING_FORUM'], $forum_data[$forum_id]['forum_name']);
 307                      break;
 308                  }
 309              }
 310              else
 311              {
 312                  $location = $user->lang['INDEX'];
 313                  $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 314              }
 315          break;
 316  
 317          case 'search':
 318              $location = $user->lang['SEARCHING_FORUMS'];
 319              $location_url = append_sid("{$phpbb_root_path}search.$phpEx");
 320          break;
 321  
 322          case 'viewonline':
 323              $location = $user->lang['VIEWING_ONLINE'];
 324              $location_url = append_sid("{$phpbb_root_path}viewonline.$phpEx");
 325          break;
 326  
 327          case 'memberlist':
 328              $location_url = append_sid("{$phpbb_root_path}memberlist.$phpEx");
 329  
 330              if (strpos($row['session_page'], 'mode=viewprofile') !== false)
 331              {
 332                  $location = $user->lang['VIEWING_MEMBER_PROFILE'];
 333              }
 334              else if (strpos($row['session_page'], 'mode=contactadmin') !== false)
 335              {
 336                  $location = $user->lang['VIEWING_CONTACT_ADMIN'];
 337                  $location_url = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contactadmin');
 338              }
 339              else
 340              {
 341                  $location = $user->lang['VIEWING_MEMBERS'];
 342              }
 343          break;
 344  
 345          case 'mcp':
 346              $location = $user->lang['VIEWING_MCP'];
 347              $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 348          break;
 349  
 350          case 'ucp':
 351              $location = $user->lang['VIEWING_UCP'];
 352  
 353              // Grab some common modules
 354              $url_params = array(
 355                  'mode=register'        => 'VIEWING_REGISTER',
 356                  'i=pm&mode=compose'    => 'POSTING_PRIVATE_MESSAGE',
 357                  'i=pm&'                => 'VIEWING_PRIVATE_MESSAGES',
 358                  'i=profile&'        => 'CHANGING_PROFILE',
 359                  'i=prefs&'            => 'CHANGING_PREFERENCES',
 360              );
 361  
 362              foreach ($url_params as $param => $lang)
 363              {
 364                  if (strpos($row['session_page'], $param) !== false)
 365                  {
 366                      $location = $user->lang[$lang];
 367                      break;
 368                  }
 369              }
 370  
 371              $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 372          break;
 373  
 374          case 'download/file':
 375              $location = $user->lang['DOWNLOADING_FILE'];
 376              $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 377          break;
 378  
 379          case 'report':
 380              $location = $user->lang['REPORTING_POST'];
 381              $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 382          break;
 383  
 384          default:
 385              $location = $user->lang['INDEX'];
 386              $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
 387  
 388              if ($row['session_page'] === 'app.' . $phpEx . '/help/faq' ||
 389                  $row['session_page'] === 'app.' . $phpEx . '/help/bbcode')
 390              {
 391                  $location = $user->lang['VIEWING_FAQ'];
 392                  $location_url = $controller_helper->route('phpbb_help_faq_controller');
 393              }
 394          break;
 395      }
 396  
 397      /**
 398      * Overwrite the location's name and URL, which are displayed in the list
 399      *
 400      * @event core.viewonline_overwrite_location
 401      * @var    array    on_page            File name and query string
 402      * @var    array    row                Array with the users sql row
 403      * @var    string    location        Page name to displayed in the list
 404      * @var    string    location_url    Page url to displayed in the list
 405      * @var    array    forum_data        Array with forum data
 406      * @since 3.1.0-a1
 407      * @changed 3.1.0-a2 Added var forum_data
 408      */
 409      $vars = array('on_page', 'row', 'location', 'location_url', 'forum_data');
 410      extract($phpbb_dispatcher->trigger_event('core.viewonline_overwrite_location', compact($vars)));
 411  
 412      $template_row = array(
 413          'USERNAME'             => $row['username'],
 414          'USERNAME_COLOUR'    => $row['user_colour'],
 415          'USERNAME_FULL'        => $username_full,
 416          'LASTUPDATE'        => $user->format_date($row['session_time']),
 417          'FORUM_LOCATION'    => $location,
 418          'USER_IP'            => ($auth->acl_get('a_')) ? (($mode == 'lookup' && $session_id == $row['session_id']) ? gethostbyaddr($row['session_ip']) : $row['session_ip']) : '',
 419          'USER_BROWSER'        => ($auth->acl_get('a_user')) ? $row['session_browser'] : '',
 420  
 421          'U_USER_PROFILE'    => ($row['user_type'] != USER_IGNORE) ? get_username_string('profile', $row['user_id'], '') : '',
 422          'U_USER_IP'            => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'mode=lookup' . (($mode != 'lookup' || $row['session_id'] != $session_id) ? '&amp;s=' . $row['session_id'] : '') . "&amp;sg=$show_guests&amp;start=$start&amp;sk=$sort_key&amp;sd=$sort_dir"),
 423          'U_WHOIS'            => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'mode=whois&amp;s=' . $row['session_id']),
 424          'U_FORUM_LOCATION'    => $location_url,
 425  
 426          'S_USER_HIDDEN'        => $s_user_hidden,
 427          'S_GUEST'            => ($row['user_id'] == ANONYMOUS) ? true : false,
 428          'S_USER_TYPE'        => $row['user_type'],
 429      );
 430  
 431      /**
 432      * Modify viewonline template data before it is displayed in the list
 433      *
 434      * @event core.viewonline_modify_user_row
 435      * @var    array    on_page            File name and query string
 436      * @var    array    row                Array with the users sql row
 437      * @var    array    forum_data        Array with forum data
 438      * @var    array    template_row    Array with template variables for the user row
 439      * @since 3.1.0-RC4
 440      */
 441      $vars = array('on_page', 'row', 'forum_data', 'template_row');
 442      extract($phpbb_dispatcher->trigger_event('core.viewonline_modify_user_row', compact($vars)));
 443  
 444      $template->assign_block_vars('user_row', $template_row);
 445  }
 446  unset($prev_id, $prev_ip);
 447  
 448  $order_legend = ($config['legend_sort_groupname']) ? 'group_name' : 'group_legend';
 449  // Grab group details for legend display
 450  if ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
 451  {
 452      $sql = 'SELECT group_id, group_name, group_colour, group_type, group_legend
 453          FROM ' . GROUPS_TABLE . '
 454          WHERE group_legend > 0
 455          ORDER BY ' . $order_legend . ' ASC';
 456  }
 457  else
 458  {
 459      $sql = 'SELECT g.group_id, g.group_name, g.group_colour, g.group_type, g.group_legend
 460          FROM ' . GROUPS_TABLE . ' g
 461          LEFT JOIN ' . USER_GROUP_TABLE . ' ug
 462              ON (
 463                  g.group_id = ug.group_id
 464                  AND ug.user_id = ' . $user->data['user_id'] . '
 465                  AND ug.user_pending = 0
 466              )
 467          WHERE g.group_legend > 0
 468              AND (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')
 469          ORDER BY g.' . $order_legend . ' ASC';
 470  }
 471  $result = $db->sql_query($sql);
 472  
 473  $legend = '';
 474  while ($row = $db->sql_fetchrow($result))
 475  {
 476      if ($row['group_name'] == 'BOTS')
 477      {
 478          $legend .= (($legend != '') ? ', ' : '') . '<span style="color:#' . $row['group_colour'] . '">' . $user->lang['G_BOTS'] . '</span>';
 479      }
 480      else
 481      {
 482          $legend .= (($legend != '') ? ', ' : '') . '<a style="color:#' . $row['group_colour'] . '" href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . $group_helper->get_name($row['group_name']) . '</a>';
 483      }
 484  }
 485  $db->sql_freeresult($result);
 486  
 487  // Refreshing the page every 60 seconds...
 488  meta_refresh(60, append_sid("{$phpbb_root_path}viewonline.$phpEx", "sg=$show_guests&amp;sk=$sort_key&amp;sd=$sort_dir&amp;start=$start"));
 489  
 490  $start = $pagination->validate_start($start, $config['topics_per_page'], $counter);
 491  $base_url = append_sid("{$phpbb_root_path}viewonline.$phpEx", "sg=$show_guests&amp;sk=$sort_key&amp;sd=$sort_dir");
 492  $pagination->generate_template_pagination($base_url, 'pagination', 'start', $counter, $config['topics_per_page'], $start);
 493  
 494  $template->assign_block_vars('navlinks', array(
 495      'BREADCRUMB_NAME'    => $user->lang('WHO_IS_ONLINE'),
 496      'U_BREADCRUMB'        => append_sid("{$phpbb_root_path}viewonline.$phpEx"),
 497  ));
 498  
 499  // Send data to template
 500  $template->assign_vars(array(
 501      'TOTAL_REGISTERED_USERS_ONLINE'    => $user->lang('REG_USERS_ONLINE', (int) $logged_visible_online, $user->lang('HIDDEN_USERS_ONLINE', (int) $logged_hidden_online)),
 502      'TOTAL_GUEST_USERS_ONLINE'        => $user->lang('GUEST_USERS_ONLINE', (int) $guest_counter),
 503      'LEGEND'                        => $legend,
 504  
 505      'U_SORT_USERNAME'        => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'sk=a&amp;sd=' . (($sort_key == 'a' && $sort_dir == 'a') ? 'd' : 'a') . '&amp;sg=' . ((int) $show_guests)),
 506      'U_SORT_UPDATED'        => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'sk=b&amp;sd=' . (($sort_key == 'b' && $sort_dir == 'a') ? 'd' : 'a') . '&amp;sg=' . ((int) $show_guests)),
 507      'U_SORT_LOCATION'        => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'sk=c&amp;sd=' . (($sort_key == 'c' && $sort_dir == 'a') ? 'd' : 'a') . '&amp;sg=' . ((int) $show_guests)),
 508  
 509      'U_SWITCH_GUEST_DISPLAY'    => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'sg=' . ((int) !$show_guests)),
 510      'L_SWITCH_GUEST_DISPLAY'    => ($show_guests) ? $user->lang['HIDE_GUESTS'] : $user->lang['DISPLAY_GUESTS'],
 511      'S_SWITCH_GUEST_DISPLAY'    => ($config['load_online_guests']) ? true : false,
 512      'S_VIEWONLINE'                => true,
 513  ));
 514  
 515  // We do not need to load the who is online box here. ;)
 516  $config['load_online'] = false;
 517  
 518  // Output the page
 519  page_header($user->lang['WHO_IS_ONLINE']);
 520  
 521  $template->set_filenames(array(
 522      'body' => 'viewonline_body.html')
 523  );
 524  make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
 525  
 526  page_footer();


Generated: Sat Nov 4 14:26:03 2023 Cross-referenced by PHPXref 0.7.1