summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes3
-rw-r--r--Changes.conf6
-rwxr-xr-xConfig6
-rwxr-xr-xconfigure9
-rw-r--r--configure.in5
-rw-r--r--data/example.conf5
-rw-r--r--include/extern.h2
-rw-r--r--include/services.h1
-rw-r--r--include/shadowircd.h86
-rw-r--r--include/sysconf.h.in3
-rw-r--r--makefile.inc.win325
-rw-r--r--makefile.win324
-rw-r--r--src/chanserv.c8
-rw-r--r--src/config.c12
-rw-r--r--src/rageircd.c8
-rw-r--r--src/ratbox.c10
-rw-r--r--src/shadowircd.c1811
-rw-r--r--src/unreal32.c16
-rw-r--r--version.log6
19 files changed, 1973 insertions, 33 deletions
diff --git a/Changes b/Changes
index a894cfc9e..3fdbaf2e4 100644
--- a/Changes
+++ b/Changes
@@ -1,11 +1,12 @@
Anope Version S V N
-------------------
Provided by Anope Dev. <dev@anope.org> - 2005
+03/03 A ShadowIRCD 4.0 beta 7 support added. [ #00]
02/27 A Added multi-file module support. [ #00]
02/13 A Internal Event support, see EVENTS in the doc folder for help [ #00]
02/05 A Support for Unreal 3.2 +I channel mode. [ #00]
02/03 A Merged anope-win32 branch into the main, now Win32 ready. [ #00]
-03/03 F ircd admin/ower mode handling. [#307]
+03/03 F Numeric in the config is now a string not an int [ #00]
03/02 F Fixed LogUser message, normalizes the "realname" on nick change. [#306]
03/02 F ircd protocol support for owner and admin taken from proto. files.[ #00]
03/02 F /ns alist output. [#288]
diff --git a/Changes.conf b/Changes.conf
index 2da76a4e9..39a272caa 100644
--- a/Changes.conf
+++ b/Changes.conf
@@ -19,6 +19,12 @@ Anope Version S V N
# UserKey2 <your_second_random_number_here>
# UserKey3 <you_third_random_number_here>
+# Numeric [OPTIONAL]
+# Many ircd identify themselves with a Numeric ID when using this option
+# consult your ircds documentation before using this.
+#Numeric "3AX"
+#Numeric "4"
+
** DELETED CONFIGURATION DIRECTIVES **
Anope Version 1.7.8
diff --git a/Config b/Config
index 2914058ca..c93b2c8ff 100755
--- a/Config
+++ b/Config
@@ -225,6 +225,7 @@ echo " 10) Unreal 3.2 [Unreal 3.2 beta19 or later]"
echo " 11) Solid IRCD 3.4.x [Solid IRCD 3.4.6 or later]"
echo " 12) Plexus 2.0 [or later]"
echo " 13) Ratbox 2.0.6 [or later]"
+echo " 14) ShadowIRCD 4.0x [beta 7 or later]"
while [ $ok -eq 0 ] ; do
echo2 "[$IRCTYPE] "
@@ -291,6 +292,11 @@ while [ $ok -eq 0 ] ; do
IRCTYPE_DEF="IRC_RATBOX"
ok=1;
;;
+ 14)
+ IRCTYPE_DEF="IRC_SHADOWIRCD"
+ ok=1;
+ ;;
+
*)
echo "Please enter a valid option number."
diff --git a/configure b/configure
index d988b25e4..596c84459 100755
--- a/configure
+++ b/configure
@@ -8639,6 +8639,15 @@ _ACEOF
IRCDFILE=" ratbox.c "
+ elif test "$withval" = "IRC_SHADOWIRCD"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define IRC_SHADOWIRCD 1
+_ACEOF
+
+ IRCDFILE=" shadowircd.c "
+
+
fi
diff --git a/configure.in b/configure.in
index ff560766a..201871519 100644
--- a/configure.in
+++ b/configure.in
@@ -267,6 +267,11 @@ AC_ARG_WITH(ircd, [ --with-ircd=ircd Specify the first ircd type], [
AC_DEFINE(IRC_RATBOX,1,"First IRCD type")
IRCDFILE=" ratbox.c "
AC_SUBST(IRCDFILE)
+ elif test "$withval" = "IRC_SHADOWIRCD"; then
+ AC_DEFINE(IRC_SHADOWIRCD,1,"First IRCD type")
+ IRCDFILE=" shadowircd.c "
+ AC_SUBST(IRCDFILE)
+
fi
])
diff --git a/data/example.conf b/data/example.conf
index 6c117aa7e..f25f274f6 100644
--- a/data/example.conf
+++ b/data/example.conf
@@ -240,9 +240,8 @@ NetworkName "LocalNet"
# Numeric [OPTIONAL]
# Many ircd identify themselves with a Numeric ID when using this option
# consult your ircds documentation before using this
-# - With TS6 ircd this must be 2 numbers, Anope will append X to this to
-# make the numeric ##X
-#Numeric 0
+#Numeric "3AX"
+#Numeric "4"
###########################################################################
#
diff --git a/include/extern.h b/include/extern.h
index e83df10d7..4305595f7 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -312,7 +312,7 @@ E int UseSVS2MODE;
E int RestrictOperNicks;
E int UseTokens;
E int NewsCount;
-E int Numeric;
+E char *Numeric;
E int UnRestrictSAdmin;
E int UseTS6;
diff --git a/include/services.h b/include/services.h
index 1c9473a8f..ef0671aec 100644
--- a/include/services.h
+++ b/include/services.h
@@ -245,6 +245,7 @@ typedef enum { false, true } boolean;
#include "solidircd.h"
#include "plexus.h"
#include "ratbox.h"
+#include "shadowircd.h"
typedef struct ircdvars_ IRCDVar;
typedef struct ircdcapab_ IRCDCAPAB;
diff --git a/include/shadowircd.h b/include/shadowircd.h
new file mode 100644
index 000000000..4af7889af
--- /dev/null
+++ b/include/shadowircd.h
@@ -0,0 +1,86 @@
+/* Ratbox IRCD functions
+ *
+ * (C) 2003-2005 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.
+ *
+ *
+ */
+
+#ifdef IRC_SHADOWIRCD
+
+/* The protocol revision. */
+#define PROTOCOL_REVISION 3402
+
+#define PROTECT_SET_MODE "+a"
+#define PROTECT_UNSET_MODE "-a"
+#define CS_CMD_PROTECT "PROTECT"
+#define CS_CMD_DEPROTECT "DEPROTECT"
+#define FANT_PROTECT_ADD "!protect"
+#define FANT_PROTECT_DEL "!deprotect"
+#define LEVEL_PROTECT_WORD "AUTOPROTECT"
+#define LEVELINFO_PROTECT_WORD "PROTECT"
+#define LEVELINFO_PROTECTME_WORD "PROTECTME"
+
+#define UMODE_a 0x00000001
+#define UMODE_C 0x00000002
+#define UMODE_i 0x00000004
+#define UMODE_o 0x00000008
+#define UMODE_z 0x00000010
+#define UMODE_w 0x00000020
+#define UMODE_s 0x00000040
+#define UMODE_c 0x00000080
+#define UMODE_r 0x00000100
+#define UMODE_k 0x00000200
+#define UMODE_f 0x00000400
+#define UMODE_y 0x00000800
+#define UMODE_d 0x00001000
+#define UMODE_n 0x00002000
+#define UMODE_x 0x00004000
+#define UMODE_u 0x00008000
+#define UMODE_b 0x00010000
+#define UMODE_l 0x00020000
+#define UMODE_g 0x00040000
+#define UMODE_v 0x00080000
+#define UMODE_A 0x00100000
+#define UMODE_E 0x00200000
+#define UMODE_G 0x00400000
+#define UMODE_R 0x00800000
+#define UMODE_e 0x01000000
+#define UMODE_O 0x02000000
+#define UMODE_H 0x04000000
+
+#define CMODE_i 0x00000001
+#define CMODE_m 0x00000002
+#define CMODE_n 0x00000004
+#define CMODE_p 0x00000008
+#define CMODE_s 0x00000010
+#define CMODE_t 0x00000020
+#define CMODE_k 0x00000040
+#define CMODE_l 0x00000080
+#define CMODE_K 0x00000100
+#define CMODE_A 0x00000200
+#define CMODE_r 0x00000400
+#define CMODE_z 0x00000800
+#define CMODE_S 0x00001000
+#define CMODE_c 0x00002000
+#define CMODE_E 0x00004000
+#define CMODE_F 0x00008000
+#define CMODE_G 0x00010000
+#define CMODE_L 0x00020000
+#define CMODE_N 0x00040000
+#define CMODE_O 0x00080000
+#define CMODE_P 0x00100000
+#define CMODE_R 0x00200000
+#define CMODE_T 0x00400000
+#define CMODE_V 0x00800000
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+#endif
+
+
diff --git a/include/sysconf.h.in b/include/sysconf.h.in
index 4ee53f115..47ab8e6d4 100644
--- a/include/sysconf.h.in
+++ b/include/sysconf.h.in
@@ -129,6 +129,9 @@
/* "First IRCD type" */
#undef IRC_RATBOX
+/* "First IRCD type" */
+#undef IRC_SHADOWIRCD
+
/* "Module dir" */
#undef MODULE_PATH
diff --git a/makefile.inc.win32 b/makefile.inc.win32
index ca6cc65a9..df9b7bfbe 100644
--- a/makefile.inc.win32
+++ b/makefile.inc.win32
@@ -26,6 +26,7 @@
# 11 Solid IRCD 3.4.x [Solid IRCD 3.4.6 or later]
# 12 Plexus 2.0 [or later]
# 13 Ratbox 2.0.6 [or later]
+# 14 ShadowIRCD 4.0x [beta 7 or later]
IRCD=10
@@ -128,6 +129,10 @@ CAPAB_O=plexus.obj
IRCTYPE=/D IRC_RATBOX
CAPAB_C=ratbox.c
CAPAB_O=ratbox.obj
+!ELSEIF $(IRCD) == 14
+IRCTYPE=/D IRC_SHADOWIRCD
+CAPAB_C=shadowircd.c
+CAPAB_O=shadowircd.obj
!ELSE
!ERROR Invalid IRCd
!ENDIF
diff --git a/makefile.win32 b/makefile.win32
index ee0e9fa19..4d2a6419c 100644
--- a/makefile.win32
+++ b/makefile.win32
@@ -114,6 +114,10 @@ dist:
echo Compiling Ratbox IRCd build
$(MAKE) IRCTYPE=/DIRC_RATBOX CAPAB_C=ratbox.c CAPAB_O=ratbox.obj
-@copy src\$(PROGRAM) services-ratbox.exe
+#Compile ShadowIRCD
+ echo Compiling Shadow IRCd build
+ $(MAKE) IRCTYPE=/DIRC_SHADOWIRCD CAPAB_C=shadowircd.c CAPAB_O=shadwoircd.obj
+ -@copy src\$(PROGRAM) services-shadowircd.exe
#Compile mypasql
$(MYPASQL_BUILD)
diff --git a/src/chanserv.c b/src/chanserv.c
index 521345057..e011eb077 100644
--- a/src/chanserv.c
+++ b/src/chanserv.c
@@ -1558,6 +1558,7 @@ int check_should_halfop(User * user, char *chan)
int check_should_owner(User * user, char *chan)
{
+ char *tmp;
ChannelInfo *ci = cs_findchan(chan);
if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
@@ -1565,7 +1566,8 @@ int check_should_owner(User * user, char *chan)
if (((ci->flags & CI_SECUREFOUNDER) && is_real_founder(user, ci))
|| (!(ci->flags & CI_SECUREFOUNDER) && is_founder(user, ci))) {
- anope_cmd_mode(whosends(ci), chan, "+oq %s %s", user->nick,
+ tmp = stripModePrefix(ircd->ownerset);
+ anope_cmd_mode(whosends(ci), chan, "+o%s %s %s", tmp, user->nick,
user->nick);
return 1;
}
@@ -1577,13 +1579,15 @@ int check_should_owner(User * user, char *chan)
int check_should_protect(User * user, char *chan)
{
+ char *tmp;
ChannelInfo *ci = cs_findchan(chan);
if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
return 0;
if (check_access(user, ci, CA_AUTOPROTECT)) {
- anope_cmd_mode(whosends(ci), chan, "+oa %s %s", user->nick,
+ tmp = stripModePrefix(ircd->adminset);
+ anope_cmd_mode(whosends(ci), chan, "+o%s %s %s", tmp, user->nick,
user->nick);
return 1;
}
diff --git a/src/config.c b/src/config.c
index 82bd4904a..4176faedb 100644
--- a/src/config.c
+++ b/src/config.c
@@ -324,7 +324,7 @@ long unsigned int UserKey1;
long unsigned int UserKey2;
long unsigned int UserKey3;
-int Numeric;
+char *Numeric;
int UnRestrictSAdmin;
@@ -519,7 +519,7 @@ Directive directives[] = {
{"NewsCount", {{PARAM_POSINT, PARAM_RELOAD, &NewsCount}}},
{"NewsDB", {{PARAM_STRING, PARAM_RELOAD, &NewsDBName}}},
{"NickservDB", {{PARAM_STRING, PARAM_RELOAD, &NickDBName}}},
- {"Numeric", {{PARAM_POSINT, PARAM_RELOAD, &Numeric}}},
+ {"Numeric", {{PARAM_STRING, PARAM_RELOAD, &Numeric}}},
{"PreNickServDB", {{PARAM_STRING, PARAM_RELOAD, &PreNickDBName}}},
{"NSEmailReg", {{PARAM_SET, PARAM_RELOAD, &NSEmailReg}}},
{"NickRegDelay", {{PARAM_POSINT, PARAM_RELOAD, &NickRegDelay}}},
@@ -1438,6 +1438,14 @@ int read_config(int reload)
}
}
+ if (UseTS6 && ircd->ts6) {
+ if (!Numeric) {
+ error(0,
+ "UseTS6 requires the setting of Numeric to be enabled.");
+ retval = 0;
+ }
+ }
+
/**
* If they try to enable any email registration option,
* make sure they have everything else they need too...
diff --git a/src/rageircd.c b/src/rageircd.c
index 182a911ef..800b04104 100644
--- a/src/rageircd.c
+++ b/src/rageircd.c
@@ -748,13 +748,9 @@ void anope_cmd_pong(char *servname, char *who)
void anope_cmd_connect(int servernum)
{
- char buf[16];
- *buf = '\0';
-
if (Numeric) {
- snprintf(buf, sizeof(buf), "%d", Numeric);
me_server =
- new_server(NULL, ServerName, ServerDesc, SERVER_ISME, buf);
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, Numeric);
} else {
me_server =
new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
@@ -768,7 +764,7 @@ void anope_cmd_connect(int servernum)
anope_cmd_pass(RemotePassword3);
anope_cmd_capab();
if (Numeric) {
- send_cmd(NULL, "MYID !%d", Numeric);
+ send_cmd(NULL, "MYID !%s", Numeric);
}
anope_cmd_server(ServerName, 1, ServerDesc);
anope_cmd_svinfo();
diff --git a/src/ratbox.c b/src/ratbox.c
index 19010ecce..47a36d7f3 100644
--- a/src/ratbox.c
+++ b/src/ratbox.c
@@ -727,13 +727,9 @@ int anope_event_436(char *source, int ac, char **av)
void moduleAddIRCDMsgs(void)
{
Message *m;
- char buf[BUFSIZE];
-
- *buf = '\0';
if (UseTS6) {
- snprintf(buf, BUFSIZE - 1, "%dX", Numeric);
- TS6SID = sstrdup(buf);
+ TS6SID = sstrdup(Numeric);
UseTSMODE = 1; /* TMODE */
}
@@ -998,7 +994,7 @@ void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real,
char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%dXAAAAA%c", Numeric,
+ snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
(ts6nickcount + 'A'));
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
(long int) time(NULL), modes, user, host, nicknumbuf,
@@ -1463,7 +1459,7 @@ void anope_cmd_nick(char *nick, char *name, char *mode)
char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%dXAAAAA%c", Numeric,
+ snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
(ts6nickcount + 'A'));
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
(long int) time(NULL), mode, ServiceUser, ServiceHost,
diff --git a/src/shadowircd.c b/src/shadowircd.c
new file mode 100644
index 000000000..b454dc618
--- /dev/null
+++ b/src/shadowircd.c
@@ -0,0 +1,1811 @@
+/* ShadowIRCd functions
+ *
+ * (C) 2003-2005 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.
+ *
+ * Provided by the ShadowIRCd development group. See
+ * http://www.shadowircd.net for details.
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+#ifdef IRC_SHADOWIRCD
+
+const char version_protocol[] = "ShadowIRCd 4.0+";
+
+/* Not all ircds use +f for their flood/join throttle system */
+const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */
+const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */
+int UseTSMODE = 1;
+
+int ts6nickcount = 0;
+
+IRCDVar ircd[] = {
+ {"ShadowIRCd 4.0+", /* ircd name */
+ "+oiqSK", /* nickserv mode */
+ "+oiqSK", /* chanserv mode */
+ "+oiqSK", /* memoserv mode */
+ "+oiqSK", /* hostserv mode */
+ "+oiqSK", /* operserv mode */
+ "+oiqSK", /* botserv mode */
+ "+oiqSK", /* helpserv mode */
+ "+oiqSK", /* Dev/Null mode */
+ "+oiqSK", /* Global mode */
+ "+oiqSK", /* nickserv alias mode */
+ "+oiqSK", /* chanserv alias mode */
+ "+oiqSK", /* memoserv alias mode */
+ "+oiqSK", /* hostserv alias mode */
+ "+oiqSK", /* operserv alias mode */
+ "+oiqSK", /* botserv alias mode */
+ "+oiqSK", /* helpserv alias mode */
+ "+oiqSK", /* Dev/Null alias mode */
+ "+oiqSK", /* Global alias mode */
+ "+oiqSK", /* Used by BotServ Bots */
+ 4, /* Chan Max Symbols */
+ "-cimnprstvzAEFGKLNOPRSTV", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+e", /* Mode On Reg */
+ "-e", /* Mode on UnReg */
+ "-e", /* Mode on Nick Change */
+ 0, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 4, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 1, /* Has Admin */
+ 1, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ 1, /* Channel Mode */
+ 1, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 1, /* UMODE */
+ 0, /* O:LINE */
+ 1, /* VHOST ON NICK */
+ 1, /* Change RealName */
+ 0, /* ChanServ extra */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_v, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 1, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "v", /* vhost char */
+ 1, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ }
+ ,
+ {NULL}
+};
+
+/* ShadowIRCd does not use CAPAB */
+IRCDCAPAB ircdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+void anope_set_umode(User * user, int ac, char **av)
+{
+ int add = 1; /* 1 if adding modes, 0 if deleting */
+ char *modes = av[0];
+
+ ac--;
+
+ if (debug)
+ alog("debug: Changing mode for %s to %s", user->nick, modes);
+
+ while (*modes) {
+
+ add ? (user->mode |= umodes[(int) *modes]) : (user->mode &=
+ ~umodes[(int)
+ *modes]);
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, 0, /* A B C */
+ 0, UMODE_E, 0, /* D E F */
+ UMODE_G, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, UMODE_O, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, 0, /* a b c */
+ UMODE_d, UMODE_e, 0, /* d e f */
+ 0, 0, UMODE_i, /* g h i */
+ 0, 0, UMODE_l, /* j k l */
+ UMODE_g, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, 0, /* p q r */
+ 0, 0, UMODE_u, /* s t u */
+ UMODE_v, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ ‚ */
+};
+
+
+char csmodes[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,
+ 'a',
+ 0, 0, 0,
+ 'h',
+ 0, 0, 0, 0,
+ 0,
+
+ 'v', 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 'o', 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
+};
+
+CMMode cmmodes[128] = {
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {NULL},
+ {NULL},
+ {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL},
+ {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}
+};
+
+
+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},
+ {CMODE_A, 0, NULL, NULL}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {CMODE_E, 0, NULL, NULL}, /* E */
+ {CMODE_F, 0, NULL, NULL}, /* F */
+ {CMODE_G, 0, NULL, NULL}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, NULL, NULL}, /* L */
+ {0}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, 0, NULL, NULL}, /* O */
+ {CMODE_P, 0, NULL, NULL}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {CMODE_T, 0, NULL, NULL}, /* T */
+ {0}, /* U */
+ {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0},
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {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},
+ {0}, /* q */
+ {CMODE_r, 0, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo cbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'E', CMODE_E, 0, NULL, NULL},
+ {'F', CMODE_F, 0, NULL, NULL},
+ {'G', CMODE_G, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'P', CMODE_P, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {'T', CMODE_T, 0, NULL, NULL},
+ {'V', CMODE_V, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode cumodes[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}, {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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_admin}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {0}, /* r */
+ {0}, /* s */
+ {0}, /* t */
+ {0}, /* u */
+ {CUS_VOICE, 0, NULL},
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}, {0}
+};
+
+
+
+void anope_cmd_notice(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ Uid *ud;
+ User *u;
+
+ *buf = '\0';
+
+ if (fmt) {
+ va