]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_operprefix.cpp
Minor spelling errors in m_spanningtree.so
[user/henk/code/inspircd.git] / src / modules / m_operprefix.cpp
index 62ddb6c67b160d187214431d4372f440d332750f..7d5e6d1181151f0cfae5c7b243205fed2d910248 100644 (file)
@@ -58,6 +58,39 @@ class OperPrefixMode : public ModeHandler
                }
 
                bool NeedsOper() { return true; }
+
+               void RemoveMode(Channel* chan, irc::modestacker* stack)
+               {
+                       irc::modestacker modestack(false);
+                       const UserMembList* users = chan->GetUsers();
+                       for (UserMembCIter i = users->begin(); i != users->end(); ++i)
+                       {
+                               if (i->second->hasMode(mode))
+                               {
+                                       if (stack)
+                                               stack->Push(this->GetModeChar(), i->first->nick);
+                                       else
+                                               modestack.Push(this->GetModeChar(), i->first->nick);
+                               }
+                       }
+
+                       if (stack)
+                               return;
+
+                       std::deque<std::string> stackresult;
+                       std::vector<std::string> mode_junk;
+                       mode_junk.push_back(chan->name);
+                       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());
+                       }
+               }
+
+               void RemoveMode(User* user, irc::modestacker* stack)
+               {
+               }
 };
 
 class ModuleOperPrefixMode;
@@ -85,7 +118,7 @@ class ModuleOperPrefixMode : public Module
        {
                ServerInstance->Modules->AddService(opm);
 
-               Implementation eventlist[] = { I_OnUserPreJoin, I_OnPostOper, I_OnLoadModule, I_OnUnloadModule };
+               Implementation eventlist[] = { I_OnUserPreJoin, I_OnPostOper, I_OnLoadModule, I_OnUnloadModule, I_OnPostJoin };
                ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
 
                /* To give clients a chance to learn about the new prefix we don't give +y to opers
@@ -110,6 +143,22 @@ class ModuleOperPrefixMode : public Module
                return MOD_RES_PASSTHRU;
        }
 
+       void OnPostJoin(Membership* memb)
+       {
+               if ((!IS_LOCAL(memb->user)) || (!IS_OPER(memb->user)) || (((mw_added) && (memb->user->IsModeSet('H')))))
+                       return;
+
+               if (memb->hasMode(opm.GetModeChar()))
+                       return;
+
+               // The user was force joined and OnUserPreJoin() did not run. Set the operprefix now.
+               std::vector<std::string> modechange;
+               modechange.push_back(memb->chan->name);
+               modechange.push_back("+y");
+               modechange.push_back(memb->user->nick);
+               ServerInstance->SendGlobalMode(modechange, ServerInstance->FakeClient);
+       }
+
        void SetOperPrefix(User* user, bool add)
        {
                std::vector<std::string> modechange;