comparison forum/Sources/Subs-MembersOnline.php @ 76:e3e11437ecea website

Add forum code
author Chris Cannam
date Sun, 07 Jul 2013 11:25:48 +0200
parents
children
comparison
equal deleted inserted replaced
75:72f59aa7e503 76:e3e11437ecea
1 <?php
2
3 /**
4 * Simple Machines Forum (SMF)
5 *
6 * @package SMF
7 * @author Simple Machines http://www.simplemachines.org
8 * @copyright 2011 Simple Machines
9 * @license http://www.simplemachines.org/about/smf/license.php BSD
10 *
11 * @version 2.0
12 */
13
14 if (!defined('SMF'))
15 die('Hacking attempt...');
16
17 /* This file currently only holds the function for showing a list of online
18 users used by the board index and SSI. In the future it'll also contain
19 functions used by the Who's online page.
20
21 array getMembersOnlineStats(array membersOnlineOptions)
22 - retrieve a list and several other statistics of the users currently
23 online on the forum.
24 - used by the board index and SSI.
25 - also returns the membergroups of the users that are currently online.
26 - (optionally) hides members that chose to hide their online presense.
27 */
28
29 // Retrieve a list and several other statistics of the users currently online.
30 function getMembersOnlineStats($membersOnlineOptions)
31 {
32 global $smcFunc, $context, $scripturl, $user_info, $modSettings, $txt;
33
34 // The list can be sorted in several ways.
35 $allowed_sort_options = array(
36 'log_time',
37 'real_name',
38 'show_online',
39 'online_color',
40 'group_name',
41 );
42 // Default the sorting method to 'most recent online members first'.
43 if (!isset($membersOnlineOptions['sort']))
44 {
45 $membersOnlineOptions['sort'] = 'log_time';
46 $membersOnlineOptions['reverse_sort'] = true;
47 }
48
49 // Not allowed sort method? Bang! Error!
50 elseif (!in_array($membersOnlineOptions['sort'], $allowed_sort_options))
51 trigger_error('Sort method for getMembersOnlineStats() function is not allowed', E_USER_NOTICE);
52
53 // Initialize the array that'll be returned later on.
54 $membersOnlineStats = array(
55 'users_online' => array(),
56 'list_users_online' => array(),
57 'online_groups' => array(),
58 'num_guests' => 0,
59 'num_spiders' => 0,
60 'num_buddies' => 0,
61 'num_users_hidden' => 0,
62 'num_users_online' => 0,
63 );
64
65 // Get any spiders if enabled.
66 $spiders = array();
67 $spider_finds = array();
68 if (!empty($modSettings['show_spider_online']) && ($modSettings['show_spider_online'] < 3 || allowedTo('admin_forum')) && !empty($modSettings['spider_name_cache']))
69 $spiders = unserialize($modSettings['spider_name_cache']);
70
71 // Load the users online right now.
72 $request = $smcFunc['db_query']('', '
73 SELECT
74 lo.id_member, lo.log_time, lo.id_spider, mem.real_name, mem.member_name, mem.show_online,
75 mg.online_color, mg.id_group, mg.group_name
76 FROM {db_prefix}log_online AS lo
77 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lo.id_member)
78 LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_mem_group} THEN mem.id_post_group ELSE mem.id_group END)',
79 array(
80 'reg_mem_group' => 0,
81 )
82 );
83 while ($row = $smcFunc['db_fetch_assoc']($request))
84 {
85 if (empty($row['real_name']))
86 {
87 // Do we think it's a spider?
88 if ($row['id_spider'] && isset($spiders[$row['id_spider']]))
89 {
90 $spider_finds[$row['id_spider']] = isset($spider_finds[$row['id_spider']]) ? $spider_finds[$row['id_spider']] + 1 : 1;
91 $membersOnlineStats['num_spiders']++;
92 }
93 // Guests are only nice for statistics.
94 $membersOnlineStats['num_guests']++;
95
96 continue;
97 }
98
99 elseif (empty($row['show_online']) && empty($membersOnlineOptions['show_hidden']))
100 {
101 // Just increase the stats and don't add this hidden user to any list.
102 $membersOnlineStats['num_users_hidden']++;
103 continue;
104 }
105
106 // Some basic color coding...
107 if (!empty($row['online_color']))
108 $link = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '" style="color: ' . $row['online_color'] . ';">' . $row['real_name'] . '</a>';
109 else
110 $link = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>';
111
112 // Buddies get counted and highlighted.
113 $is_buddy = in_array($row['id_member'], $user_info['buddies']);
114 if ($is_buddy)
115 {
116 $membersOnlineStats['num_buddies']++;
117 $link = '<strong>' . $link . '</strong>';
118 }
119
120 // A lot of useful information for each member.
121 $membersOnlineStats['users_online'][$row[$membersOnlineOptions['sort']] . $row['member_name']] = array(
122 'id' => $row['id_member'],
123 'username' => $row['member_name'],
124 'name' => $row['real_name'],
125 'group' => $row['id_group'],
126 'href' => $scripturl . '?action=profile;u=' . $row['id_member'],
127 'link' => $link,
128 'is_buddy' => $is_buddy,
129 'hidden' => empty($row['show_online']),
130 'is_last' => false,
131 );
132
133 // This is the compact version, simply implode it to show.
134 $membersOnlineStats['list_users_online'][$row[$membersOnlineOptions['sort']] . $row['member_name']] = empty($row['show_online']) ? '<em>' . $link . '</em>' : $link;
135
136 // Store all distinct (primary) membergroups that are shown.
137 if (!isset($membersOnlineStats['online_groups'][$row['id_group']]))
138 $membersOnlineStats['online_groups'][$row['id_group']] = array(
139 'id' => $row['id_group'],
140 'name' => $row['group_name'],
141 'color' => $row['online_color']
142 );
143 }
144 $smcFunc['db_free_result']($request);
145
146 // If there are spiders only and we're showing the detail, add them to the online list - at the bottom.
147 if (!empty($spider_finds) && $modSettings['show_spider_online'] > 1)
148 foreach ($spider_finds as $id => $count)
149 {
150 $link = $spiders[$id] . ($count > 1 ? ' (' . $count . ')' : '');
151 $sort = $membersOnlineOptions['sort'] = 'log_time' && $membersOnlineOptions['reverse_sort'] ? 0 : 'zzz_';
152 $membersOnlineStats['users_online'][$sort . $spiders[$id]] = array(
153 'id' => 0,
154 'username' => $spiders[$id],
155 'name' => $link,
156 'group' => $txt['spiders'],
157 'href' => '',
158 'link' => $link,
159 'is_buddy' => false,
160 'hidden' => false,
161 'is_last' => false,
162 );
163 $membersOnlineStats['list_users_online'][$sort . $spiders[$id]] = $link;
164 }
165
166 // Time to sort the list a bit.
167 if (!empty($membersOnlineStats['users_online']))
168 {
169 // Determine the sort direction.
170 $sortFunction = empty($membersOnlineOptions['reverse_sort']) ? 'ksort' : 'krsort';
171
172 // Sort the two lists.
173 $sortFunction($membersOnlineStats['users_online']);
174 $sortFunction($membersOnlineStats['list_users_online']);
175
176 // Mark the last list item as 'is_last'.
177 $userKeys = array_keys($membersOnlineStats['users_online']);
178 $membersOnlineStats['users_online'][end($userKeys)]['is_last'] = true;
179 }
180
181 // Also sort the membergroups.
182 ksort($membersOnlineStats['online_groups']);
183
184 // Hidden and non-hidden members make up all online members.
185 $membersOnlineStats['num_users_online'] = count($membersOnlineStats['users_online']) + $membersOnlineStats['num_users_hidden'] - (isset($modSettings['show_spider_online']) && $modSettings['show_spider_online'] > 1 ? count($spider_finds) : 0);
186
187 return $membersOnlineStats;
188 }
189
190 // Check if the number of users online is a record and store it.
191 function trackStatsUsersOnline($total_users_online)
192 {
193 global $modSettings, $smcFunc;
194
195 $settingsToUpdate = array();
196
197 // More members on now than ever were? Update it!
198 if (!isset($modSettings['mostOnline']) || $total_users_online >= $modSettings['mostOnline'])
199 $settingsToUpdate = array(
200 'mostOnline' => $total_users_online,
201 'mostDate' => time()
202 );
203
204 $date = strftime('%Y-%m-%d', forum_time(false));
205
206 // No entry exists for today yet?
207 if (!isset($modSettings['mostOnlineUpdated']) || $modSettings['mostOnlineUpdated'] != $date)
208 {
209 $request = $smcFunc['db_query']('', '
210 SELECT most_on
211 FROM {db_prefix}log_activity
212 WHERE date = {date:date}
213 LIMIT 1',
214 array(
215 'date' => $date,
216 )
217 );
218
219 // The log_activity hasn't got an entry for today?
220 if ($smcFunc['db_num_rows']($request) === 0)
221 {
222 $smcFunc['db_insert']('ignore',
223 '{db_prefix}log_activity',
224 array('date' => 'date', 'most_on' => 'int'),
225 array($date, $total_users_online),
226 array('date')
227 );
228 }
229 // There's an entry in log_activity on today...
230 else
231 {
232 list ($modSettings['mostOnlineToday']) = $smcFunc['db_fetch_row']($request);
233
234 if ($total_users_online > $modSettings['mostOnlineToday'])
235 trackStats(array('most_on' => $total_users_online));
236
237 $total_users_online = max($total_users_online, $modSettings['mostOnlineToday']);
238 }
239 $smcFunc['db_free_result']($request);
240
241 $settingsToUpdate['mostOnlineUpdated'] = $date;
242 $settingsToUpdate['mostOnlineToday'] = $total_users_online;
243 }
244
245 // Highest number of users online today?
246 elseif ($total_users_online > $modSettings['mostOnlineToday'])
247 {
248 trackStats(array('most_on' => $total_users_online));
249 $settingsToUpdate['mostOnlineToday'] = $total_users_online;
250 }
251
252 if (!empty($settingsToUpdate))
253 updateSettings($settingsToUpdate);
254 }
255
256 ?>