Changed a few natives/stocks that should have used IsClientInGame() rather than IsClientConnected()
3 * ===============================================================
4 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
5 * ===============================================================
7 * This file is not open source and may not be copied without explicit
8 * written permission of AlliedModders LLC. This file may not be redistributed
9 * in whole or significant part.
10 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
16 #include "sourcemod.h"
17 #include "sourcemm_api.h"
18 #include "sm_stringutil.h"
20 #include "systems/LibrarySys.h"
21 #include "sm_version.h"
26 * :TODO: This should be creating the log folder if it doesn't exist
29 ConfigResult Logger::OnSourceModConfigChanged(const char *key,
35 if (strcasecmp(key, "Logging") == 0)
39 if (strcasecmp(value, "on") == 0)
42 } else if (strcasecmp(value, "off") == 0) {
45 UTIL_Format(error, maxlength, "Invalid value: must be \"on\" or \"off\"");
46 return ConfigResult_Reject;
49 if (source == ConfigSource_Console)
51 state ? EnableLogging() : DisableLogging();
53 m_InitialState = state;
56 return ConfigResult_Accept;
57 } else if (strcasecmp(key, "LogMode") == 0) {
58 if (strcasecmp(value, "daily") == 0)
60 m_Mode = LoggingMode_Daily;
61 } else if (strcasecmp(value, "map") == 0) {
62 m_Mode = LoggingMode_PerMap;
63 } else if (strcasecmp(value, "game") == 0) {
64 m_Mode = LoggingMode_Game;
66 UTIL_Format(error, maxlength, "Invalid value: must be [daily|map|game]");
67 return ConfigResult_Reject;
70 return ConfigResult_Accept;
73 return ConfigResult_Ignore;
76 void Logger::OnSourceModStartup(bool late)
81 void Logger::OnSourceModAllShutdown()
86 void Logger::OnSourceModLevelChange(const char *mapName)
91 void Logger::_NewMapFile()
98 /* Append "Log file closed" to previous log file */
106 tm *curtime = localtime(&t);
110 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/L%02d%02d%03d.log", curtime->tm_mon + 1, curtime->tm_mday, i);
111 FILE *fp = fopen(_filename, "r");
119 m_NrmFileName.assign(_filename);
121 FILE *fp = fopen(m_NrmFileName.c_str(), "w");
124 g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
129 strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
130 fprintf(fp, "L %s: SourceMod log file started (file \"L%02d%02d%03d.log\") (Version \"%s\")\n", date, curtime->tm_mon + 1, curtime->tm_mday, i, SVN_FULL_VERSION);
135 void Logger::_CloseFile()
143 if (!m_NrmFileName.empty())
145 fp = fopen(m_NrmFileName.c_str(), "r+");
148 fseek(fp, 0, SEEK_END);
149 LogMessage("Log file closed.");
152 m_NrmFileName.clear();
159 fp = fopen(m_ErrFileName.c_str(), "r+");
162 fseek(fp, 0, SEEK_END);
163 LogError("Error log file session closed.");
166 m_ErrFileName.clear();
169 void Logger::InitLogger(LoggingMode mode)
172 m_Active = m_InitialState;
176 tm *curtime = localtime(&t);
177 m_CurDay = curtime->tm_mday;
180 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/errors_%04d%02d%02d.log", curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday);
181 m_ErrFileName.assign(_filename);
185 case LoggingMode_PerMap:
189 m_DelayedStart = true;
193 case LoggingMode_Daily:
195 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/L%04d%02d%02d.log", curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday);
196 m_NrmFileName.assign(_filename);
197 m_DailyPrintHdr = true;
208 void Logger::CloseLogger()
213 void Logger::LogMessage(const char *vafmt, ...)
220 if (m_Mode == LoggingMode_Game)
224 _PrintToGameLog(vafmt, ap);
231 m_DelayedStart = false;
238 vsnprintf(msg, sizeof(msg), vafmt, ap);
244 tm *curtime = localtime(&t);
245 strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
248 if (m_Mode == LoggingMode_PerMap)
250 fp = fopen(m_NrmFileName.c_str(), "a+");
254 fp = fopen(m_NrmFileName.c_str(), "a+");
261 if (m_CurDay != curtime->tm_mday)
264 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/L%04d%02d%02d.log", curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday);
265 m_NrmFileName.assign(_filename);
266 m_CurDay = curtime->tm_mday;
267 m_DailyPrintHdr = true;
269 fp = fopen(m_NrmFileName.c_str(), "a+");
276 m_DailyPrintHdr = false;
277 fprintf(fp, "L %s: SourceMod log file session started (file \"L%04d%02d%02d.log\") (Version \"%s\")\n", date, curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday, SVN_FULL_VERSION);
279 fprintf(fp, "L %s: %s\n", date, msg);
285 g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
288 g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
292 void Logger::LogError(const char *vafmt, ...)
301 tm *curtime = localtime(&t);
304 strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
306 if (curtime->tm_mday != m_CurDay)
309 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/errors_%04d%02d%02d.log", curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday);
310 m_ErrFileName.assign(_filename);
311 m_CurDay = curtime->tm_mday;
312 m_ErrMapStart = false;
318 vsnprintf(msg, sizeof(msg), vafmt, ap);
321 FILE *fp = fopen(m_ErrFileName.c_str(), "a+");
326 fprintf(fp, "L %s: SourceMod error session started\n", date);
327 fprintf(fp, "L %s: Info (map \"%s\") (file \"errors_%04d%02d%02d.log\")\n", date, m_CurMapName.c_str(), curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday);
328 m_ErrMapStart = true;
330 fprintf(fp, "L %s: %s\n", date, msg);
333 g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
338 g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
341 void Logger::MapChange(const char *mapname)
343 m_CurMapName.assign(mapname);
347 case LoggingMode_Daily:
349 LogMessage("-------- Mapchange to %s --------", mapname);
352 case LoggingMode_PerMap:
366 LogError("Error log file session closed.");
368 m_ErrMapStart = false;
371 void Logger::_PrintToGameLog(const char *fmt, va_list ap)
376 len = vsnprintf(msg, sizeof(msg)-2, fmt, ap);
377 len = (len >= sizeof(msg)) ? (sizeof(msg) - 2) : len;
382 engine->LogPrint(msg);
385 const char *Logger::GetLogFileName(LogType type) const
391 return m_NrmFileName.c_str();
395 return m_ErrFileName.c_str();
404 LoggingMode Logger::GetLoggingMode() const
409 void Logger::EnableLogging()
416 LogMessage("[SM] Logging enabled manually by user.");
419 void Logger::DisableLogging()
425 LogMessage("[SM] Logging disabled manually by user.");
429 void Logger::LogFatal(const char *msg, ...)
431 /* :TODO: make this print all pretty-like
432 * In fact, the pretty log printing function should be abstracted.
433 * It's already implemented twice which is bad.
436 char path[PLATFORM_MAX_PATH];
437 g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "sourcemod_fatal.log");
438 FILE *fp = fopen(path, "at");
441 /* We're just doomed, aren't we... */
447 vfprintf(fp, msg, ap);