private:
CUList empty;
public:
- DelayJoinMode(InspIRCd* Instance, Module* Parent) : ModeHandler(Parent, 'D', PARAM_NONE, MODETYPE_CHANNEL)
+ DelayJoinMode(Module* Parent) : ModeHandler(Parent, 'D', PARAM_NONE, MODETYPE_CHANNEL)
{
levelrequired = OP_VALUE;
}
DelayJoinMode djm;
public:
LocalIntExt unjoined;
- ModuleDelayJoin(InspIRCd* Me) : Module(Me), djm(Me, this), unjoined("delayjoin", this)
+ ModuleDelayJoin() : djm(this), unjoined("delayjoin", this)
{
if (!ServerInstance->Modes->AddMode(&djm))
throw ModuleException("Could not add new modes!");
Version ModuleDelayJoin::GetVersion()
{
- return Version("$Id$", VF_COMMON | VF_VENDOR);
+ return Version("Allows for delay-join channels (+D) where users dont appear to join until they speak", VF_COMMON | VF_VENDOR);
}
void ModuleDelayJoin::OnNamesListItem(User* issuer, Membership* memb, std::string &prefixes, std::string &nick)
ModResult ModuleDelayJoin::OnHostCycle(User* user)
{
- // TODO
- return MOD_RES_DENY;
+ for (UCListIter f = user->chans.begin(); f != user->chans.end(); f++)
+ {
+ Channel* chan = *f;
+ Membership* memb = chan->GetUser(user);
+
+ if (memb && unjoined.get(memb))
+ {
+ return MOD_RES_DENY;
+ }
+ }
+ return MOD_RES_PASSTHRU;
}
void ModuleDelayJoin::OnUserQuit(User* user, const std::string &reason, const std::string &oper_message)
/* 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 = this->ServerInstance->Modes->ModeString(user, channel);
+ 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());
}