+ Membership* memb = channel->GetUser(user);
+ if (!memb || !unjoined.set(memb, 0))
+ return;
+
+ /* 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 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 ¶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)