#define ChannelExists(n) (0 != FindChannel(n))
#define CHFL_CHANOP 0x0001 /**< Channel operator */
-#define CHFL_VOICE 0x0002 /**< the power to speak */
-#define CHFL_DEOPPED 0x0004 /**< Is de-opped by a server */
-#define CHFL_SERVOPOK 0x0008 /**< Server op allowed */
-#define CHFL_ZOMBIE 0x0010 /**< Kicked from channel */
+#define CHFL_HALFOP 0x0002 /**< Channel operator */
+#define CHFL_VOICE 0x0004 /**< the power to speak */
+
+#define CHFL_DEOPPED 0x0010 /**< Is de-opped by a server */
+#define CHFL_SERVOPOK 0x0020 /**< Server op allowed */
+#define CHFL_ZOMBIE 0x0040 /**< Kicked from channel */
#define CHFL_BURST_JOINED 0x0100 /**< Just joined by net.junction */
#define CHFL_BANVALID 0x0800 /**< CHFL_BANNED bit is valid */
#define CHFL_BANNED 0x1000 /**< Channel member is banned */
/**, In oob BURST, but was already
* joined and voiced
*/
-#define CHFL_CHANNEL_MANAGER 0x10000 /**< Set when creating channel or using
+#define CHFL_BURST_ALREADY_HALFOPPED 0x10000
+ /**, In oob BURST, but was already
+ * joined and voiced
+ */
+#define CHFL_CHANNEL_MANAGER 0x40000 /**< Set when creating channel or using
* Apass
*/
-#define CHFL_USER_PARTING 0x20000 /**< User is already parting that
+#define CHFL_USER_PARTING 0x80000 /**< User is already parting that
* channel
*/
-#define CHFL_DELAYED 0x40000 /**< User's join message is delayed */
-#define CHFL_INVISIBLE 0x80000 /**< User's join message is delayed */
+#define CHFL_DELAYED 0x100000 /**< User's join message is delayed */
+#define CHFL_INVISIBLE 0x200000 /**< User's join message is delayed */
-#define CHFL_OVERLAP (CHFL_CHANOP | CHFL_VOICE)
+#define CHFL_OVERLAP (CHFL_CHANOP | CHFL_HALFOP | CHFL_VOICE)
#define CHFL_BANVALIDMASK (CHFL_BANVALID | CHFL_BANNED)
-#define CHFL_VOICED_OR_OPPED (CHFL_CHANOP | CHFL_VOICE)
+#define CHFL_VOICED_OR_OPPED (CHFL_CHANOP | CHFL_HALFOP | CHFL_VOICE)
/* Channel Visibility macros */
#define MODE_NULL 0
#define MODE_CHANOP CHFL_CHANOP /**< +o Chanop */
+#define MODE_HALFOP CHFL_HALFOP /**< +h Halfop */
#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_PRIVATE 0x10 /**< +p Private */
+#define MODE_SECRET 0x20 /**< +s Secret */
+#define MODE_MODERATED 0x40 /**< +m Moderated */
+#define MODE_TOPICLIMIT 0x80 /**< +t Topic Limited */
+#define MODE_INVITEONLY 0x100 /**< +i Invite only */
+#define MODE_NOPRIVMSGS 0x200 /**< +n No Private Messages */
+#define MODE_KEY 0x400 /**< +k Keyed */
+#define MODE_BAN 0x800 /**< +b Ban */
+#define MODE_LIMIT 0x1000 /**< +l Limit */
+#define MODE_REGONLY 0x2000 /**< Only +r users may join */
+#define MODE_DELJOINS 0x4000 /**< New join messages are delayed */
+#define MODE_REGISTERED 0x8000 /**< Channel marked as registered (for future semantic expansion) */
+#define MODE_PERSIST 0x10000 /**< +z persistant channel */
+#define MODE_NOCOLOUR 0x20000 /**< no ANSI color codes */
+#define MODE_NOCTCP 0x40000 /**< no channel CTCPs */
+#define MODE_SAVE 0x80000 /**< save this mode-with-arg 'til later */
+#define MODE_FREE 0x100000 /**< string needs to be passed to MyFree() */
+#define MODE_BURSTADDED 0x200000 /**< channel was created by a BURST */
+#define MODE_UPASS 0x400000
+#define MODE_APASS 0x800000
+#define MODE_WASDELJOINS 0x1000000 /**< Not DELJOINS, but some joins pending */
+#define MODE_NOAMSGS 0x2000000 /**< No multi target messages */
+#define MODE_NONOTICE 0x4000000 /**< No channel notices */
+#define MODE_QUARANTINE 0x8000000 /**< No channel notices */
+#define MODE_ALTCHAN 0x10000000 /**< 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 */
+#define MODE_SSLCHAN 0x800000000LLU /**< +S SSL Channel */
+#define MODE_BANEXCEPTION 0x1000000000LLU /**< +e Ban exception */
/** 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_HALFOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS|MODE_ALTCHAN|MODE_ACCESS|MODE_NOFLOOD|MODE_BANEXCEPTION)
/** Available Channel modes */
-#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbiklmMnNopstuUvrDRzQu" : "cCbiklmMnNopstuvrDRzQu"
+#define infochanmodes feature_bool(FEAT_OPLEVELS) ? "AcCbehiklmMnNopsStuUvrDRzQu" : "cCbehiklmMnNopsStuvrDRzQu"
/** Available Channel modes that take parameters */
-#define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbkloUvFa" : "bklovFa"
+#define infochanmodeswithparams feature_bool(FEAT_OPLEVELS) ? "AbefhkloUvFa" : "befhklovFa"
#define HoldChannel(x) (!(x))
/** name invisible */
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_HALFOP 0x02
+#define FLFL_VOICE 0x04
+#define FLFL_NOFLOOD 0x08
+
+struct MemberFlood {
+ struct MemberFlood* next_memberflood;
+ time_t time;
+};
+
#define MAXOPLEVELDIGITS 3
#define MAXOPLEVEL 999
#define IsBanValid(x) ((x)->status & CHFL_BANVALID)
#define IsChanOp(x) ((x)->status & CHFL_CHANOP)
#define OpLevel(x) ((x)->oplevel)
+#define IsHalfOp(x) ((x)->status & CHFL_HALFOP)
+#define IsChanOpOrHalfOp(x) ((x)->status & (CHFL_CHANOP | CHFL_HALFOP))
#define HasVoice(x) ((x)->status & CHFL_VOICE)
#define IsServOpOk(x) ((x)->status & CHFL_SERVOPOK)
#define IsBurstJoined(x) ((x)->status & CHFL_BURST_JOINED)
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];
void add_invite(struct Client *cptr, struct Channel *chptr);
int number_of_zombies(struct Channel *chptr);
-extern const char* find_no_nickchange_channel(struct Client* cptr);
+extern const char* find_no_nickchange_channel(struct Client* cptr, const char* new_nick);
extern struct Membership* find_channel_member(struct Client* cptr, struct Channel* chptr);
extern int member_can_send_to_channel(struct Membership* member, int reveal);
extern int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr, int reveal);
extern void remove_user_from_all_channels(struct Client* cptr);
extern int is_chan_op(struct Client *cptr, struct Channel *chptr);
+extern int is_halfop(struct Client *cptr, struct Channel *chptr);
extern int is_zombie(struct Client *cptr, struct Channel *chptr);
extern int has_voice(struct Client *cptr, struct Channel *chptr);
/*
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 */