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