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: CommandScript.h:25

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:62
@ SEC_GAMEMASTER
Definition: Common.h:61
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:49
static bool HandleSendMoneyCommand(ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text, uint32 money)
Definition: cs_send.cpp:192
static bool HandleSendMailCommand(ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text)
Definition: cs_send.cpp:141
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:166

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 uint32 itemCount;
74 switch (itemTokens.size())
75 {
76 case 1:
77 itemCount = 1; // Default to sending 1 item
78 break;
79 case 2:
80 itemCount = *Acore::StringTo<uint32>(itemTokens.at(1));
81 break;
82 default:
83 handler->SendSysMessage(Acore::StringFormatFmt("> Incorrect item list format for '{}'", itemString));
84 continue;
85 }
86
87 uint32 itemID = *Acore::StringTo<uint32>(itemTokens.at(0));
88
89 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemID);
90 if (!itemTemplate)
91 {
93 return false;
94 }
95
96 if (!itemCount || (itemTemplate->MaxCount > 0 && itemCount > uint32(itemTemplate->MaxCount)))
97 {
98 handler->SendErrorMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemID);
99 return false;
100 }
101
102 while (itemCount > itemTemplate->GetMaxStackSize())
103 {
104 itemList.emplace_back(itemID, itemTemplate->GetMaxStackSize());
105 itemCount -= itemTemplate->GetMaxStackSize();
106 }
107
108 itemList.emplace_back(itemID, itemCount);
109
110 if (itemList.size() > MAX_MAIL_ITEMS)
111 {
113 return false;
114 }
115 }
116
117 // If the message is sent from console, set it as sent by the target itself, like the other Customer Support mails.
118 ObjectGuid::LowType senderGuid = handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : target->GetGUID().GetCounter();
119
120 // fill mail
121 MailDraft draft(subject, text);
122 MailSender sender(MAIL_NORMAL, senderGuid, MAIL_STATIONERY_GM);
123 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
124
125 for (auto const& [itemID, itemCount] : itemList)
126 {
127 if (Item* item = Item::CreateItem(itemID, itemCount, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0))
128 {
129 item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
130 draft.AddItem(item);
131 }
132 }
133
134 draft.SendMailTo(trans, MailReceiver(target->GetConnectedPlayer(), target->GetGUID().GetCounter()), sender);
135 CharacterDatabase.CommitTransaction(trans);
136
137 handler->PSendSysMessage(LANG_MAIL_SENT, handler->playerLink(target->GetName()).c_str());
138 return true;
139 }
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(FormatString< Args... > fmt, Args &&... args)
Definition: StringFormat.h:48
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:128
WorldSession * GetSession()
Definition: Chat.h:139
void SendErrorMessage(uint32 entry)
Definition: Chat.cpp:152
void PSendSysMessage(char const *fmt, Args &&... args)
Definition: Chat.h:60
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:101
static Optional< PlayerIdentifier > FromTargetOrSelf(ChatHandler *handler)
Definition: ChatCommandTags.h:188
Definition: Item.h:214
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1088
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:364

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

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
167 {
168 if (!target)
169 {
170 target = PlayerIdentifier::FromTargetOrSelf(handler);
171 }
172
173 if (!target || !target->IsConnected())
174 {
175 return false;
176 }
177
178 Player* player = target->GetConnectedPlayer();
179 std::string msg = std::string{ message };
180
182 // Use SendAreaTriggerMessage for fastest delivery.
183 player->GetSession()->SendAreaTriggerMessage("%s", msg.c_str());
184 player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
185
186 // Confirmation message
187 handler->PSendSysMessage(LANG_SENDMESSAGE, handler->playerLink(target->GetName()).c_str(), msg.c_str());
188
189 return true;
190 }
@ LANG_SENDMESSAGE
Definition: Language.h:873
Definition: Player.h:1056
WorldSession * GetSession() const
Definition: Player.h:1961
void SendAreaTriggerMessage(const char *Text,...) ATTR_PRINTF(2
Definition: MiscHandler.cpp:691

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
193 {
194 if (!target)
195 {
196 target = PlayerIdentifier::FromTargetOrSelf(handler);
197 }
198
199 if (!target)
200 {
201 return false;
202 }
203
204 // from console show not existed sender
205 MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM);
206
207 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
208
209 MailDraft(subject, text)
210 .AddMoney(money)
211 .SendMailTo(trans, MailReceiver(target->GetConnectedPlayer(), target->GetGUID().GetCounter()), sender);
212
213 CharacterDatabase.CommitTransaction(trans);
214
215 handler->PSendSysMessage(LANG_MAIL_SENT, handler->playerLink(target->GetName()).c_str());
216 return true;
217 }
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().