MODE_NOFLOOD (+f [!][+@]<count>:<time>) added (prevents users from flooding the channel)
[ircu2.10.12-pk.git] / include / channel.h
index 353aeae6f437462ccf05183dcc50738f937952d6..dcd93ea394973394aeca24d1a99aac9a4c4c9aaf 100644 (file)
 struct SLink;
 struct Client;
 
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+typedef unsigned __int64 ulong64;
+typedef signed __int64 long64;
+#else
+typedef unsigned long long ulong64;
+typedef signed long long long64;
+#endif
+
 /*
  * General defines
  */
@@ -89,47 +97,48 @@ struct Client;
 
 /* Channel Visibility macros */
 
-#define MODE_CHANOP     CHFL_CHANOP    /**< +o Chanop */
-#define MODE_VOICE      CHFL_VOICE     /**< +v Voice */
-#define MODE_PRIVATE    0x0004         /**< +p Private */
-#define MODE_SECRET     0x0008         /**< +s Secret */
-#define MODE_MODERATED  0x0010         /**< +m Moderated */
-#define MODE_TOPICLIMIT 0x0020         /**< +t Topic Limited */
-#define MODE_INVITEONLY 0x0040         /**< +i Invite only */
-#define MODE_NOPRIVMSGS 0x0080         /**< +n No Private Messages */
-#define MODE_KEY        0x0100         /**< +k Keyed */
-#define MODE_BAN        0x0200         /**< +b Ban */
-#define MODE_LIMIT      0x0400         /**< +l Limit */
-#define MODE_REGONLY    0x0800         /**< Only +r users may join */
-#define MODE_DELJOINS   0x1000         /**< New join messages are delayed */
-#define MODE_REGISTERED 0x2000         /**< Channel marked as registered
-                                        * (for future semantic expansion) */
-#define MODE_PERSIST    0x4000      /**< +z persistant channel */
-#define MODE_NOCOLOUR   0x8000      /**< no ANSI color codes */
-#define MODE_NOCTCP    0x10000      /**< no channel CTCPs */
-#define MODE_SAVE      0x20000         /**< save this mode-with-arg 'til 
-                                        * later */
-#define MODE_FREE      0x40000         /**< string needs to be passed to 
-                                        * MyFree() */
-#define MODE_BURSTADDED        0x80000         /**< channel was created by a BURST */
-#define MODE_UPASS     0x100000
-#define MODE_APASS     0x200000
-#define MODE_WASDELJOINS 0x400000      /**< Not DELJOINS, but some joins 
-                                        * pending */
-#define MODE_EXCEPTION  0x800000    /**< ban exceptions */
-#define MODE_NOAMSGS 0x1000000    /**< No multi target messages */
-#define MODE_NONOTICE 0x2000000    /**< No channel notices */
-#define MODE_QUARANTINE 0x4000000    /**< No channel notices */
-#define MODE_ALTCHAN 0x8000000    /**< Alternative channel */
-#define MODE_ACCESS 0x10000000    /**< ChanServ access */
+#define MODE_NULL           0
+#define MODE_CHANOP         CHFL_CHANOP        /**< +o Chanop */
+#define MODE_VOICE          CHFL_VOICE /**< +v Voice */
+#define MODE_PRIVATE        0x00004            /**< +p Private */
+#define MODE_SECRET         0x00008            /**< +s Secret */
+#define MODE_MODERATED      0x00010            /**< +m Moderated */
+#define MODE_TOPICLIMIT     0x00020            /**< +t Topic Limited */
+#define MODE_INVITEONLY     0x00040            /**< +i Invite only */
+#define MODE_NOPRIVMSGS     0x00080            /**< +n No Private Messages */
+#define MODE_KEY            0x00100            /**< +k Keyed */
+#define MODE_BAN            0x00200            /**< +b Ban */
+#define MODE_LIMIT          0x00400            /**< +l Limit */
+#define MODE_REGONLY        0x00800            /**< Only +r users may join */
+#define MODE_DELJOINS       0x01000            /**< New join messages are delayed */
+#define MODE_REGISTERED     0x02000            /**< Channel marked as registered (for future semantic expansion) */
+#define MODE_PERSIST        0x04000            /**< +z persistant channel */
+#define MODE_NOCOLOUR       0x08000            /**< no ANSI color codes */
+#define MODE_NOCTCP         0x10000            /**< no channel CTCPs */
+#define MODE_SAVE           0x20000            /**< save this mode-with-arg 'til later */
+#define MODE_FREE           0x40000        /**< string needs to be passed to  MyFree() */
+#define MODE_BURSTADDED     0x80000            /**< channel was created by a BURST */
+#define MODE_UPASS         0x100000
+#define MODE_APASS         0x200000
+#define MODE_WASDELJOINS   0x400000            /**< Not DELJOINS, but some joins  pending */
+#define MODE_EXCEPTION     0x800000            /**< ban exceptions */
+#define MODE_NOAMSGS      0x1000000            /**< No multi target messages */
+#define MODE_NONOTICE     0x2000000            /**< No channel notices */
+#define MODE_QUARANTINE   0x4000000            /**< No channel notices */
+#define MODE_ALTCHAN      0x8000000            /**< Alternative channel */
+#define MODE_DEL         0x20000000
+#define MODE_ADD         0x40000000
+#define MODE_ACCESS     0x100000000LLU /**< ChanServ access */
+#define MODE_AUDITORIUM 0x200000000LLU /**< +u Auditorium */
+#define MODE_NOFLOOD    0x400000000LLU /**< +f NoFlood */
 /** mode flags which take another parameter (With PARAmeterS)
  */
-#define MODE_WPARAS     (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS|MODE_EXCEPTION|MODE_ALTCHAN|MODE_ACCESS)
+#define MODE_WPARAS     (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS|MODE_EXCEPTION|MODE_ALTCHAN|MODE_ACCESS|MODE_NOFLOOD)
 
 /** Available Channel modes */
-#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbiklmMnNopstUvrDRzQ" : "cCbiklmMnNopstvrDRzQ"
+#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbiklmMnNopstuUvrDRzQu" : "cCbiklmMnNopstuvrDRzQu"
 /** Available Channel modes that take parameters */
-#define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbkloUvFa" : "bklovFa"
+#define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbfkloUvFa" : "bfklovFa"
 
 #define HoldChannel(x)          (!(x))
 /** name invisible */
@@ -150,12 +159,6 @@ typedef enum ChannelGetType {
   CGT_CREATE
 } ChannelGetType;
 
-/* used in SetMode() in channel.c and m_umode() in s_msg.c */
-
-#define MODE_NULL      0
-#define MODE_ADD       0x40000000
-#define MODE_DEL       0x20000000
-
 /* used in ListingArgs.flags */
 
 #define LISTARG_TOPICLIMITS     0x0001
@@ -203,10 +206,20 @@ struct Membership {
   struct Membership* prev_member;      /**< The previous user on this channel*/
   struct Membership* next_channel;     /**< Next channel this user is on */
   struct Membership* prev_channel;     /**< Previous channel this user is on*/
+  struct MemberFlood* flood;        /**< count's how many times a user sent something (+f floodcontrol) */
   unsigned int       status;           /**< Flags for op'd, voice'd, etc */
   unsigned short     oplevel;          /**< Op level */
 };
 
+#define FLFL_CHANOP  0x01
+#define FLFL_VOICE   0x02
+#define FLFL_NOFLOOD  0x04
+
+struct MemberFlood {
+  struct MemberFlood* next_memberflood;
+  time_t time;
+};
+
 #define MAXOPLEVELDIGITS    3
 #define MAXOPLEVEL          999
 
@@ -246,9 +259,11 @@ struct Membership {
 
 /** Mode information for a channel */
 struct Mode {
-  unsigned int mode;
+  ulong64 mode;
   unsigned int limit;
   unsigned int access;
+  char noflood[11]; //max [@+]999:9999
+  unsigned int noflood_value; //3bit for @+, 10bit  first field,  14bit second field  = 27bit of 32bit
   char key[KEYLEN + 1];
   char upass[KEYLEN + 1];
   char apass[KEYLEN + 1];
@@ -312,15 +327,15 @@ struct ListingArgs {
 };
 
 struct ModeBuf {
-  unsigned int         mb_add;         /**< Modes to add */
-  unsigned int         mb_rem;         /**< Modes to remove */
+  ulong64      mb_add;         /**< Modes to add */
+  ulong64      mb_rem;         /**< Modes to remove */
   struct Client               *mb_source;      /**< Source of MODE changes */
   struct Client               *mb_connect;     /**< Connection of MODE changes */
   struct Channel       *mb_channel;    /**< Channel they affect */
   unsigned int         mb_dest;        /**< Destination of MODE changes */
   unsigned int         mb_count;       /**< Number of modes w/args */
   struct {
-    unsigned int       mbm_type;       /**< Type of argument */
+    ulong64    mbm_type;       /**< Type of argument */
     union {
       unsigned int     mbma_uint;      /**< A limit */
       char            *mbma_string;    /**< A string */
@@ -423,16 +438,17 @@ extern void list_set_default(void); /* this belongs elsewhere! */
 extern void RevealDelayedJoinIfNeeded(struct Client *sptr, struct Channel *chptr);
 extern void RevealDelayedJoin(struct Membership *member);
 extern void CheckDelayedJoins(struct Channel *chan);
+extern void CheckEnableDelayedJoins(struct Channel *chan);
 
 extern void modebuf_init(struct ModeBuf *mbuf, struct Client *source,
                         struct Client *connect, struct Channel *chan,
                         unsigned int dest);
-extern void modebuf_mode(struct ModeBuf *mbuf, unsigned int mode);
-extern void modebuf_mode_uint(struct ModeBuf *mbuf, unsigned int mode,
+extern void modebuf_mode(struct ModeBuf *mbuf, ulong64 mode);
+extern void modebuf_mode_uint(struct ModeBuf *mbuf, ulong64 mode,
                              unsigned int uint);
-extern void modebuf_mode_string(struct ModeBuf *mbuf, unsigned int mode,
+extern void modebuf_mode_string(struct ModeBuf *mbuf, ulong64 mode,
                                char *string, int free);
-extern void modebuf_mode_client(struct ModeBuf *mbuf, unsigned int mode,
+extern void modebuf_mode_client(struct ModeBuf *mbuf, ulong64 mode,
                                struct Client *client, int oplevel);
 extern int modebuf_flush(struct ModeBuf *mbuf);
 extern void modebuf_extract(struct ModeBuf *mbuf, char *buf);
@@ -466,5 +482,6 @@ extern int apply_ban(struct Ban **banlist, struct Ban *newban, int free);
 extern void free_ban(struct Ban *ban);
 extern signed int destruct_nonpers_channel(struct Channel *chptr);
 extern int ext_amsg_block(struct Client *cptr, struct Channel *chptr, const char *msg);
+extern int ext_noflood_block(struct Client *cptr, struct Channel *chptr);
 
 #endif /* INCLUDED_channel_h */