X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_services.cpp;h=929c45f901ad4b7e30f76a15db06f10040ca744f;hb=eb4229deed0281ae566ef7e55a144e5d3183a4b2;hp=39cd55d6b3302625642f9431c6dd5f4bcdbef9a0;hpb=e8b5c0d9f9103f84384fe9b0d89301ecbf16c3e6;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_services.cpp b/src/modules/m_services.cpp index 39cd55d6b..929c45f90 100644 --- a/src/modules/m_services.cpp +++ b/src/modules/m_services.cpp @@ -1,5 +1,20 @@ -#include +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * Inspire is copyright (C) 2002-2004 ChatSpike-Dev. + * E-mail: + * + * + * + * Written by Craig Edwards, Craig McLure, and others. + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ +#include #include "users.h" #include "channels.h" #include "modules.h" @@ -8,11 +23,9 @@ /* $ModDesc: Povides support for services +r user/chan modes and more */ -Server *Srv; - - class ModuleServices : public Module { + Server *Srv; public: ModuleServices() { @@ -20,42 +33,169 @@ class ModuleServices : public Module Srv->AddExtendedMode('r',MT_CHANNEL,false,0,0); Srv->AddExtendedMode('r',MT_CLIENT,false,0,0); + Srv->AddExtendedMode('R',MT_CHANNEL,false,0,0); + Srv->AddExtendedMode('R',MT_CLIENT,false,0,0); + Srv->AddExtendedMode('M',MT_CHANNEL,false,0,0); } + + virtual void On005Numeric(std::string &output) + { + std::stringstream line(output); + std::string temp1, temp2; + while (!line.eof()) + { + line >> temp1; + if (temp1.substr(0,10) == "CHANMODES=") + { + // append the chanmode to the end + temp1 = temp1.substr(10,temp1.length()); + temp1 = "CHANMODES=" + temp1 + "rRM"; + } + temp2 = temp2 + temp1 + " "; + } + if (temp2.length()) + output = temp2.substr(0,temp2.length()-1); + } virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list ¶ms) { - if (modechar != 'r') { - return 0; + if (modechar == 'r') + { + if (type == MT_CHANNEL) + { + // only a u-lined server may add or remove the +r mode. + if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server)) || (!strcmp(user->server,""))) + { + return 1; + } + else + { + Srv->SendServ(user->fd,"500 "+std::string(user->nick)+" :Only a U-Lined server may modify the +r channel mode"); + } + } + else + { + if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server)) || (!strcmp(user->server,""))) + { + return 1; + } + else + { + Srv->SendServ(user->fd,"500 "+std::string(user->nick)+" :Only a U-Lined server may modify the +r user mode"); + } + } } - - if (type == MT_CHANNEL) + else if (modechar == 'R') { - // only a u-lined server may add or remove the +r mode. - if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server))) + if (type == MT_CHANNEL) { return 1; } - else + } + else if (modechar == 'M') + { + if (type == MT_CHANNEL) { - Srv->SendServ(user->fd,"500 "+std::string(user->nick)+" :Only a U-Lined server may modify the +r channel mode"); + return 1; } } - else + + return 0; + } + + virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text) + { + if (target_type == TYPE_CHANNEL) { - if (!strcmp(user->server,"")) + chanrec* c = (chanrec*)dest; + if ((c->IsCustomModeSet('M')) && (!strchr(user->modes,'r'))) { + if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server)) || (!strcmp(user->server,""))) + { + // user is ulined, can speak regardless + return 0; + } + // user messaging a +M channel and is not registered + Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(c->name)+" :You need a registered nickname to speak on this channel"); return 1; } - else + } + if (target_type == TYPE_USER) + { + userrec* u = (userrec*)dest; + if ((strchr(u->modes,'R')) && (!strchr(user->modes,'r'))) + { + if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server))) + { + // user is ulined, can speak regardless + return 0; + } + // user messaging a +R user and is not registered + Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(u->nick)+" :You need a registered nickname to message this user"); + return 1; + } + } + return 0; + } + + virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text) + { + if (target_type == TYPE_CHANNEL) + { + chanrec* c = (chanrec*)dest; + if ((c->IsCustomModeSet('M')) && (!strchr(user->modes,'r'))) { - Srv->SendServ(user->fd,"500 "+std::string(user->nick)+" :Only a server may modify the +r user mode"); + if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server))) + { + // user is ulined, can speak regardless + return 0; + } + // user noticing a +M channel and is not registered + Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(c->name)+" :You need a registered nickname to speak on this channel"); + return 1; + } + } + if (target_type == TYPE_USER) + { + userrec* u = (userrec*)dest; + if ((strchr(u->modes,'R')) && (!strchr(user->modes,'r'))) + { + if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server))) + { + // user is ulined, can speak regardless + return 0; + } + // user noticing a +R user and is not registered + Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(u->nick)+" :You need a registered nickname to message this user"); + return 1; } } - return 0; } - + + virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname) + { + if (chan) + { + if (chan->IsCustomModeSet('R')) + { + if (!strchr(user->modes,'r')) + { + if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server))) + { + // user is ulined, won't be stopped from joining + return 0; + } + // joining a +R channel and not identified + Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(chan->name)+" :You need a registered nickname to join this channel"); + return 1; + } + } + } + return 0; + } + virtual ~ModuleServices() { delete Srv; @@ -63,7 +203,7 @@ class ModuleServices : public Module virtual Version GetVersion() { - return Version(1,0,0,0); + return Version(1,0,0,0,VF_STATIC|VF_VENDOR); } virtual void OnUserConnect(userrec* user)