PageRenderTime 57ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/viewonline.php

https://github.com/Vexilurz/phpbb_forum
PHP | 450 lines | 351 code | 72 blank | 27 comment | 64 complexity | d2a2e19c6a3f1b7cc49af90900901040 MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package phpBB3
  5. * @version $Id$
  6. * @copyright (c) 2005 phpBB Group
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. /**
  11. * @ignore
  12. */
  13. define('IN_PHPBB', true);
  14. $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
  15. $phpEx = substr(strrchr(__FILE__, '.'), 1);
  16. include($phpbb_root_path . 'common.' . $phpEx);
  17. // Start session management
  18. $user->session_begin();
  19. $auth->acl($user->data);
  20. $user->setup('memberlist');
  21. // Get and set some variables
  22. $mode = request_var('mode', '');
  23. $session_id = request_var('s', '');
  24. $start = request_var('start', 0);
  25. $sort_key = request_var('sk', 'b');
  26. $sort_dir = request_var('sd', 'd');
  27. $show_guests= ($config['load_online_guests']) ? request_var('sg', 0) : 0;
  28. // Can this user view profiles/memberlist?
  29. if (!$auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel'))
  30. {
  31. if ($user->data['user_id'] != ANONYMOUS)
  32. {
  33. trigger_error('NO_VIEW_USERS');
  34. }
  35. login_box('', $user->lang['LOGIN_EXPLAIN_VIEWONLINE']);
  36. }
  37. $sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_JOINED'], 'c' => $user->lang['SORT_LOCATION']);
  38. $sort_key_sql = array('a' => 'u.username_clean', 'b' => 's.session_time', 'c' => 's.session_page');
  39. // Sorting and order
  40. if (!isset($sort_key_text[$sort_key]))
  41. {
  42. $sort_key = 'b';
  43. }
  44. $order_by = $sort_key_sql[$sort_key] . ' ' . (($sort_dir == 'a') ? 'ASC' : 'DESC');
  45. // Whois requested
  46. if ($mode == 'whois' && $auth->acl_get('a_') && $session_id)
  47. {
  48. include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
  49. $sql = 'SELECT u.user_id, u.username, u.user_type, s.session_ip
  50. FROM ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . " s
  51. WHERE s.session_id = '" . $db->sql_escape($session_id) . "'
  52. AND u.user_id = s.session_user_id";
  53. $result = $db->sql_query($sql);
  54. if ($row = $db->sql_fetchrow($result))
  55. {
  56. $template->assign_var('WHOIS', user_ipwhois($row['session_ip']));
  57. }
  58. $db->sql_freeresult($result);
  59. // Output the page
  60. page_header($user->lang['WHO_IS_ONLINE']);
  61. $template->set_filenames(array(
  62. 'body' => 'viewonline_whois.html')
  63. );
  64. make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
  65. page_footer();
  66. }
  67. // Forum info
  68. $sql = 'SELECT forum_id, forum_name, parent_id, forum_type, left_id, right_id
  69. FROM ' . FORUMS_TABLE . '
  70. ORDER BY left_id ASC';
  71. $result = $db->sql_query($sql, 600);
  72. $forum_data = array();
  73. while ($row = $db->sql_fetchrow($result))
  74. {
  75. $forum_data[$row['forum_id']] = $row;
  76. }
  77. $db->sql_freeresult($result);
  78. $guest_counter = 0;
  79. // Get number of online guests (if we do not display them)
  80. if (!$show_guests)
  81. {
  82. switch ($db->sql_layer)
  83. {
  84. case 'sqlite':
  85. $sql = 'SELECT COUNT(session_ip) as num_guests
  86. FROM (
  87. SELECT DISTINCT session_ip
  88. FROM ' . SESSIONS_TABLE . '
  89. WHERE session_user_id = ' . ANONYMOUS . '
  90. AND session_time >= ' . (time() - ($config['load_online_time'] * 60)) .
  91. ')';
  92. break;
  93. default:
  94. $sql = 'SELECT COUNT(DISTINCT session_ip) as num_guests
  95. FROM ' . SESSIONS_TABLE . '
  96. WHERE session_user_id = ' . ANONYMOUS . '
  97. AND session_time >= ' . (time() - ($config['load_online_time'] * 60));
  98. break;
  99. }
  100. $result = $db->sql_query($sql);
  101. $guest_counter = (int) $db->sql_fetchfield('num_guests');
  102. $db->sql_freeresult($result);
  103. }
  104. // Get user list
  105. $sql = '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
  106. FROM ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . ' s
  107. WHERE u.user_id = s.session_user_id
  108. AND s.session_time >= ' . (time() - ($config['load_online_time'] * 60)) .
  109. ((!$show_guests) ? ' AND s.session_user_id <> ' . ANONYMOUS : '') . '
  110. ORDER BY ' . $order_by;
  111. $result = $db->sql_query($sql);
  112. $prev_id = $prev_ip = $user_list = array();
  113. $logged_visible_online = $logged_hidden_online = $counter = 0;
  114. while ($row = $db->sql_fetchrow($result))
  115. {
  116. if ($row['user_id'] != ANONYMOUS && !isset($prev_id[$row['user_id']]))
  117. {
  118. $view_online = $s_user_hidden = false;
  119. $user_colour = ($row['user_colour']) ? ' style="color:#' . $row['user_colour'] . '" class="username-coloured"' : '';
  120. $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>';
  121. if (!$row['session_viewonline'])
  122. {
  123. $view_online = ($auth->acl_get('u_viewonline')) ? true : false;
  124. $logged_hidden_online++;
  125. $username_full = '<em>' . $username_full . '</em>';
  126. $s_user_hidden = true;
  127. }
  128. else
  129. {
  130. $view_online = true;
  131. $logged_visible_online++;
  132. }
  133. $prev_id[$row['user_id']] = 1;
  134. if ($view_online)
  135. {
  136. $counter++;
  137. }
  138. if (!$view_online || $counter > $start + $config['topics_per_page'] || $counter <= $start)
  139. {
  140. continue;
  141. }
  142. }
  143. else if ($show_guests && $row['user_id'] == ANONYMOUS && !isset($prev_ip[$row['session_ip']]))
  144. {
  145. $prev_ip[$row['session_ip']] = 1;
  146. $guest_counter++;
  147. $counter++;
  148. if ($counter > $start + $config['topics_per_page'] || $counter <= $start)
  149. {
  150. continue;
  151. }
  152. $s_user_hidden = false;
  153. $username_full = get_username_string('full', $row['user_id'], $user->lang['GUEST']);
  154. }
  155. else
  156. {
  157. continue;
  158. }
  159. preg_match('#^([a-z0-9/_-]+)#i', $row['session_page'], $on_page);
  160. if (!sizeof($on_page))
  161. {
  162. $on_page[1] = '';
  163. }
  164. switch ($on_page[1])
  165. {
  166. case 'index':
  167. $location = $user->lang['INDEX'];
  168. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  169. break;
  170. case 'adm/index':
  171. $location = $user->lang['ACP'];
  172. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  173. break;
  174. case 'posting':
  175. case 'viewforum':
  176. case 'viewtopic':
  177. $forum_id = $row['session_forum_id'];
  178. if ($forum_id && $auth->acl_get('f_list', $forum_id))
  179. {
  180. $location = '';
  181. $location_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
  182. if ($forum_data[$forum_id]['forum_type'] == FORUM_LINK)
  183. {
  184. $location = sprintf($user->lang['READING_LINK'], $forum_data[$forum_id]['forum_name']);
  185. break;
  186. }
  187. switch ($on_page[1])
  188. {
  189. case 'posting':
  190. preg_match('#mode=([a-z]+)#', $row['session_page'], $on_page);
  191. $posting_mode = (!empty($on_page[1])) ? $on_page[1] : '';
  192. switch ($posting_mode)
  193. {
  194. case 'reply':
  195. case 'quote':
  196. $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
  197. break;
  198. default:
  199. $location = sprintf($user->lang['POSTING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
  200. break;
  201. }
  202. break;
  203. case 'viewtopic':
  204. preg_match('#t=([0-9]+)#', $row['session_page'], $on_page);
  205. $sql = 'SELECT topic_title FROM ' . TOPICS_TABLE . " WHERE topic_id = {$on_page[1]}";
  206. $topic_result = $db->sql_query($sql);
  207. $topic_data = $db->sql_fetchrow($topic_result);
  208. $location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_data['topic_title']);
  209. $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&t=' . $on_page[1]);
  210. break;
  211. case 'viewforum':
  212. $location = sprintf($user->lang['READING_FORUM'], $forum_data[$forum_id]['forum_name']);
  213. break;
  214. }
  215. }
  216. else
  217. {
  218. $location = $user->lang['INDEX'];
  219. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  220. }
  221. break;
  222. case 'search':
  223. $location = $user->lang['SEARCHING_FORUMS'];
  224. $location_url = append_sid("{$phpbb_root_path}search.$phpEx");
  225. break;
  226. case 'faq':
  227. $location = $user->lang['VIEWING_FAQ'];
  228. $location_url = append_sid("{$phpbb_root_path}faq.$phpEx");
  229. break;
  230. case 'viewonline':
  231. $location = $user->lang['VIEWING_ONLINE'];
  232. $location_url = append_sid("{$phpbb_root_path}viewonline.$phpEx");
  233. break;
  234. case 'memberlist':
  235. $location = (strpos($row['session_page'], 'mode=viewprofile') !== false) ? $user->lang['VIEWING_MEMBER_PROFILE'] : $user->lang['VIEWING_MEMBERS'];
  236. $location_url = append_sid("{$phpbb_root_path}memberlist.$phpEx");
  237. break;
  238. case 'mcp':
  239. $location = $user->lang['VIEWING_MCP'];
  240. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  241. break;
  242. case 'ucp':
  243. $location = $user->lang['VIEWING_UCP'];
  244. // Grab some common modules
  245. $url_params = array(
  246. 'mode=register' => 'VIEWING_REGISTER',
  247. 'i=pm&mode=compose' => 'POSTING_PRIVATE_MESSAGE',
  248. 'i=pm&' => 'VIEWING_PRIVATE_MESSAGES',
  249. 'i=profile&' => 'CHANGING_PROFILE',
  250. 'i=prefs&' => 'CHANGING_PREFERENCES',
  251. );
  252. foreach ($url_params as $param => $lang)
  253. {
  254. if (strpos($row['session_page'], $param) !== false)
  255. {
  256. $location = $user->lang[$lang];
  257. break;
  258. }
  259. }
  260. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  261. break;
  262. case 'download/file':
  263. $location = $user->lang['DOWNLOADING_FILE'];
  264. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  265. break;
  266. case 'report':
  267. $location = $user->lang['REPORTING_POST'];
  268. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  269. break;
  270. default:
  271. $location = $user->lang['INDEX'];
  272. $location_url = append_sid("{$phpbb_root_path}index.$phpEx");
  273. break;
  274. }
  275. $template->assign_block_vars('user_row', array(
  276. 'USERNAME' => $row['username'],
  277. 'USERNAME_COLOUR' => $row['user_colour'],
  278. 'USERNAME_FULL' => $username_full,
  279. 'LASTUPDATE' => $user->format_date($row['session_time']),
  280. 'FORUM_LOCATION' => $location,
  281. 'USER_IP' => ($auth->acl_get('a_')) ? (($mode == 'lookup' && $session_id == $row['session_id']) ? gethostbyaddr($row['session_ip']) : $row['session_ip']) : '',
  282. 'USER_BROWSER' => ($auth->acl_get('a_user')) ? $row['session_browser'] : '',
  283. 'U_USER_PROFILE' => ($row['user_type'] != USER_IGNORE) ? get_username_string('profile', $row['user_id'], '') : '',
  284. '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"),
  285. 'U_WHOIS' => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'mode=whois&amp;s=' . $row['session_id']),
  286. 'U_FORUM_LOCATION' => $location_url,
  287. 'S_USER_HIDDEN' => $s_user_hidden,
  288. 'S_GUEST' => ($row['user_id'] == ANONYMOUS) ? true : false,
  289. 'S_USER_TYPE' => $row['user_type'],
  290. ));
  291. }
  292. $db->sql_freeresult($result);
  293. unset($prev_id, $prev_ip);
  294. // Generate reg/hidden/guest online text
  295. $vars_online = array(
  296. 'REG' => array('logged_visible_online', 'l_r_user_s'),
  297. 'HIDDEN'=> array('logged_hidden_online', 'l_h_user_s'),
  298. 'GUEST' => array('guest_counter', 'l_g_user_s')
  299. );
  300. foreach ($vars_online as $l_prefix => $var_ary)
  301. {
  302. switch ($$var_ary[0])
  303. {
  304. case 0:
  305. $$var_ary[1] = $user->lang[$l_prefix . '_USERS_ZERO_ONLINE'];
  306. break;
  307. case 1:
  308. $$var_ary[1] = $user->lang[$l_prefix . '_USER_ONLINE'];
  309. break;
  310. default:
  311. $$var_ary[1] = $user->lang[$l_prefix . '_USERS_ONLINE'];
  312. break;
  313. }
  314. }
  315. unset($vars_online);
  316. $pagination = generate_pagination(append_sid("{$phpbb_root_path}viewonline.$phpEx", "sg=$show_guests&amp;sk=$sort_key&amp;sd=$sort_dir"), $counter, $config['topics_per_page'], $start);
  317. // Grab group details for legend display
  318. if ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
  319. {
  320. $sql = 'SELECT group_id, group_name, group_colour, group_type
  321. FROM ' . GROUPS_TABLE . '
  322. WHERE group_legend = 1
  323. ORDER BY group_name ASC';
  324. }
  325. else
  326. {
  327. $sql = 'SELECT g.group_id, g.group_name, g.group_colour, g.group_type
  328. FROM ' . GROUPS_TABLE . ' g
  329. LEFT JOIN ' . USER_GROUP_TABLE . ' ug
  330. ON (
  331. g.group_id = ug.group_id
  332. AND ug.user_id = ' . $user->data['user_id'] . '
  333. AND ug.user_pending = 0
  334. )
  335. WHERE g.group_legend = 1
  336. AND (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')
  337. ORDER BY g.group_name ASC';
  338. }
  339. $result = $db->sql_query($sql);
  340. $legend = '';
  341. while ($row = $db->sql_fetchrow($result))
  342. {
  343. if ($row['group_name'] == 'BOTS')
  344. {
  345. $legend .= (($legend != '') ? ', ' : '') . '<span style="color:#' . $row['group_colour'] . '">' . $user->lang['G_BOTS'] . '</span>';
  346. }
  347. else
  348. {
  349. $legend .= (($legend != '') ? ', ' : '') . '<a style="color:#' . $row['group_colour'] . '" href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</a>';
  350. }
  351. }
  352. $db->sql_freeresult($result);
  353. // Refreshing the page every 60 seconds...
  354. meta_refresh(60, append_sid("{$phpbb_root_path}viewonline.$phpEx", "sg=$show_guests&amp;sk=$sort_key&amp;sd=$sort_dir&amp;start=$start"));
  355. // Send data to template
  356. $template->assign_vars(array(
  357. 'TOTAL_REGISTERED_USERS_ONLINE' => sprintf($l_r_user_s, $logged_visible_online) . sprintf($l_h_user_s, $logged_hidden_online),
  358. 'TOTAL_GUEST_USERS_ONLINE' => sprintf($l_g_user_s, $guest_counter),
  359. 'LEGEND' => $legend,
  360. 'PAGINATION' => $pagination,
  361. 'PAGE_NUMBER' => on_page($counter, $config['topics_per_page'], $start),
  362. '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)),
  363. '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)),
  364. '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)),
  365. 'U_SWITCH_GUEST_DISPLAY' => append_sid("{$phpbb_root_path}viewonline.$phpEx", 'sg=' . ((int) !$show_guests)),
  366. 'L_SWITCH_GUEST_DISPLAY' => ($show_guests) ? $user->lang['HIDE_GUESTS'] : $user->lang['DISPLAY_GUESTS'],
  367. 'S_SWITCH_GUEST_DISPLAY' => ($config['load_online_guests']) ? true : false)
  368. );
  369. // We do not need to load the who is online box here. ;)
  370. $config['load_online'] = false;
  371. // Output the page
  372. page_header($user->lang['WHO_IS_ONLINE']);
  373. $template->set_filenames(array(
  374. 'body' => 'viewonline_body.html')
  375. );
  376. make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
  377. page_footer();
  378. ?>