X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_delayjoin.cpp;h=dd0dadd69e2451c923e151121a3aa4262b3d8f8a;hb=b5965b08c23e3e89404b481386f2e56ce7cb7ce2;hp=a7a8575b4c7a19bff41d7ccd08fe79269b6312a7;hpb=d9e3bb8d4343643504ab7ee6ab943a000065cc8a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_delayjoin.cpp b/src/modules/m_delayjoin.cpp index a7a8575b4..dd0dadd69 100644 --- a/src/modules/m_delayjoin.cpp +++ b/src/modules/m_delayjoin.cpp @@ -2,7 +2,7 @@ * | 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 @@ -19,7 +19,7 @@ class DelayJoinMode : public ModeHandler private: CUList empty; public: - DelayJoinMode(InspIRCd* Instance, Module* Parent) : ModeHandler(Parent, 'D', PARAM_NONE, MODETYPE_CHANNEL) + DelayJoinMode(Module* Parent) : ModeHandler(Parent, "delayjoin", 'D', PARAM_NONE, MODETYPE_CHANNEL) { levelrequired = OP_VALUE; } @@ -32,22 +32,21 @@ class ModuleDelayJoin : public Module 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 }; - ServerInstance->Modules->Attach(eventlist, this, 7); + Implementation eventlist[] = { I_OnUserJoin, I_OnUserPart, I_OnUserKick, I_OnBuildNeighborList, I_OnNamesListItem, I_OnText }; + ServerInstance->Modules->Attach(eventlist, this, 6); } ~ModuleDelayJoin(); Version GetVersion(); 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 &exception); void OnText(User* user, void* dest, int target_type, const std::string &text, char status, CUList &exempt_list); }; @@ -75,12 +74,11 @@ ModeAction DelayJoinMode::OnModeChange(User* source, User* dest, Channel* channe 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) @@ -126,28 +124,15 @@ void ModuleDelayJoin::OnUserKick(User* source, Membership* memb, const std::stri populate(except, memb); } -ModResult ModuleDelayJoin::OnHostCycle(User* user) +void ModuleDelayJoin::OnBuildNeighborList(User* source, UserChanList &include, std::map &exception) { - // TODO - return MOD_RES_DENY; -} - -void ModuleDelayJoin::OnUserQuit(User* user, const std::string &reason, const std::string &oper_message) -{ - 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 parameters; - parameters.push_back(chan->name); - /* Send a fake PART from the channel, which will be silent */ - parthandler->Handle(parameters, user); - } + include.erase(c); } } @@ -169,9 +154,12 @@ void ModuleDelayJoin::OnText(User* user, void* dest, int target_type, const std: /* 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 = 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()); } MODULE_INIT(ModuleDelayJoin)