]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_delayjoin.cpp
SVSNICK should not translate nicks to UIDs
[user/henk/code/inspircd.git] / src / modules / m_delayjoin.cpp
index 5c545c2f6fd64f05e0707204c6981f3ae8eb4b59..ee4b3bba5a4eb31ad266ba09203c7297679d05c8 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
  * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
@@ -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 */
@@ -78,7 +79,7 @@ ModuleDelayJoin::~ModuleDelayJoin()
 
 Version ModuleDelayJoin::GetVersion()
 {
-       return Version("Allows for delay-join channels (+D) where users dont appear to join until they speak", VF_COMMON | VF_VENDOR);
+       return Version("Allows for delay-join channels (+D) where users dont appear to join until they speak", VF_VENDOR);
 }
 
 void ModuleDelayJoin::OnNamesListItem(User* issuer, Membership* memb, std::string &prefixes, std::string &nick)
@@ -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))
@@ -154,9 +155,33 @@ void ModuleDelayJoin::OnText(User* user, void* dest, int target_type, const std:
        /* Display the join to everyone else (the user who joined got it earlier) */
        channel->WriteAllExceptSender(user, false, 0, "JOIN %s", channel->name.c_str());
 
-       std::string n = ServerInstance->Modes->ModeString(user, channel);
-       if (n.length() > 0)
-               channel->WriteAllExceptSender(user, false, 0, "MODE %s +%s", channel->name.c_str(), n.c_str());
+       std::string ms = memb->modes;
+       for(unsigned int i=0; i < memb->modes.length(); i++)
+               ms.append(" ").append(user->nick);
+
+       if (ms.length() > 0)
+               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)