summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modules/m_delayjoin.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/modules/m_delayjoin.cpp b/src/modules/m_delayjoin.cpp
index dd0dadd69..ee4b3bba5 100644
--- a/src/modules/m_delayjoin.cpp
+++ b/src/modules/m_delayjoin.cpp
@@ -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)