From d0be7981e62a73d71cf9ffe534b245584aa27a36 Mon Sep 17 00:00:00 2001 From: w00t Date: Sat, 23 Aug 2008 16:32:54 +0000 Subject: Convert m_chanlog from using logfile output (dangerous, not really that useful) to logging snotices to channel instead, using OnSendSnotice. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10229 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_chanlog.cpp | 105 +++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/modules/m_chanlog.cpp b/src/modules/m_chanlog.cpp index 9e09b7cf3..bb5adf67c 100644 --- a/src/modules/m_chanlog.cpp +++ b/src/modules/m_chanlog.cpp @@ -13,6 +13,18 @@ #include "inspircd.h" +/* $ModDesc: Logs snomask output to channel(s). */ + +/* + * This is for the "old" chanlog module which intercepted messages going to the logfile.. + * I don't consider it all that useful, and it's quite dangerous if setup incorrectly, so + * this is defined out but left intact in case someone wants to develop it further someday. + * + * -- w00t (aug 23rd, 2008) + */ +#define OLD_CHANLOG 0 + +#if OLD_CHANLOG class ChannelLogStream : public LogStream { private: @@ -46,80 +58,87 @@ class ChannelLogStream : public LogStream } } }; - -/* $ModDesc: Logs output to a channel instead of / as well as a file. */ +#endif class ModuleChanLog : public Module { private: - std::vector cls; + /* + * Multimap so people can redirect a snomask to multiple channels. + */ + std::multimap logstreams; + public: ModuleChanLog(InspIRCd* Me) : Module(Me) { - Implementation eventlist[] = { I_OnRehash }; - ServerInstance->Modules->Attach(eventlist, this, 1); + Implementation eventlist[] = { I_OnRehash, I_OnSendSnotice }; + ServerInstance->Modules->Attach(eventlist, this, 2); OnRehash(NULL, ""); } virtual ~ModuleChanLog() { - std::vector::iterator i; - while ((i = cls.begin()) != cls.end()) - { - ServerInstance->Logs->DelLogStream(*i); - cls.erase(i); - } } virtual void OnRehash(User *user, const std::string ¶meter) { - ConfigReader Conf(ServerInstance); + ConfigReader MyConf(ServerInstance); + std::string snomasks; + std::string channel; - /* Since the CloseLogs prior to this hook just wiped out our logstreams for us, we just need to wipe the vector. */ - std::vector().swap(cls); - int index, max = Conf.Enumerate("log"); - cls.reserve(max); + logstreams.clear(); - for (index = 0; index < max; ++index) + for (int i = 0; i < MyConf.Enumerate("chanlog"); i++) { - std::string method = Conf.ReadValue("log", "method", index); - - - //if (method != "file") - // continue; + channel = MyConf.ReadValue("chanlog", "channel", i); + snomasks = MyConf.ReadValue("chanlog", "snomasks", i); - std::string type = Conf.ReadValue("log", "type", index); - std::string level = Conf.ReadValue("log", "level", index); - int loglevel = DEFAULT; - - if (level == "debug") - { - loglevel = DEBUG; - ServerInstance->Config->debugging = true; - } - else if (level == "verbose") + if (channel.empty() || snomasks.empty()) { - loglevel = VERBOSE; + ServerInstance->Logs->Log("m_chanlog", DEFAULT, "Malformed chanlog tag, ignoring"); + continue; } - else if (level == "default") + + for (std::string::const_iterator it = snomasks.begin(); it != snomasks.end(); i++) { - loglevel = DEFAULT; + logstreams.insert(std::make_pair(*it, channel)); + ServerInstance->Logs->Log("m_chanlog", DEFAULT, "Logging %c to %s", *it, channel.c_str()); + it++; } - else if (level == "sparse") + } + + } + + virtual int OnSendSnotice(char &sno, std::string &desc, const std::string &msg) + { + std::multimap::const_iterator it = logstreams.find(sno); + char buf[MAXBUF]; + + if (it == logstreams.end()) + return 0; + + snprintf(buf, MAXBUF, "\2%s\2: %s", desc.c_str(), msg.c_str()); + + while (it != logstreams.end()) + { + if (it->first != sno) { - loglevel = SPARSE; + it++; + continue; } - else if (level == "none") + + Channel *c = ServerInstance->FindChan(it->second); + if (c) { - loglevel = NONE; + c->WriteChannelWithServ(ServerInstance->Config->ServerName, "PRIVMSG %s :%s", c->name.c_str(), buf); + ServerInstance->PI->SendChannelPrivmsg(c, 0, buf); } - std::string target = Conf.ReadValue("log", "target", index); - ChannelLogStream* c = new ChannelLogStream(ServerInstance, loglevel, target); - ServerInstance->Logs->AddLogTypes(type, c, true); - cls.push_back(c); + it++; } + + return 0; } virtual Version GetVersion() -- cgit v1.2.3