AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
send_commandscript Class Reference
Inheritance diagram for send_commandscript:
CommandScript ScriptObject

Public Member Functions

 send_commandscript ()
 
ChatCommandTable GetCommands () const override
 
virtual std::vector< Acore::ChatCommands::ChatCommandBuilderGetCommands () const =0
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 

Static Public Member Functions

static bool HandleSendItemsCommand (ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text, Tail items)
 
static bool HandleSendMailCommand (ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text)
 
static bool HandleSendMessageCommand (ChatHandler *handler, Optional< PlayerIdentifier > target, Tail message)
 
static bool HandleSendMoneyCommand (ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text, uint32 money)
 

Additional Inherited Members

- Protected Member Functions inherited from CommandScript
 CommandScript (const char *name)
 
- Protected Member Functions inherited from ScriptObject
 ScriptObject (const char *name)
 
virtual ~ScriptObject ()=default
 

Detailed Description

Constructor & Destructor Documentation

◆ send_commandscript()

send_commandscript::send_commandscript ( )
inline
34: CommandScript("send_commandscript") { }
Definition: ScriptMgr.h:850

Member Function Documentation

◆ GetCommands()

ChatCommandTable send_commandscript::GetCommands ( ) const
inlineoverridevirtual

Implements CommandScript.

37 {
38 static ChatCommandTable sendCommandTable =
39 {
40 { "items", HandleSendItemsCommand, SEC_GAMEMASTER, Console::Yes },
41 { "mail", HandleSendMailCommand, SEC_GAMEMASTER, Console::Yes },
42 { "message", HandleSendMessageCommand, SEC_ADMINISTRATOR, Console::Yes },
43 { "money", HandleSendMoneyCommand, SEC_GAMEMASTER, Console::Yes }
44 };
45
46 static ChatCommandTable commandTable =
47 {
48 { "send", sendCommandTable }
49 };
50
51 return commandTable;
52 }
@ SEC_ADMINISTRATOR
Definition: Common.h:69
@ SEC_GAMEMASTER
Definition: Common.h:68
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:50
static bool HandleSendMoneyCommand(ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text, uint32 money)
Definition: cs_send.cpp:188
static bool HandleSendMailCommand(ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text)
Definition: cs_send.cpp:137
static bool HandleSendItemsCommand(ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text, Tail items)
Definition: cs_send.cpp:54
static bool HandleSendMessageCommand(ChatHandler *handler, Optional< PlayerIdentifier > target, Tail message)
Definition: cs_send.cpp:162

References HandleSendItemsCommand(), HandleSendMailCommand(), HandleSendMessageCommand(), HandleSendMoneyCommand(), SEC_ADMINISTRATOR, and SEC_GAMEMASTER.

◆ HandleSendItemsCommand()

static bool send_commandscript::HandleSendItemsCommand ( ChatHandler handler,
Optional< PlayerIdentifier target,
QuotedString  subject,
QuotedString  text,
Tail  items 
)
inlinestatic
55 {
56 if (!target)
57 {
58 target = PlayerIdentifier::FromTargetOrSelf(handler);
59 }
60
61 if (!target)
62 {
63 return false;
64 }
65
66 // extract items
67 std::vector<std::pair<uint32, uint32>> itemList;
68
69 for (auto const& itemString : Acore::Tokenize(items, ' ', true))
70 {
71 auto itemTokens = Acore::Tokenize(itemString, ':', false);
72
73 if (itemTokens.size() != 2)
74 {
75 handler->SendSysMessage(Acore::StringFormatFmt("> Incorrect item list format for '{}'", itemString));
76 continue;
77 }
78
79 uint32 itemID = *Acore::StringTo<uint32>(itemTokens.at(0));
80 uint32 itemCount = *Acore::StringTo<uint32>(itemTokens.at(1));
81
82 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemID);
83 if (!itemTemplate)
84 {
86 handler->SetSentErrorMessage(true);
87 return false;
88 }
89
90 if (!itemCount || (itemTemplate->MaxCount > 0 && itemCount > uint32(itemTemplate->MaxCount)))
91 {
92 handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemID);
93 handler->SetSentErrorMessage(true);
94 return false;
95 }
96
97 while (itemCount > itemTemplate->GetMaxStackSize())
98 {
99 itemList.emplace_back(itemID, itemTemplate->GetMaxStackSize());
100 itemCount -= itemTemplate->GetMaxStackSize();
101 }
102
103 itemList.emplace_back(itemID, itemCount);
104
105 if (itemList.size() > MAX_MAIL_ITEMS)
106 {
108 handler->SetSentErrorMessage(true);
109 return false;
110 }
111 }
112
113 // If the message is sent from console, set it as sent by the target itself, like the other Customer Support mails.
114 ObjectGuid::LowType senderGuid = handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : target->GetGUID().GetCounter();
115
116 // fill mail
117 MailDraft draft(subject, text);
118 MailSender sender(MAIL_NORMAL, senderGuid, MAIL_STATIONERY_GM);
119 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
120
121 for (auto const& [itemID, itemCount] : itemList)
122 {
123 if (Item* item = Item::CreateItem(itemID, itemCount, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0))
124 {
125 item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
126 draft.AddItem(item);
127 }
128 }
129
130 draft.SendMailTo(trans, MailReceiver(target->GetConnectedPlayer(), target->GetGUID().GetCounter()), sender);
131 CharacterDatabase.CommitTransaction(trans);
132
133 handler->PSendSysMessage(LANG_MAIL_SENT, handler->playerLink(target->GetName()).c_str());
134 return true;
135 }
std::uint32_t uint32
Definition: Define.h:108
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:70
#define sObjectMgr
Definition: ObjectMgr.h:1640
#define MAX_MAIL_ITEMS
Definition: Mail.h:34
@ MAIL_STATIONERY_GM
Definition: Mail.h:60
@ MAIL_NORMAL
Definition: Mail.h:38
@ LANG_COMMAND_INVALID_ITEM_COUNT
Definition: Language.h:84
@ LANG_COMMAND_MAIL_ITEMS_LIMIT
Definition: Language.h:85
@ LANG_MAIL_SENT
Definition: Language.h:209
@ LANG_COMMAND_ITEMIDINVALID
Definition: Language.h:450
std::string StringFormatFmt(std::string_view fmt, Args &&... args)
Definition: StringFormat.h:44
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition: Tokenize.cpp:20
std::string playerLink(std::string const &name) const
Definition: Chat.h:111
WorldSession * GetSession()
Definition: Chat.h:122
void SetSentErrorMessage(bool val)
Definition: Chat.h:118
void PSendSysMessage(char const *fmt, Args &&... args)
Definition: Chat.h:60
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:103
static Optional< PlayerIdentifier > FromTargetOrSelf(ChatHandler *handler)
Definition: ChatCommandTags.h:189
Definition: Item.h:214
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1089
Definition: ItemTemplate.h:628
int32 MaxCount
Definition: ItemTemplate.h:653
uint32 GetMaxStackSize() const
Definition: ItemTemplate.h:738
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
LowType GetCounter() const
Definition: ObjectGuid.h:147
uint32 LowType
Definition: ObjectGuid.h:124
Definition: Mail.h:84
Definition: Mail.h:106
Definition: Mail.h:120
Player * GetPlayer() const
Definition: WorldSession.h:361

References MailDraft::AddItem(), CharacterDatabase, Item::CreateItem(), Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), ObjectGuid::GetCounter(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), WorldSession::GetPlayer(), ChatHandler::GetSession(), LANG_COMMAND_INVALID_ITEM_COUNT, LANG_COMMAND_ITEMIDINVALID, LANG_COMMAND_MAIL_ITEMS_LIMIT, LANG_MAIL_SENT, MAIL_NORMAL, MAIL_STATIONERY_GM, MAX_MAIL_ITEMS, ItemTemplate::MaxCount, ChatHandler::playerLink(), ChatHandler::PSendSysMessage(), MailDraft::SendMailTo(), ChatHandler::SendSysMessage(), ChatHandler::SetSentErrorMessage(), sObjectMgr, Acore::StringFormatFmt(), and Acore::Tokenize().

Referenced by GetCommands().

◆ HandleSendMailCommand()

static bool send_commandscript::HandleSendMailCommand ( ChatHandler handler,
Optional< PlayerIdentifier target,
QuotedString  subject,
QuotedString  text 
)
inlinestatic
138 {
139 if (!target)
140 {
141 target = PlayerIdentifier::FromTargetOrSelf(handler);
142 }
143
144 if (!target)
145 {
146 return false;
147 }
148
149 ObjectGuid::LowType senderGuid = handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : target->GetGUID().GetCounter();
150
151 // If the message is sent from console, set it as sent by the target itself, like the other Customer Support mails.
152 MailSender sender(MAIL_NORMAL, senderGuid, MAIL_STATIONERY_GM);
153 MailDraft draft(subject, text);
154 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
155 draft.SendMailTo(trans, MailReceiver(target->GetConnectedPlayer(), target->GetGUID().GetCounter()), sender);
156 CharacterDatabase.CommitTransaction(trans);
157
158 handler->PSendSysMessage(LANG_MAIL_SENT, handler->playerLink(target->GetName()).c_str());
159 return true;
160 }

References CharacterDatabase, Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldSession::GetPlayer(), ChatHandler::GetSession(), LANG_MAIL_SENT, MAIL_NORMAL, MAIL_STATIONERY_GM, ChatHandler::playerLink(), ChatHandler::PSendSysMessage(), and MailDraft::SendMailTo().

Referenced by GetCommands().

◆ HandleSendMessageCommand()

static bool send_commandscript::HandleSendMessageCommand ( ChatHandler handler,
Optional< PlayerIdentifier target,
Tail  message 
)
inlinestatic
  • Send the message
163 {
164 if (!target)
165 {
166 target = PlayerIdentifier::FromTargetOrSelf(handler);
167 }
168
169 if (!target || !target->IsConnected())
170 {
171 return false;
172 }
173
174 Player* player = target->GetConnectedPlayer();
175 std::string msg = std::string{ message };
176
178 // Use SendAreaTriggerMessage for fastest delivery.
179 player->GetSession()->SendAreaTriggerMessage("%s", msg.c_str());
180 player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
181
182 // Confirmation message
183 handler->PSendSysMessage(LANG_SENDMESSAGE, handler->playerLink(target->GetName()).c_str(), msg.c_str());
184
185 return true;
186 }
@ LANG_SENDMESSAGE
Definition: Language.h:864
Definition: Player.h:1046
WorldSession * GetSession() const
Definition: Player.h:1948
void SendAreaTriggerMessage(const char *Text,...) ATTR_PRINTF(2
Definition: MiscHandler.cpp:714

References Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), Player::GetSession(), LANG_SENDMESSAGE, ChatHandler::playerLink(), ChatHandler::PSendSysMessage(), and WorldSession::SendAreaTriggerMessage().

Referenced by GetCommands().

◆ HandleSendMoneyCommand()

static bool send_commandscript::HandleSendMoneyCommand ( ChatHandler handler,
Optional< PlayerIdentifier target,
QuotedString  subject,
QuotedString  text,
uint32  money 
)
inlinestatic
189 {
190 if (!target)
191 {
192 target = PlayerIdentifier::FromTargetOrSelf(handler);
193 }
194
195 if (!target)
196 {
197 return false;
198 }
199
200 // from console show not existed sender
201 MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM);
202
203 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
204
205 MailDraft(subject, text)
206 .AddMoney(money)
207 .SendMailTo(trans, MailReceiver(target->GetConnectedPlayer(), target->GetGUID().GetCounter()), sender);
208
209 CharacterDatabase.CommitTransaction(trans);
210
211 handler->PSendSysMessage(LANG_MAIL_SENT, handler->playerLink(target->GetName()).c_str());
212 return true;
213 }
MailDraft & AddMoney(uint32 money)
Definition: Mail.h:138
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition: Mail.cpp:186

References MailDraft::AddMoney(), CharacterDatabase, Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldSession::GetPlayer(), ChatHandler::GetSession(), LANG_MAIL_SENT, MAIL_NORMAL, MAIL_STATIONERY_GM, ChatHandler::playerLink(), ChatHandler::PSendSysMessage(), and MailDraft::SendMailTo().

Referenced by GetCommands().