aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/9999_99_99_00_world.sql2
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp12
-rw-r--r--src/server/game/Accounts/AccountMgr.h1
-rw-r--r--src/server/game/Miscellaneous/Language.h3
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h3
-rw-r--r--src/server/game/World/World.cpp11
-rw-r--r--src/server/scripts/Commands/cs_ban.cpp3
7 files changed, 31 insertions, 4 deletions
diff --git a/sql/updates/world/master/9999_99_99_00_world.sql b/sql/updates/world/master/9999_99_99_00_world.sql
new file mode 100644
index 00000000000..a2d5b686b65
--- /dev/null
+++ b/sql/updates/world/master/9999_99_99_00_world.sql
@@ -0,0 +1,2 @@
+DELETE FROM `trinity_string` WHERE `entry`=1191;
+INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES (1191, 'Ban exists');
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index 52a8597f1e1..b73117689c3 100644
--- a/src/server/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
@@ -400,6 +400,18 @@ std::string AccountMgr::CalculateShaPassHash(std::string const& name, std::strin
return ByteArrayToHexStr(sha.GetDigest(), sha.GetLength());
}
+bool AccountMgr::IsBannedAccount(std::string const& name)
+{
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME);
+ stmt->setString(0, name);
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
+
+ if (!result)
+ return false;
+
+ return true;
+}
+
bool AccountMgr::IsPlayerAccount(uint32 gmlevel)
{
return gmlevel == SEC_PLAYER;
diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h
index 95a7f538560..ca5ed35943b 100644
--- a/src/server/game/Accounts/AccountMgr.h
+++ b/src/server/game/Accounts/AccountMgr.h
@@ -76,6 +76,7 @@ class TC_GAME_API AccountMgr
static uint32 GetCharactersCount(uint32 accountId);
static std::string CalculateShaPassHash(std::string const& name, std::string const& password);
+ static bool IsBannedAccount(std::string const& name);
static bool IsPlayerAccount(uint32 gmlevel);
static bool IsAdminAccount(uint32 gmlevel);
static bool IsConsoleAccount(uint32 gmlevel);
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 0f4135cad3a..039c3b81604 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -926,7 +926,8 @@ enum TrinityStrings
LANG_ACCOUNT_BNET_UNLINKED = 1188,
LANG_ACCOUNT_BNET_NOT_LINKED = 1189,
LANG_DISALLOW_TICKETS_CONFIG = 1190,
- // Room for more level 3 1191-1198 not used
+ LANG_BAN_EXISTS = 1191,
+ // Room for more level 3 1192-1198 not used
// Debug commands
LANG_DEBUG_AREATRIGGER_LEFT = 1999,
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index e784235a1b0..f7bea0e904e 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -4826,7 +4826,8 @@ enum BanReturn
{
BAN_SUCCESS,
BAN_SYNTAX_ERROR,
- BAN_NOTFOUND
+ BAN_NOTFOUND,
+ BAN_EXISTS
};
enum BattlegroundTeamId : uint8
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 760ec282bd7..25ca56325cb 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2723,6 +2723,10 @@ BanReturn World::BanAccount(BanMode mode, std::string const& nameOrIP, uint32 du
PreparedQueryResult resultAccounts = PreparedQueryResult(NULL); //used for kicking
PreparedStatement* stmt = NULL;
+ // Prevent banning an already banned account
+ if (mode == BAN_ACCOUNT && AccountMgr::IsBannedAccount(nameOrIP))
+ return BAN_EXISTS;
+
///- Update the database with ban information
switch (mode)
{
@@ -2841,17 +2845,20 @@ BanReturn World::BanCharacter(std::string const& name, std::string const& durati
else
guid = pBanned->GetGUID();
+ //Use transaction in order to ensure the order of the queries
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
// make sure there is only one active ban
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_BAN);
stmt->setUInt64(0, guid.GetCounter());
- CharacterDatabase.Execute(stmt);
+ trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_BAN);
stmt->setUInt64(0, guid.GetCounter());
stmt->setUInt32(1, duration_secs);
stmt->setString(2, author);
stmt->setString(3, reason);
- CharacterDatabase.Execute(stmt);
+ trans->Append(stmt);
+ CharacterDatabase.CommitTransaction(trans);
if (pBanned)
pBanned->GetSession()->KickPlayer();
diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp
index d59ed9c1407..5c9c89ab7eb 100644
--- a/src/server/scripts/Commands/cs_ban.cpp
+++ b/src/server/scripts/Commands/cs_ban.cpp
@@ -232,6 +232,9 @@ public:
}
handler->SetSentErrorMessage(true);
return false;
+ case BAN_EXISTS:
+ handler->PSendSysMessage(LANG_BAN_EXISTS);
+ break;
}
return true;