summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/builtinmodes.h10
-rw-r--r--include/channels.h11
-rw-r--r--include/membership.h10
-rw-r--r--include/mode.h56
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 &parameter, 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 &parameter, 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.