phpBB
Statistics
| Revision:

root / trunk / phpBB / viewonline.php

History | View | Annotate | Download (13.2 kB)

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