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
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 
uint16 GetTotalAvailableHooks ()
 

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, Tail money)
 

Additional Inherited Members

- Protected Member Functions inherited from CommandScript
 CommandScript (const char *name)
 
- Protected Member Functions inherited from ScriptObject
 ScriptObject (const char *name, uint16 totalAvailableHooks=0)
 
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 {
44 };
45
46 static ChatCommandTable commandTable =
47 {
48 { "send", sendCommandTable }
49 };
50
51 return commandTable;
52 }
static bool HandleSendMoneyCommand(ChatHandler *handler, Optional< PlayerIdentifier > target, QuotedString subject, QuotedString text, Tail 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
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:46
@ RBAC_PERM_COMMAND_SEND_MESSAGE
Definition RBAC.h:317
@ RBAC_PERM_COMMAND_SEND_MAIL
Definition RBAC.h:316
@ RBAC_PERM_COMMAND_SEND_MONEY
Definition RBAC.h:318
@ RBAC_PERM_COMMAND_SEND_ITEMS
Definition RBAC.h:315

References HandleSendItemsCommand(), HandleSendMailCommand(), HandleSendMessageCommand(), HandleSendMoneyCommand(), rbac::RBAC_PERM_COMMAND_SEND_ITEMS, rbac::RBAC_PERM_COMMAND_SEND_MAIL, rbac::RBAC_PERM_COMMAND_SEND_MESSAGE, and rbac::RBAC_PERM_COMMAND_SEND_MONEY.

◆ 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::StringFormat("> 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()));
138 return true;
139 }
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint32_t uint32
Definition Define.h:107
@ LANG_COMMAND_INVALID_ITEM_COUNT
Definition Language.h:84
@ LANG_COMMAND_MAIL_ITEMS_LIMIT
Definition Language.h:85
@ LANG_MAIL_SENT
Definition Language.h:213
@ LANG_COMMAND_ITEMIDINVALID
Definition Language.h:476
#define MAX_MAIL_ITEMS
Definition Mail.h:33
@ MAIL_STATIONERY_GM
Definition Mail.h:59
@ MAIL_NORMAL
Definition Mail.h:37
#define sObjectMgr
Definition ObjectMgr.h:1723
std::string playerLink(std::string const &name) const
Definition Chat.h:231
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
WorldSession * GetSession()
Definition Chat.h:242
void SendErrorMessage(uint32 entry)
Definition Chat.cpp:224
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:168
Definition Item.h:220
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1087
Definition Mail.h:119
Definition Mail.h:105
Definition Mail.h:83
LowType GetCounter() const
Definition ObjectGuid.h:145
uint32 LowType
Definition ObjectGuid.h:122
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
Player * GetPlayer() const
Definition WorldSession.h:454
Definition AsioHacksFwd.h:47
std::string StringFormat(FormatStringView fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:44
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition Tokenize.cpp:20
static Optional< PlayerIdentifier > FromTargetOrSelf(ChatHandler *handler)
Definition ChatCommandTags.h:189
Definition ItemTemplate.h:619
int32 MaxCount
Definition ItemTemplate.h:644
uint32 GetMaxStackSize() const
Definition ItemTemplate.h:727

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::StringFormat(), 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()));
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("{}", msg);
184 player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
185
186 // Confirmation message
187 handler->PSendSysMessage(LANG_SENDMESSAGE, handler->playerLink(target->GetName()), msg);
188
189 return true;
190 }
@ LANG_SENDMESSAGE
Definition Language.h:903
Definition Player.h:1084
WorldSession * GetSession() const
Definition Player.h:2020
void SendAreaTriggerMessage(std::string_view str)
Definition WorldSession.cpp:267

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,
Tail  money 
)
inlinestatic
193 {
194 if (!target)
195 target = PlayerIdentifier::FromTargetOrSelf(handler);
196
197 if (!target)
198 return false;
199
200 auto IsExistWord = [](std::string_view line, std::initializer_list<std::string_view> words)
201 {
202 for (auto const& word : words)
203 {
204 if (line.find(word) != std::string_view::npos)
205 return true;
206 }
207
208 return false;
209 };
210
211 Optional<int32> moneyToAddO = IsExistWord(money, { "g", "s", "c" }) ? MoneyStringToMoney(money) : Acore::StringTo<int32>(money);
212
213 if (!moneyToAddO)
214 return false;
215
216 int32 moneyToAdd = *moneyToAddO;
217
218 // from console show not existed sender
219 MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM);
220
221 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
222
223 MailDraft(subject, text)
224 .AddMoney(moneyToAdd)
225 .SendMailTo(trans, MailReceiver(target->GetConnectedPlayer(), target->GetGUID().GetCounter()), sender);
226
227 CharacterDatabase.CommitTransaction(trans);
228
229 handler->PSendSysMessage(LANG_MAIL_SENT, handler->playerLink(target->GetName()));
230 return true;
231 }
std::int32_t int32
Definition Define.h:103
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:24
Optional< int32 > MoneyStringToMoney(std::string_view moneyString)
Definition Util.cpp:108
MailDraft & AddMoney(uint32 money)
Definition Mail.h:137
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:185
Optional< Result > StringTo(std::string_view str, Params &&... params)
Definition StringConvert.h:244

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

Referenced by GetCommands().


The documentation for this class was generated from the following file: