diff options
-rw-r--r-- | data/sql/updates/pending_db_auth/rev_1676759011048897700.sql | 11 | ||||
-rw-r--r-- | data/sql/updates/pending_db_world/rev_1676761525437802000.sql | 9 | ||||
-rw-r--r-- | doc/changelog/pendings/changes_1676759248142739600.md | 17 | ||||
-rw-r--r-- | src/server/apps/worldserver/worldserver.conf.dist | 24 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/LoginDatabase.cpp | 2 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/LoginDatabase.h | 2 | ||||
-rw-r--r-- | src/server/game/Motd/ServerMotd.cpp | 7 | ||||
-rw-r--r-- | src/server/game/World/IWorld.h | 1 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 39 | ||||
-rw-r--r-- | src/server/game/World/World.h | 1 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_reload.cpp | 12 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_server.cpp | 36 | ||||
-rw-r--r-- | src/test/mocks/WorldMock.h | 1 |
13 files changed, 126 insertions, 36 deletions
diff --git a/data/sql/updates/pending_db_auth/rev_1676759011048897700.sql b/data/sql/updates/pending_db_auth/rev_1676759011048897700.sql new file mode 100644 index 0000000000..8718dc1696 --- /dev/null +++ b/data/sql/updates/pending_db_auth/rev_1676759011048897700.sql @@ -0,0 +1,11 @@ +-- +DROP TABLE IF EXISTS `motd`; +CREATE TABLE `motd` ( + `realmid` INT NOT NULL, + `text` LONGTEXT NULL DEFAULT NULL, + PRIMARY KEY (`realmid`) +) ENGINE=InnoDB; + +DELETE FROM `motd` WHERE `realmid`=1; +INSERT INTO `motd` (`realmid`, `text`) VALUES +(-1, 'Welcome to an AzerothCore server.'); diff --git a/data/sql/updates/pending_db_world/rev_1676761525437802000.sql b/data/sql/updates/pending_db_world/rev_1676761525437802000.sql new file mode 100644 index 0000000000..29750ceff1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1676761525437802000.sql @@ -0,0 +1,9 @@ +-- +DELETE FROM `command` WHERE `name` = 'reload motd'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('reload motd', 3, 'Syntax: .reload motd +Reload motd table.'); + +UPDATE `command` SET `help`='Syntax: .server set motd $realmId $MOTD\r\n\r\nSet server Message of the day for the specified realm.' WHERE `name`='server set motd'; + +UPDATE `acore_string` SET `content_default`='Message of the day in realm %i changed to:\r\n%s', `locale_deDE`='Nachricht des Tages in Realm %i wurde geändert zu:\r\n%s', `locale_zhCN`='每日消息更改为 in realm %i:\r\n%s' WHERE `entry`=1101; diff --git a/doc/changelog/pendings/changes_1676759248142739600.md b/doc/changelog/pendings/changes_1676759248142739600.md new file mode 100644 index 0000000000..f4f8c945be --- /dev/null +++ b/doc/changelog/pendings/changes_1676759248142739600.md @@ -0,0 +1,17 @@ +### How to upgrade + +Motd is removed from config file + +Motd is can now be found in auth database table `motd` + +`realmid` = Realm ID or -1 for all realms. +`text` = Text for Motd + +Specified realmId is prioritized over -1 (All Realms) + +For example: + +You have realm 1, 2, 3 + +(-1, "This Motd will show for 2, 3") +(1, "This Motd will show for 1") diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 4ef0b35d31..02210dd417 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -1258,30 +1258,6 @@ BeepAtStart = 1 FlashAtStart = 1 # -# Motd -# Description: Message of the Day, displayed at login. -# Use '@' for a newline and be sure to escape special characters. -# Example: "Welcome to John\'s Server@" -# Default: "Welcome to an AzerothCore server." - -Motd = "Welcome to an AzerothCore server." - -# PLEASE NOTE: another (hardcoded) text will appear below the MOTD: -# -# "This server runs on AzerothCore www.azerothcore.org" -# -# All the AzerothCore contributors, as well as its father projects (MaNGOS, TrinityCore, etc..), -# have worked for free to provide you this software. Please do not remove the credits. -# -# Changing or removing such hardcoded text is considered a violation of our license -# and it's not allowed. We reserve the right to take legal action in case of violations. -# Furthermore, any kind of support will be always denied. -# -# All AzerothCore contributors and its father projects are publicly listed in -# our official repository. Credits to open source contributions should always be shown. -# - -# # Server.LoginInfo # Description: Display core version (.server info) on login. # Default: 0 - (Disabled) diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 5a393a3cc1..4824309747 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -114,6 +114,8 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_MOTD, "SELECT text FROM motd WHERE realmid = ? OR realmid = -1 ORDER BY realmid DESC", CONNECTION_SYNCH); + PrepareStatement(LOGIN_REP_MOTD, "REPLACE INTO motd (realmid, text) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(LOGIN_INS_ACCOUNT_MUTE, "INSERT INTO account_muted VALUES (?, UNIX_TIMESTAMP(), ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_ACCOUNT_MUTE_INFO, "SELECT mutedate, mutetime, mutereason, mutedby FROM account_muted WHERE guid = ? ORDER BY mutedate ASC", CONNECTION_SYNCH); PrepareStatement(LOGIN_DEL_ACCOUNT_MUTED, "DELETE FROM account_muted WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h index 3a9bb4a823..c7fb2be483 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.h +++ b/src/server/database/Database/Implementation/LoginDatabase.h @@ -96,6 +96,8 @@ enum LoginDatabaseStatements : uint32 LOGIN_SEL_REALMLIST_SECURITY_LEVEL, LOGIN_DEL_ACCOUNT, LOGIN_SEL_AUTOBROADCAST, + LOGIN_SEL_MOTD, + LOGIN_REP_MOTD, LOGIN_SEL_LAST_ATTEMPT_IP, LOGIN_SEL_LAST_IP, LOGIN_INS_ALDL_IP_LOGGING, diff --git a/src/server/game/Motd/ServerMotd.cpp b/src/server/game/Motd/ServerMotd.cpp index 0ff8eab9ef..589cca55ec 100644 --- a/src/server/game/Motd/ServerMotd.cpp +++ b/src/server/game/Motd/ServerMotd.cpp @@ -31,13 +31,6 @@ namespace void Motd::SetMotd(std::string motd) { - motd = /* fctlsup << //0x338// "63"+"cx""d2"+"1e""dd"+"cx""ds"+"ce""dd"+"ce""7D"+ << */ motd - /*"d3"+"ce"*/ + "@|" + "cf" +/*"as"+"k4"*/"fF" +"F4" +/*"d5"+"f3"*/"A2" +"DT"/*"F4"+"Az"*/ + "hi" + "s " - /*"fd"+"hy"*/ + "se" + "rv" +/*"nh"+"k3"*/"er" +" r" +/*"x1"+"A2"*/"un" +"s "/*"F2"+"Ay"*/ + "on" + " Az" - /*"xs"+"5n"*/ + "er" + "ot" +/*"xs"+"A2"*/"hC" +"or" +/*"a4"+"f3"*/"e|" +"r "/*"f2"+"A2"*/ + "|c" + "ff" - /*"5g"+"A2"*/ + "3C" + "E7" +/*"k5"+"AX"*/"FF" +"ww" +/*"sx"+"Gj"*/"w." +"az"/*"a1"+"vf"*/ + "er" + "ot" - /*"ds"+"sx"*/ + "hc" + "or" +/*"F4"+"k5"*/"e." +"or" +/*"po"+"xs"*/"g|r"/*"F4"+"p2"+"o4"+"A2"+"i2"*/; - // scripts may change motd sScriptMgr->OnMotdChange(motd); diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index cd7e2f369b..663b54f8f9 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -597,6 +597,7 @@ public: virtual void LoadDBVersion() = 0; [[nodiscard]] virtual char const* GetDBVersion() const = 0; virtual void LoadAutobroadcasts() = 0; + virtual void LoadMotd() = 0; virtual void UpdateAreaDependentAuras() = 0; [[nodiscard]] virtual uint32 GetCleaningFlags() const = 0; virtual void SetCleaningFlags(uint32 flags) = 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 568cf32a9a..ec41ac44e5 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -442,8 +442,6 @@ void World::LoadConfigSettings(bool reload) SetPlayerAmountLimit(sConfigMgr->GetOption<int32>("PlayerLimit", 1000)); } - Motd::SetMotd(sConfigMgr->GetOption<std::string>("Motd", "Welcome to an AzerothCore server")); - ///- Read ticket system setting from the config file _bool_configs[CONFIG_ALLOW_TICKETS] = sConfigMgr->GetOption<bool>("AllowTickets", true); _bool_configs[CONFIG_DELETE_CHARACTER_TICKET_TRACE] = sConfigMgr->GetOption<bool>("DeletedCharacterTicketTrace", false); @@ -1993,6 +1991,10 @@ void World::SetInitialWorldSettings() LOG_INFO("server.loading", "Loading Autobroadcasts..."); LoadAutobroadcasts(); + ///- Load Motd + LOG_INFO("server.loading", "Loading MotD..."); + LoadMotd(); + ///- Load and initialize scripts sObjectMgr->LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data) sObjectMgr->LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data) @@ -2257,6 +2259,39 @@ void World::LoadAutobroadcasts() LOG_INFO("server.loading", " "); } +void World::LoadMotd() +{ + uint32 oldMSTime = getMSTime(); + + uint32 realmId = sConfigMgr->GetOption<int32>("RealmID", 0); + LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_MOTD); + stmt->SetData(0, realmId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + std::string motd; + + if (result) + { + Field* fields = result->Fetch(); + motd = fields[0].Get<std::string>(); + } + else + { + LOG_WARN("server.loading", ">> Loaded 0 motd definitions. DB table `motd` is empty for this realm!"); + LOG_INFO("server.loading", " "); + } + + motd = /* fctlsup << //0x338// "63"+"cx""d2"+"1e""dd"+"cx""ds"+"ce""dd"+"ce""7D"+ << */ motd + /*"d3"+"ce"*/ + "@|" + "cf" +/*"as"+"k4"*/"fF" + "F4" +/*"d5"+"f3"*/"A2" + "DT"/*"F4"+"Az"*/ + "hi" + "s " + /*"fd"+"hy"*/ + "se" + "rv" +/*"nh"+"k3"*/"er" + " r" +/*"x1"+"A2"*/"un" + "s "/*"F2"+"Ay"*/ + "on" + " Az" + /*"xs"+"5n"*/ + "er" + "ot" +/*"xs"+"A2"*/"hC" + "or" +/*"a4"+"f3"*/"e|" + "r "/*"f2"+"A2"*/ + "|c" + "ff" + /*"5g"+"A2"*/ + "3C" + "E7" +/*"k5"+"AX"*/"FF" + "ww" +/*"sx"+"Gj"*/"w." + "az"/*"a1"+"vf"*/ + "er" + "ot" + /*"ds"+"sx"*/ + "hc" + "or" +/*"F4"+"k5"*/"e." + "or" +/*"po"+"xs"*/"g|r"/*"F4"+"p2"+"o4"+"A2"+"i2"*/;; + Motd::SetMotd(motd); + + LOG_INFO("server.loading", ">> Loaded Motd Definitions in {} ms", GetMSTimeDiffToNow(oldMSTime)); + LOG_INFO("server.loading", " "); +} + /// Update the World ! void World::Update(uint32 diff) { diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 20ce7f1378..6b53fbf8af 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -342,6 +342,7 @@ public: [[nodiscard]] char const* GetDBVersion() const override { return _dbVersion.c_str(); } void LoadAutobroadcasts() override; + void LoadMotd() override; void UpdateAreaDependentAuras() override; diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 2fee7b3b6d..5eefe3a817 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -32,6 +32,7 @@ EndScriptData */ #include "LFGMgr.h" #include "Language.h" #include "MapMgr.h" +#include "ServerMotd.h" #include "ObjectMgr.h" #include "ScriptMgr.h" #include "SkillDiscovery.h" @@ -80,6 +81,7 @@ public: { "areatrigger_tavern", HandleReloadAreaTriggerTavernCommand, SEC_ADMINISTRATOR, Console::Yes }, { "areatrigger_teleport", HandleReloadAreaTriggerTeleportCommand, SEC_ADMINISTRATOR, Console::Yes }, { "autobroadcast", HandleReloadAutobroadcastCommand, SEC_ADMINISTRATOR, Console::Yes }, + { "motd", HandleReloadMotdCommand, SEC_ADMINISTRATOR, Console::Yes }, { "broadcast_text", HandleReloadBroadcastTextCommand, SEC_ADMINISTRATOR, Console::Yes }, { "battleground_template", HandleReloadBattlegroundTemplate, SEC_ADMINISTRATOR, Console::Yes }, { "command", HandleReloadCommandCommand, SEC_ADMINISTRATOR, Console::Yes }, @@ -209,6 +211,7 @@ public: HandleReloadVehicleTemplateAccessoryCommand(handler); HandleReloadAutobroadcastCommand(handler); + HandleReloadMotdCommand(handler); HandleReloadBroadcastTextCommand(handler); HandleReloadBattlegroundTemplate(handler); return true; @@ -403,6 +406,15 @@ public: return true; } + static bool HandleReloadMotdCommand(ChatHandler* handler) + { + LOG_INFO("server.loading", "Re-Loading Motd..."); + sWorld->LoadMotd(); + handler->SendGlobalGMSysMessage("DB table `motd` reloaded."); + handler->SendGlobalSysMessage(Motd::GetMotd()); + return true; + } + static bool HandleReloadBroadcastTextCommand(ChatHandler* handler) { LOG_INFO("server.loading", "Re-Loading Broadcast texts..."); diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 63c65caab5..4c89715f7b 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -498,10 +498,40 @@ public: } // Define the 'Message of the day' for the realm - static bool HandleServerSetMotdCommand(ChatHandler* handler, std::string motd) + static bool HandleServerSetMotdCommand(ChatHandler* handler, std::string realmId, Tail motd) { - Motd::SetMotd(motd); - handler->PSendSysMessage(LANG_MOTD_NEW, motd); + std::wstring wMotd = std::wstring(); + std::string strMotd = std::string(); + + if (realmId.empty()) + { + return false; + } + + if (motd.empty()) + { + return false; + } + + if (!Utf8toWStr(motd, wMotd)) + { + return false; + } + + if (!WStrToUtf8(wMotd, strMotd)) + { + return false; + } + + LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction(); + LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_MOTD); + stmt->SetData(0, Acore::StringTo<int32>(realmId).value()); + stmt->SetData(1, strMotd); + trans->Append(stmt); + LoginDatabase.CommitTransaction(trans); + + sWorld->LoadMotd(); + handler->PSendSysMessage(LANG_MOTD_NEW, Acore::StringTo<int32>(realmId).value(), strMotd); return true; } diff --git a/src/test/mocks/WorldMock.h b/src/test/mocks/WorldMock.h index 73742627a5..d4e0247f19 100644 --- a/src/test/mocks/WorldMock.h +++ b/src/test/mocks/WorldMock.h @@ -113,6 +113,7 @@ public: MOCK_METHOD(void, LoadDBVersion, ()); MOCK_METHOD(char const *, GetDBVersion, (), (const)); MOCK_METHOD(void, LoadAutobroadcasts, ()); + MOCK_METHOD(void, LoadMotd, ()); MOCK_METHOD(void, UpdateAreaDependentAuras, ()); MOCK_METHOD(uint32, GetCleaningFlags, (), (const)); MOCK_METHOD(void, SetCleaningFlags, (uint32 flags), ()); |