]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ojoin.cpp
Move static map of extensions into ServerInstance, add const-correctness
[user/henk/code/inspircd.git] / src / modules / m_ojoin.cpp
index a71f9f8220542ab682d2fdee4dc8af39e9c7e92b..d5f7b9443f8c77ce93cf773e1b1562ad1ef8cbe4 100644 (file)
@@ -43,9 +43,9 @@ class CommandOjoin : public Command
 {
  public:
        bool active;
-       CommandOjoin (InspIRCd* Instance, Module* parent) : Command(Instance,parent,"OJOIN", "o", 1, false, 0)
+       CommandOjoin(Module* parent) : Command(parent,"OJOIN", 1)
        {
-               syntax = "<channel>";
+               flags_needed = 'o'; Penalty = 0; syntax = "<channel>";
                active = false;
                TRANSLATE3(TR_NICK, TR_TEXT, TR_END);
        }
@@ -60,27 +60,17 @@ class CommandOjoin : public Command
                }
 
                active = true;
-               Channel* channel = Channel::JoinUser(ServerInstance, user, parameters[0].c_str(), false, "", false);
+               Channel* channel = Channel::JoinUser(user, parameters[0].c_str(), false, "", false);
                active = false;
 
                if (channel)
                {
                        ServerInstance->SNO->WriteGlobalSno('a', std::string(user->nick)+" used OJOIN to join "+channel->name);
 
-                       if (!NPrefix)
-                       {
-                               std::vector<std::string> modes;
-                               modes.push_back(parameters[0]);
-                               modes.push_back("+Y");
-                               modes.push_back(user->nick);
-                               ServerInstance->SendMode(modes, ServerInstance->FakeClient);
-                               ServerInstance->PI->SendMode(channel->name, ServerInstance->Modes->GetLastParseParams(), ServerInstance->Modes->GetLastParseTranslate());
-                       }
-
                        if (notice)
                        {
                                channel = ServerInstance->FindChan(parameters[0]);
-                               channel->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :%s joined on official network business.",
+                               channel->WriteChannelWithServ(ServerInstance->Config->ServerName.c_str(), "NOTICE %s :%s joined on official network business.",
                                        parameters[0].c_str(), user->nick.c_str());
                                ServerInstance->PI->SendChannelNotice(channel, 0, std::string(user->nick) + " joined on official network business.");
                        }
@@ -94,7 +84,7 @@ class CommandOjoin : public Command
                        modes.push_back("+Y");
                        modes.push_back(user->nick);
                        ServerInstance->SendMode(modes, ServerInstance->FakeClient);
-                       ServerInstance->PI->SendMode(channel->name, ServerInstance->Modes->GetLastParseParams(), ServerInstance->Modes->GetLastParseTranslate());
+                       ServerInstance->PI->SendMode(parameters[0], ServerInstance->Modes->GetLastParseParams(), ServerInstance->Modes->GetLastParseTranslate());
                }
                return CMD_SUCCESS;
        }
@@ -105,9 +95,12 @@ class CommandOjoin : public Command
 class NetworkPrefix : public ModeHandler
 {
  public:
-       NetworkPrefix(InspIRCd* Instance, Module* parent)
-               : ModeHandler(Instance, parent, 'Y', 1, 1, true, MODETYPE_CHANNEL, false, NPrefix, 0, TR_NICK)
+       NetworkPrefix(Module* parent) : ModeHandler(parent, "official-join", 'Y', PARAM_ALWAYS, MODETYPE_CHANNEL)
        {
+               list = true;
+               prefix = NPrefix;
+               levelrequired = 0xFFFFFFFF;
+               m_paramtype = TR_NICK;
        }
 
        ModePair ModeSet(User* source, User* dest, Channel* channel, const std::string &parameter)
@@ -115,14 +108,14 @@ class NetworkPrefix : public ModeHandler
                User* x = ServerInstance->FindNick(parameter);
                if (x)
                {
-                       if (!channel->HasUser(x))
+                       Membership* m = channel->GetUser(x);
+                       if (!m)
                        {
                                return std::make_pair(false, parameter);
                        }
                        else
                        {
-                               std::string item = "cm_network_"+std::string(channel->name);
-                               if (x->GetExt(item))
+                               if (m->hasMode('Y'))
                                {
                                        return std::make_pair(true, x->nick);
                                }
@@ -137,16 +130,15 @@ class NetworkPrefix : public ModeHandler
 
        void RemoveMode(Channel* channel, irc::modestacker* stack)
        {
-               CUList* cl = channel->GetUsers();
-               std::string item = "cm_network_" + std::string(channel->name);
+               const UserMembList* cl = channel->GetUsers();
                std::vector<std::string> mode_junk;
                mode_junk.push_back(channel->name);
-               irc::modestacker modestack(ServerInstance, false);
+               irc::modestacker modestack(false);
                std::deque<std::string> stackresult;
 
-               for (CUList::iterator i = cl->begin(); i != cl->end(); i++)
+               for (UserMembCIter i = cl->begin(); i != cl->end(); i++)
                {
-                       if (i->first->GetExt(item))
+                       if (i->second->hasMode('Y'))
                        {
                                if (stack)
                                        stack->Push(this->GetModeChar(), i->first->nick);
@@ -179,22 +171,19 @@ class NetworkPrefix : public ModeHandler
 
        ModeAction HandleChange(User* source, User* theuser, bool adding, Channel* channel, std::string &parameter)
        {
-               std::string item = "cm_network_" + std::string(channel->name);
-
-               if (adding)
+               Membership* m = channel->GetUser(theuser);
+               if (m && adding)
                {
-                       if (!theuser->GetExt(item))
+                       if (!m->hasMode('Y'))
                        {
-                               theuser->Extend(item);
                                parameter = theuser->nick;
                                return MODEACTION_ALLOW;
                        }
                }
-               else
+               else if (m && !adding)
                {
-                       if (theuser->GetExt(item))
+                       if (m->hasMode('Y'))
                        {
-                               theuser->Shrink(item);
                                parameter = theuser->nick;
                                return MODEACTION_ALLOW;
                        }
@@ -223,7 +212,6 @@ class NetworkPrefix : public ModeHandler
                        ((source == theuser) && (!adding)) ||
                        (ServerInstance->ULine(source->nick.c_str())) ||
                        (ServerInstance->ULine(source->server)) ||
-                       (!*source->server) ||
                        (!IS_LOCAL(source))
                        )
                {
@@ -246,14 +234,14 @@ class ModuleOjoin : public Module
 
  public:
 
-       ModuleOjoin(InspIRCd* Me)
-               : Module(Me), np(NULL), mycommand(Me, this)
+       ModuleOjoin()
+               : np(NULL), mycommand(this)
        {
                /* Load config stuff */
                OnRehash(NULL);
 
                /* Initialise module variables */
-               np = new NetworkPrefix(Me, this);
+               np = new NetworkPrefix(this);
 
                if (!ServerInstance->Modes->AddMode(np))
                {
@@ -263,7 +251,7 @@ class ModuleOjoin : public Module
 
                ServerInstance->AddCommand(&mycommand);
 
-               Implementation eventlist[] = { I_OnUserPreJoin, I_OnUserKick, I_OnUserPart, I_OnAccessCheck, I_OnRehash };
+               Implementation eventlist[] = { I_OnUserPreJoin, I_OnUserKick, I_OnUserPart, I_OnUserPreKick, I_OnRehash };
                ServerInstance->Modules->Attach(eventlist, this, 5);
        }
 
@@ -271,29 +259,18 @@ class ModuleOjoin : public Module
        {
                if (mycommand.active)
                {
-                       if (NPrefix)
-                               privs += NPrefix;
-                       if (op && privs.find('@') == std::string::npos)
-                               privs += '@';
+                       privs += 'Y';
+                       if (op)
+                               privs += 'o';
                        return MOD_RES_ALLOW;
                }
 
                return MOD_RES_PASSTHRU;
        }
 
-       void OnUserKick(User* source, User* user, Channel* chan, const std::string &reason, bool &silent)
-       {
-               user->Shrink("cm_network_"+std::string(chan->name));
-       }
-
-       void OnUserPart(User* user, Channel* channel, std::string &partreason, bool &silent)
-       {
-               user->Shrink("cm_network_"+std::string(channel->name));
-       }
-
        void OnRehash(User* user)
        {
-               ConfigReader Conf(ServerInstance);
+               ConfigReader Conf;
 
                if (!np)
                {
@@ -309,64 +286,25 @@ class ModuleOjoin : public Module
                op = Conf.ReadFlag("ojoin", "op", "yes", 0);
        }
 
-       ModResult OnAccessCheck(User* source,User* dest,Channel* channel,int access_type)
+       ModResult OnUserPreKick(User* source, Membership* memb, const std::string &reason)
        {
-               // Here's where we preform access checks, and disallow any kicking/deopping
-               // of +Y users. 
-
-               // If there's no dest, it's not for us.
-               if (!dest || !channel)
+               if ((ServerInstance->ULine(source->nick.c_str())) || ServerInstance->ULine(source->server))
                        return MOD_RES_PASSTHRU;
 
-               // If a ulined nickname, or a server is setting the mode, let it
-               // do whatever it wants.
-               if ((ServerInstance->ULine(source->nick.c_str())) || (ServerInstance->ULine(source->server)) || (!*source->server))
-                       return MOD_RES_ALLOW;
-
-               std::string network("cm_network_"+channel->name);
-
                // Don't do anything if they're not +Y
-               if (!dest->GetExt(network))
+               if (!memb->hasMode('Y'))
                        return MOD_RES_PASSTHRU;
 
                // Let them do whatever they want to themselves.
-               if (source == dest)
+               if (source == memb->user)
                        return MOD_RES_PASSTHRU;
 
-               switch (access_type)
-               {
-                       // Disallow deopping of +Y users.
-                       case AC_DEOP:
-                               source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't deop "+dest->nick+" as they're on official network business.");
-                               return MOD_RES_DENY;
-                       break;
-
-                       // Kicking people who are here on network business is a no no.
-                       case AC_KICK:
-                               source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't kick "+dest->nick+" as they're on official network business.");
-                               return MOD_RES_DENY;
-                       break;
-
-                       // Yes, they're immune to dehalfopping too.
-                       case AC_DEHALFOP:
-                               source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't de-halfop "+dest->nick+" as they're on official network business.");
-                               return MOD_RES_DENY;
-                       break;
-
-                       // same with devoice.
-                       case AC_DEVOICE:
-                               source->WriteNumeric(484, source->nick+" "+channel->name+" :Can't devoice "+dest->nick+" as they're on official network business.");
-                               return MOD_RES_DENY;
-                       break;
-               }
-
-               // Some other access check that doesn't fall into the above. Let it through.
-               return MOD_RES_PASSTHRU;
+               source->WriteNumeric(484, source->nick+" "+memb->chan->name+" :Can't kick "+memb->user->nick+" as they're on official network business.");
+               return MOD_RES_DENY;
        }
 
        ~ModuleOjoin()
        {
-               ServerInstance->Modes->DelMode(np);
                delete np;
        }