Chatlog simple
Voici un patch implémentant un chatlog simple mais efficace.
En français !

[code=cpp]diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp
index f4c688c..ed84c49 100644
--- a/src/game/ChatHandler.cpp
+++ b/src/game/ChatHandler.cpp
@@ -180,11 +180,20 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
break;

if(type == CHAT_MSG_SAY)
+ {
+ sLog.outChat(type, "[%s] dit: %s", GetPlayer()->GetName(), msg.c_str());
GetPlayer()->Say(msg, lang);
+ }
else if(type == CHAT_MSG_EMOTE)
+ {
+ sLog.outChat(type, "[%s] %s", GetPlayer()->GetName(), msg.c_str());
GetPlayer()->TextEmote(msg);
+ }
else if(type == CHAT_MSG_YELL)
+ {
+ sLog.outChat(type, "[%s] crie: %s", GetPlayer()->GetName(), msg.c_str());
GetPlayer()->Yell(msg, lang);
+ }
} break;

case CHAT_MSG_WHISPER:
@@ -223,6 +232,7 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
}
}

+ sLog.outChat(type, "[%s] chucote a [%s]: %s", GetPlayer()->GetName(), to.c_str(), msg.c_str());
GetPlayer()->Whisper(msg, lang, player->GetGUID());
} break;

@@ -256,6 +266,11 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
if ((type == CHAT_MSG_PARTY_LEADER) && !group->IsLeader(_player->GetObjectGuid()))
return;

+ if(type == CHAT_MSG_PARTY_LEADER)
+ sLog.outChat(type, "[%s][Groupe - Chef de groupe]: %s", GetPlayer()->GetName(), msg.c_str());
+ else
+ sLog.outChat(type, "[%s][Groupe de %s]: %s", GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str());
+
WorldPacket data;
ChatHandler::FillMessageData(&data, this, type, lang, NULL, 0, msg.c_str(), NULL);
group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetObjectGuid()));
@@ -280,7 +295,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )

if (GetPlayer()->GetGuildId())
if (Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()))
+ {
guild->BroadcastToGuild(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
+ sLog.outChat(type, "[%s][Guilde]<%s>: %s", GetPlayer()->GetName(), guild->GetName().c_str(), msg.c_str());
+ }
} break;

case CHAT_MSG_OFFICER:
@@ -302,7 +320,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )

if (GetPlayer()->GetGuildId())
if (Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()))
+ {
guild->BroadcastToOfficers(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
+ sLog.outChat(type, "[%s][Guild][Officer]<%s>: %s", GetPlayer()->GetName(), guild->GetName().c_str(), msg.c_str());
+ }
} break;

case CHAT_MSG_RAID:
@@ -330,6 +351,8 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
if(!group || group->isBGGroup() || !group->isRaidGroup())
return;
}
+
+ sLog.outChat(type, "[%s][Raid de %s]: %s", GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str());

WorldPacket data;
ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID, lang, "", 0, msg.c_str(), NULL);
@@ -361,6 +384,8 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
return;
}

+ sLog.outChat(type, "[%s][Raid - Chef de Raid]: %s", GetPlayer()->GetName(), msg.c_str());
+
WorldPacket data;
ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID_LEADER, lang, "", 0, msg.c_str(), NULL);
group->BroadcastPacket(&data, false);
@@ -382,6 +407,8 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
!(group->IsLeader(GetPlayer()->GetObjectGuid()) || group->IsAssistant(GetPlayer()->GetObjectGuid())))
return;

+ sLog.outChat(type, "[%s][Raid de %s]: %s", GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str());
+
WorldPacket 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);
@@ -404,6 +431,8 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
if(!group || !group->isBGGroup())
return;

+ sLog.outChat(type, "[%s][Champ de bataille de %s]: %s", GetPlayer()->GetName(), group->GetLeaderName(), msg.c_str());
+
WorldPacket data;
ChatHandler::FillMessageData(&data, this, CHAT_MSG_BATTLEGROUND, lang, "", 0, msg.c_str(), NULL);
group->BroadcastPacket(&data, false);
@@ -425,6 +454,8 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
if (!group || !group->isBGGroup() || !group->IsLeader(GetPlayer()->GetObjectGuid()))
return;

+ sLog.outChat(type, "[%s][Champ de bataille - Chef de groupe]: %s", GetPlayer()->GetName(), msg.c_str());
+
WorldPacket data;
ChatHandler::FillMessageData(&data, this, CHAT_MSG_BATTLEGROUND_LEADER, lang, "", 0, msg.c_str(), NULL);
group->BroadcastPacket(&data, false);
@@ -444,7 +475,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )

if(ChannelMgr* cMgr = channelMgr(_player->GetTeam()))
if(Channel *chn = cMgr->GetChannel(channel, _player))
+ {
chn->Say(_player->GetGUID(), msg.c_str(), lang);
+ sLog.outChat(type , "[%s][%s]: %s", GetPlayer()->GetName(), channel.c_str(), msg.c_str());
+ }
} break;

case CHAT_MSG_AFK:
diff --git a/src/shared/Log.cpp b/src/shared/Log.cpp
index 724d093..91f1cee 100644
--- a/src/shared/Log.cpp
+++ b/src/shared/Log.cpp
@@ -62,7 +62,11 @@ const int LogType_count = int(LogError) +1;

Log::Log() :
raLogfile(NULL), logfile(NULL), gmLogfile(NULL), charLogfile(NULL),
- dberLogfile(NULL), m_colored(false), m_includeTime(false), m_gmlog_per_account(false)
+ dberLogfile(NULL), m_colored(false), m_includeTime(false), m_gmlog_per_account(false),
+ chatLogfile(NULL), m_chatlog_per_type(false), m_chatlog_logsay(false),
+ m_chatlog_logemote(false), m_chatlog_logyell(false), m_chatlog_logwhisper(false),
+ m_chatlog_logparty(false), m_chatlog_logguild(false), m_chatlog_lograid(false),
+ m_chatlog_logbg(false)
{
Initialize();
}
@@ -256,10 +260,48 @@ void Log::Initialize()
}
}

+ m_chatlog_per_type = sConfig.GetBoolDefault("ChatLogPerType", false);
+ if(!m_chatlog_per_type)
+ chatLogfile = openLogFile("ChatLogFile", "ChatLogTimestamp", "a");
+ else {
+ // Chat log settings for per type case
+ m_chatlog_filename_format = sConfig.GetStringDefault("ChatLogFile", "");
+ if(!m_chatlog_filename_format.empty())
+ {
+ bool m_chatlog_timestamp = sConfig.GetBoolDefault("ChatLogTimestamp", false);
+
+ size_t dot_pos = m_chatlog_filename_format.find_last_of(".");
+ if(dot_pos != m_chatlog_filename_format.npos)
+ {
+ if(m_chatlog_timestamp)
+ m_chatlog_filename_format.insert(dot_pos, m_logsTimestamp);
+
+ m_chatlog_filename_format.insert(dot_pos, "_%s");
+ } else {
+ m_chatlog_filename_format += "_%s";
+
+ if(m_chatlog_timestamp)
+ m_chatlog_filename_format += m_logsTimestamp;
+ }
+
+ m_chatlog_filename_format = m_logsDir + m_chatlog_filename_format;
+ }
+ }
+ m_chatlog_logsay = sConfig.GetBoolDefault("ChatLogSay", false);
+ m_chatlog_logemote = sConfig.GetBoolDefault("ChatLogEmote", false);
+ m_chatlog_logyell = sConfig.GetBoolDefault("ChatLogYell", false);
+ m_chatlog_logwhisper = sConfig.GetBoolDefault("ChatLogWhisper", false);
+ m_chatlog_logparty = sConfig.GetBoolDefault("ChatLogParty", false);
+ m_chatlog_logguild = sConfig.GetBoolDefault("ChatLogGuild", false);
+ m_chatlog_lograid = sConfig.GetBoolDefault("ChatLogRaid", false);
+ m_chatlog_logbg = sConfig.GetBoolDefault("ChatLogBG", false);
+ m_chatlog_logchannel = sConfig.GetBoolDefault("ChatLogChannel", false);
+
charLogfile = openLogFile("CharLogFile","CharLogTimestamp","a");
dberLogfile = openLogFile("DBErrorLogFile",NULL,"a");
raLogfile = openLogFile("RaLogFile",NULL,"a");
worldLogfile = openLogFile("WorldLogFile","WorldLogTimestamp","a");
+ forcerestart = openLogFile("forcerestart",NULL,"a");

// Main log file settings
m_includeTime = sConfig.GetBoolDefault("LogTime", false);
@@ -305,6 +347,56 @@ FILE* Log::openGmlogPerAccount(uint32 account)
return fopen(namebuf, "a");
}

+FILE* Log::openChatLogPerType(uint32 chattype)
+{
+ if(m_chatlog_filename_format.empty())
+ return NULL;
+
+ std::string chatstr = "";
+
+ switch(chattype)
+ {
+ case 1: // CHAT_MSG_SAY
+ chatstr = "SAY";
+ break;
+ case 10: // CHAT_MSG_EMOTE
+ chatstr = "EMOTE";
+ break;
+ case 6: // CHAT_MSG_YELL
+ chatstr = "YELL";
+ break;
+ case 7: // CHAT_MSG_WHISPER
+ chatstr = "WHISPER";
+ break;
+ case 2: // CHAT_MSG_PARTY
+ case 51: // CHAT_MSG_PARTY_LEADER
+ chatstr = "PARTY";
+ break;
+ case 4: // CHAT_MSG_GUILD
+ case 5: // CHAT_MSG_OFFICER
+ chatstr = "GUILD";
+ break;
+ case 3: // CHAT_MSG_RAID
+ case 39: // CHAT_MSG_RAID_LEADER
+ case 40: // CHAT_MSG_RAID_WARNING
+ chatstr = "RAID";
+ break;
+ case 44: // CHAT_MSG_BATTLEGROUND
+ case 45: // CHAT_MSG_BATTLEGROUND_LEADER
+ chatstr = "BG";
+ break;
+ case 17: // CHAT_MSG_CHANNEL
+ chatstr = "CHANNEL";
+ break;
+ default:
+ break;
+ }
+
+ char namebuf[MANGOS_PATH_MAX];
+ snprintf(namebuf, MANGOS_PATH_MAX, m_chatlog_filename_format.c_str(), chatstr.c_str());
+ return fopen(namebuf, "a");
+}
+
void Log::outTimestamp(FILE* file)
{
time_t t = time(NULL);
@@ -744,6 +836,110 @@ void Log::outCommand( uint32 account, const char * str, ... )
fflush(stdout);
}

+void Log::outChat( uint32 chattype, const char * str, ... )
+{
+ if( !str )
+ return;
+
+ switch(chattype)
+ {
+ case 1: // CHAT_MSG_SAY
+ if(!m_chatlog_logsay)
+ return;
+ break;
+ case 10: // CHAT_MSG_EMOTE
+ if(!m_chatlog_logemote)
+ return;
+ break;
+ case 6: // CHAT_MSG_YELL
+ if(!m_chatlog_logyell)
+ return;
+ break;
+ case 7: // CHAT_MSG_WHISPER
+ if(!m_chatlog_logwhisper)
+ return;
+ break;
+ case 2: // CHAT_MSG_PARTY
+ case 51: // CHAT_MSG_PARTY_LEADER
+ if(!m_chatlog_logparty)
+ return;
+ break;
+ case 4: // CHAT_MSG_GUILD
+ case 5: // CHAT_MSG_OFFICER
+ if(!m_chatlog_logguild)
+ return;
+ break;
+ case 3: // CHAT_MSG_RAID
+ case 39: // CHAT_MSG_RAID_LEADER
+ case 40: // CHAT_MSG_RAID_WARNING
+ if(!m_chatlog_lograid)
+ return;
+ break;
+ case 44: // CHAT_MSG_BATTLEGROUND
+ case 45: // CHAT_MSG_BATTLEGROUND_LEADER
+ if(!m_chatlog_logbg)
+ return;
+ break;
+ case 17: // CHAT_MSG_CHANNEL
+ if(!m_chatlog_logchannel)
+ return;
+ break;
+ default:
+ break;
+ }
+ if( m_logLevel > 1 )
+ {
+ if(m_colored)
+ SetColor(true,m_colors[LogDetails]);
+
+ if(m_includeTime)
+ outTime();
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if(m_colored)
+ ResetColor(true);
+
+ printf( "\n" );
+ }
+ if(logfile && m_logFileLevel > 1)
+ {
+ va_list ap;
+ outTimestamp(logfile);
+ va_start(ap, str);
+ vfprintf(logfile, str, ap);
+ fprintf(logfile, "\n" );
+ va_end(ap);
+ fflush(logfile);
+ }
+ if (m_chatlog_per_type)
+ {
+ if (FILE* per_file = openChatLogPerType (chattype))
+ {
+ va_list ap;
+ outTimestamp(per_file);
+ va_start(ap, str);
+ vfprintf(per_file, str, ap);
+ fprintf(per_file, "\n" );
+ va_end(ap);
+ fclose(per_file);
+ }
+ } else if (chatLogfile) {
+ va_list ap;
+ outTimestamp(chatLogfile);
+ va_start(ap, str);
+ vfprintf(chatLogfile, str, ap);
+ fprintf(chatLogfile, "\n" );
+ va_end(ap);
+ fflush(chatLogfile);
+ }
+
+ fflush(stdout);
+}
+
void Log::outChar(const char * str, ... )
{

diff --git a/src/shared/Log.h b/src/shared/Log.h
index ad003a6..b75462d 100644
--- a/src/shared/Log.h
+++ b/src/shared/Log.h
@@ -103,6 +103,10 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
fclose(charLogfile);
charLogfile = NULL;

+ if (chatLogfile != NULL)
+ fclose(chatLogfile);
+ chatLogfile = NULL;
+
if( dberLogfile != NULL )
fclose(dberLogfile);
dberLogfile = NULL;
@@ -163,13 +167,15 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
private:
FILE* openLogFile(char const* configFileName,char const* configTimeStampFlag, char const* mode);
FILE* openGmlogPerAccount(uint32 account);
+ FILE* openChatLogPerType(uint32 chattype);

FILE* raLogfile;
FILE* logfile;
FILE* gmLogfile;
FILE* charLogfile;
+ FILE* chatLogfile;
FILE* dberLogfile;
FILE* worldLogfile;

// log/console control
LogLevel m_logLevel;
@@ -186,6 +201,19 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
// char log control
bool m_charLog_Dump;

+ // chat log control
+ bool m_chatlog_per_type;
+ bool m_chatlog_logsay;
+ bool m_chatlog_logemote;
+ bool m_chatlog_logyell;
+ bool m_chatlog_logwhisper;
+ bool m_chatlog_logparty;
+ bool m_chatlog_logguild;
+ bool m_chatlog_lograid;
+ bool m_chatlog_logbg;
+ bool m_chatlog_logchannel;
+ std::string m_chatlog_filename_format;
+
// gm log control
bool m_gmlog_per_account;
std::string m_gmlog_filename_format;
[/code]

Patch d'origine => GetMangos.com

Have Fun !
Cordialement,
MacWarrior.

Retourner en haut Accueil