* Added support for logging chats: Guild, raid, party, public, officer chat, addon messages, whispers, system/custom channels.
* Added config options to enable/disable them (ChatLogs.*), LogDB.Chat (enables/disables DB logging of chats), and ChatLogFile to specify the log file to use. --HG-- branch : trunk
This commit is contained in:
+2
-2
@@ -30,8 +30,6 @@
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
class Channel
|
||||
{
|
||||
enum ChatNotify
|
||||
{
|
||||
CHAT_JOINED_NOTICE = 0x00, //+ "%s joined channel.";
|
||||
@@ -119,6 +117,8 @@ class Channel
|
||||
// 0x80
|
||||
};
|
||||
|
||||
class Channel
|
||||
{
|
||||
struct PlayerInfo
|
||||
{
|
||||
uint64 player;
|
||||
|
||||
@@ -86,6 +86,21 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
|
||||
if(lang == LANG_ADDON)
|
||||
{
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_ADDON))
|
||||
{
|
||||
std::string msg = "";
|
||||
recv_data >> msg;
|
||||
|
||||
if(msg.empty())
|
||||
{
|
||||
sLog.outDebug("Player %s send empty addon msg", GetPlayer()->GetName());
|
||||
return;
|
||||
}
|
||||
|
||||
sLog.outChat("[ADDON] Player %s sends: %s",
|
||||
GetPlayer()->GetName(), msg.c_str());
|
||||
}
|
||||
|
||||
// Disabled addon channel?
|
||||
if(!sWorld.getConfig(CONFIG_ADDON_CHANNEL))
|
||||
return;
|
||||
@@ -245,6 +260,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
WorldPacket data;
|
||||
ChatHandler::FillMessageData(&data, this, CHAT_MSG_PARTY, lang, NULL, 0, msg.c_str(),NULL);
|
||||
group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID()));
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_PARTY))
|
||||
sLog.outChat("[PARTY] Player %s tells group with leader %s: %s",
|
||||
GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str());
|
||||
}
|
||||
break;
|
||||
case CHAT_MSG_GUILD:
|
||||
@@ -270,6 +289,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
|
||||
if (guild)
|
||||
guild->BroadcastToGuild(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_GUILD))
|
||||
sLog.outChat("[GUILD] Player %s tells guild %s: %s",
|
||||
GetPlayer()->GetName(), guild->GetName(), msg.c_str());
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -297,6 +320,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
|
||||
if (guild)
|
||||
guild->BroadcastToOfficers(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_GUILD))
|
||||
sLog.outChat("[OFFICER] Player %s tells guild %s officers: %s",
|
||||
GetPlayer()->GetName(), guild->GetName(), msg.c_str());
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -327,6 +354,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
WorldPacket data;
|
||||
ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID, lang, "", 0, msg.c_str(),NULL);
|
||||
group->BroadcastPacket(&data, false);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_RAID))
|
||||
sLog.outChat("[RAID] Player %s tells raid with leader %s: %s",
|
||||
GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str());
|
||||
} break;
|
||||
case CHAT_MSG_RAID_LEADER:
|
||||
{
|
||||
@@ -354,6 +385,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
WorldPacket data;
|
||||
ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID_LEADER, lang, "", 0, msg.c_str(),NULL);
|
||||
group->BroadcastPacket(&data, false);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_RAID))
|
||||
sLog.outChat("[RAID] Leader player %s tells raid: %s",
|
||||
GetPlayer()->GetName(), msg.c_str());
|
||||
} break;
|
||||
case CHAT_MSG_RAID_WARNING:
|
||||
{
|
||||
@@ -375,6 +410,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
//in battleground, raid warning is sent only to players in battleground - code is ok
|
||||
ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID_WARNING, lang, "", 0, msg.c_str(),NULL);
|
||||
group->BroadcastPacket(&data, false);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_RAID))
|
||||
sLog.outChat("[RAID] Leader player %s warns raid with: %s",
|
||||
GetPlayer()->GetName(), msg.c_str());
|
||||
} break;
|
||||
|
||||
case CHAT_MSG_BATTLEGROUND:
|
||||
@@ -440,8 +479,21 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
|
||||
|
||||
if(ChannelMgr* cMgr = channelMgr(_player->GetTeam()))
|
||||
{
|
||||
if(Channel *chn = cMgr->GetChannel(channel,_player))
|
||||
Channel *chn = cMgr->GetChannel(channel,_player);
|
||||
if(chn)
|
||||
chn->Say(_player->GetGUID(),msg.c_str(),lang);
|
||||
|
||||
if(chn->HasFlag(CHANNEL_FLAG_TRADE) ||
|
||||
chn->HasFlag(CHANNEL_FLAG_GENERAL) ||
|
||||
chn->HasFlag(CHANNEL_FLAG_CITY) ||
|
||||
chn->HasFlag(CHANNEL_FLAG_LFG))
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_SYSCHAN))
|
||||
sLog.outChat("[SYSCHAN] Player %s tells channel %s: %s",
|
||||
GetPlayer()->GetName(), chn->GetName(), msg.c_str());
|
||||
else
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_CHANNEL))
|
||||
sLog.outChat("[CHANNEL] Player %s tells channel %s: %s",
|
||||
GetPlayer()->GetName(), chn->GetName(), msg.c_str());
|
||||
}
|
||||
} break;
|
||||
|
||||
|
||||
@@ -17071,6 +17071,10 @@ void Player::Say(const std::string& text, const uint32 language)
|
||||
WorldPacket data(SMSG_MESSAGECHAT, 200);
|
||||
BuildPlayerChat(&data, CHAT_MSG_SAY, text, language);
|
||||
SendMessageToSetInRange(&data,sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY),true);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_PUBLIC))
|
||||
sLog.outChat("[SAY] Player %s says (language %u): %s",
|
||||
GetName(), language, text.c_str());
|
||||
}
|
||||
|
||||
void Player::Yell(const std::string& text, const uint32 language)
|
||||
@@ -17078,6 +17082,10 @@ void Player::Yell(const std::string& text, const uint32 language)
|
||||
WorldPacket data(SMSG_MESSAGECHAT, 200);
|
||||
BuildPlayerChat(&data, CHAT_MSG_YELL, text, language);
|
||||
SendMessageToSetInRange(&data,sWorld.getConfig(CONFIG_LISTEN_RANGE_YELL),true);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_PUBLIC))
|
||||
sLog.outChat("[YELL] Player %s yells (language %u): %s",
|
||||
GetName(), language, text.c_str());
|
||||
}
|
||||
|
||||
void Player::TextEmote(const std::string& text)
|
||||
@@ -17085,6 +17093,10 @@ void Player::TextEmote(const std::string& text)
|
||||
WorldPacket data(SMSG_MESSAGECHAT, 200);
|
||||
BuildPlayerChat(&data, CHAT_MSG_EMOTE, text, LANG_UNIVERSAL);
|
||||
SendMessageToSetInRange(&data,sWorld.getConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE),true, !sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT), true );
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_PUBLIC))
|
||||
sLog.outChat("[TEXTEMOTE] Player %s emotes: %s",
|
||||
GetName(), text.c_str());
|
||||
}
|
||||
|
||||
void Player::Whisper(const std::string& text, uint32 language,uint64 receiver)
|
||||
@@ -17094,6 +17106,10 @@ void Player::Whisper(const std::string& text, uint32 language,uint64 receiver)
|
||||
|
||||
Player *rPlayer = objmgr.GetPlayer(receiver);
|
||||
|
||||
if(sWorld.getConfig(CONFIG_CHATLOG_WHISPER))
|
||||
sLog.outChat("[WHISPER] Player %s tells %s: %s",
|
||||
GetName(), rPlayer->GetName(), text.c_str());
|
||||
|
||||
// when player you are whispering to is dnd, he cannot receive your message, unless you are in gm mode
|
||||
if(!rPlayer->isDND() || isGameMaster())
|
||||
{
|
||||
|
||||
@@ -1085,6 +1085,16 @@ void World::LoadConfigSettings(bool reload)
|
||||
token = strtok(NULL,delim);
|
||||
}
|
||||
delete[] forbiddenMaps;
|
||||
|
||||
// chat logging
|
||||
m_configs[CONFIG_CHATLOG_CHANNEL] = sConfig.GetBoolDefault("ChatLogs.Channel", false);
|
||||
m_configs[CONFIG_CHATLOG_WHISPER] = sConfig.GetBoolDefault("ChatLogs.Whisper", false);
|
||||
m_configs[CONFIG_CHATLOG_SYSCHAN] = sConfig.GetBoolDefault("ChatLogs.SysChan", false);
|
||||
m_configs[CONFIG_CHATLOG_PARTY] = sConfig.GetBoolDefault("ChatLogs.Party", false);
|
||||
m_configs[CONFIG_CHATLOG_RAID] = sConfig.GetBoolDefault("ChatLogs.Raid", false);
|
||||
m_configs[CONFIG_CHATLOG_GUILD] = sConfig.GetBoolDefault("ChatLogs.Guild", false);
|
||||
m_configs[CONFIG_CHATLOG_PUBLIC] = sConfig.GetBoolDefault("ChatLogs.Public", false);
|
||||
m_configs[CONFIG_CHATLOG_ADDON] = sConfig.GetBoolDefault("ChatLogs.Addon", false);
|
||||
}
|
||||
|
||||
/// Initialize the World
|
||||
|
||||
@@ -216,6 +216,14 @@ enum WorldConfigs
|
||||
CONFIG_MIN_LOG_UPDATE,
|
||||
CONFIG_ENABLE_SINFO_LOGIN,
|
||||
CONFIG_OFFHAND_CHECK_AT_TALENTS_RESET,
|
||||
CONFIG_CHATLOG_CHANNEL,
|
||||
CONFIG_CHATLOG_WHISPER,
|
||||
CONFIG_CHATLOG_SYSCHAN,
|
||||
CONFIG_CHATLOG_PARTY,
|
||||
CONFIG_CHATLOG_RAID,
|
||||
CONFIG_CHATLOG_GUILD,
|
||||
CONFIG_CHATLOG_PUBLIC,
|
||||
CONFIG_CHATLOG_ADDON,
|
||||
CONFIG_VALUE_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -95,6 +95,7 @@ void Log::Initialize()
|
||||
m_dbChar = sConfig.GetBoolDefault("LogDB.Char", false);
|
||||
m_dbRA = sConfig.GetBoolDefault("LogDB.RA", false);
|
||||
m_dbGM = sConfig.GetBoolDefault("LogDB.GM", false);
|
||||
m_dbChat = sConfig.GetBoolDefault("LogDB.Chat", false);
|
||||
|
||||
/// Common log files data
|
||||
m_logsDir = sConfig.GetStringDefault("LogsDir","");
|
||||
@@ -145,6 +146,7 @@ void Log::Initialize()
|
||||
|
||||
dberLogfile = openLogFile("DBErrorLogFile",NULL,"a");
|
||||
raLogfile = openLogFile("RaLogFile",NULL,"a");
|
||||
chatLogfile = openLogFile("ChatLogFile",NULL,"a");
|
||||
|
||||
// Main log file settings
|
||||
m_logLevel = sConfig.GetIntDefault("LogLevel", LOGL_NORMAL);
|
||||
@@ -796,6 +798,33 @@ void Log::outRemote( const char * str, ... )
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void Log::outChat( const char * str, ... )
|
||||
{
|
||||
if( !str )
|
||||
return;
|
||||
|
||||
if (m_enableLogDB && m_dbChat)
|
||||
{
|
||||
va_list ap2;
|
||||
va_start(ap2, str);
|
||||
char nnew_str[MAX_QUERY_LEN];
|
||||
vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
|
||||
outDB(LOG_TYPE_CHAT, nnew_str);
|
||||
va_end(ap2);
|
||||
}
|
||||
|
||||
if (chatLogfile)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, str);
|
||||
vfprintf(chatLogfile, str, ap);
|
||||
fprintf(chatLogfile, "\n" );
|
||||
fflush(chatLogfile);
|
||||
va_end(ap);
|
||||
}
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void outstring_log(const char * str, ...)
|
||||
{
|
||||
if( !str )
|
||||
|
||||
@@ -47,6 +47,7 @@ enum LogTypes
|
||||
LOG_TYPE_RA = 7,
|
||||
LOG_TYPE_GM = 8,
|
||||
LOG_TYPE_CRASH = 9,
|
||||
LOG_TYPE_CHAT = 10,
|
||||
MAX_LOG_TYPES
|
||||
};
|
||||
|
||||
@@ -106,6 +107,7 @@ class Log : public Trinity::Singleton<Log, Trinity::ClassLevelLockable<Log, ZThr
|
||||
void outChar( const char * str, ... ) ATTR_PRINTF(2,3);
|
||||
void outCommand( uint32 account, const char * str, ...) ATTR_PRINTF(3,4);
|
||||
void outRemote( const char * str, ... ) ATTR_PRINTF(2,3);
|
||||
void outChat( const char * str, ... ) ATTR_PRINTF(2,3);
|
||||
void outCharDump( const char * str, uint32 account_id, uint32 guid, const char * name );
|
||||
|
||||
static void outTimestamp(FILE* file);
|
||||
@@ -133,6 +135,7 @@ class Log : public Trinity::Singleton<Log, Trinity::ClassLevelLockable<Log, ZThr
|
||||
FILE* gmLogfile;
|
||||
FILE* charLogfile;
|
||||
FILE* dberLogfile;
|
||||
FILE* chatLogfile;
|
||||
|
||||
// cache values for after initilization use (like gm log per account case)
|
||||
std::string m_logsDir;
|
||||
@@ -159,6 +162,7 @@ class Log : public Trinity::Singleton<Log, Trinity::ClassLevelLockable<Log, ZThr
|
||||
bool m_dbChar;
|
||||
bool m_dbRA;
|
||||
bool m_dbGM;
|
||||
bool m_dbChat;
|
||||
bool m_charLog_Dump;
|
||||
};
|
||||
|
||||
|
||||
@@ -223,6 +223,11 @@ AddonChannel = 1
|
||||
# Default: "Server.log"
|
||||
# "" - Empty name disable creating log file
|
||||
#
|
||||
# ChatLogFile
|
||||
# Log file for chat logs
|
||||
# Default: "chat.log"
|
||||
# "" - Empty name for disable
|
||||
#
|
||||
# LogTimestamp
|
||||
# Logfile with timestamp of server start in name
|
||||
# Default: 0 - no timestamp in name
|
||||
@@ -325,12 +330,53 @@ AddonChannel = 1
|
||||
# Default: 0 - off
|
||||
# 1 - on (very heavy)
|
||||
#
|
||||
# LogDB.Chat
|
||||
# Enable/disable logging chat messages to the database.
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
# ChatLogs.Channel
|
||||
# Enable logging chatting in custom channels.
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
# ChatLogs.Whisper
|
||||
# Enable logging whispers between players.
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
# ChatLogs.Party
|
||||
# Enable logging party messages.
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
# ChatLogs.Raid
|
||||
# Enable logging raid messages.
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
# ChatLogs.Guild
|
||||
# Enable logging guild messages.
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
# ChatLogs.Public
|
||||
# Enable logging public chat events (say/yell/emote).
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
# ChatLogs.Addon
|
||||
# Enable logging addon messages.
|
||||
# Default: 0 - off
|
||||
# 1 - on
|
||||
#
|
||||
###################################################################################################################
|
||||
|
||||
LogSQL = 1
|
||||
PidFile = ""
|
||||
LogLevel = 1
|
||||
LogFile = "Server.log"
|
||||
ChatLogFile = "chat.log"
|
||||
LogTimestamp = 0
|
||||
LogFileLevel = 0
|
||||
LogFilter_AchievementUpdates = 1
|
||||
@@ -353,6 +399,15 @@ LogDB.Char = 0
|
||||
LogDB.GM = 0
|
||||
LogDB.RA = 0
|
||||
LogDB.World = 0
|
||||
LogDB.Chat = 0
|
||||
ChatLogs.Channel = 0
|
||||
ChatLogs.SysChan = 0
|
||||
ChatLogs.Whisper = 0
|
||||
ChatLogs.Party = 0
|
||||
ChatLogs.Raid = 0
|
||||
ChatLogs.Guild = 0
|
||||
ChatLogs.Public = 0
|
||||
ChatLogs.Addon = 0
|
||||
|
||||
###################################################################################################################
|
||||
# SERVER SETTINGS
|
||||
|
||||
Reference in New Issue
Block a user