1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
7 * <brain@chatspike.net>
8 * <Craig@chatspike.net>
10 * Written by Craig Edwards, Craig McLure, and others.
11 * This program is free but copyrighted software; see
12 * the file COPYING for details.
14 * ---------------------------------------------------
24 #include "helperfuncs.h"
27 static bool kludgeme = false;
29 /* $ModDesc: Povides support for services +r user/chan modes and more */
31 class Channel_r : public ModeHandler
35 Channel_r(Server* srv) : ModeHandler('r', 0, 0, false, MODETYPE_CHANNEL, false), Srv(srv) { }
37 ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
39 // only a u-lined server may add or remove the +r mode.
40 if ((Srv->IsUlined(source->nick)) || (Srv->IsUlined(source->server)) || (!*source->server || (strchr(source->nick,'.'))))
42 log(DEBUG,"Allowing cmode +r, server and nick are: '%s','%s'",source->nick,source->server);
43 channel->SetMode('r',adding);
44 return MODEACTION_ALLOW;
48 log(DEBUG,"Only a server can set chanmode +r, server and nick are: '%s','%s'",source->nick,source->server);
49 Srv->SendServ(source->fd,"500 "+std::string(source->nick)+" :Only a server may modify the +r channel mode");
50 return MODEACTION_DENY;
55 class User_r : public ModeHandler
59 User_r(Server* srv) : ModeHandler('r', 0, 0, false, MODETYPE_USER, false), Srv(srv) { }
61 ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
63 if ((kludgeme) || (Srv->IsUlined(source->nick)) || (Srv->IsUlined(source->server)) || (!*source->server || (strchr(source->nick,'.'))))
65 log(DEBUG,"Allowing umode +r, server and nick are: '%s','%s'",source->nick,source->server);
66 dest->SetMode('r',adding);
67 return MODEACTION_ALLOW;
71 log(DEBUG,"Only a server can set umode +r, server and nick are: '%s','%s'",source->nick, source->server);
72 Srv->SendServ(source->fd,"500 "+std::string(source->nick)+" :Only a server may modify the +r user mode");
73 return MODEACTION_DENY;
78 class Channel_R : public ModeHandler
81 Channel_R() : ModeHandler('R', 0, 0, false, MODETYPE_CHANNEL, false) { }
83 ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
87 if (!channel->IsModeSet('R'))
89 channel->SetMode('R',true);
90 return MODEACTION_ALLOW;
95 if (channel->IsModeSet('R'))
97 channel->SetMode('R',false);
98 return MODEACTION_ALLOW;
102 return MODEACTION_DENY;
106 class User_R : public ModeHandler
109 User_R() : ModeHandler('R', 0, 0, false, MODETYPE_USER, false) { }
111 ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
115 if (!dest->IsModeSet('R'))
117 dest->SetMode('R',true);
118 return MODEACTION_ALLOW;
123 if (dest->IsModeSet('R'))
125 dest->SetMode('R',false);
126 return MODEACTION_ALLOW;
130 return MODEACTION_DENY;
134 class Channel_M : public ModeHandler
137 Channel_M() : ModeHandler('M', 0, 0, false, MODETYPE_CHANNEL, false) { }
139 ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
143 if (!channel->IsModeSet('M'))
145 channel->SetMode('M',true);
146 return MODEACTION_ALLOW;
151 if (channel->IsModeSet('M'))
153 channel->SetMode('M',true);
154 return MODEACTION_ALLOW;
158 return MODEACTION_DENY;
162 class ModuleServices : public Module
171 ModuleServices(Server* Me)
175 m1 = new Channel_r(Me);
176 m2 = new Channel_R();
177 m3 = new Channel_M();
180 Srv->AddMode(m1, 'r');
181 Srv->AddMode(m2, 'R');
182 Srv->AddMode(m3, 'M');
183 Srv->AddMode(m4, 'r');
184 Srv->AddMode(m5, 'R');
188 virtual void On005Numeric(std::string &output)
190 InsertMode(output, "rRM", 4);
193 /* <- :stitch.chatspike.net 307 w00t w00t :is a registered nick */
194 virtual void OnWhois(userrec* source, userrec* dest)
196 if (dest->IsModeSet('r'))
198 /* user is registered */
199 WriteServ(source->fd, "307 %s %s :is a registered nick", source->nick, dest->nick);
203 void Implements(char* List)
205 List[I_OnWhois] = List[I_OnUserPostNick] = List[I_OnUserPreMessage] = List[I_On005Numeric] = List[I_OnUserPreNotice] = List[I_OnUserPreJoin] = 1;
208 virtual void OnUserPostNick(userrec* user, const std::string &oldnick)
210 /* On nickchange, if they have +r, remove it */
211 if (user->IsModeSet('r'))
214 modechange[0] = user->nick;
215 modechange[1] = "-r";
217 Srv->SendMode(modechange,2,user);
222 virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status)
224 if (target_type == TYPE_CHANNEL)
226 chanrec* c = (chanrec*)dest;
227 if ((c->IsModeSet('M')) && (!user->IsModeSet('r')))
229 if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server)) || (!strcmp(user->server,"")))
231 // user is ulined, can speak regardless
234 // user messaging a +M channel and is not registered
235 Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(c->name)+" :You need a registered nickname to speak on this channel");
239 if (target_type == TYPE_USER)
241 userrec* u = (userrec*)dest;
242 if ((u->IsModeSet('R')) && (user->IsModeSet('r')))
244 if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server)))
246 // user is ulined, can speak regardless
249 // user messaging a +R user and is not registered
250 Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(u->nick)+" :You need a registered nickname to message this user");
257 virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status)
259 return OnUserPreMessage(user,dest,target_type,text,status);
262 virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname)
266 if (chan->IsModeSet('R'))
268 if (user->IsModeSet('r'))
270 if ((Srv->IsUlined(user->nick)) || (Srv->IsUlined(user->server)))
272 // user is ulined, won't be stopped from joining
275 // joining a +R channel and not identified
276 Srv->SendServ(user->fd,"477 "+std::string(user->nick)+" "+std::string(chan->name)+" :You need a registered nickname to join this channel");
284 virtual ~ModuleServices()
293 virtual Version GetVersion()
295 return Version(1,0,0,0,VF_STATIC|VF_VENDOR);
300 class ModuleServicesFactory : public ModuleFactory
303 ModuleServicesFactory()
307 ~ModuleServicesFactory()
311 virtual Module * CreateModule(Server* Me)
313 return new ModuleServices(Me);
319 extern "C" void * init_module( void )
321 return new ModuleServicesFactory;