diff options
-rw-r--r-- | src/modules/m_delayjoin.cpp | 28 |
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 ¶m, 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 ¶m, 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) |