X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmode.h;h=2833d75a2cd8504c19661ea8c5f02bb9f1e81f6f;hb=3d958279c6c4d352132ea50836a2b7b1d3be5434;hp=3e30d5b884a03b299308a835e0d015292477659b;hpb=51da1d3b59c25af4931b998cc23e2066392e548e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/mode.h b/include/mode.h index 3e30d5b88..2833d75a2 100644 --- a/include/mode.h +++ b/include/mode.h @@ -23,6 +23,7 @@ #pragma once #include "ctables.h" +#include "modechange.h" /** * Holds the values for different type of modes @@ -110,11 +111,6 @@ class CoreExport ModeHandler : public ServiceProvider Id modeid; protected: - /** - * The mode parameter translation type - */ - TranslateType m_paramtype; - /** What kind of parameters does the mode take? */ ParamSpec parameters_taken; @@ -199,10 +195,6 @@ class CoreExport ModeHandler : public ServiceProvider * Returns the mode's type */ inline ModeType GetModeType() const { return m_type; } - /** - * Returns the mode's parameter translation type - */ - inline TranslateType GetTranslateType() const { return m_paramtype; } /** * Returns true if the mode can only be set/unset by an oper */ @@ -534,6 +526,10 @@ class CoreExport ModeParser : public fakederef */ std::multimap modewatchermap; + /** Last processed mode change + */ + Modes::ChangeList LastChangeList; + /** Displays the current modes of a channel or user. * Used by ModeParser::Process. */ @@ -541,12 +537,12 @@ class CoreExport ModeParser : public fakederef /** Displays the value of a list mode * Used by ModeParser::Process. */ - void DisplayListModes(User* user, Channel* chan, std::string &mode_sequence); + void DisplayListModes(User* user, Channel* chan, const std::string& mode_sequence); /** * Attempts to apply a mode change to a user or channel */ - ModeAction TryMode(User* user, User* targu, Channel* targc, bool adding, unsigned char mode, std::string ¶m, bool SkipACL); + ModeAction TryMode(User* user, User* targu, Channel* targc, Modes::Change& mcitem, bool SkipACL); /** Returns a list of user or channel mode characters. * Used for constructing the parts of the mode list in the 004 numeric. @@ -572,8 +568,6 @@ class CoreExport ModeParser : public fakederef * Use GetLastParse() to get this value, to be used for display purposes. */ std::string LastParse; - std::vector LastParseParams; - std::vector LastParseTranslate; unsigned int sent[256]; @@ -603,11 +597,19 @@ class CoreExport ModeParser : public fakederef */ MODE_MERGE = 1, - /** If this flag is set then the mode change won't be handed over to - * the linking module to be sent to other servers, but will be processed + /** If this flag is set then the linking module will ignore the mode change + * and not send it to other servers. The mode change will be processed * locally and sent to local user(s) as usual. */ - MODE_LOCALONLY = 2 + MODE_LOCALONLY = 2, + + /** If this flag is set then the mode change will be subject to access checks. + * For more information see the documentation of the PrefixMode class, + * ModeHandler::levelrequired and ModeHandler::AccessCheck(). + * Modules may explicitly allow a mode change regardless of this flag by returning + * MOD_RES_ALLOW from the OnPreMode hook. Only affects channel mode changes. + */ + MODE_CHECKACCESS = 4 }; ModeParser(); @@ -637,8 +639,6 @@ class CoreExport ModeParser : public fakederef * @return Last parsed string, as seen by users. */ const std::string& GetLastParse() const { return LastParse; } - const std::vector& GetLastParseParams() { return LastParseParams; } - const std::vector& GetLastParseTranslate() { return LastParseTranslate; } /** Add a mode to the mode parser. * Throws a ModuleException if the mode cannot be added. @@ -680,6 +680,18 @@ class CoreExport ModeParser : public fakederef */ void Process(const std::vector& parameters, User* user, ModeProcessFlag flags = MODE_NONE); + /** Process a single MODE line's worth of mode changes, taking max modes and line length limits + * into consideration. + * @param user The source of the mode change, can be a server user. + * @param targetchannel Channel to apply the mode change on. NULL if changing modes on a channel. + * @param targetuser User to apply the mode change on. NULL if changing modes on a user. + * @param changelist Modes to change in form of a Modes::ChangeList. May not process + * the entire list due to MODE line length and max modes limitations. + * @param flags Optional flags controlling how the mode change is processed, + * defaults to MODE_NONE. + */ + void ProcessSingle(User* user, Channel* targetchannel, User* targetuser, Modes::ChangeList& changelist, ModeProcessFlag flags = MODE_NONE); + /** Find the mode handler for a given mode name and type. * @param modename The mode name to search for. * @param mt Type of mode to search for, user or channel.