+};
+
+/** Dreamnforge-like services support
+ */
+class ModuleServices : public Module
+{
+
+ Channel_r* m1;
+ Channel_R* m2;
+ Channel_M* m3;
+ User_r* m4;
+ User_R* m5;
+ public:
+ ModuleServices(InspIRCd* Me)
+ : Module::Module(Me)
+ {
+
+ m1 = new Channel_r(ServerInstance);
+ m2 = new Channel_R(ServerInstance);
+ m3 = new Channel_M(ServerInstance);
+ m4 = new User_r(ServerInstance);
+ m5 = new User_R(ServerInstance);
+ ServerInstance->AddMode(m1, 'r');
+ ServerInstance->AddMode(m2, 'R');
+ ServerInstance->AddMode(m3, 'M');
+ ServerInstance->AddMode(m4, 'r');
+ ServerInstance->AddMode(m5, 'R');
+ kludgeme = false;
+ }
+
+ /* <- :stitch.chatspike.net 307 w00t w00t :is a registered nick */
+ virtual void OnWhois(userrec* source, userrec* dest)
+ {
+ if (dest->IsModeSet('r'))
+ {
+ /* user is registered */
+ source->WriteServ("307 %s %s :is a registered nick", source->nick, dest->nick);
+ }
+ }
+
+ void Implements(char* List)
+ {
+ List[I_OnWhois] = List[I_OnUserPostNick] = List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = List[I_OnUserPreJoin] = 1;
+ }
+
+ virtual void OnUserPostNick(userrec* user, const std::string &oldnick)
+ {
+ /* On nickchange, if they have +r, remove it */
+ if (user->IsModeSet('r'))
+ {
+ const char* modechange[2];
+ modechange[0] = user->nick;
+ modechange[1] = "-r";
+ kludgeme = true;
+ ServerInstance->SendMode(modechange,2,user);
+ kludgeme = false;
+ }
+ }
+
+ virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status)