diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/builtinmodes.h | 10 | ||||
-rw-r--r-- | include/channels.h | 11 | ||||
-rw-r--r-- | include/membership.h | 10 | ||||
-rw-r--r-- | include/mode.h | 56 |
4 files changed, 61 insertions, 26 deletions
diff --git a/include/builtinmodes.h b/include/builtinmodes.h index b1e5c3ccd..ce73a7817 100644 --- a/include/builtinmodes.h +++ b/include/builtinmodes.h @@ -86,13 +86,10 @@ class ModeChannelNoExternal : public SimpleChannelModeHandler /** Channel mode +o */ -class ModeChannelOp : public ModeHandler +class ModeChannelOp : public PrefixMode { - private: public: ModeChannelOp(); - ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding); - unsigned int GetPrefixRank(); }; /** Channel mode +p @@ -127,13 +124,10 @@ class ModeChannelTopicOps : public SimpleChannelModeHandler /** Channel mode +v */ -class ModeChannelVoice : public ModeHandler +class ModeChannelVoice : public PrefixMode { - private: public: ModeChannelVoice(); - ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding); - unsigned int GetPrefixRank(); }; /** User mode +i diff --git a/include/channels.h b/include/channels.h index 0c7a3a20c..4f61e15e4 100644 --- a/include/channels.h +++ b/include/channels.h @@ -338,17 +338,6 @@ class CoreExport Channel : public Extensible, public InviteBase */ unsigned int GetPrefixValue(User* user); - /** Add a prefix character to a user. - * Only the core should call this method, usually from - * within the mode parser or when the first user joins - * the channel (to grant ops to them) - * @param user The user to associate the privilage with - * @param prefix The prefix character to associate - * @param adding True if adding the prefix, false when removing - * @return True if a change was made - */ - bool SetPrefix(User* user, char prefix, bool adding); - /** Check if a user is banned on this channel * @param user A user to check against the banlist * @returns True if the user given is banned diff --git a/include/membership.h b/include/membership.h index 5850e0ae0..7074566ae 100644 --- a/include/membership.h +++ b/include/membership.h @@ -32,6 +32,16 @@ class CoreExport Membership : public Extensible return modes.find(m) != std::string::npos; } unsigned int getRank(); + + /** Add a prefix character to a user. + * Only the core should call this method, usually from + * within the mode parser or when the first user joins + * the channel (to grant the default privs to them) + * @param mh The mode handler of the prefix mode to associate + * @param adding True if adding the prefix, false when removing + * @return True if a change was made + */ + bool SetPrefix(ModeHandler* mh, bool adding); }; class CoreExport InviteBase diff --git a/include/mode.h b/include/mode.h index 18fed8b0a..8c3e875f3 100644 --- a/include/mode.h +++ b/include/mode.h @@ -103,16 +103,10 @@ class CoreExport ModeHandler : public ServiceProvider public: enum Class { + MC_PREFIX, MC_OTHER }; - /** - * Removes this prefix mode from all users on the given channel - * @param channel The channel which the server wants to remove your mode from - * @param stack The mode stack to add the mode change to - */ - void RemovePrefixMode(Channel* chan, irc::modestacker& stack); - protected: /** * The mode parameter translation type @@ -312,6 +306,54 @@ class CoreExport ModeHandler : public ServiceProvider inline unsigned int GetLevelRequired() const { return levelrequired; } }; +/** + * Prefix modes are channel modes that grant a specific rank to members having prefix mode set. + * They require a parameter when setting and unsetting; the parameter is always a member of the channel. + * A prefix mode may be set on any number of members on a channel, but for a given member a given prefix + * mode is either set or not set, in other words members cannot have the same prefix mode set more than once. + * + * A rank of a member is defined as the rank given by the 'strongest' prefix mode that member has. + * Other parts of the IRCd use this rank to determine whether a channel action is allowable for a user or not. + * The rank of a prefix mode is constant, i.e. the same rank value is given to all users having that prefix mode set. + * + * Note that it is possible that the same action requires a different rank on a different channel; + * for example changing the topic on a channel having +t set requires a rank that is >= than the rank of a halfop, + * but there is no such restriction when +t isn't set. + */ +class PrefixMode : public ModeHandler +{ + public: + /** + * Constructor + * @param Creator The module creating this mode + * @param Name The user-friendly one word name of the prefix mode, e.g.: "op", "voice" + * @param ModeLetter The mode letter of this mode + */ + PrefixMode(Module* Creator, const std::string& Name, char ModeLetter); + + /** + * Handles setting and unsetting the prefix mode. + * Finds the given member of the given channel, if it's not found an error message is sent to 'source' + * and MODEACTION_DENY is returned. Otherwise the mode change is attempted. + * @param source Source of the mode change, an error message is sent to this user if the target is not found + * @param dest Unused + * @param channel The channel the mode change is happening on + * @param param The nickname or uuid of the target user + * @param adding True when the mode is being set, false when it is being unset + * @return MODEACTION_ALLOW if the change happened, MODEACTION_DENY if no change happened + * The latter occurs either when the member cannot be found or when the member already has this prefix set + * (when setting) or doesn't have this prefix set (when unsetting). + */ + ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& param, bool adding); + + /** + * Removes this prefix mode from all users on the given channel + * @param chan The channel which the server wants to remove your mode from + * @param stack The mode stack to add the mode change to + */ + void RemoveMode(Channel* chan, irc::modestacker& stack); +}; + /** A prebuilt mode handler which handles a simple user mode, e.g. no parameters, usable by any user, with no extra * behaviour to the mode beyond the basic setting and unsetting of the mode, not allowing the mode to be set if it * is already set and not allowing it to be unset if it is already unset. |