+ return MODEACTION_DENY;
+ }
+ else
+ {
+ source->WriteNumeric(500, "%s :Only a server may modify the +r channel mode", source->nick.c_str());
+ return MODEACTION_DENY;
+ }
+ }
+};
+
+/** User mode +r - mark a user as identified
+ */
+class User_r : public ModeHandler
+{
+
+ public:
+ User_r(InspIRCd* Instance) : ModeHandler(Instance, 'r', 0, 0, false, MODETYPE_USER, false) { }
+
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool)
+ {
+ if ((kludgeme) || (ServerInstance->ULine(source->nick.c_str())) || (ServerInstance->ULine(source->server)) || (!*source->server || (source->nick.find('.') != std::string::npos)))
+ {
+ if ((adding && !dest->IsModeSet('r')) || (!adding && dest->IsModeSet('r')))
+ {
+ dest->SetMode('r',adding);
+ return MODEACTION_ALLOW;
+ }
+ return MODEACTION_DENY;
+ }
+ else
+ {
+ source->WriteNumeric(500, "%s :Only a server may modify the +r user mode", source->nick.c_str());
+ return MODEACTION_DENY;
+ }
+ }
+};
+
+/** Channel mode +R - registered users only
+ */
+class Channel_R : public SimpleChannelModeHandler
+{
+ public:
+ Channel_R(InspIRCd* Instance) : SimpleChannelModeHandler(Instance, 'R') { }
+};
+
+/** User mode +R - only allow PRIVMSG and NOTICE from registered users
+ */
+class User_R : public SimpleUserModeHandler
+{
+ public:
+ User_R(InspIRCd* Instance) : SimpleUserModeHandler(Instance, 'R') { }
+};
+
+/** Channel mode +M - only allow privmsg and notice to channel from registered users
+ */
+class Channel_M : public SimpleChannelModeHandler
+{
+ public:
+ Channel_M(InspIRCd* Instance) : SimpleChannelModeHandler(Instance, 'M') { }
+};
+
+/** Dreamnforge-like services support
+ */