]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_permchannels.cpp
Clean up the protocol interface
[user/henk/code/inspircd.git] / src / modules / m_permchannels.cpp
index ff1a35ba913e62bbe3ed1cf1cb4daac0daa703ed..2a3dff6ee764fd58e50e0d68f7547f5ecf760c7b 100644 (file)
 #include "inspircd.h"
 #include <fstream>
 
-/* $ModDesc: Provides support for channel mode +P to provide permanent channels */
+
+/** Handles the +P channel mode
+ */
+class PermChannel : public ModeHandler
+{
+ public:
+       PermChannel(Module* Creator)
+               : ModeHandler(Creator, "permanent", 'P', PARAM_NONE, MODETYPE_CHANNEL)
+       {
+               oper = true;
+       }
+
+       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding)
+       {
+               if (adding == channel->IsModeSet(this))
+                       return MODEACTION_DENY;
+
+               channel->SetMode(this, adding);
+               if (!adding)
+                       channel->CheckDestroy();
+
+               return MODEACTION_ALLOW;
+       }
+};
 
 // Not in a class due to circular dependancy hell.
 static std::string permchannelsconf;
-static bool WriteDatabase()
+static bool WriteDatabase(PermChannel& permchanmode)
 {
        /*
         * We need to perform an atomic write so as not to fuck things up.
@@ -41,7 +64,7 @@ static bool WriteDatabase()
        std::ofstream stream(permchannelsnewconf.c_str());
        if (!stream.is_open())
        {
-               ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "permchannels: Cannot create database! %s (%d)", strerror(errno), errno);
+               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Cannot create database! %s (%d)", strerror(errno), errno);
                ServerInstance->SNO->WriteToSnoMask('a', "database: cannot create new db: %s (%d)", strerror(errno), errno);
                return false;
        }
@@ -52,7 +75,7 @@ static bool WriteDatabase()
        for (chan_hash::const_iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); i++)
        {
                Channel* chan = i->second;
-               if (!chan->IsModeSet('P'))
+               if (!chan->IsModeSet(permchanmode))
                        continue;
 
                stream << "<permchannels channel=\"" << ServerConfig::Escape(chan->name)
@@ -63,7 +86,7 @@ static bool WriteDatabase()
 
        if (stream.fail())
        {
-               ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "permchannels: Cannot write to new database! %s (%d)", strerror(errno), errno);
+               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Cannot write to new database! %s (%d)", strerror(errno), errno);
                ServerInstance->SNO->WriteToSnoMask('a', "database: cannot write to new db: %s (%d)", strerror(errno), errno);
                return false;
        }
@@ -72,7 +95,7 @@ static bool WriteDatabase()
 #ifdef _WIN32
        if (remove(permchannelsconf.c_str()))
        {
-               ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "permchannels: Cannot remove old database! %s (%d)", strerror(errno), errno);
+               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Cannot remove old database! %s (%d)", strerror(errno), errno);
                ServerInstance->SNO->WriteToSnoMask('a', "database: cannot remove old database: %s (%d)", strerror(errno), errno);
                return false;
        }
@@ -80,7 +103,7 @@ static bool WriteDatabase()
        // Use rename to move temporary to new db - this is guarenteed not to fuck up, even in case of a crash.
        if (rename(permchannelsnewconf.c_str(), permchannelsconf.c_str()) < 0)
        {
-               ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "permchannels: Cannot move new to old database! %s (%d)", strerror(errno), errno);
+               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Cannot move new to old database! %s (%d)", strerror(errno), errno);
                ServerInstance->SNO->WriteToSnoMask('a', "database: cannot replace old with new db: %s (%d)", strerror(errno), errno);
                return false;
        }
@@ -88,38 +111,6 @@ static bool WriteDatabase()
        return true;
 }
 
-
-/** Handles the +P channel mode
- */
-class PermChannel : public ModeHandler
-{
- public:
-       PermChannel(Module* Creator) : ModeHandler(Creator, "permanent", 'P', PARAM_NONE, MODETYPE_CHANNEL) { oper = true; }
-
-       ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
-       {
-               if (adding)
-               {
-                       if (!channel->IsModeSet('P'))
-                       {
-                               channel->SetMode('P',true);
-                               return MODEACTION_ALLOW;
-                       }
-               }
-               else
-               {
-                       if (channel->IsModeSet('P'))
-                       {
-                               channel->SetMode(this,false);
-                               channel->CheckDestroy();
-                               return MODEACTION_ALLOW;
-                       }
-               }
-
-               return MODEACTION_DENY;
-       }
-};
-
 class ModulePermanentChannels : public Module
 {
        PermChannel p;
@@ -133,8 +124,6 @@ public:
        void init() CXX11_OVERRIDE
        {
                ServerInstance->Modules->AddService(p);
-               Implementation eventlist[] = { I_OnChannelPreDelete, I_OnPostTopicChange, I_OnRawMode, I_OnRehash, I_OnBackgroundTimer };
-               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
 
                OnRehash(NULL);
        }
@@ -154,7 +143,7 @@ public:
                        {
                                chan_hash::iterator at = iter;
                                iter++;
-                               FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(c));
+                               FOREACH_MOD(OnChannelDelete, (c));
                                ServerInstance->chanlist->erase(at);
                                ServerInstance->GlobalCulls.AddItem(c);
                        }
@@ -186,7 +175,7 @@ public:
 
                        if (channel.empty())
                        {
-                               ServerInstance->Logs->Log("m_permchannels", LOG_DEBUG, "Malformed permchannels tag with empty channel name.");
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Malformed permchannels tag with empty channel name.");
                                continue;
                        }
 
@@ -197,7 +186,7 @@ public:
                                c = new Channel(channel, ServerInstance->Time());
                                if (!topic.empty())
                                {
-                                       c->SetTopic(ServerInstance->FakeClient, topic, true);
+                                       c->SetTopic(ServerInstance->FakeClient, topic);
 
                                        /*
                                         * Due to the way protocol works in 1.2, we need to hack the topic TS in such a way that this
@@ -207,7 +196,7 @@ public:
                                         */
                                        c->topicset = 42;
                                }
-                               ServerInstance->Logs->Log("m_permchannels", LOG_DEBUG, "Added %s with topic %s", channel.c_str(), topic.c_str());
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Added %s with topic %s", channel.c_str(), topic.c_str());
 
                                if (modes.empty())
                                        continue;
@@ -238,7 +227,7 @@ public:
 
        ModResult OnRawMode(User* user, Channel* chan, const char mode, const std::string &param, bool adding, int pcnt) CXX11_OVERRIDE
        {
-               if (chan && (chan->IsModeSet('P') || mode == 'P'))
+               if (chan && (chan->IsModeSet(p) || mode == p.GetModeChar()))
                        dirty = true;
 
                return MOD_RES_PASSTHRU;
@@ -246,14 +235,14 @@ public:
 
        void OnPostTopicChange(User*, Channel *c, const std::string&) CXX11_OVERRIDE
        {
-               if (c->IsModeSet('P'))
+               if (c->IsModeSet(p))
                        dirty = true;
        }
 
        void OnBackgroundTimer(time_t) CXX11_OVERRIDE
        {
                if (dirty)
-                       WriteDatabase();
+                       WriteDatabase(p);
                dirty = false;
        }
 
@@ -274,7 +263,7 @@ public:
                // Load only when there are no linked servers - we set the TS of the channels we
                // create to the current time, this can lead to desync because spanningtree has
                // no way of knowing what we do
-               ProtoServerList serverlist;
+               ProtocolInterface::ServerList serverlist;
                ServerInstance->PI->GetServerList(serverlist);
                if (serverlist.size() < 2)
                {
@@ -284,7 +273,7 @@ public:
                        }
                        catch (CoreException& e)
                        {
-                               ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "Error loading permchannels database: " + std::string(e.GetReason()));
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Error loading permchannels database: " + std::string(e.GetReason()));
                        }
                }
        }
@@ -296,7 +285,7 @@ public:
 
        ModResult OnChannelPreDelete(Channel *c) CXX11_OVERRIDE
        {
-               if (c->IsModeSet('P'))
+               if (c->IsModeSet(p))
                        return MOD_RES_DENY;
 
                return MOD_RES_PASSTHRU;