1. void WorldSession::SendExternalMails()
  2. {
  3. sLog->outDetail("EXTERNAL MAIL> Sending mails in queue...");
  4. PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_EXTERNAL_MAIL);
  5. PreparedQueryResult result = CharacterDatabase.Query(stmt);
  6. if (!result)
  7. {
  8. sLog->outDetail("EXTERNAL MAIL> No mails in queue...");
  9. return;
  10. }
  11. SQLTransaction trans = CharacterDatabase.BeginTransaction();
  12. MailDraft* mail = NULL;
  13. do
  14. {
  15. Field *fields = result->Fetch();
  16. uint32 id = fields[0].GetUInt32();
  17. uint32 receiver_guid = fields[1].GetUInt32();
  18. std::string subject = fields[2].GetString();
  19. std::string body = fields[3].GetString();
  20. uint32 money = fields[4].GetUInt32();
  21. uint32 itemId = fields[5].GetUInt32();
  22. uint32 itemCount = fields[6].GetUInt32();
  23. uint32 type = fields[7].GetUInt32();
  24. Player *receiver = ObjectAccessor::FindPlayer(receiver_guid);
  25. switch (type)
  26. {
  27. case 1:
  28. mail = new MailDraft(subject, body);
  29. if (money)
  30. {
  31. sLog->outDetail("EXTERNAL MAIL> Adding money");
  32. mail->AddMoney(money);
  33. }
  34. if (itemId)
  35. {
  36. sLog->outDetail("EXTERNAL MAIL> Adding %u of item with id %u", itemCount, itemId);
  37. if(Item* mailItem = Item::CreateItem(itemId, itemCount))
  38. {
  39. mailItem->SaveToDB(trans);
  40. mail->AddItem(mailItem);
  41. }
  42. }
  43. mail->SendMailTo(trans, receiver ? receiver : MailReceiver(receiver_guid), MailSender(MAIL_NORMAL, 0, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_RETURNED);
  44. delete mail;
  45. stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXTERNAL_MAIL);
  46. stmt->setUInt32(0, id);
  47. trans->Append(stmt);
  48. break;
  49. case 2:
  50. if (receiver)
  51. {
  52. if (AchievementEntry const* achievementEntry = GetAchievementStore()->LookupEntry(itemId))
  53. receiver->CompletedAchievement(achievementEntry);
  54. stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXTERNAL_MAIL);
  55. stmt->setUInt32(0, id);
  56. trans->Append(stmt);
  57. }
  58. break;
  59. }
  60. sLog->outDetail("EXTERNAL MAIL> Mail sent");
  61. } while (result->NextRow());
  62. CharacterDatabase.CommitTransaction(trans);
  63. sLog->outDetail("EXTERNAL MAIL> All Mails Sent...");
  64. }