mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-07 15:28:02 +00:00
feat(Scripts/Commands): add commands for autobroadcast management (#25154)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Ryan Turner <16946913+TheSCREWEDSoftware@users.noreply.github.com>
This commit is contained in:
@@ -118,6 +118,13 @@ void LoginDatabaseConnection::DoPrepareStatements()
|
||||
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_AUTOBROADCAST_LOCALIZED, "SELECT id, locale, text FROM autobroadcast_locale WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_INS_AUTOBROADCAST, "INSERT INTO autobroadcast (realmid, weight, text) VALUES (?, ?, ?)", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_DEL_AUTOBROADCAST, "DELETE FROM autobroadcast WHERE id = ? AND (realmid = ? OR realmid = -1)", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_INS_AUTOBROADCAST_LOCALE, "REPLACE INTO autobroadcast_locale (realmid, id, locale, text) VALUES (?, ?, ?, ?)", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_DEL_AUTOBROADCAST_LOCALE, "DELETE FROM autobroadcast_locale WHERE id = ? AND (realmid = ? OR realmid = -1)", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_SEL_AUTOBROADCAST_BY_ID, "SELECT 1 FROM autobroadcast WHERE id = ? AND (realmid = ? OR realmid = -1)", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_SEL_AUTOBROADCAST_LOCALE_BY_ID, "SELECT locale, text FROM autobroadcast_locale WHERE (realmid = ? OR realmid = -1) AND id = ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_SEL_AUTOBROADCAST_MAX_ID, "SELECT MAX(id) 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_SEL_MOTD_LOCALE, "SELECT locale, text FROM motd_localized WHERE realmid = ? OR realmid = -1 ORDER BY realmid DESC", CONNECTION_SYNCH);
|
||||
PrepareStatement(LOGIN_REP_MOTD, "REPLACE INTO motd (realmid, text) VALUES (?, ?)", CONNECTION_ASYNC);
|
||||
|
||||
@@ -100,6 +100,13 @@ enum LoginDatabaseStatements : uint32
|
||||
LOGIN_DEL_ACCOUNT,
|
||||
LOGIN_SEL_AUTOBROADCAST,
|
||||
LOGIN_SEL_AUTOBROADCAST_LOCALIZED,
|
||||
LOGIN_INS_AUTOBROADCAST,
|
||||
LOGIN_DEL_AUTOBROADCAST,
|
||||
LOGIN_INS_AUTOBROADCAST_LOCALE,
|
||||
LOGIN_DEL_AUTOBROADCAST_LOCALE,
|
||||
LOGIN_SEL_AUTOBROADCAST_BY_ID,
|
||||
LOGIN_SEL_AUTOBROADCAST_LOCALE_BY_ID,
|
||||
LOGIN_SEL_AUTOBROADCAST_MAX_ID,
|
||||
LOGIN_SEL_MOTD,
|
||||
LOGIN_SEL_MOTD_LOCALE,
|
||||
LOGIN_REP_MOTD,
|
||||
|
||||
@@ -1203,7 +1203,19 @@ enum AcoreStrings
|
||||
LANG_BF_QUEUE_PLAYER_QUEUE = 5123,
|
||||
LANG_BF_QUEUE_PLAYER_INVITED = 5124,
|
||||
LANG_BF_QUEUE_PLAYER_WAR = 5125,
|
||||
// Room for more strings 5126-9999
|
||||
|
||||
// Autobroadcast commands
|
||||
LANG_AUTOBROADCAST_LIST_HEADER = 5126,
|
||||
LANG_AUTOBROADCAST_LIST_ENTRY = 5127,
|
||||
LANG_AUTOBROADCAST_LIST_EMPTY = 5128,
|
||||
LANG_AUTOBROADCAST_ADD_SUCCESS = 5129,
|
||||
LANG_AUTOBROADCAST_REMOVE_SUCCESS = 5130,
|
||||
LANG_AUTOBROADCAST_NOT_FOUND = 5131,
|
||||
LANG_AUTOBROADCAST_LOCALE_SUCCESS = 5132,
|
||||
LANG_AUTOBROADCAST_LOCALE_ENTRY = 5133,
|
||||
LANG_AUTOBROADCAST_INVALID_LOCALE = 5134,
|
||||
|
||||
// Room for more strings 5135-9999
|
||||
|
||||
// Level requirement notifications
|
||||
LANG_SAY_REQ = 6604,
|
||||
|
||||
208
src/server/scripts/Commands/cs_autobroadcast.cpp
Normal file
208
src/server/scripts/Commands/cs_autobroadcast.cpp
Normal file
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "AutobroadcastMgr.h"
|
||||
#include "Chat.h"
|
||||
#include "CommandScript.h"
|
||||
#include "Config.h"
|
||||
#include "Language.h"
|
||||
|
||||
using namespace Acore::ChatCommands;
|
||||
|
||||
class autobroadcast_commandscript : public CommandScript
|
||||
{
|
||||
public:
|
||||
autobroadcast_commandscript() : CommandScript("autobroadcast_commandscript") { }
|
||||
|
||||
ChatCommandTable GetCommands() const override
|
||||
{
|
||||
static ChatCommandTable autobroadcastCommandTable =
|
||||
{
|
||||
{ "list", HandleAutobroadcastListCommand, SEC_GAMEMASTER, Console::Yes },
|
||||
{ "add", HandleAutobroadcastAddCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "locale", HandleAutobroadcastLocaleCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "remove", HandleAutobroadcastRemoveCommand, SEC_ADMINISTRATOR, Console::Yes }
|
||||
};
|
||||
|
||||
static ChatCommandTable commandTable =
|
||||
{
|
||||
{ "autobroadcast", autobroadcastCommandTable }
|
||||
};
|
||||
|
||||
return commandTable;
|
||||
}
|
||||
|
||||
static bool HandleAutobroadcastListCommand(ChatHandler* handler)
|
||||
{
|
||||
uint32 realmId = sConfigMgr->GetOption<int32>("RealmID", 0);
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST);
|
||||
stmt->SetData(0, realmId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
if (!result)
|
||||
{
|
||||
handler->SendSysMessage(LANG_AUTOBROADCAST_LIST_EMPTY);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Prefetch all locales and group by id
|
||||
LoginDatabasePreparedStatement* localeStmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST_LOCALIZED);
|
||||
localeStmt->SetData(0, realmId);
|
||||
PreparedQueryResult localeResult = LoginDatabase.Query(localeStmt);
|
||||
|
||||
std::unordered_map<uint32, std::vector<std::pair<std::string, std::string>>> localeMap;
|
||||
if (localeResult)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field* localeFields = localeResult->Fetch();
|
||||
uint32 localeId = localeFields[0].Get<uint32>();
|
||||
std::string locale = localeFields[1].Get<std::string>();
|
||||
std::string localeText = localeFields[2].Get<std::string>();
|
||||
localeMap[localeId].emplace_back(std::move(locale), std::move(localeText));
|
||||
} while (localeResult->NextRow());
|
||||
}
|
||||
|
||||
handler->SendSysMessage(LANG_AUTOBROADCAST_LIST_HEADER);
|
||||
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
uint32 id = fields[0].Get<uint32>();
|
||||
uint8 weight = fields[1].Get<uint8>();
|
||||
std::string text = fields[2].Get<std::string>();
|
||||
|
||||
handler->PSendSysMessage(LANG_AUTOBROADCAST_LIST_ENTRY, id, weight, text);
|
||||
|
||||
auto itr = localeMap.find(id);
|
||||
if (itr != localeMap.end())
|
||||
for (auto const& [locale, localeText] : itr->second)
|
||||
handler->PSendSysMessage(LANG_AUTOBROADCAST_LOCALE_ENTRY, locale, localeText);
|
||||
} while (result->NextRow());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool HandleAutobroadcastAddCommand(ChatHandler* handler, uint8 weight, Tail text)
|
||||
{
|
||||
if (text.empty())
|
||||
return false;
|
||||
|
||||
uint32 realmId = sConfigMgr->GetOption<int32>("RealmID", 0);
|
||||
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_AUTOBROADCAST);
|
||||
stmt->SetData(0, realmId);
|
||||
stmt->SetData(1, weight);
|
||||
stmt->SetData(2, std::string(text));
|
||||
LoginDatabase.DirectExecute(stmt);
|
||||
|
||||
// Retrieve the newly inserted ID
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST_MAX_ID);
|
||||
stmt->SetData(0, realmId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
uint32 newId = 0;
|
||||
if (result)
|
||||
newId = result->Fetch()[0].Get<uint32>();
|
||||
|
||||
sAutobroadcastMgr->LoadAutobroadcasts();
|
||||
sAutobroadcastMgr->LoadAutobroadcastsLocalized();
|
||||
|
||||
handler->PSendSysMessage(LANG_AUTOBROADCAST_ADD_SUCCESS, newId);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool HandleAutobroadcastLocaleCommand(ChatHandler* handler, uint32 id, std::string locale, Tail text)
|
||||
{
|
||||
if (text.empty())
|
||||
return false;
|
||||
|
||||
if (!IsLocaleValid(locale))
|
||||
{
|
||||
handler->SendErrorMessage(LANG_AUTOBROADCAST_INVALID_LOCALE);
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32 realmId = sConfigMgr->GetOption<int32>("RealmID", 0);
|
||||
|
||||
// Verify the autobroadcast entry exists
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST_BY_ID);
|
||||
stmt->SetData(0, id);
|
||||
stmt->SetData(1, realmId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
if (!result)
|
||||
{
|
||||
handler->SendErrorMessage(LANG_AUTOBROADCAST_NOT_FOUND, id);
|
||||
return true;
|
||||
}
|
||||
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_AUTOBROADCAST_LOCALE);
|
||||
stmt->SetData(0, realmId);
|
||||
stmt->SetData(1, id);
|
||||
stmt->SetData(2, locale);
|
||||
stmt->SetData(3, std::string(text));
|
||||
LoginDatabase.DirectExecute(stmt);
|
||||
|
||||
sAutobroadcastMgr->LoadAutobroadcasts();
|
||||
sAutobroadcastMgr->LoadAutobroadcastsLocalized();
|
||||
|
||||
handler->PSendSysMessage(LANG_AUTOBROADCAST_LOCALE_SUCCESS, locale, id);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool HandleAutobroadcastRemoveCommand(ChatHandler* handler, uint32 id)
|
||||
{
|
||||
uint32 realmId = sConfigMgr->GetOption<int32>("RealmID", 0);
|
||||
|
||||
// Verify the autobroadcast entry exists
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST_BY_ID);
|
||||
stmt->SetData(0, id);
|
||||
stmt->SetData(1, realmId);
|
||||
PreparedQueryResult result = LoginDatabase.Query(stmt);
|
||||
|
||||
if (!result)
|
||||
{
|
||||
handler->SendErrorMessage(LANG_AUTOBROADCAST_NOT_FOUND, id);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Delete the autobroadcast entry
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_AUTOBROADCAST);
|
||||
stmt->SetData(0, id);
|
||||
stmt->SetData(1, realmId);
|
||||
LoginDatabase.DirectExecute(stmt);
|
||||
|
||||
// Delete associated locale entries
|
||||
stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_AUTOBROADCAST_LOCALE);
|
||||
stmt->SetData(0, id);
|
||||
stmt->SetData(1, realmId);
|
||||
LoginDatabase.DirectExecute(stmt);
|
||||
|
||||
sAutobroadcastMgr->LoadAutobroadcasts();
|
||||
sAutobroadcastMgr->LoadAutobroadcastsLocalized();
|
||||
|
||||
handler->PSendSysMessage(LANG_AUTOBROADCAST_REMOVE_SUCCESS, id);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_autobroadcast_commandscript()
|
||||
{
|
||||
new autobroadcast_commandscript();
|
||||
}
|
||||
@@ -19,6 +19,7 @@
|
||||
void AddSC_account_commandscript();
|
||||
void AddSC_achievement_commandscript();
|
||||
void AddSC_arena_commandscript();
|
||||
void AddSC_autobroadcast_commandscript();
|
||||
void AddSC_bag_commandscript();
|
||||
void AddSC_ban_commandscript();
|
||||
void AddSC_bf_commandscript();
|
||||
@@ -73,6 +74,7 @@ void AddCommandsScripts()
|
||||
AddSC_account_commandscript();
|
||||
AddSC_achievement_commandscript();
|
||||
AddSC_arena_commandscript();
|
||||
AddSC_autobroadcast_commandscript();
|
||||
AddSC_bag_commandscript();
|
||||
AddSC_ban_commandscript();
|
||||
AddSC_bf_commandscript();
|
||||
|
||||
Reference in New Issue
Block a user