]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_delayjoin.cpp
Stop hiding users when a prefix is set on them, fixes apparent desyncs
[user/henk/code/inspircd.git] / src / modules / m_delayjoin.cpp
index dd0dadd69e2451c923e151121a3aa4262b3d8f8a..ee4b3bba5a4eb31ad266ba09203c7297679d05c8 100644 (file)
@@ -36,8 +36,8 @@ class ModuleDelayJoin : public Module
        {
                if (!ServerInstance->Modes->AddMode(&djm))
                        throw ModuleException("Could not add new modes!");
-               Implementation eventlist[] = { I_OnUserJoin, I_OnUserPart, I_OnUserKick, I_OnBuildNeighborList, I_OnNamesListItem, I_OnText };
-               ServerInstance->Modules->Attach(eventlist, this, 6);
+               Implementation eventlist[] = { I_OnUserJoin, I_OnUserPart, I_OnUserKick, I_OnBuildNeighborList, I_OnNamesListItem, I_OnText, I_OnRawMode };
+               ServerInstance->Modules->Attach(eventlist, this, 7);
        }
        ~ModuleDelayJoin();
        Version GetVersion();
@@ -48,6 +48,7 @@ class ModuleDelayJoin : public Module
        void OnUserKick(User* source, Membership*, const std::string &reason, CUList&);
        void OnBuildNeighborList(User* source, UserChanList &include, std::map<User*,bool> &exception);
        void OnText(User* user, void* dest, int target_type, const std::string &text, char status, CUList &exempt_list);
+       ModResult OnRawMode(User* user, Channel* channel, const char mode, const std::string &param, bool adding, int pcnt);
 };
 
 /* $ModDesc: Allows for delay-join channels (+D) where users dont appear to join until they speak */
@@ -145,7 +146,7 @@ void ModuleDelayJoin::OnText(User* user, void* dest, int target_type, const std:
        if (target_type != TYPE_CHANNEL)
                return;
 
-       Channel* channel = (Channel*) dest;
+       Channel* channel = static_cast<Channel*>(dest);
 
        Membership* memb = channel->GetUser(user);
        if (!memb || !unjoined.set(memb, 0))
@@ -162,5 +163,26 @@ void ModuleDelayJoin::OnText(User* user, void* dest, int target_type, const std:
                channel->WriteAllExceptSender(user, false, 0, "MODE %s +%s", channel->name.c_str(), ms.c_str());
 }
 
+/* make the user visible if he receives any mode change */
+ModResult ModuleDelayJoin::OnRawMode(User* user, Channel* channel, const char mode, const std::string &param, bool adding, int pcnt)
+{
+       if (!user || !channel || param.empty())
+               return MOD_RES_PASSTHRU;
+
+       User* dest;
+       if (IS_LOCAL(user))
+               dest = ServerInstance->FindNickOnly(param);
+       else
+               dest = ServerInstance->FindNick(param);
+
+       if (!dest)
+               return MOD_RES_PASSTHRU;
+
+       Membership* memb = channel->GetUser(dest);
+       if (memb && unjoined.set(memb, 0))
+               channel->WriteAllExceptSender(dest, false, 0, "JOIN %s", channel->name.c_str());
+       return MOD_RES_PASSTHRU;
+}
+
 MODULE_INIT(ModuleDelayJoin)