]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ojoin.cpp
m_callerid Route ACCEPT to the server of the target user only, do not send METADATA...
[user/henk/code/inspircd.git] / src / modules / m_ojoin.cpp
index fcb26775017ef391a5d80117a92820d129f4b1f0..999cd5b6486a72bd0311fa9eaa02f81b7dafbd0a 100644 (file)
@@ -45,28 +45,30 @@ bool op;
 
 /** Handle /OJOIN
  */
-class CommandOjoin : public Command
+class CommandOjoin : public SplitCommand
 {
  public:
        bool active;
-       CommandOjoin(Module* parent) : Command(parent,"OJOIN", 1)
+       CommandOjoin(Module* parent) :
+               SplitCommand(parent, "OJOIN", 1)
        {
                flags_needed = 'o'; Penalty = 0; syntax = "<channel>";
                active = false;
                TRANSLATE3(TR_NICK, TR_TEXT, TR_END);
        }
 
-       CmdResult Handle (const std::vector<std::string>& parameters, User *user)
+       CmdResult HandleLocal(const std::vector<std::string>& parameters, LocalUser* user)
        {
                // Make sure the channel name is allowable.
-               if (!ServerInstance->IsChannel(parameters[0].c_str(), ServerInstance->Config->Limits.ChanMax))
+               if (!ServerInstance->IsChannel(parameters[0]))
                {
-                       user->WriteServ("NOTICE "+user->nick+" :*** Invalid characters in channel name or name too long");
+                       user->WriteNotice("*** Invalid characters in channel name or name too long");
                        return CMD_FAILURE;
                }
 
                active = true;
-               Channel* channel = Channel::JoinUser(user, parameters[0].c_str(), false, "", false);
+               // override is false because we want OnUserPreJoin to run
+               Channel* channel = Channel::JoinUser(user, parameters[0], false);
                active = false;
 
                if (channel)
@@ -76,7 +78,7 @@ class CommandOjoin : public Command
                        if (notice)
                        {
                                channel = ServerInstance->FindChan(parameters[0]);
-                               channel->WriteChannelWithServ(ServerInstance->Config->ServerName.c_str(), "NOTICE %s :%s joined on official network business.",
+                               channel->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :%s joined on official network business.",
                                        parameters[0].c_str(), user->nick.c_str());
                                ServerInstance->PI->SendChannelNotice(channel, 0, user->nick + " joined on official network business.");
                        }
@@ -87,8 +89,10 @@ class CommandOjoin : public Command
                        // they're already in the channel
                        std::vector<std::string> modes;
                        modes.push_back(parameters[0]);
-                       modes.push_back("+Y");
+                       modes.push_back(op ? "+Yo" : "+Y");
                        modes.push_back(user->nick);
+                       if (op)
+                               modes.push_back(user->nick);
                        ServerInstance->SendGlobalMode(modes, ServerInstance->FakeClient);
                }
                return CMD_SUCCESS;
@@ -106,45 +110,7 @@ class NetworkPrefix : public ModeHandler
                prefix = NPrefix;
                levelrequired = INT_MAX;
                m_paramtype = TR_NICK;
-       }
-
-       void RemoveMode(Channel* channel, irc::modestacker* stack)
-       {
-               const UserMembList* cl = channel->GetUsers();
-               std::vector<std::string> mode_junk;
-               mode_junk.push_back(channel->name);
-               irc::modestacker modestack(false);
-               std::deque<std::string> stackresult;
-
-               for (UserMembCIter i = cl->begin(); i != cl->end(); i++)
-               {
-                       if (i->second->hasMode('Y'))
-                       {
-                               if (stack)
-                                       stack->Push(this->GetModeChar(), i->first->nick);
-                               else
-                                       modestack.Push(this->GetModeChar(), i->first->nick);
-                       }
-               }
-
-               if (stack)
-                       return;
-
-               while (modestack.GetStackedLine(stackresult))
-               {
-                       mode_junk.insert(mode_junk.end(), stackresult.begin(), stackresult.end());
-                       ServerInstance->SendMode(mode_junk, ServerInstance->FakeClient);
-                       mode_junk.erase(mode_junk.begin() + 1, mode_junk.end());
-               }
-       }
-
-       unsigned int GetPrefixRank()
-       {
-               return NETWORK_VALUE;
-       }
-
-       void RemoveMode(User* user, irc::modestacker* stack)
-       {
+               prefixrank = NETWORK_VALUE;
        }
 
        ModResult AccessCheck(User* source, Channel* channel, std::string &parameter, bool adding)
@@ -176,7 +142,7 @@ class ModuleOjoin : public Module
        {
        }
 
-       void init()
+       void init() CXX11_OVERRIDE
        {
                /* Load config stuff */
                OnRehash(NULL);
@@ -188,10 +154,10 @@ class ModuleOjoin : public Module
                ServerInstance->Modules->AddService(mycommand);
 
                Implementation eventlist[] = { I_OnUserPreJoin, I_OnUserPreKick, I_OnRehash };
-               ServerInstance->Modules->Attach(eventlist, this, 3);
+               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
        }
 
-       ModResult OnUserPreJoin(User *user, Channel *chan, const char *cname, std::string &privs, const std::string &keygiven)
+       ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
        {
                if (mycommand.active)
                {
@@ -204,7 +170,7 @@ class ModuleOjoin : public Module
                return MOD_RES_PASSTHRU;
        }
 
-       void OnRehash(User* user)
+       void OnRehash(User* user) CXX11_OVERRIDE
        {
                ConfigTag* Conf = ServerInstance->Config->ConfValue("ojoin");
 
@@ -222,7 +188,7 @@ class ModuleOjoin : public Module
                op = Conf->getBool("op", true);
        }
 
-       ModResult OnUserPreKick(User* source, Membership* memb, const std::string &reason)
+       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'))
@@ -246,11 +212,10 @@ class ModuleOjoin : public Module
                ServerInstance->Modules->SetPriority(this, I_OnUserPreJoin, PRIORITY_FIRST);
        }
 
-       Version GetVersion()
+       Version GetVersion() CXX11_OVERRIDE
        {
                return Version("Network Business Join", VF_VENDOR);
        }
 };
 
 MODULE_INIT(ModuleOjoin)
-