* 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:
XTZGZoReX
2009-03-25 14:25:15 +01:00
parent 833eaa9ed3
commit 82e966e5f2
8 changed files with 262 additions and 88 deletions
+2 -2
View File
@@ -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;
+53 -1
View File
@@ -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;
+16
View File
@@ -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())
{
+10
View File
@@ -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
+8
View File
@@ -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
};
+29
View File
@@ -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 )
+4
View File
@@ -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;
};
+55
View File
@@ -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