From 526f5a4a02882b19056fe755dff1f64b764ff313 Mon Sep 17 00:00:00 2001 From: danieldg Date: Fri, 6 Mar 2009 22:28:57 +0000 Subject: Construct explicit parameter type list for MODE parameters Previously, we used TR_SPACENICKLIST on the parameters. This worked only because usually, if anything in the list parsed as a nick, then it was a nick. However, some modes like +k and +g allow free-form text, which could also resolve as a nick. Add extra parameters to allow modes to specify their TranslateType, defaulting to TR_TEXT. This fixes bug #757, found by Taros git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11180 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/command_parse.h | 2 ++ include/ctables.h | 2 -- include/mode.h | 14 ++++++++++++-- include/modules.h | 6 ++++-- include/u_listmode.h | 5 ++++- 5 files changed, 22 insertions(+), 7 deletions(-) (limited to 'include') diff --git a/include/command_parse.h b/include/command_parse.h index b3ae3236a..21dae89dd 100644 --- a/include/command_parse.h +++ b/include/command_parse.h @@ -202,6 +202,8 @@ class CoreExport CommandParser : public classbase * @return returns the number of substitutions made. Will always be 0 or 1 for TR_TEXT and 0..n for other types. */ int TranslateUIDs(TranslateType to, const std::string &source, std::string &dest); + + int TranslateUIDs(const std::vector to, const std::string &source, std::string &dest); }; /** Command handler class for the RELOAD command. diff --git a/include/ctables.h b/include/ctables.h index 3e10e7c23..d7c2a2050 100644 --- a/include/ctables.h +++ b/include/ctables.h @@ -33,8 +33,6 @@ enum TranslateType TR_END, /* End of known parameters, everything after this is TR_TEXT */ TR_TEXT, /* Raw text, leave as-is */ TR_NICK, /* Nickname, translate to UUID for server->server */ - TR_NICKLIST, /* Comma seperated nickname list, translate to UUIDs */ - TR_SPACENICKLIST, /* Space seperated nickname list, translate to UUIDs */ TR_CUSTOM /* Custom translation handled by EncodeParameter/DecodeParameter */ }; diff --git a/include/mode.h b/include/mode.h index f78fcda9c..525a26208 100644 --- a/include/mode.h +++ b/include/mode.h @@ -17,6 +17,7 @@ /* Forward declarations. */ class User; +#include "ctables.h" #include "channels.h" /** @@ -125,6 +126,10 @@ class CoreExport ModeHandler : public Extensible * MODETYPE_CHANNEL. */ ModeType m_type; + /** + * The mode parameter translation type + */ + TranslateType m_paramtype; /** * True if the mode requires oper status * to set. @@ -161,7 +166,8 @@ class CoreExport ModeHandler : public Extensible * and the rank values OP_VALUE, HALFOP_VALUE and VOICE_VALUE respectively. Any prefixes you define should have unique values proportional * to these three defaults or proportional to another mode in a module you depend on. See src/cmode_o.cpp as an example. */ - ModeHandler(InspIRCd* Instance, char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly, char mprefix = 0, char prefixrequired = '%'); + ModeHandler(InspIRCd* Instance, char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly, + char mprefix = 0, char prefixrequired = '%', TranslateType translate = TR_TEXT); /** * The default destructor does nothing */ @@ -191,9 +197,13 @@ class CoreExport ModeHandler : public Extensible */ virtual unsigned int GetPrefixRank(); /** - * Returns the modes type + * Returns the mode's type */ ModeType GetModeType(); + /** + * Returns the mode's parameter translation type + */ + TranslateType GetTranslateType(); /** * Returns true if the mode can only be set/unset by an oper */ diff --git a/include/modules.h b/include/modules.h index 536313d8f..90aeb178e 100644 --- a/include/modules.h +++ b/include/modules.h @@ -739,8 +739,9 @@ class CoreExport Module : public Extensible * @param dest The target of the modes (User* or Channel*) * @param target_type The type of target (TYPE_USER or TYPE_CHANNEL) * @param text The actual modes and their parameters if any + * @param translate The translation types of the mode parameters */ - virtual void OnMode(User* user, void* dest, int target_type, const std::string &text); + virtual void OnMode(User* user, void* dest, int target_type, const std::string &text, const std::vector &translate); /** Allows modules to alter or create server descriptions * Whenever a module requires a server description, for example for display in @@ -847,8 +848,9 @@ class CoreExport Module : public Extensible * @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL * @param target The Channel* or User* that modes should be sent for * @param modeline The modes and parameters to be sent + * @param translate The translation types of the mode parameters */ - virtual void ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::string &modeline); + virtual void ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::string &modeline, const std::vector &translate); /** Implemented by modules which provide the ability to link servers. * These modules will implement this method, which allows metadata (extra data added to diff --git a/include/u_listmode.h b/include/u_listmode.h index b08ad8d4d..88b5fb3ee 100644 --- a/include/u_listmode.h +++ b/include/u_listmode.h @@ -423,18 +423,21 @@ class ListModeBase : public ModeHandler chan->GetExt(infokey, mlist); irc::modestacker modestack(ServerInstance, true); std::deque stackresult; + std::vector types; + types.push_back(TR_TEXT); if (mlist) { for (modelist::iterator it = mlist->begin(); it != mlist->end(); it++) { modestack.Push(std::string(1, mode)[0], it->mask); + types.push_back(this->GetTranslateType()); } } while (modestack.GetStackedLine(stackresult)) { irc::stringjoiner mode_join(" ", stackresult, 0, stackresult.size() - 1); std::string line = mode_join.GetJoined(); - proto->ProtoSendMode(opaque, TYPE_CHANNEL, chan, line); + proto->ProtoSendMode(opaque, TYPE_CHANNEL, chan, line, types); } } -- cgit v1.2.3