Passed
Push — release-2.1 ( e31624...391b74 )
by Mathias
26:03 queued 19:58
created

getMembersOnlineStats()   F

Complexity

Conditions 28
Paths 7560

Size

Total Lines 169
Code Lines 93

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 28
eloc 93
c 0
b 0
f 0
nc 7560
nop 1
dl 0
loc 169
rs 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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