191 {
192
194 "SELECT messageType, sender, receiver, subject, body, money, mailTemplateId, checked, deliver_time"
195 " FROM mail WHERE id = {}", mailId);
196
197 if (!result)
198 {
200 return true;
201 }
202
203 Field* fields = result->Fetch();
207 std::string subject = fields[3].
Get<std::string>();
208 std::string body = fields[4].
Get<std::string>();
213
214
216 {
218 return true;
219 }
220
221
223 {
225 return true;
226 }
227
229 {
231 return true;
232 }
233
234 if (!sender)
235 {
237 return true;
238 }
239
241 {
243 return true;
244 }
245
247
249
250
251
252
253
254
255
256
257
258
259 std::vector<std::pair<
Item*,
bool >> attachments;
260
262 "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments,"
263 " randomPropertyId, durability, playedTime, text, mi.item_guid, itemEntry, ii.owner_guid"
264 " FROM mail_items mi LEFT JOIN item_instance ii ON mi.item_guid = ii.guid"
265 " WHERE mi.mail_id = {}", mailId);
266
267 if (itemResult)
268 {
269 do
270 {
271 Field* itemFields = itemResult->Fetch();
274
275
276 if (
Item* item = player ? player->
GetMItem(itemGuid) :
nullptr)
277 {
278 attachments.emplace_back(item, false);
279 continue;
280 }
281
282
283 if (!itemEntry)
284 {
285 LOG_ERROR(
"misc",
"cs_mail: Mail #{} has dangling mail_items row for item_guid {}. Cleaning up.", mailId, itemGuid);
286
289 trans->Append(delStmt);
290 continue;
291 }
292
294 if (!proto)
295 {
296 LOG_ERROR(
"misc",
"cs_mail: Mail #{} has unknown item (entry: {}, guid: {}). Cleaning up.", mailId, itemEntry, itemGuid);
297
300 trans->Append(delStmt);
301
302
304 continue;
305 }
306
309 ? ObjectGuid::Create<HighGuid::Player>(itemFields[13].Get<uint32>())
311
312 if (!item->
LoadFromDB(itemGuid, ownerGuid, itemFields, itemEntry))
313 {
314 LOG_ERROR(
"misc",
"cs_mail: Item (GUID: {}) in mail #{} failed to load. Cleaning up.", itemGuid, mailId);
315
318 trans->Append(delStmt);
319
320
321
324 continue;
325 }
326
327 attachments.emplace_back(item, true);
328 } while (itemResult->NextRow());
329 }
330
331
332
333 if (player)
334 {
336 bool blocked = false;
337
338 if (attachments.empty())
340
341 for (auto const& [item, loadedFromDb] : attachments)
342 {
343 if (blocked)
344 break;
345
347 }
348
349 if (blocked)
350 {
351 for (auto const& [item, loadedFromDb] : attachments)
352 if (loadedFromDb)
353 delete item;
354
356 return true;
357 }
358 }
359
360
363 trans->Append(stmt);
364
367 trans->Append(stmt);
368
370 if (mailTemplate)
372
373 if (player)
374 {
375
376
379 delete m;
380 }
381
382 for (auto const& [item, loadedFromDb] : attachments)
383 {
384 if (!loadedFromDb)
386
387 draft.AddItem(item);
388 }
389
391 draft.AddMoney(money).SendReturnToSender(accountId, receiver, sender, trans);
392
394
396
398 return true;
399 }
Item * NewItemOrBag(ItemTemplate const *proto)
Definition Bag.h:67
@ CHAR_DEL_INVALID_MAIL_ITEM
Definition CharacterDatabase.h:113
@ CHAR_DEL_MAIL_BY_ID
Definition CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition CharacterDatabase.h:386
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
@ ITEM_REMOVED
Definition Item.h:212
@ LANG_MAIL_RETURN_NOT_NORMAL
Definition Language.h:1227
@ LANG_MAIL_RETURN_ALREADY_RETURNED
Definition Language.h:1229
@ LANG_MAIL_RETURN_HOOK_BLOCKED
Definition Language.h:1230
@ LANG_MAIL_RETURN_NO_SENDER
Definition Language.h:1228
@ LANG_MAIL_RETURN_NOT_FOUND
Definition Language.h:1226
@ LANG_MAIL_RETURN_SUCCESS
Definition Language.h:1225
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sMailMgr
Definition MailMgr.h:85
@ MAIL_CHECK_MASK_RETURNED
Definition Mail.h:48
#define sObjectMgr
Definition ObjectMgr.h:1730
#define sScriptMgr
Definition ScriptMgr.h:743
void SendErrorMessage(uint32 entry)
Definition Chat.cpp:224
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
Definition Item.cpp:420
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:337
void FSetState(ItemUpdateState state)
Definition Item.h:330
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:519
LowType GetCounter() const
Definition ObjectGuid.h:149
static ObjectGuid const Empty
Definition ObjectGuid.h:123
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
void RemoveMail(uint32 id)
Definition Player.cpp:2943
bool RemoveMItem(ObjectGuid::LowType itemLowGuid)
Definition Player.h:1706
Item * GetMItem(ObjectGuid::LowType itemLowGuid)
Definition Player.h:1693
Mail * GetMail(uint32 id)
Definition Player.cpp:3965
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
ObjectGuid GetGUID() const
Definition ChatCommandTags.h:181
std::string const & GetName() const
Definition ChatCommandTags.h:180
Player * GetConnectedPlayer() const
Definition ChatCommandTags.h:183
Definition ItemTemplate.h:619