/* Channel-handling routines.
*
* (C) 2003 Anope Team
* Contact us at info@anope.org
*
* Please read COPYING and README for furhter details.
*
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*
* $Id$
*
*/
#include "services.h"
#include "language.h"
Channel *chanlist[1024];
#define HASH(chan) ((chan)[1] ? ((chan)[1]&31)<<5 | ((chan)[2]&31) : 0)
static void add_ban(Channel * chan, char *mask);
#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
static void add_exception(Channel * chan, char *mask);
#endif
static void chan_adduser2(User * user, Channel * c);
static Channel *chan_create(const char *chan);
static void chan_delete(Channel * c);
static void del_ban(Channel * chan, char *mask);
#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
static void del_exception(Channel * chan, char *mask);
#endif
#ifdef HAS_FMODE
static char *get_flood(Channel * chan);
#endif
static char *get_key(Channel * chan);
static char *get_limit(Channel * chan);
#ifdef HAS_LMODE
static char *get_redirect(Channel * chan);
#endif
static Channel *join_user_update(User * user, Channel * chan, char *name);
#ifdef HAS_FMODE
static void set_flood(Channel * chan, char *value);
#endif
static void set_key(Channel * chan, char *value);
static void set_limit(Channel * chan, char *value);
#ifdef HAS_LMODE
static void set_redirect(Channel * chan, char *value);
#endif
void do_mass_mode(char *modes);
/*************************************************************************/
/* *INDENT-OFF* */
CBMode cbmodes[128] = {
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
{ 0 },
#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
{ CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL },
#else
{ 0 }, /* A */
#endif
{ 0 }, /* B */
#ifdef IRC_UNREAL
{ CMODE_C, 0, NULL, NULL },
#else
{ 0 }, /* C */
#endif
{ 0 }, /* D */
{ 0 }, /* E */
{ 0 }, /* F */
#ifdef IRC_UNREAL
{ CMODE_G, 0, NULL, NULL },
{ CMODE_H, CBM_NO_USER_MLOCK, NULL, NULL },
#else
{ 0 }, /* G */
{ 0 }, /* H */
#endif
#ifdef IRC_ULTIMATE
{ CMODE_I },
#else
{ 0 }, /* I */
#endif
{ 0 }, /* J */
#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
{ CMODE_K, 0, NULL, NULL },
#else
{ 0 }, /* K */
#endif
#ifdef HAS_LMODE
{ CMODE_L, 0, set_redirect, cs_set_redirect },
#else
{ 0 }, /* L */
#endif
#ifdef IRC_BAHAMUT
{ CMODE_M },
#else
{ 0 }, /* M */
#endif
#if defined (IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined (IRC_PTLINK)
{ CMODE_N, 0, NULL, NULL },
#else
{ 0 }, /* N */
#endif
#if defined(IRC_BAHAMUT) || defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
{ CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL },
#else
{ 0 }, /* O */
#endif
{ 0 }, /* P */
#ifdef IRC_UNREAL
{ CMODE_Q, 0, NULL, NULL },
#else
{ 0 }, /* Q */
#endif
#ifndef IRC_HYBRID
{ CMODE_R, 0, NULL, NULL }, /* R */
#else
{ 0 },
#endif
#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined (IRC_PTLINK)
{ CMODE_S, 0, NULL, NULL },
#else
{ 0 }, /* S */
#endif
{ 0 }, /* T */
{ 0 }, /* U */
#ifdef IRC_UNREAL
{ CMODE_V, 0, NULL, NULL },
#else
{ 0 }, /* V */
#endif
{ 0 }, /* W */
{ 0 }, /* X */
{ 0 }, /* Y */
{ 0 }, /* Z */
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
#ifdef IRC_HYBRID
{ CMODE_a, 0, NULL, NULL },
#else
{ 0 }, /* a */
#endif
{ 0 }, /* b */
#if defined(IRC_BAHAMUT) || defined(IRC_UNREAL) || defined (IRC_PTLINK)
{ CMODE_c, 0, NULL, NULL },
#else
{ 0 }, /* c */
#endif
#ifdef IRC_PTLINK
{ CMODE_d, 0, NULL, NULL },
#else
{ 0 }, /* d */
#endif
{ 0 }, /* e */
#ifdef HAS_FMODE
{ CMODE_f, 0, set_flood, cs_set_flood },
#else
{ 0 }, /* f */
#endif
{ 0 }, /* g */
{ 0 }, /* h */
{ CMODE_i, 0, NULL, NULL },
{ 0 }, /* j */
{ CMODE_k, 0, set_key, cs_set_key },
{ CMODE_l, CBM_MINUS_NO_ARG, set_limit, cs_set_limit },
{ CMODE_m, 0, NULL, NULL },
{ CMODE_n, 0, NULL, NULL },
{ 0 }, /* o */
{ CMODE_p, 0, NULL, NULL },
#ifdef IRC_PTLINK
{ CMODE_q, 0, NULL, NULL },
#else
{ 0 }, /* q */
#endif
#ifndef IRC_HYBRID
{ CMODE_r, CBM_NO_MLOCK, NULL, NULL },
#else
{ 0 },
#endif
{ CMODE_s, 0, NULL, NULL },
{ CMODE_t, 0, NULL, NULL },
#ifdef IRC_UNREAL
{ CMODE_u, 0, NULL, NULL },
#else
{ 0 },
#endif
{ 0 }, /* v */
{ 0 }, /* w */
#ifdef IRC_ULTIMATE
{ CMODE_x },
#else
{ 0 }, /* x */
#endif
{ 0 }, /* y */
#ifdef IRC_UNREAL
{ CMODE_z, 0, NULL, NULL },
#else
{ 0 }, /* z */
#endif
{ 0 }, { 0 }, { 0 }, { 0 }
};
CBModeInfo cbmodeinfos[] = {
#if defined(IRC_HYBRID)
{ 'a', CMODE_a, 0, NULL, NULL },
#endif
#if defined(IRC_BAHAMUT) || defined(IRC_UNREAL) || defined(IRC_PTLINK)
{ 'c', CMODE_c, 0, NULL, NULL },
#endif
#if defined(IRC_PTLINK)
{ 'd', CMODE_d, 0, NULL, NULL },
#endif
#ifdef HAS_FMODE
{ 'f', CMODE_f, 0, get_flood, cs_get_flood },
#endif
{ 'i', CMODE_i, 0, NULL, NULL },
{ 'k', CMODE_k, 0, get_key, cs_get_key },
{ 'l', CMODE_l, CBM_MINUS_NO_ARG, get_limit, cs_get_limit },
{ 'm', CMODE_m, 0, NULL, NULL },
{ 'n', CMODE_n, 0, NULL, NULL },
{ 'p', CMODE_p, 0, NULL, NULL },
#ifdef IRC_PTLINK
{ 'q', CMODE_q, 0, NULL, NULL },
#endif
#ifndef IRC_HYBRID
{ 'r', CMODE_r, 0, NULL, NULL },
#endif
{ 's', CMODE_s, 0, NULL, NULL },
{ 't', CMODE_t, 0, NULL, NULL },
#ifdef IRC_UNREAL
{ 'u', CMODE_u, 0, NULL, NULL },
#endif
#ifdef IRC_ULTIMATE
{ 'x', CMODE_x, 0, NULL, NULL },
#endif
#ifdef IRC_UNREAL
{ 'z', CMODE_z, 0, NULL, NULL },
#endif
#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_PTLINK)
{ 'A', CMODE_A, 0, NULL, NULL },
#endif
#ifdef IRC_UNREAL
{ 'C', CMODE_C, 0, NULL, NULL },
{ 'G', CMODE_G, 0, NULL, NULL },
{ 'H', CMODE_H, 0, NULL, NULL },
#endif
#ifdef IRC_ULTIMATE
{ 'I', CMODE_I, 0, NULL, NULL },
#endif
#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_PTLINK) || defined(IRC_ULTIMATE3)
{ 'K', CMODE_K, 0, NULL, NULL },
#endif
#ifdef HAS_LMODE
{ 'L', CMODE_L, 0, get_redirect, cs_get_redirect },
#endif
#ifdef IRC_BAHAMUT
#ifndef IRC_ULTIMATE3
{ 'M', CMODE_M, 0, NULL, NULL },
#endif
#endif
#if defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_PTLINK)
{ 'N', CMODE_N, 0, NULL, NULL },
#endif
#if defined(
|