aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Miscellaneous/Language.h8
-rw-r--r--src/server/scripts/Commands/cs_list.cpp110
-rw-r--r--src/server/scripts/Commands/cs_message.cpp2
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp4
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.h3
5 files changed, 126 insertions, 1 deletions
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 1ac10e156ad..ca48fc8730d 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -896,7 +896,13 @@ enum TrinityStrings
LANG_GROUP_FULL = 1148,
LANG_GROUP_TYPE = 1149,
LANG_GROUP_PLAYER_NAME_GUID = 1150,
- // Room for more level 3 1151-1199 not used
+ LANG_LIST_MAIL_HEADER = 1151,
+ LANG_LIST_MAIL_INFO_1 = 1152,
+ LANG_LIST_MAIL_INFO_2 = 1153,
+ LANG_LIST_MAIL_INFO_3 = 1154,
+ LANG_LIST_MAIL_INFO_ITEM = 1155,
+ LANG_LIST_MAIL_NOT_FOUND = 1156,
+ // Room for more level 3 1157-1199 not used
// Debug commands
LANG_CINEMATIC_NOT_EXIST = 1200,
diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp
index 2ae91f4670d..bbff716253e 100644
--- a/src/server/scripts/Commands/cs_list.cpp
+++ b/src/server/scripts/Commands/cs_list.cpp
@@ -29,6 +29,7 @@ EndScriptData */
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Player.h"
+#include <iostream>
class list_commandscript : public CommandScript
{
@@ -43,6 +44,7 @@ public:
{ "item", SEC_ADMINISTRATOR, true, &HandleListItemCommand, "", NULL },
{ "object", SEC_ADMINISTRATOR, true, &HandleListObjectCommand, "", NULL },
{ "auras", SEC_ADMINISTRATOR, false, &HandleListAurasCommand, "", NULL },
+ { "mail", SEC_ADMINISTRATOR, true, &HandleListMailCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
@@ -463,6 +465,114 @@ public:
return true;
}
+ // handle list mail command
+ static bool HandleListMailCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+
+ if (!*args)
+ return false;
+
+ uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, targetName))
+ {
+ target = sObjectMgr->GetPlayerByLowGUID(parseGUID);
+ targetGuid = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_LIST_COUNT);
+ stmt->setUInt32(0, targetGuid);
+ PreparedQueryResult result = CharacterDatabase.Query(stmt);
+ if (result)
+ {
+ Field* fields = result->Fetch();
+ uint32 countMail = fields[0].GetUInt64();
+ std::string nameLink = handler->playerLink(targetName);
+ handler->PSendSysMessage(LANG_LIST_MAIL_HEADER, countMail, nameLink.c_str(), targetGuid);
+ handler->PSendSysMessage(LANG_ACCOUNT_LIST_BAR);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_LIST_INFO);
+ stmt->setUInt32(0, targetGuid);
+ PreparedQueryResult result = CharacterDatabase.Query(stmt);
+ if (result)
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 messageId = fields[0].GetUInt32();
+ uint32 senderId = fields[1].GetUInt32();
+ std::string sender = fields[2].GetString();
+ uint32 receiverId = fields[3].GetUInt32();
+ std::string receiver = fields[4].GetString();
+ std::string subject = fields[5].GetString();
+ uint64 deliverTime = fields[6].GetUInt32();
+ uint64 expireTime = fields[7].GetUInt32();
+ uint32 money = fields[8].GetUInt32();
+ int hasItem = fields[9].GetUInt8();
+ uint32 gold = money /GOLD;
+ uint32 silv = (money % GOLD) / SILVER;
+ uint32 copp = (money % GOLD) % SILVER;
+ std::string receiverStr = handler->playerLink(receiver);
+ std::string senderStr = handler->playerLink(sender);
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_1 , messageId, subject.c_str(),gold, silv, copp);
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_2, senderStr.c_str(), senderId, receiverStr.c_str(), receiverId);
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_3, TimeToTimestampStr(deliverTime).c_str(), TimeToTimestampStr(expireTime).c_str());
+ if (hasItem == 1)
+ {
+ QueryResult result2;
+ result2 = CharacterDatabase.PQuery("SELECT item_guid FROM mail_items WHERE mail_id = '%u'", messageId);
+ if (result2)
+ {
+ do
+ {
+ uint32 item_guid = (*result2)[0].GetUInt32();
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_LIST_ITEMS);
+ stmt->setUInt32(0, item_guid);
+ PreparedQueryResult result3 = CharacterDatabase.Query(stmt);
+ if (result3)
+ {
+ do
+ {
+ Field* fields = result3->Fetch();
+ uint32 item_entry = fields[0].GetUInt32();
+ uint32 item_count = fields[1].GetUInt32();
+ QueryResult result4;
+ result4 = WorldDatabase.PQuery("SELECT name,quality FROM item_template WHERE entry = '%u'", item_entry);
+ Field* fields1 = result4->Fetch();
+ std::string item_name = fields1[0].GetString();
+ int item_quality = fields1[1].GetUInt8();
+ if (handler->GetSession())
+ {
+ uint32 color = ItemQualityColors[item_quality];
+ std::ostringstream itemStr;
+ itemStr << "|c" << std::hex << color << "|Hitem:" << item_entry << ":0:0:0:0:0:0:0:0:0|h[" << item_name << "]|h|r";
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_ITEM, itemStr.str().c_str(), item_entry, item_guid, item_count);
+ }
+ else
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_ITEM, item_name.c_str(), item_entry, item_guid, item_count);
+ }
+ while (result3->NextRow());
+ }
+ }
+ while (result2->NextRow());
+ }
+ }
+ handler->PSendSysMessage(LANG_ACCOUNT_LIST_BAR);
+ }
+ while (result->NextRow());
+ }
+ else
+ handler->PSendSysMessage(LANG_LIST_MAIL_NOT_FOUND);
+ return true;
+ }
+ else
+ handler->PSendSysMessage(LANG_LIST_MAIL_NOT_FOUND);
+ return true;
+ }
};
void AddSC_list_commandscript()
diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp
index 218d16d8b68..cc50490e831 100644
--- a/src/server/scripts/Commands/cs_message.cpp
+++ b/src/server/scripts/Commands/cs_message.cpp
@@ -210,6 +210,7 @@ public:
{
std::string name = strtok(NULL, " ");
if (normalizePlayerName(name))
+ {
if (Player* player = sObjectAccessor->FindPlayerByName(name))
{
handler->GetSession()->GetPlayer()->RemoveFromWhisperWhiteList(player->GetGUID());
@@ -222,6 +223,7 @@ public:
handler->SetSentErrorMessage(true);
return false;
}
+ }
}
handler->SendSysMessage(LANG_USE_BOL);
handler->SetSentErrorMessage(true);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 0838007a53c..811032f11c9 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -38,6 +38,10 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_GUID_BY_NAME_FILTER, "SELECT guid, name FROM characters WHERE name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_BANINFO_LIST, "SELECT bandate, unbandate, bannedby, banreason FROM character_banned WHERE guid = ? ORDER BY unbandate", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_BANNED_NAME, "SELECT characters.name FROM characters, character_banned WHERE character_banned.guid = ? AND character_banned.guid = characters.guid", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_LIST_COUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? ", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_LIST_INFO, "SELECT id, sender, (SELECT name FROM characters WHERE guid = sender) AS sendername, receiver, (SELECT name FROM characters WHERE guid = receiver) AS receivername, "
+ "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, "
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot "
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index 27be26636c7..ad146b8e98f 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -58,6 +58,9 @@ enum CharacterDatabaseStatements
CHAR_SEL_GUID_BY_NAME_FILTER,
CHAR_SEL_BANINFO_LIST,
CHAR_SEL_BANNED_NAME,
+ CHAR_SEL_MAIL_LIST_COUNT,
+ CHAR_SEL_MAIL_LIST_INFO,
+ CHAR_SEL_MAIL_LIST_ITEMS,
CHAR_SEL_ENUM,
CHAR_SEL_ENUM_DECLINED_NAME,
CHAR_SEL_FREE_NAME,