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