|
1
|
|
|
<?php |
|
2
|
|
|
/** |
|
3
|
|
|
* Created by Gorlum 13.05.2020 13:02 |
|
4
|
|
|
*/ |
|
5
|
|
|
|
|
6
|
|
|
namespace Chat; |
|
7
|
|
|
|
|
8
|
|
|
|
|
9
|
|
|
use classCache; |
|
10
|
|
|
use Common\Traits\TSingleton; |
|
11
|
|
|
use SN; |
|
12
|
|
|
use SnTemplate; |
|
13
|
|
|
|
|
14
|
|
|
class Chat { |
|
15
|
|
|
|
|
16
|
|
|
use TSingleton; |
|
17
|
|
|
|
|
18
|
|
|
const CHAT_DEFAULT_LINES_PER_PAGE = 20; |
|
19
|
|
|
|
|
20
|
|
|
protected $_chat_aliases = array( |
|
21
|
|
|
'h' => 'help', |
|
22
|
|
|
'?' => 'help', |
|
23
|
|
|
'help' => 'help', |
|
24
|
|
|
'w' => 'whisper', |
|
25
|
|
|
'whisper' => 'whisper', |
|
26
|
|
|
'b' => 'ban', |
|
27
|
|
|
'ban' => 'ban', |
|
28
|
|
|
'ub' => 'unban', |
|
29
|
|
|
'unban' => 'unban', |
|
30
|
|
|
'm' => 'mute', |
|
31
|
|
|
'mute' => 'mute', |
|
32
|
|
|
'um' => 'unmute', |
|
33
|
|
|
'unmute' => 'unmute', |
|
34
|
|
|
'iv' => 'invisible', |
|
35
|
|
|
'invisible' => 'invisible', |
|
36
|
|
|
// * /i /ignore |
|
37
|
|
|
// * /ck /kick |
|
38
|
|
|
// * /ci /invite |
|
39
|
|
|
// * /cj /join |
|
40
|
|
|
// * /cc /create |
|
41
|
|
|
); |
|
42
|
|
|
|
|
43
|
|
|
protected $_chat_commands = array( |
|
44
|
|
|
'invisible' => array( |
|
45
|
|
|
'access' => array(0, 1, 2, 3, 4), |
|
46
|
|
|
'options' => array( |
|
47
|
|
|
CHAT_OPTION_SWITCH => CHAT_OPTION_SWITCH, |
|
48
|
|
|
), |
|
49
|
|
|
), |
|
50
|
|
|
'whisper' => array( |
|
51
|
|
|
'access' => array(0, 1, 2, 3, 4), |
|
52
|
|
|
'options' => array(), |
|
53
|
|
|
), |
|
54
|
|
|
'mute' => array( |
|
55
|
|
|
'access' => array(1, 2, 3, 4), |
|
56
|
|
|
'options' => array(), |
|
57
|
|
|
), |
|
58
|
|
|
'unmute' => array( |
|
59
|
|
|
'access' => array(1, 2, 3, 4), |
|
60
|
|
|
'options' => array(), |
|
61
|
|
|
), |
|
62
|
|
|
'ban' => array( |
|
63
|
|
|
'access' => array(1, 2, 3, 4), |
|
64
|
|
|
'options' => array(), |
|
65
|
|
|
), |
|
66
|
|
|
'unban' => array( |
|
67
|
|
|
'access' => array(1, 2, 3, 4), |
|
68
|
|
|
'options' => array(), |
|
69
|
|
|
), |
|
70
|
|
|
'help' => array( |
|
71
|
|
|
'access' => array(0, 1, 2, 3, 4), |
|
72
|
|
|
'options' => array(), |
|
73
|
|
|
), |
|
74
|
|
|
); |
|
75
|
|
|
|
|
76
|
|
|
|
|
77
|
|
|
public static function chatModel() { |
|
78
|
|
|
static::me()->_chatModel(); |
|
|
|
|
|
|
79
|
|
|
} |
|
80
|
|
|
|
|
81
|
|
|
public static function chatAddModel() { |
|
82
|
|
|
static::me()->_chatAddModel(); |
|
|
|
|
|
|
83
|
|
|
} |
|
84
|
|
|
|
|
85
|
|
|
public static function chatView($template = null) { |
|
86
|
|
|
return static::me()->_chatView($template); |
|
|
|
|
|
|
87
|
|
|
} |
|
88
|
|
|
|
|
89
|
|
|
public static function chatMsgView($template = null) { |
|
90
|
|
|
static::me()->_chatMsgView($template); |
|
|
|
|
|
|
91
|
|
|
} |
|
92
|
|
|
|
|
93
|
|
|
public static function chatFrameView($template = null) { |
|
94
|
|
|
static::me()->_chatFrameView($template); |
|
|
|
|
|
|
95
|
|
|
} |
|
96
|
|
|
|
|
97
|
|
|
protected function _chatView($template = null) { |
|
98
|
|
|
defined('IN_AJAX') or define('IN_AJAX', true); |
|
99
|
|
|
|
|
100
|
|
|
global $config, $lang; |
|
101
|
|
|
|
|
102
|
|
|
$iframe = sys_get_param_id('iframe'); |
|
103
|
|
|
|
|
104
|
|
|
// $template = $this->addModuleTemplate('chat_body', $template); |
|
105
|
|
|
$template = SnTemplate::gettemplate('chat/chat_body', $template); |
|
106
|
|
|
$template->assign_var('CHAT_REFRESH_RATE', $config->chat_refresh_rate); |
|
107
|
|
|
$template->assign_var('CHAT_MODE', $iframe); |
|
108
|
|
|
$template->assign_var('MENU', !$iframe); |
|
109
|
|
|
$template->assign_var('NAVBAR', !$iframe); |
|
110
|
|
|
$template->assign_var('CHAT_IFRAME', $iframe); |
|
111
|
|
|
foreach ($lang['chat_advanced_command_interval'] as $interval => $locale) { |
|
112
|
|
|
$template->assign_block_vars('chat_advanced_command_interval', array( |
|
113
|
|
|
'INTERVAL' => $interval, |
|
114
|
|
|
'NAME' => $locale, |
|
115
|
|
|
)); |
|
116
|
|
|
} |
|
117
|
|
|
|
|
118
|
|
|
return $template; |
|
119
|
|
|
} |
|
120
|
|
|
|
|
121
|
|
|
protected function _chatMsgView($template = null) { |
|
122
|
|
|
defined('IN_AJAX') or define('IN_AJAX', true); |
|
123
|
|
|
|
|
124
|
|
|
global $config, $user, $lang; |
|
125
|
|
|
|
|
126
|
|
|
|
|
127
|
|
|
$history = sys_get_param_str('history'); |
|
128
|
|
|
if (!$history) { |
|
129
|
|
|
$config->array_set('users', $user['id'], 'chat_last_refresh', SN_TIME_MICRO); |
|
130
|
|
|
// $chat_player_row = $this->sn_chat_advanced_get_chat_player_record($user['id']); |
|
131
|
|
|
doquery("UPDATE {{chat_player}} SET `chat_player_refresh_last` = " . SN_TIME_NOW . " WHERE `chat_player_player_id` = {$user['id']} LIMIT 1;"); |
|
|
|
|
|
|
132
|
|
|
} |
|
133
|
|
|
|
|
134
|
|
|
$page = 0; |
|
135
|
|
|
$last_message = ''; |
|
136
|
|
|
$alliance = 0; |
|
137
|
|
|
$template_result['.']['chat'] = array(); |
|
|
|
|
|
|
138
|
|
|
if (!$history && $config->getMode() != classCache::CACHER_NO_CACHE && $config->chat_timeout && SN_TIME_MICRO - $config->array_get('users', $user['id'], 'chat_last_activity') > $config->chat_timeout) { |
|
139
|
|
|
$result['disable'] = true; |
|
|
|
|
|
|
140
|
|
|
$template_result['.']['chat'][] = array( |
|
141
|
|
|
'TIME' => date(FMT_DATE_TIME, htmlentities(SN_TIME_NOW + SN_CLIENT_TIME_DIFF, ENT_QUOTES, 'utf-8')), |
|
|
|
|
|
|
142
|
|
|
'DISABLE' => true, |
|
143
|
|
|
); |
|
144
|
|
|
} else { |
|
145
|
|
|
$alliance = sys_get_param_str('ally') && $user['ally_id'] ? $user['ally_id'] : 0; |
|
146
|
|
|
|
|
147
|
|
|
$page_limit = sys_get_param_id('line_per_page', self::CHAT_DEFAULT_LINES_PER_PAGE); // Chat rows Limit |
|
148
|
|
|
|
|
149
|
|
|
$where_add = ''; |
|
150
|
|
|
$last_message = 0; |
|
151
|
|
|
if ($history) { |
|
152
|
|
|
$rows = doquery("SELECT count(1) AS CNT |
|
|
|
|
|
|
153
|
|
|
FROM {{chat}} |
|
154
|
|
|
WHERE |
|
155
|
|
|
( |
|
156
|
|
|
(ally_id = '{$alliance}' AND `chat_message_recipient_id` IS NULL) OR |
|
157
|
|
|
(ally_id = 0 AND `chat_message_recipient_id` = {$user['id']}) OR |
|
158
|
|
|
(ally_id = 0 AND `chat_message_sender_id` = {$user['id']} AND `chat_message_recipient_id` IS NOT NULL) OR |
|
159
|
|
|
(ally_id = 0 AND `chat_message_sender_id` IS NULL AND `chat_message_recipient_id` IS NULL) |
|
160
|
|
|
) |
|
161
|
|
|
", true); |
|
|
|
|
|
|
162
|
|
|
$page_count = ceil($rows['CNT'] / $page_limit); |
|
163
|
|
|
|
|
164
|
|
|
for ($i = 1; $i <= $page_count; $i++) { |
|
165
|
|
|
$template_result['.']['page'][] = array( |
|
166
|
|
|
'NUMBER' => $i |
|
167
|
|
|
); |
|
168
|
|
|
} |
|
169
|
|
|
|
|
170
|
|
|
$page = min($page_count, max(1, sys_get_param_int('sheet'))); |
|
171
|
|
|
} else { |
|
172
|
|
|
$last_message = sys_get_param_id('last_message'); |
|
173
|
|
|
$where_add = $last_message ? "AND `messageid` > {$last_message}" : ''; |
|
174
|
|
|
$page = 1; |
|
175
|
|
|
} |
|
176
|
|
|
|
|
177
|
|
|
$start_row = ($page - 1) * $page_limit;// OR `chat_message_recipient_id` = {$user['id']} |
|
178
|
|
|
$start_row = $start_row < 0 ? 0 : $start_row; |
|
179
|
|
|
$query = doquery( |
|
|
|
|
|
|
180
|
|
|
"SELECT c.*, u.authlevel |
|
181
|
|
|
FROM |
|
182
|
|
|
{{chat}} AS c |
|
183
|
|
|
LEFT JOIN {{users}} AS u ON u.id = c.chat_message_sender_id |
|
184
|
|
|
WHERE |
|
185
|
|
|
( |
|
186
|
|
|
(c.ally_id = '{$alliance}' AND `chat_message_recipient_id` IS NULL) OR |
|
187
|
|
|
(c.ally_id = 0 AND `chat_message_recipient_id` = {$user['id']}) OR |
|
188
|
|
|
(c.ally_id = 0 AND `chat_message_sender_id` = {$user['id']} AND `chat_message_recipient_id` IS NOT NULL) OR |
|
189
|
|
|
(c.ally_id = 0 AND `chat_message_sender_id` IS NULL AND `chat_message_recipient_id` IS NULL) |
|
190
|
|
|
) |
|
191
|
|
|
{$where_add} |
|
192
|
|
|
ORDER BY messageid DESC |
|
193
|
|
|
LIMIT {$start_row}, {$page_limit}"); |
|
194
|
|
|
while ($chat_row = db_fetch($query)) { |
|
|
|
|
|
|
195
|
|
|
$chat_row['user'] = player_nick_render_to_html($chat_row['user']); |
|
196
|
|
|
$nick_stripped = htmlentities(strip_tags($chat_row['user']), ENT_QUOTES, 'utf-8'); |
|
197
|
|
|
$template_result['.']['chat'][] = array( |
|
198
|
|
|
'TIME' => SN::$gc->bbCodeParser->expandBbCode(date(FMT_DATE_TIME, $chat_row['timestamp'] + SN_CLIENT_TIME_DIFF)), |
|
199
|
|
|
'NICK' => $chat_row['user'], |
|
200
|
|
|
'NICK_STRIPPED' => $nick_stripped, |
|
201
|
|
|
'TEXT' => SN::$gc->bbCodeParser->expandBbCode($chat_row['message'], $chat_row['authlevel']), |
|
202
|
|
|
'SENDER_ID' => $chat_row['chat_message_sender_id'], |
|
203
|
|
|
'SENDER_NAME' => $safe_name = sys_safe_output($chat_row['chat_message_sender_name']), |
|
204
|
|
|
'SENDER_NAME_SAFE' => $safe_name <> $chat_row['chat_message_sender_name'] || strpbrk($safe_name, ' /\\\'') ? '"' . $safe_name . '"' : $safe_name, |
|
205
|
|
|
'RECIPIENT_ID' => $chat_row['chat_message_recipient_id'], |
|
206
|
|
|
'RECIPIENT_NAME' => $safe_name_recipient = sys_safe_output($chat_row['chat_message_recipient_name']), |
|
207
|
|
|
'RECIPIENT_NAME_SAFE' => $safe_name_recipient <> $chat_row['chat_message_recipient_name'] || strpbrk($safe_name_recipient, ' /\\\'') ? '"' . $safe_name_recipient . '"' : $safe_name_recipient, |
|
208
|
|
|
); |
|
209
|
|
|
|
|
210
|
|
|
$last_message = max($last_message, $chat_row['messageid']); |
|
211
|
|
|
} |
|
212
|
|
|
} |
|
213
|
|
|
|
|
214
|
|
|
$template_result['.']['chat'] = array_reverse($template_result['.']['chat']); |
|
215
|
|
|
|
|
216
|
|
|
$template_result += array( |
|
217
|
|
|
'PAGE' => $page, |
|
218
|
|
|
'PAGES_TOTAL' => $page_count, |
|
|
|
|
|
|
219
|
|
|
'PAGE_NEXT' => $page < $page_count ? $page + 1 : $page, |
|
220
|
|
|
'PAGE_PREV' => $page > 1 ? $page - 1 : $page, |
|
221
|
|
|
'ALLY' => $alliance, |
|
222
|
|
|
'HISTORY' => $history, |
|
223
|
|
|
'USER_ID' => $user['id'], |
|
224
|
|
|
); |
|
225
|
|
|
|
|
226
|
|
|
// $template = $this->addModuleTemplate('chat_messages', $template); |
|
227
|
|
|
$template = SnTemplate::gettemplate('chat/chat_messages', $template); |
|
228
|
|
|
$template->assign_recursive($template_result); |
|
229
|
|
|
|
|
230
|
|
|
if ($history) { |
|
231
|
|
|
$pageTitle = "{$lang['chat_history']} - {$lang[$alliance ? 'chat_ally' : 'chat_common']}"; |
|
232
|
|
|
SnTemplate::display($template, $pageTitle); |
|
233
|
|
|
} else { |
|
234
|
|
|
$result['last_message'] = $last_message; |
|
235
|
|
|
$result['html'] = SnTemplate::templateRenderToHtml($template); |
|
236
|
|
|
|
|
237
|
|
|
// $template = $this->addModuleTemplate('chat_online', $template); |
|
238
|
|
|
$template = SnTemplate::gettemplate('chat/chat_online', null); |
|
239
|
|
|
// $template->assign_recursive($template_result); |
|
240
|
|
|
$chat_online_players = 0; |
|
241
|
|
|
$chat_online_invisibles = 0; |
|
242
|
|
|
$chat_player_invisible = 0; |
|
243
|
|
|
$template_result['.']['online_player'] = array(); |
|
244
|
|
|
$ally_add = $alliance ? "AND u.ally_id = {$alliance}" : ''; |
|
245
|
|
|
|
|
246
|
|
|
$chat_player_list = db_chat_player_list_online($config->chat_refresh_rate, $ally_add); |
|
247
|
|
|
|
|
248
|
|
|
// TODO: Добавить ограничение по бану |
|
249
|
|
|
while ($chat_player_row = db_fetch($chat_player_list)) { |
|
|
|
|
|
|
250
|
|
|
$chat_online_players++; |
|
251
|
|
|
if ($chat_player_row['chat_player_invisible']) { |
|
252
|
|
|
$chat_online_invisibles++; |
|
253
|
|
|
} |
|
254
|
|
|
|
|
255
|
|
|
if (!$chat_player_row['chat_player_invisible'] || $user['authlevel']) { |
|
256
|
|
|
$safe_name = sys_safe_output($chat_player_row['username']); |
|
257
|
|
|
$safe_name = $chat_player_row['username'] <> $safe_name || strpbrk($safe_name, ' /\\\'') !== false ? '"' . $safe_name . '"' : $safe_name; |
|
258
|
|
|
$template_result['.']['online_player'][] = array( |
|
259
|
|
|
'ID' => $chat_player_row['id'], |
|
260
|
|
|
'NAME' => player_nick_render_to_html($chat_player_row, array( |
|
261
|
|
|
'color' => true, |
|
262
|
|
|
'icons' => true, |
|
263
|
|
|
'ally' => !$alliance, |
|
264
|
|
|
'class' => 'class="chat_nick_whisper" safe_name="' . $safe_name . '"', |
|
265
|
|
|
)), |
|
266
|
|
|
'NAME_SAFE' => $safe_name, |
|
267
|
|
|
'MUTED' => $chat_player_row['chat_player_muted'] && $chat_player_row['chat_player_muted'] >= SN_TIME_NOW ? date(FMT_DATE_TIME, $chat_player_row['chat_player_muted']) : false, |
|
268
|
|
|
'MUTE_REASON' => htmlentities($chat_player_row['chat_player_mute_reason'], ENT_COMPAT, 'UTF-8'), |
|
269
|
|
|
'INVISIBLE' => $chat_player_row['chat_player_invisible'], |
|
270
|
|
|
'AUTH_LEVEL' => $chat_player_row['authlevel'], |
|
271
|
|
|
); |
|
272
|
|
|
} |
|
273
|
|
|
if ($user['id'] == $chat_player_row['id']) { |
|
274
|
|
|
$chat_player_invisible = $chat_player_row['chat_player_invisible']; |
|
275
|
|
|
} |
|
276
|
|
|
} |
|
277
|
|
|
|
|
278
|
|
|
$chat_commands = &$this->_chat_commands; |
|
279
|
|
|
$template_result = array_merge($template_result, array( |
|
280
|
|
|
'USER_ID' => $user['id'], |
|
281
|
|
|
'USER_AUTHLEVEL' => $user['authlevel'], |
|
282
|
|
|
'USER_CAN_BAN' => in_array($user['authlevel'], $chat_commands['ban']['access']), |
|
283
|
|
|
'USER_CAN_MUTE' => in_array($user['authlevel'], $chat_commands['mute']['access']), |
|
284
|
|
|
'USER_CAN_UNMUTE' => in_array($user['authlevel'], $chat_commands['unmute']['access']), |
|
285
|
|
|
)); |
|
286
|
|
|
$template->assign_recursive($template_result); |
|
287
|
|
|
$result['online'] = SnTemplate::templateRenderToHtml($template); |
|
288
|
|
|
|
|
289
|
|
|
$result['online_players'] = $chat_online_players; |
|
290
|
|
|
$result['online_invisibles'] = $chat_online_invisibles; |
|
291
|
|
|
$result['chat_player_invisible'] = $chat_player_invisible; |
|
292
|
|
|
$result['users_total'] = SN::$config->users_amount; |
|
293
|
|
|
$result['users_online'] = SN::$config->var_online_user_count; |
|
294
|
|
|
print(json_encode($result)); |
|
295
|
|
|
} |
|
296
|
|
|
die(); |
|
|
|
|
|
|
297
|
|
|
} |
|
298
|
|
|
|
|
299
|
|
|
protected function _chatFrameView($template = null) { |
|
300
|
|
|
defined('IN_AJAX') or define('IN_AJAX', true); |
|
301
|
|
|
|
|
302
|
|
|
// $template = $this->addModuleTemplate('chat_frame', $template); |
|
303
|
|
|
$template = SnTemplate::gettemplate('chat/chat_frame', $template); |
|
304
|
|
|
require_once($template->files['chat_frame']); |
|
305
|
|
|
die(); |
|
|
|
|
|
|
306
|
|
|
} |
|
307
|
|
|
|
|
308
|
|
|
|
|
309
|
|
|
protected function _chatModel() { |
|
310
|
|
|
global $user, $template_result, $lang; |
|
311
|
|
|
|
|
312
|
|
|
$this->update_chat_activity(); |
|
313
|
|
|
|
|
314
|
|
|
$mode = sys_get_param_int('mode'); |
|
315
|
|
|
switch ($mode) { |
|
316
|
|
|
case CHAT_MODE_ALLY: |
|
317
|
|
|
$template_result['ALLY'] = intval($user['ally_id']); |
|
318
|
|
|
$template_result['CHAT_MODE'] = CHAT_MODE_ALLY; |
|
319
|
|
|
$page_title = $lang['chat_ally']; |
|
320
|
|
|
break; |
|
321
|
|
|
|
|
322
|
|
|
case CHAT_MODE_COMMON: |
|
323
|
|
|
default: |
|
324
|
|
|
$page_title = $lang['chat_common']; |
|
325
|
|
|
$template_result['CHAT_MODE'] = CHAT_MODE_COMMON; |
|
326
|
|
|
break; |
|
327
|
|
|
} |
|
328
|
|
|
|
|
329
|
|
|
$template_result['PAGE_HEADER'] = $page_title; |
|
330
|
|
|
|
|
331
|
|
|
$template_result['.']['smiles'] = array(); |
|
332
|
|
|
|
|
333
|
|
|
foreach (SN::$gc->design->getSmilesList() as $auth_level => $replaces) { |
|
334
|
|
|
if ($auth_level > $user['authlevel']) { |
|
335
|
|
|
continue; |
|
336
|
|
|
} |
|
337
|
|
|
|
|
338
|
|
|
foreach ($replaces as $bbcode => $filename) { |
|
339
|
|
|
$template_result['.']['smiles'][] = array( |
|
340
|
|
|
'BBCODE' => htmlentities($bbcode, ENT_COMPAT, 'UTF-8'), |
|
341
|
|
|
'FILENAME' => $filename, |
|
342
|
|
|
); |
|
343
|
|
|
} |
|
344
|
|
|
} |
|
345
|
|
|
} |
|
346
|
|
|
|
|
347
|
|
|
protected function _chatAddModel() { |
|
348
|
|
|
defined('IN_AJAX') or define('IN_AJAX', true); |
|
349
|
|
|
|
|
350
|
|
|
global $config, $user, $lang; |
|
351
|
|
|
// $chat_commands = get_unit_param(P_CHAT, P_CHAT_COMMANDS); |
|
352
|
|
|
// $chat_aliases = get_unit_param(P_CHAT, P_CHAT_ALIASES); |
|
353
|
|
|
$chat_commands = &$this->_chat_commands; |
|
354
|
|
|
$chat_aliases = &$this->_chat_aliases; |
|
355
|
|
|
|
|
356
|
|
|
if ($config->getMode() != classCache::CACHER_NO_CACHE && $config->chat_timeout && SN_TIME_MICRO - $config->array_get('users', $user['id'], 'chat_last_activity') > $config->chat_timeout) { |
|
357
|
|
|
die(); |
|
|
|
|
|
|
358
|
|
|
} |
|
359
|
|
|
|
|
360
|
|
|
if (($message = sys_get_param_str_unsafe('message')) && $user['username']) { |
|
361
|
|
|
$this->update_chat_activity(); |
|
362
|
|
|
|
|
363
|
|
|
$chat_message_sender_id = 'NULL'; |
|
364
|
|
|
$chat_message_sender_name = ''; |
|
365
|
|
|
$chat_message_recipient_id = $user['id']; |
|
366
|
|
|
$chat_message_recipient_name = SN::$db->db_escape($user['username']); |
|
367
|
|
|
$nick = ''; |
|
368
|
|
|
$ally_id = 0; |
|
369
|
|
|
$chat_command_issued = ''; |
|
370
|
|
|
|
|
371
|
|
|
$chat_player_row = $this->sn_chat_advanced_get_chat_player_record($user['id']); |
|
372
|
|
|
$chat_player_muted = $chat_player_row['chat_player_muted'] && $chat_player_row['chat_player_muted'] >= SN_TIME_NOW ? $chat_player_row['chat_player_muted'] : false; |
|
373
|
|
|
if (preg_match("#^\/([\w\?]+)\s*({on|off|ID\s*[0-9]+|[а-яёА-ЯЁa-zA-Z0-9\_\-\[\]\(\)\+\{\}]+|\".+\"}*)*\s*(.*)#iu", $message, $chat_command_parsed)) { |
|
374
|
|
|
$chat_command_exists = array_key_exists(strtolower($chat_command_parsed[1]), $chat_aliases) ? true : strtolower($chat_command_parsed[1]); |
|
375
|
|
|
$chat_command_issued = $chat_command_exists === true ? $chat_aliases[$chat_command_parsed[1]] : 'help'; |
|
376
|
|
|
if ($chat_command_accessible = in_array($user['authlevel'], $chat_commands[$chat_command_issued]['access'])) { |
|
|
|
|
|
|
377
|
|
|
switch ($chat_command_issued) { |
|
378
|
|
|
case 'invisible': |
|
379
|
|
|
//$chat_player_row = $this->sn_chat_advanced_get_chat_player_record($user['id'], '`chat_player_invisible`', true); |
|
380
|
|
|
$chat_directive = strtolower($chat_command_parsed[2]) == 'on' || $chat_command_parsed[2] == 1 ? 1 : (strtolower($chat_command_parsed[2]) == 'off' || (string)$chat_command_parsed[2] === '0' ? 0 : ''); |
|
381
|
|
|
if ($chat_directive !== '') { |
|
382
|
|
|
doquery("UPDATE {{chat_player}} SET `chat_player_invisible` = {$chat_directive} WHERE `chat_player_player_id` = {$user['id']} LIMIT 1"); |
|
|
|
|
|
|
383
|
|
|
} else { |
|
384
|
|
|
$chat_directive = $chat_player_row['chat_player_invisible']; |
|
385
|
|
|
} |
|
386
|
|
|
$message = "[c=lime]{$lang['chat_advanced_visible'][$chat_directive]}[/c]"; |
|
387
|
|
|
break; |
|
388
|
|
|
|
|
389
|
|
|
case 'whisper': |
|
390
|
|
|
if ($chat_player_muted) { |
|
391
|
|
|
$chat_command_issued = ''; |
|
392
|
|
|
} elseif ($chat_command_parsed[3] && $chat_command_parsed[2]) { |
|
393
|
|
|
$chat_command_parsed[2] = trim($chat_command_parsed[2], '"'); |
|
394
|
|
|
$recipient_info = db_user_by_username($chat_command_parsed[2]); |
|
|
|
|
|
|
395
|
|
|
$chat_command_parsed[2] = SN::$db->db_escape($chat_command_parsed[2]); |
|
396
|
|
|
if ($recipient_info['id']) { |
|
397
|
|
|
$message = $chat_command_parsed[3]; |
|
398
|
|
|
$nick = SN::$db->db_escape(player_nick_compact(player_nick_render_current_to_array($user, array('color' => true, 'icons' => true, 'ally' => false)))); |
|
399
|
|
|
$chat_message_recipient_id = $recipient_info['id']; |
|
400
|
|
|
$chat_message_recipient_name = SN::$db->db_escape($recipient_info['username']); |
|
401
|
|
|
$chat_message_sender_id = $user['id']; |
|
402
|
|
|
$chat_message_sender_name = SN::$db->db_escape($user['username']); |
|
403
|
|
|
} else { |
|
404
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_player_name_unknown']}[/c]"; |
|
405
|
|
|
} |
|
406
|
|
|
} elseif (!$chat_command_parsed[2]) { |
|
407
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_message_player_empty']}[/c]"; |
|
408
|
|
|
} elseif (!$chat_command_parsed[3]) { |
|
409
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_message_empty']}[/c]"; |
|
410
|
|
|
} |
|
411
|
|
|
break; |
|
412
|
|
|
|
|
413
|
|
|
case 'mute': |
|
414
|
|
|
case 'ban': |
|
415
|
|
|
case 'unmute': |
|
416
|
|
|
case 'unban': |
|
417
|
|
|
if ($chat_command_parsed[2] && ($chat_command_parsed[3] || $chat_command_issued == 'unmute' || $chat_command_issued == 'unban')) { |
|
418
|
|
|
$chat_command_parsed[2] = strtolower($chat_command_parsed[2]); |
|
419
|
|
|
if (strpos($chat_command_parsed[2], 'id ') !== false && is_id($player_id = substr($chat_command_parsed[2], 3))) { |
|
420
|
|
|
$chat_player_subject = db_user_by_id($player_id, false); |
|
|
|
|
|
|
421
|
|
|
if ($chat_player_subject) { |
|
422
|
|
|
if ($chat_player_subject['id'] == $user['id']) { |
|
423
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_player_same']}[/c]"; |
|
424
|
|
|
} elseif ($chat_player_subject['authlevel'] >= $user['authlevel']) { |
|
425
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_player_higher']}[/c]"; |
|
426
|
|
|
} else { |
|
427
|
|
|
$chat_message_recipient_id = 'NULL'; |
|
428
|
|
|
$chat_message_recipient_name = ''; |
|
429
|
|
|
if ($chat_command_issued == 'unmute' || $chat_command_issued == 'unban') { |
|
430
|
|
|
$temp = SN::$db->db_escape($chat_command_parsed[3]); |
|
431
|
|
|
if ($chat_command_issued == 'unban') { |
|
432
|
|
|
sys_admin_player_ban_unset($user, $chat_player_subject, $temp); |
|
433
|
|
|
$message = $lang['chat_advanced_command_unban']; |
|
434
|
|
|
} elseif ($chat_command_issued == 'unmute') { |
|
435
|
|
|
doquery("UPDATE {{chat_player}} SET `chat_player_muted` = 0, `chat_player_mute_reason` = '{$temp}' WHERE `chat_player_player_id` = {$chat_player_subject['id']} LIMIT 1"); |
|
|
|
|
|
|
436
|
|
|
$message = $lang['chat_advanced_command_unmute']; |
|
437
|
|
|
} else { |
|
438
|
|
|
$message = ''; |
|
439
|
|
|
} |
|
440
|
|
|
|
|
441
|
|
|
if ($message) { |
|
442
|
|
|
$message = sprintf($message, $chat_player_subject['username']); |
|
443
|
|
|
$message .= $chat_command_parsed[3] ? sprintf($lang['chat_advanced_command_reason'], $chat_command_parsed[3]) : ''; |
|
444
|
|
|
$message = "[c=lime]{$message}[/c]"; |
|
445
|
|
|
} |
|
446
|
|
|
} elseif (preg_match("#(\d+)(y|m|w|d|h)(\!)?\s*(.*)#iu", $chat_command_parsed[3], $chat_command_parsed_two)) { |
|
447
|
|
|
//TODO Localize [\s\pL\w]* |
|
448
|
|
|
$date_to_timestamp = array( |
|
449
|
|
|
'y' => PERIOD_YEAR, |
|
450
|
|
|
'm' => PERIOD_MONTH, |
|
451
|
|
|
'w' => PERIOD_WEEK, |
|
452
|
|
|
'd' => PERIOD_DAY, |
|
453
|
|
|
'h' => PERIOD_HOUR, |
|
454
|
|
|
); |
|
455
|
|
|
$this->sn_chat_advanced_get_chat_player_record($chat_player_subject['id'], '`chat_player_muted`', false); |
|
456
|
|
|
|
|
457
|
|
|
$term = $date_to_timestamp[$chat_command_parsed_two[2]] * $chat_command_parsed_two[1]; |
|
458
|
|
|
$date_compiled = $term + SN_TIME_NOW; |
|
459
|
|
|
$chat_command_parsed_two[4] = SN::$db->db_escape($chat_command_parsed_two[4]); |
|
460
|
|
|
|
|
461
|
|
|
doquery("UPDATE {{chat_player}} SET `chat_player_muted` = {$date_compiled}, `chat_player_mute_reason` = '{$chat_command_parsed_two[4]}' WHERE `chat_player_player_id` = {$chat_player_subject['id']} LIMIT 1"); |
|
|
|
|
|
|
462
|
|
|
if ($chat_command_issued == 'ban') { |
|
463
|
|
|
sys_admin_player_ban($user, $chat_player_subject, $term, $chat_command_parsed_two[3] != '!', $chat_command_parsed_two[4]); |
|
464
|
|
|
$message = $chat_command_parsed_two[3] == '!' ? $lang['chat_advanced_command_ban_no_vacancy'] : $lang['chat_advanced_command_ban']; |
|
465
|
|
|
} else { |
|
466
|
|
|
$message = $lang['chat_advanced_command_mute']; |
|
467
|
|
|
} |
|
468
|
|
|
// $message = sprintf($message, $chat_player_subject['username'], date(FMT_DATE_TIME, $date_compiled)); |
|
469
|
|
|
// $message .= $chat_command_parsed_two[4] ? sprintf($lang['chat_advanced_command_reason'], $chat_command_parsed_two[4]) : ''; |
|
470
|
|
|
$message = sprintf($message, $chat_player_subject['username'], date(FMT_DATE_TIME, $date_compiled), $chat_command_parsed_two[4] ? sprintf($lang['chat_advanced_command_reason'], $chat_command_parsed_two[4]) : ''); |
|
471
|
|
|
$message = "[c=red]{$message}[/c]"; |
|
472
|
|
|
} else { |
|
473
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_term_wrong']}[/c]"; |
|
474
|
|
|
} |
|
475
|
|
|
} |
|
476
|
|
|
} else { |
|
477
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_player_id_unknown']}[/c]"; |
|
478
|
|
|
} |
|
479
|
|
|
} else { |
|
480
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_player_id_incorrect']}[/c]"; |
|
481
|
|
|
} |
|
482
|
|
|
} elseif (!$chat_command_parsed[2]) { |
|
483
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_player_id_need']}[/c]"; |
|
484
|
|
|
} elseif (!$chat_command_parsed[3]) { |
|
485
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_term_need']}[/c]"; |
|
486
|
|
|
} |
|
487
|
|
|
break; |
|
488
|
|
|
|
|
489
|
|
|
default: |
|
490
|
|
|
$message = array(); |
|
491
|
|
|
$chat_command_parsed[2] = strtolower($chat_command_parsed[2]); |
|
492
|
|
|
|
|
493
|
|
|
$chat_directive = $chat_command_parsed[2] && array_key_exists($chat_command_parsed[2], $chat_aliases) ? $chat_aliases[$chat_command_parsed[2]] : ''; |
|
494
|
|
|
|
|
495
|
|
|
if (!$chat_directive) { |
|
496
|
|
|
$commands_available = array(); |
|
497
|
|
|
$message[] = $lang['chat_advanced_help_description']; |
|
498
|
|
|
foreach ($chat_commands as $chat_command_listed => $chat_command_info) { |
|
499
|
|
|
if (in_array($user['authlevel'], $chat_command_info['access'])) { |
|
500
|
|
|
$commands_available[] = $lang['chat_advanced_help_short'][$chat_command_listed]; |
|
501
|
|
|
} |
|
502
|
|
|
} |
|
503
|
|
|
$message[] = $lang['chat_advanced_help_commands_accessible'] . ' ' . implode(', ', $commands_available); |
|
504
|
|
|
} else { |
|
505
|
|
|
$message[] = sprintf($lang['chat_advanced_help_command'], $chat_directive); |
|
506
|
|
|
$message[] = $lang['chat_advanced_help'][$chat_directive]; |
|
507
|
|
|
$aliases = array(); |
|
508
|
|
|
foreach ($chat_aliases as $chat_command_alias => $chat_command_real) { |
|
509
|
|
|
if ($chat_command_real == $chat_directive) { |
|
510
|
|
|
$aliases[] = '/' . $chat_command_alias; |
|
511
|
|
|
} |
|
512
|
|
|
} |
|
513
|
|
|
$message[] = $lang['chat_advanced_help_command_aliases'] . implode(', ', $aliases); |
|
514
|
|
|
} |
|
515
|
|
|
$message = implode(chr(13) . chr(10), $message); |
|
516
|
|
|
$message = "[c=lime]{$message}[/c]"; |
|
517
|
|
|
|
|
518
|
|
|
if ($chat_command_exists !== true) { |
|
519
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_command_unknown']} \"/{$chat_command_exists}\"[/c]" . chr(13) . chr(10) . $message; |
|
520
|
|
|
} |
|
521
|
|
|
break; |
|
522
|
|
|
} |
|
523
|
|
|
} else { |
|
524
|
|
|
$message = "[c=red]{$lang['chat_advanced_err_command_inacessible']}[/c]"; |
|
525
|
|
|
} |
|
526
|
|
|
$message = "[b]{$message}[/b]"; |
|
527
|
|
|
} |
|
528
|
|
|
|
|
529
|
|
|
if (!$chat_command_issued && !$chat_player_muted) { |
|
530
|
|
|
$chat_message_sender_id = $user['id']; |
|
531
|
|
|
$chat_message_sender_name = SN::$db->db_escape($user['username']); |
|
532
|
|
|
$chat_message_recipient_id = 'NULL'; |
|
533
|
|
|
$chat_message_recipient_name = ''; |
|
534
|
|
|
$ally_id = sys_get_param('ally') && $user['ally_id'] ? $user['ally_id'] : 0; |
|
535
|
|
|
$nick = SN::$db->db_escape(player_nick_compact(player_nick_render_current_to_array($user, array('color' => true, 'icons' => true, 'ally' => !$ally_id, 'class' => 'class="chat_nick_msg"')))); |
|
536
|
|
|
|
|
537
|
|
|
// Replacing news://xxx link with BBCode |
|
538
|
|
|
$message = preg_replace("#news\:\/\/(\d+)#i", "[news=$1]", $message); |
|
539
|
|
|
// Replacing news URL with BBCode |
|
540
|
|
|
$message = preg_replace("#(?:https?\:\/\/(?:.+)?\/announce\.php\?id\=(\d+))#", "[news=$1]", $message); |
|
541
|
|
|
$message = preg_replace("#(?:https?\:\/\/(?:.+)?\/index\.php\?page\=battle_report\&cypher\=([0-9a-zA-Z]{32}))#", "[ube=$1]", $message); |
|
542
|
|
|
|
|
543
|
|
|
if ($color = sys_get_param_str('color')) { |
|
544
|
|
|
$message = "[c={$color}]{$message}[/c]"; |
|
545
|
|
|
} |
|
546
|
|
|
} elseif (!$chat_command_issued && $chat_player_muted) { |
|
547
|
|
|
$chat_message_recipient_id = $user['id']; |
|
548
|
|
|
$chat_message_recipient_name = SN::$db->db_escape($user['username']); |
|
549
|
|
|
$message = sprintf($lang['chat_advanced_command_mute'], $user['username'], date(FMT_DATE_TIME, $chat_player_muted)) . |
|
550
|
|
|
($chat_player_row['chat_player_muted_reason'] ? sprintf($lang['chat_advanced_command_mute_reason'], $chat_player_row['chat_player_muted_reason']) : ''); |
|
551
|
|
|
$message = "[c=red]{$message}[/c]"; |
|
552
|
|
|
} |
|
553
|
|
|
$message = SN::$db->db_escape($message); |
|
554
|
|
|
|
|
555
|
|
|
doquery( |
|
|
|
|
|
|
556
|
|
|
"INSERT INTO |
|
557
|
|
|
{{chat}} |
|
558
|
|
|
SET |
|
559
|
|
|
`user` = '{$nick}', |
|
560
|
|
|
`ally_id` = '{$ally_id}', |
|
561
|
|
|
`message` = '{$message}', |
|
562
|
|
|
`timestamp` = " . SN_TIME_NOW . ", |
|
563
|
|
|
`chat_message_sender_id` = {$chat_message_sender_id}, |
|
564
|
|
|
`chat_message_sender_name` = '{$chat_message_sender_name}', |
|
565
|
|
|
`chat_message_recipient_id` = {$chat_message_recipient_id}, |
|
566
|
|
|
`chat_message_recipient_name` = '{$chat_message_recipient_name}'" |
|
567
|
|
|
); |
|
568
|
|
|
} |
|
569
|
|
|
|
|
570
|
|
|
die(); |
|
|
|
|
|
|
571
|
|
|
} |
|
572
|
|
|
|
|
573
|
|
|
|
|
574
|
|
|
protected function update_chat_activity($refresh = false) { |
|
575
|
|
|
global $config, $user; |
|
576
|
|
|
|
|
577
|
|
|
$config->array_set('users', $user['id'], 'chat_last_activity', SN_TIME_MICRO); |
|
578
|
|
|
$config->array_set('users', $user['id'], 'chat_last_refresh', $refresh ? 0 : SN_TIME_MICRO); |
|
579
|
|
|
|
|
580
|
|
|
$activity_row = doquery("SELECT `chat_player_id` FROM {{chat_player}} WHERE `chat_player_player_id` = {$user['id']} LIMIT 1", true); |
|
|
|
|
|
|
581
|
|
|
if (!$activity_row) { |
|
582
|
|
|
doquery("INSERT INTO {{chat_player}} SET `chat_player_player_id` = {$user['id']}"); |
|
|
|
|
|
|
583
|
|
|
} else { |
|
584
|
|
|
doquery("UPDATE {{chat_player}} SET `chat_player_activity` = '" . SN::$db->db_escape(SN_TIME_SQL) . "' WHERE `chat_player_player_id` = {$user['id']} LIMIT 1"); |
|
|
|
|
|
|
585
|
|
|
} |
|
586
|
|
|
} |
|
587
|
|
|
|
|
588
|
|
|
protected function sn_chat_advanced_get_chat_player_record($player_id, $fields = '*', $return_data = true) { |
|
589
|
|
|
$result = false; |
|
590
|
|
|
if($player_id) { |
|
591
|
|
|
if(!($result = doquery("SELECT {$fields} FROM {{chat_player}} WHERE `chat_player_player_id` = {$player_id} LIMIT 1", true))) { |
|
|
|
|
|
|
592
|
|
|
doquery("INSERT INTO {{chat_player}} SET `chat_player_player_id` = {$player_id}"); |
|
|
|
|
|
|
593
|
|
|
if($return_data) { |
|
594
|
|
|
$result = doquery("SELECT {$fields} FROM {{chat_player}} WHERE `chat_player_player_id` = {$player_id} LIMIT 1", true); |
|
|
|
|
|
|
595
|
|
|
} |
|
596
|
|
|
} |
|
597
|
|
|
} |
|
598
|
|
|
|
|
599
|
|
|
return $result; |
|
600
|
|
|
} |
|
601
|
|
|
|
|
602
|
|
|
|
|
603
|
|
|
} |
|
604
|
|
|
|