X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmode.h;h=1c3fcfe7746f5f0f44a2294dee5226a4bef24b90;hb=8f9d0a68cd77b6a78eccfa7df9c1045d453ce581;hp=efc83b281270ad22b8568ebaf4c355e6d478045d;hpb=3d433bc7b0074e3c008b2e5d93f219ac23a58174;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/mode.h b/include/mode.h index efc83b281..1c3fcfe77 100644 --- a/include/mode.h +++ b/include/mode.h @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * Inspire is copyright (C) 2002-2005 ChatSpike-Dev. + * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. * E-mail: * * @@ -27,27 +27,108 @@ #include #include "users.h" #include "channels.h" +#include "ctables.h" + +enum UserModeBits { + UM_INVISIBLE = 1, + UM_SERVERNOTICE = 2, + UM_WALLOPS = 4 +}; + +enum ModeType { + MODETYPE_USER = 0, + MODETYPE_CHANNEL = 1 +}; + +enum ModeAction { + MODEACTION_DENY = 0, /* Drop the mode change, AND a parameter if its a parameterized mode */ + MODEACTION_ALLOW = 1 /* Allow the mode */ +}; + +enum ModeMasks { + MASK_USER = 128, /* A user mode */ + MASK_CHANNEL = 0 /* A channel mode */ +}; + +class ModeHandler +{ + char mode; + int n_params_on; + int n_params_off; + bool list; + ModeType m_type; + bool oper; + + public: + ModeHandler(char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly); + virtual ~ModeHandler(); + + bool IsListMode(); + ModeType GetModeType(); + bool NeedsOper(); + int GetNumParams(bool adding); + char GetModeChar(); + + virtual ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding); /* Can change the mode parameter as its a ref */ + virtual void DisplayList(userrec* user, chanrec* channel); + virtual bool CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel); +}; + +class ModeWatcher +{ + char mode; + ModeType m_type; + + public: + ModeWatcher(char modeletter, ModeType type); + virtual ~ModeWatcher(); + + char GetModeChar(); + ModeType GetModeType(); + + virtual bool BeforeMode(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding, ModeType type); /* Can change the mode parameter */ + virtual void AfterMode(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter, bool adding, ModeType type); +}; + +typedef std::vector::iterator ModeWatchIter; class ModeParser { private: + /** + * Mode handlers for each mode, to access a handler subtract + * 65 from the ascii value of the mode letter. + * The upper bit of the value indicates if its a usermode + * or a channel mode, so we have 255 of them not 64. + */ + ModeHandler* modehandlers[256]; + /** + * Mode watcher classes + */ + std::vector modewatchers[256]; + char* GiveOps(userrec *user,char *dest,chanrec *chan,int status); char* GiveHops(userrec *user,char *dest,chanrec *chan,int status); char* GiveVoice(userrec *user,char *dest,chanrec *chan,int status); char* TakeOps(userrec *user,char *dest,chanrec *chan,int status); char* TakeHops(userrec *user,char *dest,chanrec *chan,int status); char* TakeVoice(userrec *user,char *dest,chanrec *chan,int status); - char* AddBan(userrec *user,char *dest,chanrec *chan,int status); - char* TakeBan(userrec *user,char *dest,chanrec *chan,int status); + userrec* SanityChecks(userrec *user,char *dest,chanrec *chan,int status); + char* Grant(userrec *d,chanrec *chan,int MASK); + char* Revoke(userrec *d,chanrec *chan,int MASK); public: - std::string CompressModes(std::string modes,bool channelmodes); - void ProcessModes(char **parameters,userrec* user,chanrec *chan,int status, int pcnt, bool servermode, bool silent, bool local); - bool AllowedUmode(char umode, char* sourcemodes,bool adding,bool serveroverride); - bool ProcessModuleUmode(char umode, userrec* source, void* dest, bool adding); - void ServerMode(char **parameters, int pcnt, userrec *user); -}; + ModeParser(); + bool AddMode(ModeHandler* mh, unsigned const char modeletter); + void Process(char **parameters, int pcnt, userrec *user, bool servermode); -void handle_mode(char **parameters, int pcnt, userrec *user); + //void ServerMode(char **parameters, int pcnt, userrec *user); +}; +class cmd_mode : public command_t +{ + public: + cmd_mode () : command_t("MODE",0,1) { } + void Handle(char **parameters, int pcnt, userrec *user); +}; #endif