diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/channels.c | 20 | ||||
-rw-r--r-- | src/chanserv.c | 20 | ||||
-rw-r--r-- | src/protocol/inspircd12.c | 233 | ||||
-rw-r--r-- | src/protocol/inspircd12.h | 13 |
4 files changed, 239 insertions, 47 deletions
diff --git a/src/channels.c b/src/channels.c index 0d957c32e..fbeddb633 100644 --- a/src/channels.c +++ b/src/channels.c @@ -1849,6 +1849,15 @@ char *get_redirect(Channel * chan) /*************************************************************************/ +/* This is a dummy function part of making anope accept modes + * it does actively parse.. ~ Viper */ +char *get_unkwn(Channel * chan) +{ + return NULL; +} + +/*************************************************************************/ + Channel *join_user_update(User * user, Channel * chan, char *name, time_t chants) { @@ -1972,6 +1981,17 @@ void set_redirect(Channel * chan, char *value) chan->redirect ? chan->redirect : "no redirect"); } +/*************************************************************************/ + +/* This is a dummy function to make anope parse a param for a mode, + * yet we don't use that param internally.. ~ Viper */ +void set_unkwn(Channel *chan, char *value) +{ + /* Do nothing.. */ +} + +/*************************************************************************/ + void do_mass_mode(char *modes) { int ac; diff --git a/src/chanserv.c b/src/chanserv.c index dce22c06b..983c21719 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -2487,6 +2487,15 @@ char *cs_get_redirect(ChannelInfo * ci) /*************************************************************************/ +/* This is a dummy function part of making anope accept modes + * it does actively parse.. ~ Viper */ +char *cs_get_unkwn(ChannelInfo * ci) +{ + return NULL; +} + +/*************************************************************************/ + void cs_set_flood(ChannelInfo * ci, char *value) { if (!ci) { @@ -2577,6 +2586,17 @@ void cs_set_redirect(ChannelInfo * ci, char *value) } } +/*************************************************************************/ + +/* This is a dummy function to make anope parse a param for a mode, + * yet we don't use that param internally.. ~ Viper */ +void cs_set_unkwn(ChannelInfo * ci, char *value) +{ + /* Do nothing.. */ +} + +/*************************************************************************/ + int get_access_level(ChannelInfo * ci, NickAlias * na) { ChanAccess *access; diff --git a/src/protocol/inspircd12.c b/src/protocol/inspircd12.c index 86456c448..42c065496 100644 --- a/src/protocol/inspircd12.c +++ b/src/protocol/inspircd12.c @@ -255,28 +255,28 @@ CBMode myCbmodes[128] = { {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, - {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL}, + {0}, /* A */ {0}, /* B */ - {CMODE_C, 0, NULL, NULL}, /* C */ + {0}, /* C */ {0}, /* D */ {0}, /* E */ {0}, /* F */ - {CMODE_G, 0, NULL, NULL}, /* G */ - {CMODE_H, CBM_NO_USER_MLOCK, NULL, NULL}, + {0}, /* G */ + {0}, /* H */ {0}, /* I */ {0}, /* J */ - {CMODE_K, 0, NULL, NULL}, /* K */ + {0}, /* K */ {0}, /* L */ - {0}, /* M */ - {CMODE_N, 0, NULL, NULL}, /* N */ - {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL}, + {CMODE_M, 0, NULL, NULL}, /* M */ + {0}, /* N */ + {0}, /* O */ {0}, /* P */ - {CMODE_Q, 0, NULL, NULL}, /* Q */ + {0}, /* Q */ {CMODE_R, 0, NULL, NULL}, /* R */ - {CMODE_S, 0, NULL, NULL}, /* S */ + {0}, /* S */ {0}, /* T */ {0}, /* U */ - {CMODE_V, 0, NULL, NULL}, /* V */ + {0}, /* V */ {0}, /* W */ {0}, /* X */ {0}, /* Y */ @@ -284,7 +284,7 @@ CBMode myCbmodes[128] = { {0}, {0}, {0}, {0}, {0}, {0}, {0}, /* a */ {0}, /* b */ - {CMODE_c, 0, NULL, NULL}, + {0}, /* c */ {0}, /* d */ {0}, /* e */ {0}, /* f */ @@ -302,12 +302,12 @@ CBMode myCbmodes[128] = { {CMODE_r, CBM_NO_MLOCK, NULL, NULL}, {CMODE_s, 0, NULL, NULL}, {CMODE_t, 0, NULL, NULL}, - {CMODE_u, 0, NULL, NULL}, + {0}, {0}, /* v */ {0}, /* w */ {0}, /* x */ {0}, /* y */ - {CMODE_z, 0, NULL, NULL}, + {0}, {0}, {0}, {0}, {0} }; @@ -328,16 +328,19 @@ CBModeInfo myCbmodeinfos[] = { {'z', CMODE_z, 0, NULL, NULL}, {'A', CMODE_A, 0, NULL, NULL}, {'C', CMODE_C, 0, NULL, NULL}, + {'F', CMODE_F, 0, NULL, NULL}, {'G', CMODE_G, 0, NULL, NULL}, - {'H', CMODE_H, 0, NULL, NULL}, + {'J', CMODE_J, 0, NULL, NULL}, {'K', CMODE_K, 0, NULL, NULL}, {'L', CMODE_L, 0, NULL, NULL}, + {'M', CMODE_M, 0, NULL, NULL}, {'N', CMODE_N, 0, NULL, NULL}, {'O', CMODE_O, 0, NULL, NULL}, + {'P', CMODE_P, 0, NULL, NULL}, {'Q', CMODE_Q, 0, NULL, NULL}, {'R', CMODE_R, 0, NULL, NULL}, {'S', CMODE_S, 0, NULL, NULL}, - {'V', CMODE_V, 0, NULL, NULL}, + {'T', CMODE_T, 0, NULL, NULL}, {0} }; @@ -404,10 +407,26 @@ static int has_inviteexceptionmod = 0; static int has_joinfloodmod = 0; static int has_hidechansmod = 0; static int has_chanprotectmod = 0; -static int has_knockmod = 0; static int has_halfop = 0; static int has_redirectmod = 0; static int has_servprotectmod = 0; +static int has_permchannels = 0; +static int has_nokicks = 0; +static int has_stripcolor = 0; +static int has_nonotice = 0; +static int has_auditorium = 0; +static int has_sslmodes = 0; +static int has_blockcolor = 0; +static int has_operchans = 0; +static int has_nonicks = 0; +static int has_knock = 0; +static int has_censor = 0; +static int has_noctcp = 0; +static int has_allowinvite = 0; +static int has_blockcaps = 0; +static int has_nickflood = 0; +static int has_chanfilter = 0; +static int has_kicknorejoin = 0; void inspircd_set_umode(User *user, int ac, char **av) { @@ -1911,15 +1930,63 @@ int anope_event_capab(char *source, int ac, char **av) if (strstr(av[1], "m_chanprotect.so")) { has_chanprotectmod = 1; } - if (strstr(av[1], "m_knock.so")) { - has_knockmod = 1; - } if (strstr(av[1], "m_redirect.so")) { has_redirectmod = 1; } if (strstr(av[1], "m_servprotect.so")) { has_servprotectmod = 1; } + if (strstr(av[1], "m_permchannels.so")) { + has_permchannels = 1; + } + if (strstr(av[1], "m_nokicks.so")) { + has_nokicks = 1; + } + if (strstr(av[1], "m_stripcolor.so")) { + has_stripcolor = 1; + } + if (strstr(av[1], "m_nonotice.so")) { + has_nonotice = 1; + } + if (strstr(av[1], "m_auditorium.so")) { + has_auditorium = 1; + } + if (strstr(av[1], "m_sslmodes.so")) { + has_sslmodes = 1; + } + if (strstr(av[1], "m_blockcolor.so")) { + has_blockcolor = 1; + } + if (strstr(av[1], "m_operchans.so")) { + has_operchans = 1; + } + if (strstr(av[1], "m_nonicks.so")) { + has_nonicks = 1; + } + if (strstr(av[1], "m_knock.so")) { + has_knock = 1; + } + if (strstr(av[1], "m_censor.so")) { + has_censor = 1; + } + if (strstr(av[1], "m_noctcp.so")) { + has_noctcp = 1; + } + if (strstr(av[1], "m_allowinvite.so")) { + has_allowinvite = 1; + } + if (strstr(av[1], "m_blockcaps.so")) { + has_blockcaps = 1; + } + if (strstr(av[1], "m_nickflood.so")) { + has_nickflood = 1; + } + if (strstr(av[1], "m_chanfilter.so")) { + has_chanfilter = 1; + } + if (strstr(av[1], "m_kicknorejoin.so")) { + has_kicknorejoin = 1; + } } else if (strcasecmp(av[0], "END") == 0) { if (!has_globopsmod) { send_cmd(NULL, "ERROR :m_globops is not loaded. This is required by Anope"); @@ -1963,19 +2030,13 @@ int anope_event_capab(char *source, int ac, char **av) cbmi->csgetvalue = cs_get_flood; myCbmodes['f'].flag = CMODE_f; - myCbmodes['f'].flags = 0; + myCbmodes['f'].flags = CBM_MINUS_NO_ARG; myCbmodes['f'].setvalue = set_flood; myCbmodes['f'].cssetvalue = cs_set_flood; - pmodule_ircd_cbmodeinfos(myCbmodeinfos); - pmodule_ircd_cbmodes(myCbmodes); - ircd->fmode = 1; } else { alog("Support for channelmode +f can not be enabled"); - if (debug) { - alog("debug: 'f' missing from myCbmodeinfos"); - } } } @@ -1989,10 +2050,10 @@ int anope_event_capab(char *source, int ac, char **av) myCmmodes['I'].delmask = del_invite; ircd->invitemode = 1; } - ircd->svshold = has_svsholdmod; if (has_banexceptionmod || has_inviteexceptionmod) { pmodule_ircd_cmmodes(myCmmodes); } + ircd->svshold = has_svsholdmod; if (has_joinfloodmod) { cbmi = myCbmodeinfos; @@ -2009,14 +2070,9 @@ int anope_event_capab(char *source, int ac, char **av) myCbmodes['j'].setvalue = chan_set_throttle; myCbmodes['j'].cssetvalue = cs_set_throttle; - pmodule_ircd_cbmodeinfos(myCbmodeinfos); - pmodule_ircd_cbmodes(myCbmodes); - ircd->jmode = 1; } else { alog("Support for channelmode +j can not be enabled"); - if (debug) - alog("debug: 'j' missing from myCbmodeinfos"); } } if (!has_chanprotectmod) { @@ -2026,10 +2082,7 @@ int anope_event_capab(char *source, int ac, char **av) alog("Support for admin and owner channelmodes disabled."); } else ircd->botchanumode = "+oa"; - if (has_knockmod) { - ircd->noknock = CMODE_K; - alog("Support for channelmode +K enabled."); - } + if (!has_halfop) { ircd->halfop = 0; alog("Support for halfops disabled."); @@ -2046,18 +2099,13 @@ int anope_event_capab(char *source, int ac, char **av) cbmi->csgetvalue = cs_get_redirect; myCbmodes['L'].flag = CMODE_L; - myCbmodes['L'].flags = 0; + myCbmodes['L'].flags = CBM_MINUS_NO_ARG; myCbmodes['L'].setvalue = set_redirect; myCbmodes['L'].cssetvalue = cs_set_redirect; - pmodule_ircd_cbmodeinfos(myCbmodeinfos); - pmodule_ircd_cbmodes(myCbmodes); - ircd->Lmode = 1; } else { alog("Support for channelmode +L can not be enabled"); - if (debug) - alog("debug: 'L' missing from myCbmodeinfos"); } } @@ -2086,6 +2134,105 @@ int anope_event_capab(char *source, int ac, char **av) alog("Support for usermode +k enabled. Pseudo-clients will be gods."); } + if (has_permchannels) { + myCbmodes['P'].flag = CMODE_P; + myCbmodes['P'].flags = CBM_NO_USER_MLOCK; + } + if (has_nokicks) { + myCbmodes['Q'].flag = CMODE_Q; + myCbmodes['Q'].flags = 0; + } + if (has_stripcolor) { + myCbmodes['S'].flag = CMODE_S; + myCbmodes['S'].flags = 0; + } + if (has_nonotice) { + myCbmodes['T'].flag = CMODE_T; + myCbmodes['T'].flags = 0; + } + if (has_auditorium) { + myCbmodes['u'].flag = CMODE_u; + myCbmodes['u'].flags = 0; + } + if (has_sslmodes) { + myCbmodes['z'].flag = CMODE_z; + myCbmodes['z'].flags = 0; + } + if (has_blockcolor) { + myCbmodes['c'].flag = CMODE_c; + myCbmodes['c'].flags = 0; + } + if (has_operchans) { + myCbmodes['O'].flag = CMODE_O; + myCbmodes['O'].flags = CBM_NO_USER_MLOCK; + } + if (has_nonicks) { + myCbmodes['N'].flag = CMODE_N; + myCbmodes['N'].flags = 0; + } + if (has_knock) { + ircd->noknock = CMODE_K; + myCbmodes['K'].flag = CMODE_K; + myCbmodes['K'].flags = 0; + } + if (has_censor) { + myCbmodes['G'].flag = CMODE_G; + myCbmodes['G'].flags = 0; + } + if (has_noctcp) { + myCbmodes['C'].flag = CMODE_C; + myCbmodes['C'].flags = 0; + } + if (has_allowinvite) { + myCbmodes['A'].flag = CMODE_A; + myCbmodes['A'].flags = 0; + } + if (has_blockcaps) { + myCbmodes['B'].flag = CMODE_B; + myCbmodes['B'].flags = 0; + } + if (has_nickflood) { + cbmi = myCbmodeinfos; + + while ((cbmi->mode != 'F')) + cbmi++; + if (cbmi) { + cbmi->getvalue = get_unkwn; + cbmi->csgetvalue = cs_get_unkwn; + + myCbmodes['F'].flag = CMODE_F; + myCbmodes['F'].flags = CBM_NO_MLOCK | CBM_MINUS_NO_ARG; + myCbmodes['F'].setvalue = set_unkwn; + myCbmodes['F'].cssetvalue = cs_set_unkwn; + } else { + alog("Support for channelmode +F can not be enabled"); + } + } + if (has_chanfilter) { + myCbmodes['g'].flag = CMODE_g; + myCbmodes['g'].flags = CBM_NO_MLOCK; + } + if (has_kicknorejoin) { + cbmi = myCbmodeinfos; + + while ((cbmi->mode != 'J')) + cbmi++; + if (cbmi) { + cbmi->getvalue = get_unkwn; + cbmi->csgetvalue = cs_get_unkwn; + + myCbmodes['J'].flag = CMODE_J; + myCbmodes['J'].flags = CBM_NO_MLOCK | CBM_MINUS_NO_ARG; + myCbmodes['J'].setvalue = set_unkwn; + myCbmodes['J'].cssetvalue = cs_set_unkwn; + } else { + alog("Support for channelmode +J can not be enabled"); + } + } + + pmodule_ircd_cbmodeinfos(myCbmodeinfos); + pmodule_ircd_cbmodes(myCbmodes); /* Commit all changes we made to the modes list.. */ + /* Generate a fake capabs parsing call so things like NOQUIT work * fine. It's ugly, but it works.... */ diff --git a/src/protocol/inspircd12.h b/src/protocol/inspircd12.h index 6e1448894..b0b2314a2 100644 --- a/src/protocol/inspircd12.h +++ b/src/protocol/inspircd12.h @@ -36,24 +36,29 @@ #define CMODE_t 0x00000020 #define CMODE_k 0x00000040 /* These two used only by ChanServ */ #define CMODE_l 0x00000080 +#define CMODE_R 0x00000100 /* Only identified users can join */ +#define CMODE_r 0x00000200 /* Set for all registered channels */ #define CMODE_c 0x00000400 #define CMODE_A 0x00000800 -#define CMODE_H 0x00001000 +#define CMODE_T 0x00001000 #define CMODE_K 0x00002000 #define CMODE_L 0x00004000 #define CMODE_O 0x00008000 #define CMODE_Q 0x00010000 #define CMODE_S 0x00020000 -#define CMODE_V 0x00040000 +#define CMODE_P 0x00040000 #define CMODE_f 0x00080000 #define CMODE_G 0x00100000 #define CMODE_C 0x00200000 #define CMODE_u 0x00400000 #define CMODE_z 0x00800000 #define CMODE_N 0x01000000 -#define CMODE_R 0x00000100 /* Only identified users can join */ -#define CMODE_r 0x00000200 /* Set for all registered channels */ #define CMODE_j 0x02000000 +#define CMODE_M 0x04000000 +#define CMODE_B 0x08000000 +#define CMODE_F 0x10000000 +#define CMODE_g 0x20000000 +#define CMODE_J 0x40000000 #define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r |