|
1 <?php |
|
2 /* |
|
3 Plugin Name: Who's Online |
|
4 Plugin URI: javascript: // No URL yet, stay tuned! |
|
5 Description: This plugin tracks who is currently online. 3 queries per page request. This plugin works ONLY with MySQL and will likely be difficult to port because it uses unique indices and the REPLACE command. |
|
6 Author: Dan Fuhry |
|
7 Version: 0.1 |
|
8 Author URI: http://www.enanocms.org/ |
|
9 */ |
|
10 |
|
11 /* |
|
12 * Who's Online plugin for Enano |
|
13 * Version 0.1 |
|
14 * Copyright (C) 2007 Dan Fuhry |
|
15 * |
|
16 * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License |
|
17 * as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. |
|
18 * |
|
19 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
|
20 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. |
|
21 */ |
|
22 |
|
23 global $whos_online; |
|
24 $whos_online = Array('not_yet_initialized'); |
|
25 |
|
26 // First things first - create the table if needed |
|
27 $ver = getConfig('whos_online_version'); |
|
28 if($ver != '0.1') |
|
29 { |
|
30 if(! |
|
31 $db->sql_query('DROP TABLE IF EXISTS '.table_prefix.'online;') |
|
32 ) $db->_die('Could not clean out old who\'s-online table'); |
|
33 // The key on username allows the REPLACE command later, to save queries |
|
34 if(!$db->sql_query('CREATE TABLE '.table_prefix.'online( |
|
35 entry_id int(12) UNSIGNED NOT NULL auto_increment, |
|
36 user_id int(12) NOT NULL, |
|
37 username varchar(63) NOT NULL, |
|
38 last_load int(12) NOT NULL, |
|
39 PRIMARY KEY ( entry_id ), |
|
40 KEY ( username ) |
|
41 );') |
|
42 ) $db->_die('Could not create new who\'s-online table'); |
|
43 if(!$db->sql_query('CREATE UNIQUE INDEX '.table_prefix.'onluser ON '.table_prefix.'online(username);')) |
|
44 $db->_die('Could not create index on username column.'); |
|
45 setConfig('whos_online_version', '0.1'); |
|
46 } |
|
47 |
|
48 $plugins->attachHook('session_started', '__WhosOnline_UserCount();'); |
|
49 $plugins->attachHook('login_success', '__WhosOnline_logonhandler();'); |
|
50 $plugins->attachHook('logout_success', '__WhosOnline_logoffhandler($ou, $oid, $level);'); |
|
51 |
|
52 function __WhosOnline_UserCount() |
|
53 { |
|
54 global $db, $session, $paths, $template, $plugins; // Common objects |
|
55 global $whos_online; |
|
56 $whos_online = Array(); |
|
57 $whos_online['users'] = Array(); |
|
58 $whos_online['guests'] = Array(); |
|
59 $q = $db->sql_query('REPLACE INTO '.table_prefix.'online SET user_id='.$session->user_id.',username=\''.$db->escape($session->username).'\',last_load='.time().';'); if(!$q) $db->_die(''); |
|
60 $q = $db->sql_query('DELETE FROM '.table_prefix.'online WHERE last_load<'.( time() - 60*60*24 ).';'); if(!$q) $db->_die(''); |
|
61 $q = $db->sql_query('SELECT o.username,o.user_id,u.user_level FROM '.table_prefix.'online AS o |
|
62 LEFT JOIN '.table_prefix.'users AS u |
|
63 ON u.user_id=o.user_id |
|
64 WHERE last_load>'.( time() - 60*5 - 1 ).' ORDER BY username ASC'); if(!$q) $db->_die(''); |
|
65 $num_guests = 0; |
|
66 $num_users = 0; |
|
67 $users = Array(); |
|
68 while ( $row = $db->fetchrow() ) |
|
69 { |
|
70 ( $row['user_id'] == 1 ) ? $num_guests++ : $num_users++; |
|
71 if($row['user_id'] > 1) |
|
72 { |
|
73 switch($row['user_level']) |
|
74 { |
|
75 case USER_LEVEL_MEMBER: |
|
76 default: |
|
77 $color = '303030'; |
|
78 $weight = 'normal'; |
|
79 break; |
|
80 case USER_LEVEL_MOD: |
|
81 $color = '00AA00'; |
|
82 $weight = 'bold'; |
|
83 break; |
|
84 case USER_LEVEL_ADMIN: |
|
85 $color = 'AA0000'; |
|
86 $weight = 'bold'; |
|
87 break; |
|
88 } |
|
89 $users[] = "<a href='".makeUrlNS('User', str_replace(' ', '_', $row['username']))."' style='color: #$color; font-weight: $weight'>{$row['username']}</a>"; |
|
90 $whos_online['users'][] = $row['username']; |
|
91 } |
|
92 else |
|
93 { |
|
94 $whos_online['guests'][] = $row['username']; |
|
95 } |
|
96 } |
|
97 $total = $num_guests + $num_users; |
|
98 $ms = ( $num_users == 1 ) ? '' : 's'; |
|
99 $gs = ( $num_guests == 1 ) ? '' : 's'; |
|
100 $ts = ( $total == 1 ) ? '' : 's'; |
|
101 $is_are = ( $total == 1 ) ? 'is' : 'are'; |
|
102 $users = implode(', ', $users); |
|
103 $online_main = ( $num_users > 0 ) ? "<br /> |
|
104 Users online right now: |
|
105 <div style='max-height: 100px; clip: rect(0px,auto,auto,0px); overflow: auto;'> |
|
106 $users |
|
107 </div> |
|
108 Legend:<br /><span style='color: #00AA00; font-weight: bold;'>Moderators</span> :: <span style='color: #AA0000; font-weight: bold;'>Administrators</span>" |
|
109 : ''; |
|
110 $html = "<div style='padding: 5px;'> |
|
111 <small> |
|
112 There $is_are <b>$total</b> user$ts online :: <b>$num_guests</b> guest$gs and <b>$num_users</b> member$ms |
|
113 $online_main |
|
114 </small> |
|
115 </div>"; |
|
116 $template->sidebar_widget('Who\'s Online', $html); |
|
117 } |
|
118 |
|
119 function __WhosOnline_logonhandler() |
|
120 { |
|
121 global $db, $session, $paths, $template, $plugins; // Common objects |
|
122 $q = $db->sql_query('DELETE FROM '.table_prefix.'online WHERE user_id=1 AND username=\''.$db->escape($_SERVER['REMOTE_ADDR']).'\';'); |
|
123 if(!$q) |
|
124 echo $db->get_error(); |
|
125 if(!$session->theme) |
|
126 $session->register_guest_session(); |
|
127 $template->load_theme($session->theme, $session->style); |
|
128 __WhosOnline_UserCount(); |
|
129 } |
|
130 |
|
131 function __WhosOnline_logoffhandler($username, $user_id, $level) |
|
132 { |
|
133 if($level <= USER_LEVEL_MEMBER) |
|
134 { |
|
135 global $db, $session, $paths, $template, $plugins; // Common objects |
|
136 $q = $db->sql_query('DELETE FROM '.table_prefix.'online WHERE user_id=\''.intval($user_id).'\' AND username=\''.$db->escape($username).'\';'); |
|
137 if(!$q) |
|
138 echo $db->get_error(); |
|
139 $q = $db->sql_query('REPLACE INTO '.table_prefix.'online SET user_id=1,username=\''.$db->escape($_SERVER['REMOTE_ADDR']).'\',last_load='.time().';'); if(!$q) $db->_die(''); |
|
140 if(!$q) |
|
141 echo $db->get_error(); |
|
142 } |
|
143 } |
|
144 |
|
145 ?> |