* | 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
private:
CUList empty;
public:
- DelayJoinMode(InspIRCd* Instance, Module* Parent) : ModeHandler(Instance, Parent, 'D', 0, 0, false, MODETYPE_CHANNEL, false, 0, '@') {};
+ DelayJoinMode(Module* Parent) : ModeHandler(Parent, "delayjoin", 'D', PARAM_NONE, MODETYPE_CHANNEL)
+ {
+ levelrequired = OP_VALUE;
+ }
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding);
};
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!");
- Implementation eventlist[] = { I_OnUserJoin, I_OnUserPart, I_OnUserKick, I_OnUserQuit, I_OnNamesListItem, I_OnText, I_OnHostCycle };
+ Implementation eventlist[] = { I_OnUserJoin, I_OnUserPart, I_OnUserKick, I_OnBuildNeighborList, I_OnNamesListItem, I_OnText, I_OnRawMode };
ServerInstance->Modules->Attach(eventlist, this, 7);
}
~ModuleDelayJoin();
void OnNamesListItem(User* issuer, Membership*, std::string &prefixes, std::string &nick);
void OnUserJoin(Membership*, bool, bool, CUList&);
void CleanUser(User* user);
- ModResult OnHostCycle(User* user);
void OnUserPart(Membership*, std::string &partmessage, CUList&);
void OnUserKick(User* source, Membership*, const std::string &reason, CUList&);
- void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message);
+ 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 */
ModuleDelayJoin::~ModuleDelayJoin()
{
- ServerInstance->Modes->DelMode(&djm);
}
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_VENDOR);
}
void ModuleDelayJoin::OnNamesListItem(User* issuer, Membership* memb, std::string &prefixes, std::string &nick)
populate(except, memb);
}
-ModResult ModuleDelayJoin::OnHostCycle(User* user)
-{
- // TODO
- return MOD_RES_DENY;
-}
-
-void ModuleDelayJoin::OnUserQuit(User* user, const std::string &reason, const std::string &oper_message)
+void ModuleDelayJoin::OnBuildNeighborList(User* source, UserChanList &include, std::map<User*,bool> &exception)
{
- Command* parthandler = ServerInstance->Parser->GetHandler("PART");
- if (!parthandler)
- return;
- for (UCListIter f = user->chans.begin(); f != user->chans.end(); f++)
+ UCListIter i = include.begin();
+ while (i != include.end())
{
- Channel* chan = *f;
- Membership* memb = chan->GetUser(user);
+ Channel* c = *i++;
+ Membership* memb = c->GetUser(source);
if (memb && unjoined.get(memb))
- {
- std::vector<std::string> parameters;
- parameters.push_back(chan->name);
- /* Send a fake PART from the channel, which will be silent */
- parthandler->Handle(parameters, user);
- }
+ include.erase(c);
}
}
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))
/* 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);
- 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 ¶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)