0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-06 05:48:54 +01:00
construct/include/chmode.h
William Pitcock 7e1bb8ad0d Proper channel mode classification. Fixes existing ad hoc
channel mode classification which is required by RPL_MYINFO indicating arity,
and RPL_ISUPPORT indicating an enumerated class. The content of these replies
had previously been generated by hardcoded strings of some letters.

Channel modes require classification which corresponds to the
CHANMODES= data in RPL_ISUPPORT. Classes A,B,C can then be
listed in the unary column of RPL_MYINFO. cflag_add() is updated
for this. Additional cleanup of chmode.h and channel.h
circularity is also proffered within.

Submitted-by: Jason Volk <jason@zemos.net>
2016-06-25 22:54:37 -05:00

123 lines
4 KiB
C

/*
* charybdis: An advanced ircd.
* chmode.h: The ircd channel header.
*
* Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
* Copyright (C) 1996-2002 Hybrid Development Team
* Copyright (C) 2002-2004 ircd-ratbox development team
* Copyright (C) 2008 charybdis development team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
#ifndef INCLUDED_chmode_h
#define INCLUDED_chmode_h
/* something not included in messages.tab
* to change some hooks behaviour when needed
* -- dwr
*/
#define ERR_CUSTOM 1000
/* Maximum mode changes allowed per client, per server is different */
#define MAXMODEPARAMS 4
#define MAXMODEPARAMSSERV 10
#define MODEBUFLEN 200
/* Channel mode classification */
typedef enum
{
CHM_A, // Mode has a parameter apropos a list (or no param for xfer)
CHM_B, // Always has a parameter
CHM_C, // Only has a parameter on MODE_ADD
CHM_D, // Never has a parameter
}
ChmClass;
/* Channel mode mask */
#define MODE_PRIVATE 0x00000001
#define MODE_SECRET 0x00000002
#define MODE_MODERATED 0x00000004
#define MODE_TOPICLIMIT 0x00000008
#define MODE_INVITEONLY 0x00000010
#define MODE_NOPRIVMSGS 0x00000020
#define MODE_REGONLY 0x00000040
#define MODE_EXLIMIT 0x00000100 /* exempt from list limits, +b/+e/+I/+q */
#define MODE_PERMANENT 0x00000200 /* permanant channel, +P */
#define MODE_OPMODERATE 0x00000400 /* send rejected messages to ops */
#define MODE_FREEINVITE 0x00000800 /* allow free use of /invite */
#define MODE_FREETARGET 0x00001000 /* can be forwarded to without authorization */
#define MODE_DISFORWARD 0x00002000 /* disable channel forwarding */
#define CHFL_BAN 0x10000000 /* ban channel flag */
#define CHFL_EXCEPTION 0x20000000 /* exception to ban channel flag */
#define CHFL_INVEX 0x40000000
#define CHFL_QUIET 0x80000000
/* extban function results */
#define EXTBAN_INVALID -1 /* invalid mask, false even if negated */
#define EXTBAN_NOMATCH 0 /* valid mask, no match */
#define EXTBAN_MATCH 1 /* matches */
struct Client;
struct Channel;
typedef int (*ExtbanFunc)
(const char *data, struct Client *client_p, struct Channel *chptr, long mode_type);
typedef void (*ChmFunc)
(struct Client *source_p, struct Channel *chptr,
int alevel, int parc, int *parn, const char **parv, int *errors, int dir, char c, long mode_type);
struct Chm
{
ChmFunc set_func;
ChmClass mode_class;
long mode_type;
};
extern struct Chm chmode_table[256];
extern ExtbanFunc extban_table[256];
extern char chmode_arity[2][256];
extern char chmode_class[4][256];
extern int chmode_flags[256];
#define CHM_FUNCTION(_NAME_) \
void _NAME_(struct Client *source_p, struct Channel *chptr, \
int alevel, int parc, int *parn, const char **parv, \
int *errors, int dir, char c, long mode_type);
CHM_FUNCTION(chm_nosuch)
CHM_FUNCTION(chm_orphaned)
CHM_FUNCTION(chm_simple)
CHM_FUNCTION(chm_ban)
CHM_FUNCTION(chm_hidden)
CHM_FUNCTION(chm_staff)
CHM_FUNCTION(chm_forward)
CHM_FUNCTION(chm_throttle)
CHM_FUNCTION(chm_key)
CHM_FUNCTION(chm_limit)
CHM_FUNCTION(chm_op)
CHM_FUNCTION(chm_voice)
unsigned int cflag_add(const unsigned char c, const ChmClass chmclass, const ChmFunc function);
void cflag_orphan(const unsigned char c);
void chmode_init(void);
#endif