X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmode.h;h=6d31d580e846ad9cbc7cf1b78a109846ab89c11a;hb=c6934754b0cb10f6510f98fb3668a5effbbe97a5;hp=8145ccd32d40da1025686858e6378b54d01ceecd;hpb=3dacf1edd2e1e623b07819bb483ae61eff3854cd;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/mode.h b/include/mode.h index 8145ccd32..6d31d580e 100644 --- a/include/mode.h +++ b/include/mode.h @@ -55,6 +55,13 @@ enum ModeMasks { MASK_CHANNEL = 0 /* A channel mode */ }; +/** + * Used by ModeHandler::ModeSet() to return the state of a mode upon a channel or user. + * The pair contains an activity flag, true if the mode is set with the given parameter, + * and the parameter of the mode (or the parameter provided) in the std::string. + */ +typedef std::pair ModePair; + /** Each mode is implemented by ONE ModeHandler class. * You must derive ModeHandler and add the child class to * the list of modes handled by the ircd, using @@ -172,7 +179,8 @@ class ModeHandler : public Extensible /** * If your mode needs special action during a server sync to determine which side wins when comparing timestamps, * override this function and use it to return true or false. The default implementation just returns true if - * theirs < ours. + * theirs < ours. This will only be called for non-listmodes with parameters, when adding the mode and where + * theirs == ours (therefore the default implementation will always return false). * @param theirs The timestamp of the remote side * @param ours The timestamp of the local side * @param their_param Their parameter if the mode has a parameter @@ -181,6 +189,21 @@ class ModeHandler : public Extensible * @return True if the other side wins the merge, false if we win the merge for this mode. */ virtual bool CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel); + + /** + * When a remote server needs to bounce a set of modes, it will call this method for every mode + * in the mode string to determine if the mode is set or not. + * @param source of the mode change, this will be NULL for a server mode + * @param dest Target user of the mode change, if this is a user mode + * @param channel Target channel of the mode change, if this is a channel mode + * @param parameter The parameter given for the mode change, or an empty string + * @returns The first value of the pair should be true if the mode is set with the given parameter. + * In the case of permissions modes such as channelmode +o, this should return true if the user given + * as the parameter has the given privilage on the given channel. The string value of the pair will hold + * the current setting for this mode set locally, when the bool is true, or, the parameter given. + * This allows the local server to enforce our locally set parameters back to a remote server. + */ + virtual ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter); }; /** @@ -251,7 +274,7 @@ class ModeWatcher : public Extensible typedef std::vector::iterator ModeWatchIter; -class ModeParser +class ModeParser : public classbase { private: /** @@ -343,7 +366,21 @@ class ModeParser * and *user->server == NULL. * @param servermode True if a server is setting the mode. */ - void Process(char **parameters, int pcnt, userrec *user, bool servermode); + void Process(const char** parameters, int pcnt, userrec *user, bool servermode); + + /** + * Find the mode handler for a given mode and type + * @param modeletter mode letter to search for + * @param type of mode to search for, user or channel + * @returns a pointer to a ModeHandler class, or NULL of there isnt a handler for the given mode + */ + ModeHandler* FindMode(unsigned const char modeletter, ModeType mt); + + std::string UserModeList(); + + std::string ChannelModeList(); + + std::string ParaModeList(); }; /** @@ -356,11 +393,11 @@ class cmd_mode : public command_t /** * Standard constructor */ - cmd_mode () : command_t("MODE",0,1) { } + cmd_mode () : command_t("MODE",0,1) { syntax = " {}"; } /** * Handle MODE */ - void Handle(char **parameters, int pcnt, userrec *user); + void Handle(const char** parameters, int pcnt, userrec *user); }; #endif