Mercurial > hg > vamp-website
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 ?> |