]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ojoin.cpp
Fix a couple of issues
[user/henk/code/inspircd.git] / src / modules / m_ojoin.cpp
index ff92f3fae8b2187cd34b9124a21e1650062c8209..b0c206ab312731dc8d5d724da81f51dfb0e069ec 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2009 Taros <taros34@hotmail.com>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-
-/*
- * Written for InspIRCd-1.2 by Taros on the Tel'Laerad M&D Team
- * <http://tellaerad.net>
- */
-
 #include "inspircd.h"
 
-/* $ModConfig: <ojoin prefix="!" notice="yes" op="yes">
- *  Specify the prefix that +Y will grant here, it should be unused.
- *  Leave prefix empty if you do not wish +Y to grant a prefix
- *  If notice is set to on, upon ojoin, the server will notice
- *  the channel saying that the oper is joining on network business
- *  If op is set to on, it will give them +o along with +Y */
-/* $ModDesc: Provides the /ojoin command, which joins a user to a channel on network business, and gives them +Y, which makes them immune to kick / deop and so on. */
-/* $ModAuthor: Taros */
-/* $ModAuthorMail: taros34@hotmail.com */
-
-/* A note: This will not protect against kicks from services,
- * ulines, or operoverride. */
-
 #define NETWORK_VALUE 9000000
 
-char NPrefix;
-bool notice;
-bool op;
-
 /** Handle /OJOIN
  */
 class CommandOjoin : public SplitCommand
 {
  public:
        bool active;
+       bool notice;
+       bool op;
+       ModeHandler* npmh;
        CommandOjoin(Module* parent) :
                SplitCommand(parent, "OJOIN", 1)
        {
                flags_needed = 'o'; Penalty = 0; syntax = "<channel>";
                active = false;
-               TRANSLATE3(TR_NICK, TR_TEXT, TR_END);
        }
 
        CmdResult HandleLocal(const std::vector<std::string>& parameters, LocalUser* user)
@@ -89,11 +69,14 @@ class CommandOjoin : public SplitCommand
                        // they're already in the channel
                        std::vector<std::string> modes;
                        modes.push_back(parameters[0]);
-                       modes.push_back(op ? "+Yo" : "+Y");
-                       modes.push_back(user->nick);
+                       modes.push_back(std::string("+") + npmh->GetModeChar());
                        if (op)
+                       {
+                               modes[1].push_back('o');
                                modes.push_back(user->nick);
-                       ServerInstance->SendGlobalMode(modes, ServerInstance->FakeClient);
+                       }
+                       modes.push_back(user->nick);
+                       ServerInstance->Modes->Process(modes, ServerInstance->FakeClient);
                }
                return CMD_SUCCESS;
        }
@@ -104,17 +87,14 @@ class CommandOjoin : public SplitCommand
 class NetworkPrefix : public ModeHandler
 {
  public:
-       NetworkPrefix(Module* parent) : ModeHandler(parent, "official-join", 'Y', PARAM_ALWAYS, MODETYPE_CHANNEL)
+       NetworkPrefix(Module* parent, char NPrefix)
+               : ModeHandler(parent, "official-join", 'Y', PARAM_ALWAYS, MODETYPE_CHANNEL)
        {
                list = true;
                prefix = NPrefix;
                levelrequired = INT_MAX;
                m_paramtype = TR_NICK;
-       }
-
-       unsigned int GetPrefixRank()
-       {
-               return NETWORK_VALUE;
+               prefixrank = NETWORK_VALUE;
        }
 
        ModResult AccessCheck(User* source, Channel* channel, std::string &parameter, bool adding)
@@ -151,22 +131,25 @@ class ModuleOjoin : public Module
                /* Load config stuff */
                OnRehash(NULL);
 
+               std::string npre = ServerInstance->Config->ConfValue("ojoin")->getString("prefix");
+               char NPrefix = npre.empty() ? 0 : npre[0];
+               if (NPrefix && ServerInstance->Modes->FindPrefix(NPrefix))
+                       throw ModuleException("Looks like the prefix you picked for m_ojoin is already in use. Pick another.");
+
                /* Initialise module variables */
-               np = new NetworkPrefix(this);
+               np = new NetworkPrefix(this, NPrefix);
+               mycommand.npmh = np;
 
                ServerInstance->Modules->AddService(*np);
                ServerInstance->Modules->AddService(mycommand);
-
-               Implementation eventlist[] = { I_OnUserPreJoin, I_OnUserPreKick, I_OnRehash };
-               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
        }
 
        ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
        {
                if (mycommand.active)
                {
-                       privs += 'Y';
-                       if (op)
+                       privs += np->GetModeChar();
+                       if (mycommand.op)
                                privs += 'o';
                        return MOD_RES_ALLOW;
                }
@@ -177,25 +160,14 @@ class ModuleOjoin : public Module
        void OnRehash(User* user) CXX11_OVERRIDE
        {
                ConfigTag* Conf = ServerInstance->Config->ConfValue("ojoin");
-
-               if (!np)
-               {
-                       // This is done on module load only
-                       std::string npre = Conf->getString("prefix");
-                       NPrefix = npre.empty() ? 0 : npre[0];
-
-                       if (NPrefix && ServerInstance->Modes->FindPrefix(NPrefix))
-                               throw ModuleException("Looks like the +Y prefix you picked for m_ojoin is already in use. Pick another.");
-               }
-
-               notice = Conf->getBool("notice", true);
-               op = Conf->getBool("op", true);
+               mycommand.notice = Conf->getBool("notice", true);
+               mycommand.op = Conf->getBool("op", true);
        }
 
        ModResult OnUserPreKick(User* source, Membership* memb, const std::string &reason) CXX11_OVERRIDE
        {
                // Don't do anything if they're not +Y
-               if (!memb->hasMode('Y'))
+               if (!memb->hasMode(np->GetModeChar()))
                        return MOD_RES_PASSTHRU;
 
                // Let them do whatever they want to themselves.