+/** Channel mode +r - mark a channel as identified
+ */
+class Channel_r : public ModeHandler
+{
+ public:
+ Channel_r(Module* Creator) : ModeHandler(Creator, "c_registered", 'r', PARAM_NONE, MODETYPE_CHANNEL) { }
+
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding)
+ {
+ // only a u-lined server may add or remove the +r mode.
+ if (!IS_LOCAL(source) || ServerInstance->ULine(source->server))
+ {
+ // Only change the mode if it's not redundant
+ if ((adding != channel->IsModeSet('r')))
+ {
+ channel->SetMode('r',adding);
+ return MODEACTION_ALLOW;
+ }
+ }
+ 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(Module* Creator) : ModeHandler(Creator, "u_registered", 'r', PARAM_NONE, MODETYPE_USER) { }
+
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding)
+ {
+ if (!IS_LOCAL(source) || ServerInstance->ULine(source->server))
+ {
+ if ((adding != dest->IsModeSet('r')))
+ {
+ dest->SetMode('r',adding);
+ return MODEACTION_ALLOW;
+ }
+ }
+ else
+ {
+ source->WriteNumeric(500, "%s :Only a server may modify the +r user mode", source->nick.c_str());
+ }
+ return MODEACTION_DENY;
+ }
+};