]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_chanlog.cpp
Fix the cloaking module on C++98 compilers.
[user/henk/code/inspircd.git] / src / modules / m_chanlog.cpp
index 9e09b7cf34032a3ce009808dd303cf47f881e027..c80b4691cf9e8097f2f1ce582178235566cb7818 100644 (file)
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ *   Copyright (C) 2018 linuxdaemon <linuxdaemon.irc@gmail.com>
+ *   Copyright (C) 2013, 2018 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012-2014, 2018 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
+ *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *
- * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 #include "inspircd.h"
 
-class ChannelLogStream : public LogStream
+class ModuleChanLog : public Module
 {
- private:
-       std::string channel;
+       /*
+        * Multimap so people can redirect a snomask to multiple channels.
+        */
+       typedef insp::flat_multimap<char, std::string> ChanLogTargets;
+       ChanLogTargets logstreams;
 
  public:
-       ChannelLogStream(InspIRCd *Instance, int loglevel, const std::string &chan) : LogStream(Instance, loglevel), channel(chan)
-       {
-       }
-
-       virtual void OnLog(int loglevel, const std::string &type, const std::string &msg)
+       void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
-               Channel *c = ServerInstance->FindChan(channel);
-               static bool Logging = false;
+               std::string snomasks;
+               std::string channel;
+               ChanLogTargets newlogs;
 
-               if (loglevel < this->loglvl)
-                       return;
-
-               if (Logging)
-                       return;
-
-               if (c)
+               ConfigTagList tags = ServerInstance->Config->ConfTags("chanlog");
+               for (ConfigIter i = tags.first; i != tags.second; ++i)
                {
-                       Logging = true; // this avoids (rare chance) loops with logging server IO on networks
-                       char buf[MAXBUF];
-                       snprintf(buf, MAXBUF, "\2%s\2: %s", type.c_str(), msg.c_str());
+                       channel = i->second->getString("channel");
+                       snomasks = i->second->getString("snomasks");
 
-                       c->WriteChannelWithServ(ServerInstance->Config->ServerName, "PRIVMSG %s :%s", c->name.c_str(), buf);
-                       ServerInstance->PI->SendChannelPrivmsg(c, 0, buf);
-                       Logging = false;
-               }
-       }
-};
-
-/* $ModDesc: Logs output to a channel instead of / as well as a file. */
-
-class ModuleChanLog : public Module
-{
- private:
-       std::vector<ChannelLogStream*> cls;
- public:
-       ModuleChanLog(InspIRCd* Me) : Module(Me)
-       {
-               Implementation eventlist[] = { I_OnRehash };
-               ServerInstance->Modules->Attach(eventlist, this, 1);
-
-               OnRehash(NULL, "");
-       }
+                       if (channel.empty() || snomasks.empty())
+                       {
+                               throw ModuleException("Malformed chanlog tag at " + i->second->getTagLocation());
+                       }
 
-       virtual ~ModuleChanLog()
-       {
-               std::vector<ChannelLogStream*>::iterator i;
-               while ((i = cls.begin()) != cls.end())
-               {
-                       ServerInstance->Logs->DelLogStream(*i);
-                       cls.erase(i);
+                       for (std::string::const_iterator it = snomasks.begin(); it != snomasks.end(); it++)
+                       {
+                               newlogs.insert(std::make_pair(*it, channel));
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Logging %c to %s", *it, channel.c_str());
+                       }
                }
+               logstreams.swap(newlogs);
+
        }
 
-       virtual void OnRehash(User *user, const std::string &parameter)
+       ModResult OnSendSnotice(char &sno, std::string &desc, const std::string &msg) CXX11_OVERRIDE
        {
-               ConfigReader Conf(ServerInstance);
+               std::pair<ChanLogTargets::const_iterator, ChanLogTargets::const_iterator> itpair = logstreams.equal_range(sno);
+               if (itpair.first == itpair.second)
+                       return MOD_RES_PASSTHRU;
 
-               /* Since the CloseLogs prior to this hook just wiped out our logstreams for us, we just need to wipe the vector. */
-               std::vector<ChannelLogStream*>().swap(cls);
-               int index, max = Conf.Enumerate("log");
-               cls.reserve(max);
+               const std::string snotice = "\002" + desc + "\002: " + msg;
 
-               for (index = 0; index < max; ++index)
+               for (ChanLogTargets::const_iterator it = itpair.first; it != itpair.second; ++it)
                {
-                       std::string method = Conf.ReadValue("log", "method", index);
-
-
-                       //if (method != "file")
-                       //      continue;
-
-                       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")
+                       Channel *c = ServerInstance->FindChan(it->second);
+                       if (c)
                        {
-                               loglevel = VERBOSE;
+                               ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, ServerInstance->Config->ServerName, c, snotice);
+                               c->Write(ServerInstance->GetRFCEvents().privmsg, privmsg);
+                               ServerInstance->PI->SendMessage(c, 0, snotice);
                        }
-                       else if (level == "default")
-                       {
-                               loglevel = DEFAULT;
-                       }
-                       else if (level == "sparse")
-                       {
-                               loglevel = SPARSE;
-                       }
-                       else if (level == "none")
-                       {
-                               loglevel = NONE;
-                       }
-
-                       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);
                }
+
+               return MOD_RES_PASSTHRU;
        }
 
-       virtual Version GetVersion()
+       Version GetVersion() CXX11_OVERRIDE
        {
-               return Version(1,2,0,1,VF_VENDOR,API_VERSION);
+               return Version("Allows messages sent to snomasks to be logged to a channel.", VF_VENDOR);
        }
 };
 
-
 MODULE_INIT(ModuleChanLog)
-