X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_chanprotect.cpp;h=6d99ed10bcba7c755ad46fab9b6ac6a57bfd6386;hb=b7e299c2e10d915d5e59df4cb3f54951c8daa999;hp=1afba46ba76595e6ac83c81503df624ebe0bd78b;hpb=76d7e8a0684b38a82e6c05ebd7538b69660e1bef;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_chanprotect.cpp b/src/modules/m_chanprotect.cpp index 1afba46ba..6d99ed10b 100644 --- a/src/modules/m_chanprotect.cpp +++ b/src/modules/m_chanprotect.cpp @@ -80,7 +80,7 @@ class FounderProtectBase unload_kludge = true; CUList* cl = channel->GetUsers(); std::string item = extend + std::string(channel->name); - const char* mode_junk[MAXMODES+1]; + const char* mode_junk[MAXMODES+2]; userrec* n = new userrec(MyInstance); n->SetFd(FD_MAGIC_NUMBER); mode_junk[0] = channel->name; @@ -111,7 +111,7 @@ class FounderProtectBase { CUList* cl = channel->GetUsers(); std::string item = extend+std::string(channel->name); - for (CUList::iterator i = cl->begin(); i != cl->end(); i++) + for (CUList::reverse_iterator i = cl->rbegin(); i != cl->rend(); ++i) { if (i->first->GetExt(item, dummyptr)) { @@ -126,7 +126,7 @@ class FounderProtectBase userrec* theuser = MyInstance->FindNick(parameter); if ((!theuser) || (!channel->HasUser(theuser))) { - parameter = ""; + parameter.clear(); return NULL; } return theuser; @@ -215,7 +215,7 @@ class ChanFounder : public ModeHandler, public FounderProtectBase { // whoops, someones being naughty! source->WriteServ("468 %s %s :Only servers may set channel mode +q",source->nick, channel->name); - parameter = ""; + parameter.clear(); return MODEACTION_DENY; } } @@ -320,7 +320,7 @@ class ModuleChanProtect : public Module void Implements(char* List) { - List[I_OnUserKick] = List[I_OnUserPart] = List[I_OnRehash] = List[I_OnUserJoin] = List[I_OnAccessCheck] = List[I_OnSyncChannel] = 1; + List[I_OnUserKick] = List[I_OnUserPart] = List[I_OnRehash] = List[I_OnUserPreJoin] = List[I_OnPostJoin] = List[I_OnAccessCheck] = List[I_OnSyncChannel] = 1; } virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason, bool &silent) @@ -372,26 +372,29 @@ class ModuleChanProtect : public Module } } - virtual void OnUserJoin(userrec* user, chanrec* channel, bool &silent) + virtual int OnUserPreJoin(userrec *user, chanrec *chan, const char *cname, std::string &privs) { // if the user is the first user into the channel, mark them as the founder, but only if // the config option for it is set - if (FirstInGetsFounder) - { - if (channel->GetUserCounter() == 1) - { - // we're using Extensible::Extend to add data into user objects. - // this way is best as it adds data thats accessible to other modules - // (so long as you document your code properly) without breaking anything - // because its encapsulated neatly in a map. - - // Change requested by katsklaw... when the first in is set to get founder, - // to make it clearer that +q has been given, send that one user the +q notice - // so that their client's syncronization and their sanity are left intact. - user->WriteServ("MODE %s +q %s",channel->name,user->nick); - user->Extend("cm_founder_"+std::string(channel->name),fakevalue); - } - } + + if (FirstInGetsFounder && !chan) + privs = "~@"; + + return 0; + } + + virtual void OnPostJoin(userrec *user, chanrec *channel) + { + // This *must* be in PostJoin, not UserJoin - the former will make it appear to happen + // before the client is in the channel + + // This notice was here originally because it was all done prior to the creation of + // privs in OnUserPreJoin. I've left it because it might still be wanted, but i'm + // not sure it really should be here - ops don't get shown, obviously, and the prefix + // will appear in the names list for the user.. remove if desired -Special + + if (FirstInGetsFounder && channel->GetUserCounter() == 1) + user->WriteServ("MODE %s +q %s", channel->name, user->nick); } virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type) @@ -528,27 +531,4 @@ class ModuleChanProtect : public Module }; - -class ModuleChanProtectFactory : public ModuleFactory -{ - public: - ModuleChanProtectFactory() - { - } - - ~ModuleChanProtectFactory() - { - } - - virtual Module * CreateModule(InspIRCd* Me) - { - return new ModuleChanProtect(Me); - } - -}; - - -extern "C" DllExport void * init_module( void ) -{ - return new ModuleChanProtectFactory; -} +MODULE_INIT(ModuleChanProtect)