TrinityCore
cs_ban.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19Name: ban_commandscript
20%Complete: 100
21Comment: All ban related commands
22Category: commandscripts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "AccountMgr.h"
27#include "CharacterCache.h"
28#include "Chat.h"
29#include "ChatCommand.h"
30#include "DatabaseEnv.h"
31#include "GameTime.h"
32#include "Language.h"
33#include "ObjectAccessor.h"
34#include "ObjectMgr.h"
35#include "Player.h"
36#include "World.h"
37#include "WorldSession.h"
38
39#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
40#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
41#endif
42
43using namespace Trinity::ChatCommands;
44
46{
47public:
48 ban_commandscript() : CommandScript("ban_commandscript") { }
49
51 {
52 static ChatCommandTable unbanCommandTable =
53 {
58 };
59 static ChatCommandTable banlistCommandTable =
60 {
64 };
65 static ChatCommandTable baninfoCommandTable =
66 {
70 };
71 static ChatCommandTable banCommandTable =
72 {
77 };
78 static ChatCommandTable commandTable =
79 {
80 { "ban", banCommandTable },
81 { "baninfo", baninfoCommandTable },
82 { "banlist", banlistCommandTable },
83 { "unban", unbanCommandTable },
84 };
85 return commandTable;
86 }
87
88 static bool HandleBanAccountCommand(ChatHandler* handler, char const* args)
89 {
90 return HandleBanHelper(BAN_ACCOUNT, args, handler);
91 }
92
93 static bool HandleBanCharacterCommand(ChatHandler* handler, char const* args)
94 {
95 if (!*args)
96 return false;
97
98 char* nameStr = strtok((char*)args, " ");
99 if (!nameStr)
100 return false;
101
102 std::string name = nameStr;
103
104 char* durationStr = strtok(nullptr, " ");
105 if (!durationStr || !atoi(durationStr))
106 return false;
107
108 char* reasonStr = strtok(nullptr, "");
109 if (!reasonStr)
110 return false;
111
112 if (!normalizePlayerName(name))
113 {
115 handler->SetSentErrorMessage(true);
116 return false;
117 }
118
119 std::string author = handler->GetSession() ? handler->GetSession()->GetPlayerName() : "Server";
120
121 switch (sWorld->BanCharacter(name, durationStr, reasonStr, author))
122 {
123 case BAN_SUCCESS:
124 {
125 if (atoi(durationStr) > 0)
126 {
127 if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
128 sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr);
129 else
130 handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr);
131 }
132 else
133 {
134 if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
135 sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), reasonStr);
136 else
137 handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, name.c_str(), reasonStr);
138 }
139 break;
140 }
141 case BAN_NOTFOUND:
142 {
143 handler->PSendSysMessage(LANG_BAN_NOTFOUND, "character", name.c_str());
144 handler->SetSentErrorMessage(true);
145 return false;
146 }
147 default:
148 break;
149 }
150
151 return true;
152 }
153
154 static bool HandleBanAccountByCharCommand(ChatHandler* handler, char const* args)
155 {
156 return HandleBanHelper(BAN_CHARACTER, args, handler);
157 }
158
159 static bool HandleBanIPCommand(ChatHandler* handler, char const* args)
160 {
161 return HandleBanHelper(BAN_IP, args, handler);
162 }
163
164 static bool HandleBanHelper(BanMode mode, char const* args, ChatHandler* handler)
165 {
166 if (!*args)
167 return false;
168
169 char* cnameOrIP = strtok((char*)args, " ");
170 if (!cnameOrIP)
171 return false;
172
173 std::string nameOrIP = cnameOrIP;
174
175 char* durationStr = strtok(nullptr, " ");
176 if (!durationStr || !atoi(durationStr))
177 return false;
178
179 char* reasonStr = strtok(nullptr, "");
180 if (!reasonStr)
181 return false;
182
183 switch (mode)
184 {
185 case BAN_ACCOUNT:
186 if (!Utf8ToUpperOnlyLatin(nameOrIP))
187 {
188 handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, nameOrIP.c_str());
189 handler->SetSentErrorMessage(true);
190 return false;
191 }
192 break;
193 case BAN_CHARACTER:
194 if (!normalizePlayerName(nameOrIP))
195 {
197 handler->SetSentErrorMessage(true);
198 return false;
199 }
200 break;
201 case BAN_IP:
202 if (!IsIPAddress(nameOrIP.c_str()))
203 return false;
204 break;
205 }
206
207 std::string author = handler->GetSession() ? handler->GetSession()->GetPlayerName() : "Server";
208
209 switch (sWorld->BanAccount(mode, nameOrIP, durationStr, reasonStr, author))
210 {
211 case BAN_SUCCESS:
212 if (atoi(durationStr) > 0)
213 {
214 if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
215 sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr);
216 else
217 handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr);
218 }
219 else
220 {
221 if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
222 sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), reasonStr);
223 else
224 handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, nameOrIP.c_str(), reasonStr);
225 }
226 break;
227 case BAN_SYNTAX_ERROR:
228 return false;
229 case BAN_NOTFOUND:
230 switch (mode)
231 {
232 default:
233 handler->PSendSysMessage(LANG_BAN_NOTFOUND, "account", nameOrIP.c_str());
234 break;
235 case BAN_CHARACTER:
236 handler->PSendSysMessage(LANG_BAN_NOTFOUND, "character", nameOrIP.c_str());
237 break;
238 case BAN_IP:
239 handler->PSendSysMessage(LANG_BAN_NOTFOUND, "ip", nameOrIP.c_str());
240 break;
241 }
242 handler->SetSentErrorMessage(true);
243 return false;
244 case BAN_EXISTS:
246 break;
247 }
248
249 return true;
250 }
251
252 static bool HandleBanInfoAccountCommand(ChatHandler* handler, char const* args)
253 {
254 if (!*args)
255 return false;
256
257 char* nameStr = strtok((char*)args, "");
258 if (!nameStr)
259 return false;
260
261 std::string accountName = nameStr;
262 if (!Utf8ToUpperOnlyLatin(accountName))
263 {
264 handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
265 handler->SetSentErrorMessage(true);
266 return false;
267 }
268
269 uint32 accountId = AccountMgr::GetId(accountName);
270 if (!accountId)
271 {
272 handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
273 return true;
274 }
275
276 return HandleBanInfoHelper(accountId, accountName.c_str(), handler);
277 }
278
279 static bool HandleBanInfoHelper(uint32 accountId, char const* accountName, ChatHandler* handler)
280 {
281 QueryResult result = LoginDatabase.PQuery("SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate, banreason, bannedby FROM account_banned WHERE id = '{}' ORDER BY bandate ASC", accountId);
282 if (!result)
283 {
284 handler->PSendSysMessage(LANG_BANINFO_NOACCOUNTBAN, accountName);
285 return true;
286 }
287
288 handler->PSendSysMessage(LANG_BANINFO_BANHISTORY, accountName);
289 do
290 {
291 Field* fields = result->Fetch();
292
293 time_t unbanDate = time_t(fields[3].GetUInt32());
294 bool active = false;
295 if (fields[2].GetBool() && (fields[1].GetUInt64() == uint64(0) || unbanDate >= GameTime::GetGameTime()))
296 active = true;
297 bool permanent = (fields[1].GetUInt64() == uint64(0));
298 std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), TimeFormat::ShortText);
300 fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());
301 }
302 while (result->NextRow());
303
304 return true;
305 }
306
307 static bool HandleBanInfoCharacterCommand(ChatHandler* handler, char const* args)
308 {
309 if (!*args)
310 return false;
311
312 std::string name(args);
313 if (!normalizePlayerName(name))
314 {
316 handler->SetSentErrorMessage(true);
317 return false;
318 }
319
321 ObjectGuid targetGuid;
322
323 if (!target)
324 {
325 targetGuid = sCharacterCache->GetCharacterGuidByName(name);
326 if (targetGuid.IsEmpty())
327 {
329 handler->SetSentErrorMessage(true);
330 return false;
331 }
332 }
333 else
334 targetGuid = target->GetGUID();
335
337 stmt->setUInt64(0, targetGuid.GetCounter());
338 PreparedQueryResult result = CharacterDatabase.Query(stmt);
339 if (!result)
340 {
341 handler->PSendSysMessage(LANG_CHAR_NOT_BANNED, name.c_str());
342 return true;
343 }
344
345 handler->PSendSysMessage(LANG_BANINFO_BANHISTORY, name.c_str());
346 do
347 {
348 Field* fields = result->Fetch();
349 time_t unbanDate = fields[3].GetInt64();
350 bool active = false;
351 if (fields[2].GetUInt8() && (!fields[1].GetInt64() || unbanDate >= GameTime::GetGameTime()))
352 active = true;
353 bool permanent = (fields[1].GetInt64() == SI64LIT(0));
354 std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetInt64(), TimeFormat::ShortText);
356 TimeToTimestampStr(fields[0].GetInt64()).c_str(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());
357 }
358 while (result->NextRow());
359
360 return true;
361 }
362
363 static bool HandleBanInfoIPCommand(ChatHandler* handler, char const* args)
364 {
365 if (!*args)
366 return false;
367
368 char* ipStr = strtok((char*)args, "");
369 if (!ipStr)
370 return false;
371
372 if (!IsIPAddress(ipStr))
373 return false;
374
375 std::string IP = ipStr;
376
377 LoginDatabase.EscapeString(IP);
378 QueryResult result = LoginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason, bannedby, unbandate-bandate FROM ip_banned WHERE ip = '{}'", IP);
379 if (!result)
380 {
382 return true;
383 }
384
385 Field* fields = result->Fetch();
386 bool permanent = !fields[6].GetUInt64();
388 fields[0].GetCString(), fields[1].GetCString(), permanent ? handler->GetTrinityString(LANG_BANINFO_NEVER) : fields[2].GetCString(),
389 permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[3].GetUInt64(), TimeFormat::ShortText).c_str(), fields[4].GetCString(), fields[5].GetCString());
390
391 return true;
392 }
393
394 static bool HandleBanListAccountCommand(ChatHandler* handler, char const* args)
395 {
396 LoginDatabasePreparedStatement* stmt = nullptr;
397
398 stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_EXPIRED_IP_BANS);
399 LoginDatabase.Execute(stmt);
400
401 char* filterStr = strtok((char*)args, " ");
402 std::string filter = filterStr ? filterStr : "";
403
404 PreparedQueryResult result;
405
406 if (filter.empty())
407 {
408 stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED_ALL);
409 result = LoginDatabase.Query(stmt);
410 }
411 else
412 {
413 stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_FILTER);
414 stmt->setString(0, filter);
415 result = LoginDatabase.Query(stmt);
416 }
417
418 if (!result)
419 {
421 return true;
422 }
423
424 return HandleBanListHelper(result, handler);
425 }
426
428 {
430
431 // Chat short output
432 if (handler->GetSession())
433 {
434 do
435 {
436 Field* fields = result->Fetch();
437 uint32 accountid = fields[0].GetUInt32();
438
439 QueryResult banResult = LoginDatabase.PQuery("SELECT account.username FROM account, account_banned WHERE account_banned.id='{}' AND account_banned.id = account.id", accountid);
440 if (banResult)
441 {
442 Field* fields2 = banResult->Fetch();
443 handler->PSendSysMessage("%s", fields2[0].GetCString());
444 }
445 }
446 while (result->NextRow());
447 }
448 // Console wide output
449 else
450 {
452 handler->SendSysMessage(" ===============================================================================");
454 do
455 {
456 handler->SendSysMessage("-------------------------------------------------------------------------------");
457 Field* fields = result->Fetch();
458 uint32 accountId = fields[0].GetUInt32();
459
460 std::string accountName;
461
462 // "account" case, name can be get in same query
463 if (result->GetFieldCount() > 1)
464 accountName = fields[1].GetString();
465 // "character" case, name need extract from another DB
466 else
467 AccountMgr::GetName(accountId, accountName);
468
469 // No SQL injection. id is uint32.
470 QueryResult banInfo = LoginDatabase.PQuery("SELECT bandate, unbandate, bannedby, banreason FROM account_banned WHERE id = {} ORDER BY unbandate", accountId);
471 if (banInfo)
472 {
473 Field* fields2 = banInfo->Fetch();
474 do
475 {
476 time_t timeBan = time_t(fields2[0].GetUInt32());
477 tm tmBan;
478 localtime_r(&timeBan, &tmBan);
479
480 if (fields2[0].GetUInt32() == fields2[1].GetUInt32())
481 {
482 handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
483 accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
484 fields2[2].GetCString(), fields2[3].GetCString());
485 }
486 else
487 {
488 time_t timeUnban = time_t(fields2[1].GetUInt32());
489 tm tmUnban;
490 localtime_r(&timeUnban, &tmUnban);
491 handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
492 accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
493 tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
494 fields2[2].GetCString(), fields2[3].GetCString());
495 }
496 }
497 while (banInfo->NextRow());
498 }
499 }
500 while (result->NextRow());
501
502 handler->SendSysMessage(" ===============================================================================");
503 }
504
505 return true;
506 }
507
508 static bool HandleBanListCharacterCommand(ChatHandler* handler, char const* args)
509 {
510 if (!*args)
511 return false;
512
513 char* filterStr = strtok((char*)args, " ");
514 if (!filterStr)
515 return false;
516
517 std::string filter(filterStr);
519 stmt->setString(0, filter);
520 PreparedQueryResult result = CharacterDatabase.Query(stmt);
521 if (!result)
522 {
524 return true;
525 }
526
528
529 // Chat short output
530 if (handler->GetSession())
531 {
532 do
533 {
534 Field* fields = result->Fetch();
536 stmt2->setUInt64(0, fields[0].GetUInt64());
537 PreparedQueryResult banResult = CharacterDatabase.Query(stmt2);
538 if (banResult)
539 handler->PSendSysMessage("%s", (*banResult)[0].GetCString());
540 }
541 while (result->NextRow());
542 }
543 // Console wide output
544 else
545 {
547 handler->SendSysMessage(" =============================================================================== ");
549 do
550 {
551 handler->SendSysMessage("-------------------------------------------------------------------------------");
552
553 Field* fields = result->Fetch();
554
555 std::string char_name = fields[1].GetString();
556
558 stmt2->setUInt64(0, fields[0].GetUInt64());
559 PreparedQueryResult banInfo = CharacterDatabase.Query(stmt2);
560 if (banInfo)
561 {
562 Field* banFields = banInfo->Fetch();
563 do
564 {
565 time_t timeBan = banFields[0].GetInt64();
566 tm tmBan;
567 localtime_r(&timeBan, &tmBan);
568
569 if (banFields[0].GetInt64() == banFields[1].GetInt64())
570 {
571 handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
572 char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
573 banFields[2].GetCString(), banFields[3].GetCString());
574 }
575 else
576 {
577 time_t timeUnban = banFields[1].GetInt64();
578 tm tmUnban;
579 localtime_r(&timeUnban, &tmUnban);
580 handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
581 char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
582 tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
583 banFields[2].GetCString(), banFields[3].GetCString());
584 }
585 }
586 while (banInfo->NextRow());
587 }
588 }
589 while (result->NextRow());
590 handler->SendSysMessage(" =============================================================================== ");
591 }
592
593 return true;
594 }
595
596 static bool HandleBanListIPCommand(ChatHandler* handler, char const* args)
597 {
599 LoginDatabase.Execute(stmt);
600
601 char* filterStr = strtok((char*)args, " ");
602 std::string filter = filterStr ? filterStr : "";
603 LoginDatabase.EscapeString(filter);
604
605 PreparedQueryResult result;
606
607 if (filter.empty())
608 {
609 stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_BANNED_ALL);
610 result = LoginDatabase.Query(stmt);
611 }
612 else
613 {
614 stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_BANNED_BY_IP);
615 stmt->setString(0, filter);
616 result = LoginDatabase.Query(stmt);
617 }
618
619 if (!result)
620 {
622 return true;
623 }
624
626 // Chat short output
627 if (handler->GetSession())
628 {
629 do
630 {
631 Field* fields = result->Fetch();
632 handler->PSendSysMessage("%s", fields[0].GetCString());
633 }
634 while (result->NextRow());
635 }
636 // Console wide output
637 else
638 {
640 handler->SendSysMessage(" ===============================================================================");
642 do
643 {
644 handler->SendSysMessage("-------------------------------------------------------------------------------");
645 Field* fields = result->Fetch();
646 time_t timeBan = time_t(fields[1].GetUInt32());
647 tm tmBan;
648 localtime_r(&timeBan, &tmBan);
649 if (fields[1].GetUInt32() == fields[2].GetUInt32())
650 {
651 handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
652 fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
653 fields[3].GetCString(), fields[4].GetCString());
654 }
655 else
656 {
657 time_t timeUnban = time_t(fields[2].GetUInt32());
658 tm tmUnban;
659 localtime_r(&timeUnban, &tmUnban);
660 handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
661 fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
662 tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
663 fields[3].GetCString(), fields[4].GetCString());
664 }
665 }
666 while (result->NextRow());
667
668 handler->SendSysMessage(" ===============================================================================");
669 }
670
671 return true;
672 }
673
674 static bool HandleUnBanAccountCommand(ChatHandler* handler, char const* args)
675 {
676 return HandleUnBanHelper(BAN_ACCOUNT, args, handler);
677 }
678
679 static bool HandleUnBanCharacterCommand(ChatHandler* handler, char const* args)
680 {
681 if (!*args)
682 return false;
683
684 char* nameStr = strtok((char*)args, " ");
685 if (!nameStr)
686 return false;
687
688 std::string name = nameStr;
689
690 if (!normalizePlayerName(name))
691 {
693 handler->SetSentErrorMessage(true);
694 return false;
695 }
696
697 if (!sWorld->RemoveBanCharacter(name))
698 {
700 handler->SetSentErrorMessage(true);
701 return false;
702 }
703
704 handler->PSendSysMessage(LANG_UNBAN_UNBANNED, name.c_str());
705 return true;
706 }
707
708 static bool HandleUnBanAccountByCharCommand(ChatHandler* handler, char const* args)
709 {
710 return HandleUnBanHelper(BAN_CHARACTER, args, handler);
711 }
712
713 static bool HandleUnBanIPCommand(ChatHandler* handler, char const* args)
714 {
715 return HandleUnBanHelper(BAN_IP, args, handler);
716 }
717
718 static bool HandleUnBanHelper(BanMode mode, char const* args, ChatHandler* handler)
719 {
720 if (!*args)
721 return false;
722
723 char* nameOrIPStr = strtok((char*)args, " ");
724 if (!nameOrIPStr)
725 return false;
726
727 std::string nameOrIP = nameOrIPStr;
728
729 switch (mode)
730 {
731 case BAN_ACCOUNT:
732 if (!Utf8ToUpperOnlyLatin(nameOrIP))
733 {
734 handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, nameOrIP.c_str());
735 handler->SetSentErrorMessage(true);
736 return false;
737 }
738 break;
739 case BAN_CHARACTER:
740 if (!normalizePlayerName(nameOrIP))
741 {
743 handler->SetSentErrorMessage(true);
744 return false;
745 }
746 break;
747 case BAN_IP:
748 if (!IsIPAddress(nameOrIP.c_str()))
749 return false;
750 break;
751 }
752
753 if (sWorld->RemoveBanAccount(mode, nameOrIP))
754 handler->PSendSysMessage(LANG_UNBAN_UNBANNED, nameOrIP.c_str());
755 else
756 handler->PSendSysMessage(LANG_UNBAN_ERROR, nameOrIP.c_str());
757
758 return true;
759 }
760};
761
763{
764 new ban_commandscript();
765}
#define sCharacterCache
@ CHAR_SEL_BANNED_NAME
@ CHAR_SEL_BANINFO
@ CHAR_SEL_BANINFO_LIST
@ CHAR_SEL_GUID_BY_NAME_FILTER
std::shared_ptr< ResultSet > QueryResult
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition: DatabaseEnv.cpp:22
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
#define SI64LIT(N)
Definition: Define.h:130
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
@ LANG_BANINFO_IPENTRY
Definition: Language.h:481
@ LANG_YES
Definition: Language.h:479
@ LANG_BANINFO_INFINITE
Definition: Language.h:477
@ LANG_BANINFO_NEVER
Definition: Language.h:478
@ LANG_BANLIST_CHARACTERS_HEADER
Definition: Language.h:906
@ LANG_BANINFO_NOCHARACTER
Definition: Language.h:472
@ LANG_BANINFO_BANHISTORY
Definition: Language.h:475
@ LANG_BAN_NOTFOUND
Definition: Language.h:465
@ LANG_BANLIST_NOACCOUNT
Definition: Language.h:484
@ LANG_UNBAN_UNBANNED
Definition: Language.h:467
@ LANG_BAN_EXISTS
Definition: Language.h:961
@ LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD
Definition: Language.h:1224
@ LANG_BAN_YOUPERMBANNED
Definition: Language.h:464
@ LANG_BANLIST_IPS_HEADER
Definition: Language.h:683
@ LANG_BANINFO_NOIP
Definition: Language.h:473
@ LANG_BANLIST_MATCHINGIP
Definition: Language.h:486
@ LANG_BANINFO_NOACCOUNTBAN
Definition: Language.h:474
@ LANG_CHAR_NOT_BANNED
Definition: Language.h:909
@ LANG_BAN_YOUBANNED
Definition: Language.h:463
@ LANG_UNBAN_ERROR
Definition: Language.h:468
@ LANG_NO
Definition: Language.h:480
@ LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD
Definition: Language.h:1226
@ LANG_BANLIST_MATCHINGCHARACTER
Definition: Language.h:904
@ LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD
Definition: Language.h:1225
@ LANG_BANLIST_MATCHINGACCOUNT
Definition: Language.h:487
@ LANG_BANLIST_NOCHARACTER
Definition: Language.h:485
@ LANG_PLAYER_NOT_FOUND
Definition: Language.h:567
@ LANG_BANINFO_HISTORYENTRY
Definition: Language.h:476
@ LANG_BANLIST_CHARACTERS
Definition: Language.h:905
@ LANG_BANLIST_NOIP
Definition: Language.h:483
@ LANG_ACCOUNT_NOT_EXIST
Definition: Language.h:470
@ LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD
Definition: Language.h:1227
@ LANG_BANLIST_ACCOUNTS_HEADER
Definition: Language.h:681
@ LANG_BANLIST_IPS
Definition: Language.h:682
@ LANG_BANLIST_ACCOUNTS
Definition: Language.h:680
@ LOGIN_SEL_ACCOUNT_BANNED_BY_FILTER
Definition: LoginDatabase.h:37
@ LOGIN_DEL_EXPIRED_IP_BANS
Definition: LoginDatabase.h:32
@ LOGIN_SEL_IP_BANNED_BY_IP
Definition: LoginDatabase.h:51
@ LOGIN_SEL_IP_BANNED_ALL
Definition: LoginDatabase.h:50
@ LOGIN_SEL_ACCOUNT_BANNED_ALL
Definition: LoginDatabase.h:36
bool normalizePlayerName(std::string &name)
Definition: ObjectMgr.cpp:154
@ BAN_EXISTS
@ BAN_SYNTAX_ERROR
@ BAN_NOTFOUND
@ BAN_SUCCESS
BanMode
Ban function modes.
@ BAN_ACCOUNT
@ BAN_IP
@ BAN_CHARACTER
bool Utf8ToUpperOnlyLatin(std::string &utf8String)
Definition: Util.cpp:795
bool IsIPAddress(char const *ipaddress)
Check if the string is a valid ip address representation.
Definition: Util.cpp:313
std::string TimeToTimestampStr(time_t t)
Definition: Util.cpp:290
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
Definition: Util.cpp:115
uint32 TimeStringToSecs(std::string const &timestring)
Definition: Util.cpp:258
static uint32 GetId(std::string_view username)
Definition: AccountMgr.cpp:289
static bool GetName(uint32 accountId, std::string &name)
Definition: AccountMgr.cpp:319
WorldSession * GetSession()
Definition: Chat.h:42
void PSendSysMessage(const char *fmt, Args &&... args)
Definition: Chat.h:57
void SetSentErrorMessage(bool val)
Definition: Chat.h:114
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:113
virtual char const * GetTrinityString(uint32 entry) const
Definition: Chat.cpp:48
Class used to access individual fields of database query result.
Definition: Field.h:90
std::string GetString() const
Definition: Field.cpp:118
int64 GetInt64() const
Definition: Field.cpp:86
uint64 GetUInt64() const
Definition: Field.cpp:78
char const * GetCString() const
Definition: Field.cpp:110
uint32 GetUInt32() const
Definition: Field.cpp:62
LowType GetCounter() const
Definition: ObjectGuid.h:293
bool IsEmpty() const
Definition: ObjectGuid.h:319
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void setString(const uint8 index, const std::string &value)
void setUInt64(const uint8 index, const uint64 value)
std::string const & GetPlayerName() const
static bool HandleBanHelper(BanMode mode, char const *args, ChatHandler *handler)
Definition: cs_ban.cpp:164
static bool HandleUnBanHelper(BanMode mode, char const *args, ChatHandler *handler)
Definition: cs_ban.cpp:718
ChatCommandTable GetCommands() const override
Definition: cs_ban.cpp:50
static bool HandleBanAccountByCharCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:154
static bool HandleUnBanIPCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:713
static bool HandleUnBanAccountByCharCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:708
static bool HandleBanInfoAccountCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:252
static bool HandleBanListIPCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:596
static bool HandleBanIPCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:159
static bool HandleBanInfoHelper(uint32 accountId, char const *accountName, ChatHandler *handler)
Definition: cs_ban.cpp:279
static bool HandleBanListCharacterCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:508
static bool HandleBanInfoIPCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:363
static bool HandleBanListAccountCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:394
static bool HandleBanCharacterCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:93
static bool HandleBanInfoCharacterCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:307
static bool HandleUnBanAccountCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:674
static bool HandleBanListHelper(PreparedQueryResult result, ChatHandler *handler)
Definition: cs_ban.cpp:427
static bool HandleBanAccountCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:88
static bool HandleUnBanCharacterCommand(ChatHandler *handler, char const *args)
Definition: cs_ban.cpp:679
void AddSC_ban_commandscript()
Definition: cs_ban.cpp:762
#define sWorld
Definition: World.h:931
@ CONFIG_SHOW_BAN_IN_WORLD
Definition: World.h:153
time_t GetGameTime()
Definition: GameTime.cpp:44
TC_GAME_API Player * FindPlayerByName(std::string_view name)
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:49
@ RBAC_PERM_COMMAND_BANINFO_IP
Definition: RBAC.h:161
@ RBAC_PERM_COMMAND_BANINFO_ACCOUNT
Definition: RBAC.h:159
@ RBAC_PERM_COMMAND_BANINFO_CHARACTER
Definition: RBAC.h:160
@ RBAC_PERM_COMMAND_BAN_PLAYERACCOUNT
Definition: RBAC.h:157
@ RBAC_PERM_COMMAND_UNBAN_CHARACTER
Definition: RBAC.h:168
@ RBAC_PERM_COMMAND_UNBAN_PLAYERACCOUNT
Definition: RBAC.h:170
@ RBAC_PERM_COMMAND_BAN_CHARACTER
Definition: RBAC.h:155
@ RBAC_PERM_COMMAND_BANLIST_ACCOUNT
Definition: RBAC.h:163
@ RBAC_PERM_COMMAND_BAN_IP
Definition: RBAC.h:156
@ RBAC_PERM_COMMAND_BANLIST_CHARACTER
Definition: RBAC.h:164
@ RBAC_PERM_COMMAND_BANLIST_IP
Definition: RBAC.h:165
@ RBAC_PERM_COMMAND_BAN_ACCOUNT
Definition: RBAC.h:154
@ RBAC_PERM_COMMAND_UNBAN_ACCOUNT
Definition: RBAC.h:167
@ RBAC_PERM_COMMAND_UNBAN_IP
Definition: RBAC.h:169