-
Notifications
You must be signed in to change notification settings - Fork 0
/
_whosonline.plugin.php
327 lines (276 loc) · 7.6 KB
/
_whosonline.plugin.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
<?php
/**
* This file implements the Whosonline plugin.
*
* This file is part of the b2evolution project - {@link http://b2evolution.net/}
*
* @license GNU GPL v2 - {@link http://b2evolution.net/about/gnu-gpl-license}
*
* @copyright (c)2003-2018 by Francois Planque - {@link http://fplanque.com/}
* Parts of this file are copyright (c)2004-2006 by Daniel HAHLER - {@link http://thequod.de/contact}.
*
* @package plugins
*/
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );
/**
* Calendar Plugin
*
* This plugin displays
*/
class whosonline_plugin extends Plugin
{
/**
* Variables below MUST be overriden by plugin implementations,
* either in the subclass declaration or in the subclass constructor.
*/
var $name;
var $code = 'evo_WhosOnline';
var $priority = 96;
var $version = '6.11.4';
var $author = 'The b2evo Group';
var $group = 'widget';
var $subgroup = 'other';
var $widget_icon = 'wifi';
/**
* Init
*/
function PluginInit( & $params )
{
$this->name = T_( 'Who\'s online Widget' );
$this->short_desc = T_('This skin tag displays a list of whos is online.');
$this->long_desc = T_('All logged in users and guest users who have requested a page in the last 5 minutes are listed.');
}
/**
* Get definitions for widget specific editable params
*
* @see Plugin::GetDefaultSettings()
* @param local params like 'for_editing' => true
*/
function get_widget_param_definitions( $params )
{
$r = array_merge( array(
'contacticons' => array(
'label' => T_('Contact icons'),
'note' => T_('Display contact icons allowing to send private messages to logged in users.'),
'type' => 'checkbox',
'defaultvalue' => true,
),
'timeout_online_user' => array(
'label' => T_( 'Online session timeout' ),
'note' => T_( 'seconds. After how much time of inactivity an user is considered to be offline? 300 seconds are 5 minutes.' ),
'type' => 'integer',
'defaultvalue' => 300,
'valid_range' => array(
'min' => 1, // 0 would not make sense.
),
),
), parent::get_widget_param_definitions( $params ) );
if( isset( $r['allow_blockcache'] ) )
{ // Disable "allow blockcache" because this widget displays the dynamic data:
$r['allow_blockcache']['defaultvalue'] = false;
$r['allow_blockcache']['disabled'] = 'disabled';
$r['allow_blockcache']['note'] = T_('This widget cannot be cached in the block cache.');
}
return $r;
}
/**
* Event handler: SkinTag (widget)
*
* @param array Associative array of parameters.
* @return boolean did we display?
*/
function SkinTag( & $params )
{
global $Plugins;
if( $Plugins->trigger_event_first_true('CacheIsCollectingContent') )
{ // A caching plugin collecting the content
return false;
}
echo $params['block_start'];
echo $params['block_title_start'];
echo T_('Who\'s Online?');
echo $params['block_title_end'];
echo $params['block_body_start'];
$OnlineSessions = new OnlineSessions( $params['timeout_online_user'] );
$OnlineSessions->display_onliners( $params );
echo $params['block_body_end'];
echo $params['block_end'];
return true;
}
}
/**
* This tracks who is online
*
* @todo dh> I wanted to add a MySQL INDEX on the sess_lastseen field, but this "plugin"
* is the only real user of this. So, when making this a plugin, this should
* add the index perhaps.
* @package evocore
*/
class OnlineSessions
{
/**
* Number of guests (and users that want to be anonymous)
*
* Gets lazy-filled when needed, through {@link init()}.
*
* @access protected
*/
var $_count_guests;
/**
* List of registered users.
*
* Gets lazy-filled when needed, through {@link init()}.
*
* @access protected
*/
var $_registered_Users;
/**
* Online session timeout in seconds.
*
* Default value: 300 (5 minutes). Set by {@link OnlineSessions::OnlineSessions()}.
*
* @access protected
*/
var $_timeout_online_user;
var $_initialized = false;
/**
* Constructor.
*
* @param integer Online session timeout in seconds.
*/
function __construct( $timeout_online_user = 300 )
{
$this->_timeout_online_user = $timeout_online_user;
}
/**
* Get an array of registered users and guests.
*
* @return array containing number of registered users and guests ('registered' and 'guests')
*/
function init()
{
if( $this->_initialized )
{
return true;
}
global $DB, $UserSettings, $localtimenow;
$this->_count_guests = 0;
$this->_registered_Users = array();
$timeout_YMD = date( 'Y-m-d H:i:s', ($localtimenow - $this->_timeout_online_user) );
$UserCache = & get_UserCache();
// We get all sessions that have been seen in $timeout_YMD and that have a session key.
// NOTE: we do not use DISTINCT here, because guest users are all "NULL".
$online_user_ids = $DB->get_col( "
SELECT SQL_NO_CACHE sess_user_ID
FROM T_sessions
WHERE sess_lastseen_ts > '".$timeout_YMD."'
AND sess_key IS NOT NULL
GROUP BY sess_ID", 0, 'Sessions: get list of relevant users.' );
$registered_online_user_ids = array_diff( $online_user_ids, array( NULL ) );
// load all online users into the cache because we need information ( login, avatar ) about them
$UserCache->load_list( $registered_online_user_ids );
foreach( $online_user_ids as $user_ID )
{
if( !empty( $user_ID ) && ( $User = & $UserCache->get_by_ID( $user_ID, false ) ) )
{
if( $UserSettings->get( 'show_online', $User->ID ) )
{ // Assign by ID so that each user is only counted once (he could use multiple user agents at the same time):
$this->_registered_Users[ $user_ID ] = & $User;
}
else
{ // Count this user as guest when he doesn't want to be visible:
$this->_count_guests++;
}
}
else
{
$this->_count_guests++;
}
}
$this->_initialized = true;
}
/**
* Get the number of guests.
*
* @param boolean display?
*/
function number_of_guests( $display = true )
{
if( !isset($this->_count_guests) )
{
$this->init();
}
if( $display )
{
echo $this->_count_guests;
}
return $this->_count_guests;
}
/**
* Template function: Display onliners, both registered users and guests.
*
* @todo get class="" out of here (put it into skins)
*/
function display_onliners( $params )
{
$this->display_online_users( $params );
$this->display_online_guests( $params );
}
/**
* Template function: Display the registered users who are online
*
* @todo get class="" out of here (put it into skins)
*
* @param array
*/
function display_online_users( $params )
{
global $DB, $Collection, $Blog, $UserSettings;
if( !isset($this->_registered_Users) )
{
$this->init();
}
// Note: not all users want to appear online, so we might have an empty list.
$r = '';
foreach( $this->_registered_Users as $User )
{
if( $UserSettings->get( 'show_online', $User->ID ) )
{
if( empty($r) )
{ // first user
$r .= $params['list_start'];
}
$r .= $params['item_start'];
$r .= $User->dget('preferredname');
if( $params['contacticons'] )
{ // We want contact icons:
$r .= $User->get_msgform_link();
}
$r .= $params['item_end'];
}
}
if( !empty($r) )
{ // we need to close the list
$r .= $params['list_end'];;
}
echo $r;
}
/**
* Template function: Display number of online guests.
*/
function display_online_guests( $params )
{
if( !isset($this->_count_guests) )
{
$this->init();
}
$r = $params['list_start'];
$r .= $params['item_start'];
$r .= T_('Guest Users:').' ';
$r .= $this->_count_guests;
$r .= $params['item_end'];
$r .= $params['list_end'];;
echo $r;
}
}
?>