-/* +------------------------------------+
- * | 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) 2008 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
*
- * 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);
+ std::string snomasks;
+ std::string channel;
- if (loglevel < this->loglvl) return;
+ logstreams.clear();
- if (c)
+ ConfigTagList tags = ServerInstance->Config->ConfTags("chanlog");
+ for (ConfigIter i = tags.first; i != tags.second; ++i)
{
- // So this won't work remotely. Oh well.
- c->WriteChannelWithServ(ServerInstance->Config->ServerName, "PRIVMSG %s :\2%s\2: %s", c->name, type.c_str(), msg.c_str());
- }
- }
-};
-
-/* $ModDesc: Logs output to a channel instead of / as well as a file. */
+ channel = i->second->getString("channel");
+ snomasks = i->second->getString("snomasks");
-class ModuleChanLog : public Module
-{
- private:
- std::vector<ChannelLogStream*> cls;
- public:
- ModuleChanLog(InspIRCd* Me) : Module(Me)
- {
- }
+ if (channel.empty() || snomasks.empty())
+ {
+ ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "Malformed chanlog tag, ignoring");
+ continue;
+ }
- 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++)
+ {
+ logstreams.insert(std::make_pair(*it, channel));
+ ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Logging %c to %s", *it, channel.c_str());
+ }
}
+
}
- virtual void OnReadConfig(ServerConfig* sc, ConfigReader* Conf)
+ ModResult OnSendSnotice(char &sno, std::string &desc, const std::string &msg) CXX11_OVERRIDE
{
- /* 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);
- for (index = 0; index < max; ++index)
+ std::pair<ChanLogTargets::const_iterator, ChanLogTargets::const_iterator> itpair = logstreams.equal_range(sno);
+ if (itpair.first == itpair.second)
+ return MOD_RES_PASSTHRU;
+
+ const std::string snotice = "\2" + desc + "\2: " + msg;
+
+ 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")
- {
- loglevel = VERBOSE;
- }
- else if (level == "default")
+ Channel *c = ServerInstance->FindChan(it->second);
+ if (c)
{
- loglevel = DEFAULT;
+ c->WriteChannelWithServ(ServerInstance->Config->ServerName, "PRIVMSG %s :%s", c->name.c_str(), snotice.c_str());
+ ServerInstance->PI->SendMessage(c, 0, snotice);
}
- 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);
- irc::commasepstream css(type);
- std::string tok;
- while (css.GetToken(tok))
- {
- ServerInstance->Logs->AddLogType(tok, c);
- }
- cls.push_back(c);
}
+
+ return MOD_RES_PASSTHRU;
}
- virtual Version GetVersion()
+ Version GetVersion() CXX11_OVERRIDE
{
- return Version(1,1,0,1,VF_VENDOR,API_VERSION);
+ return Version("Logs snomask output to channel(s).", VF_VENDOR);
}
};
-
MODULE_INIT(ModuleChanLog)
-