+ if (adding)
+ {
+ if (!dest->IsModeSet('R'))
+ {
+ dest->SetMode('R',true);
+ return MODEACTION_ALLOW;
+ }
+ }
+ else
+ {
+ if (dest->IsModeSet('R'))
+ {
+ dest->SetMode('R',false);
+ return MODEACTION_ALLOW;
+ }
+ }
+
+ return MODEACTION_DENY;
+ }
+};
+
+/** Channel mode +M - only allow privmsg and notice to channel from registered users
+ */
+class Channel_M : public ModeHandler
+{
+ public:
+ Channel_M(InspIRCd* Instance) : ModeHandler(Instance, 'M', 0, 0, false, MODETYPE_CHANNEL, false) { }
+
+ ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
+ {
+ if (adding)
+ {
+ if (!channel->IsModeSet('M'))
+ {
+ channel->SetMode('M',true);
+ return MODEACTION_ALLOW;
+ }
+ }
+ else
+ {
+ if (channel->IsModeSet('M'))
+ {
+ channel->SetMode('M',false);
+ return MODEACTION_ALLOW;
+ }
+ }
+
+ return MODEACTION_DENY;
+ }
+};
+
+/** 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;