]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ojoin.cpp
Change to Duration for second param
[user/henk/code/inspircd.git] / src / modules / m_ojoin.cpp
index c03f2ad1f208b209c54765dd25dc5f7902dcfb80..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.");
                        }
@@ -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)
@@ -140,7 +133,7 @@ class NetworkPrefix : public ModeHandler
                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 (UserMembCIter i = cl->begin(); i != cl->end(); i++)
@@ -219,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))
                        )
                {
@@ -242,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))
                {
@@ -259,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);
        }
 
@@ -278,7 +270,7 @@ class ModuleOjoin : public Module
 
        void OnRehash(User* user)
        {
-               ConfigReader Conf(ServerInstance);
+               ConfigReader Conf;
 
                if (!np)
                {
@@ -294,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)
-                       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))
+               if ((ServerInstance->ULine(source->nick.c_str())) || ServerInstance->ULine(source->server))
                        return MOD_RES_PASSTHRU;
 
-               Membership* m = channel->GetUser(dest);
-
                // Don't do anything if they're not +Y
-               if (!m || !m->hasMode('Y'))
+               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;
        }