]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_permchannels.cpp
Default <permchannelsdb:listmodes> to on.
[user/henk/code/inspircd.git] / src / modules / m_permchannels.cpp
index d514e62a5e7f9fded696e148a9213c8bd56ccc93..fdc75ec34fd4c3fdd5073f43841e2c5ab6729dad 100644 (file)
@@ -1,7 +1,14 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2014 Justin Crawford <Justasic@Gmail.com>
+ *   Copyright (C) 2013-2014, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013-2014, 2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2012, 2014 Adam <Adam@anope.org>
+ *   Copyright (C) 2010 Craig Edwards <brain@inspircd.org>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
  *   Copyright (C) 2008-2009 Robin Burchell <robin+git@viroteck.net>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
@@ -34,7 +41,7 @@ class PermChannel : public ModeHandler
                oper = true;
        }
 
-       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding)
+       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE
        {
                if (adding == channel->IsModeSet(this))
                        return MODEACTION_DENY;
@@ -47,11 +54,10 @@ class PermChannel : public ModeHandler
        }
 };
 
-// Not in a class due to circular dependancy hell.
+// Not in a class due to circular dependency hell.
 static std::string permchannelsconf;
 static bool WriteDatabase(PermChannel& permchanmode, Module* mod, bool save_listmodes)
 {
-       ChanModeReference ban(mod, "ban");
        /*
         * We need to perform an atomic write so as not to fuck things up.
         * So, let's write to a temporary file, flush it, then rename the file..
@@ -146,7 +152,7 @@ static bool WriteDatabase(PermChannel& permchanmode, Module* mod, bool save_list
 #ifdef _WIN32
        remove(permchannelsconf.c_str());
 #endif
-       // Use rename to move temporary to new db - this is guarenteed not to fuck up, even in case of a crash.
+       // Use rename to move temporary to new db - this is guaranteed not to fuck up, even in case of a crash.
        if (rename(permchannelsnewconf.c_str(), permchannelsconf.c_str()) < 0)
        {
                ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Cannot replace old database \"%s\" with new database \"%s\"! %s (%d)", permchannelsconf.c_str(), permchannelsnewconf.c_str(), strerror(errno), errno);
@@ -157,7 +163,10 @@ static bool WriteDatabase(PermChannel& permchanmode, Module* mod, bool save_list
        return true;
 }
 
-class ModulePermanentChannels : public Module
+class ModulePermanentChannels
+       : public Module
+       , public Timer
+
 {
        PermChannel p;
        bool dirty;
@@ -166,7 +175,10 @@ class ModulePermanentChannels : public Module
 public:
 
        ModulePermanentChannels()
-               : p(this), dirty(false), loaded(false)
+               : Timer(0, true)
+               , p(this)
+               , dirty(false)
+               , loaded(false)
        {
        }
 
@@ -174,7 +186,8 @@ public:
        {
                ConfigTag* tag = ServerInstance->Config->ConfValue("permchanneldb");
                permchannelsconf = tag->getString("filename");
-               save_listmodes = tag->getBool("listmodes");
+               save_listmodes = tag->getBool("listmodes", true);
+               SetInterval(tag->getDuration("saveperiod", 5));
 
                if (!permchannelsconf.empty())
                        permchannelsconf = ServerInstance->Config->Paths.PrependConfig(permchannelsconf);
@@ -193,9 +206,9 @@ public:
                        std::string channel = tag->getString("channel");
                        std::string modes = tag->getString("modes");
 
-                       if ((channel.empty()) || (channel.length() > ServerInstance->Config->Limits.ChanMax))
+                       if (!ServerInstance->IsChannel(channel))
                        {
-                               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Ignoring permchannels tag with empty or too long channel name (\"" + channel + "\")");
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Ignoring permchannels tag with invalid channel name (\"" + channel + "\")");
                                continue;
                        }
 
@@ -206,7 +219,7 @@ public:
                                time_t TS = tag->getInt("ts", ServerInstance->Time(), 1);
                                c = new Channel(channel, TS);
 
-                               unsigned int topicset = tag->getInt("topicts");
+                               time_t topicset = tag->getInt("topicts", 0);
                                std::string topic = tag->getString("topic");
 
                                if ((topicset != 0) || (!topic.empty()))
@@ -215,7 +228,7 @@ public:
                                                topicset = ServerInstance->Time();
                                        std::string topicsetby = tag->getString("topicsetby");
                                        if (topicsetby.empty())
-                                               topicsetby = ServerInstance->Config->ServerName;
+                                               topicsetby = ServerInstance->Config->GetServerName();
                                        c->SetTopic(ServerInstance->FakeClient, topic, topicset, &topicsetby);
                                }
 
@@ -266,14 +279,15 @@ public:
                        dirty = true;
        }
 
-       void OnBackgroundTimer(time_t) CXX11_OVERRIDE
+       bool Tick(time_t) CXX11_OVERRIDE
        {
                if (dirty)
                        WriteDatabase(p, this, save_listmodes);
                dirty = false;
+               return true;
        }
 
-       void Prioritize()
+       void Prioritize() CXX11_OVERRIDE
        {
                // XXX: Load the DB here because the order in which modules are init()ed at boot is
                // alphabetical, this means we must wait until all modules have done their init()
@@ -305,7 +319,7 @@ public:
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides support for channel mode +P to provide permanent channels",VF_VENDOR);
+               return Version("Adds channel mode P (permanent) which prevents the channel from being deleted when the last user leaves.", VF_VENDOR);
        }
 
        ModResult OnChannelPreDelete(Channel *c) CXX11_OVERRIDE