summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes3
-rwxr-xr-xConfig6
-rwxr-xr-xconfigure8
-rw-r--r--configure.in4
-rw-r--r--include/plexus.h53
-rw-r--r--include/services.h1
-rw-r--r--include/sysconf.h.in21
-rw-r--r--src/Makefile3
-rw-r--r--src/plexus.c1380
-rw-r--r--version.log6
10 files changed, 1471 insertions, 14 deletions
diff --git a/Changes b/Changes
index 4a775d12b..d25118459 100644
--- a/Changes
+++ b/Changes
@@ -69,6 +69,9 @@ Provided by Jens Hoffrichter <joho@nickstories.de> - 2004
Provided by mitch{Xy} <mitch@bondage.com> - 2004.
12/20 F Removed unclear email text from language files. [ #00]
+Provided by ThaPrince <> - 2004.
+12/20 A Added plexus ircd support. [ #00]
+
Anope Version 1.7.6
-------------------
Provided by Anope Dev. <dev@anope.org> - 2004
diff --git a/Config b/Config
index 387e379fb..3d39cefca 100755
--- a/Config
+++ b/Config
@@ -223,6 +223,7 @@ echo " 8) PTlink 6.15.0 [experimental]"
echo " 9) RageIRCd 2.0.0 [beta-6 or later]"
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 IRCD [experimental]"
while [ $ok -eq 0 ] ; do
echo2 "[$IRCTYPE] "
@@ -281,7 +282,10 @@ while [ $ok -eq 0 ] ; do
IRCTYPE_DEF="IRC_SOLID"
ok=1;
;;
-
+ 12)
+ IRCTYPE_DEF="IRC_PLEXUS"
+ ok=1;
+ ;;
*)
echo "Please enter a valid option number."
diff --git a/configure b/configure
index f6b282005..f17acb8ae 100755
--- a/configure
+++ b/configure
@@ -8593,6 +8593,14 @@ _ACEOF
IRCDFILE=" solidircd.c "
+ elif test "$withval" = "IRC_PLEXUS"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define IRC_PLEXUS 1
+_ACEOF
+
+ IRCDFILE=" plexus.c "
+
fi
diff --git a/configure.in b/configure.in
index 448ef60f0..22cb44fc1 100644
--- a/configure.in
+++ b/configure.in
@@ -233,6 +233,10 @@ AC_ARG_WITH(ircd, [ --with-ircd=ircd Specify the first ircd type], [
AC_DEFINE(IRC_SOLID,1,"First IRCD type")
IRCDFILE=" solidircd.c "
AC_SUBST(IRCDFILE)
+ elif test "$withval" = "IRC_PLEXUS"; then
+ AC_DEFINE(IRC_PLEXUS,1,"First IRCD type")
+ IRCDFILE=" plexus.c "
+ AC_SUBST(IRCDFILE)
fi
])
diff --git a/include/plexus.h b/include/plexus.h
new file mode 100644
index 000000000..f47699b20
--- /dev/null
+++ b/include/plexus.h
@@ -0,0 +1,53 @@
+/* Hybrid IRCD functions
+ *
+ * (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.
+ *
+ *
+ */
+
+#ifdef IRC_PLEXUS
+
+#define PROTECT_SET_MODE "+"
+#define PROTECT_UNSET_MODE "+"
+#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_h 0x00000002
+#define UMODE_i 0x00000004
+#define UMODE_o 0x00000008
+#define UMODE_R 0x00000010
+#define UMODE_w 0x00000020
+#define UMODE_A 0x00000040
+
+#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 /* These two used only by ChanServ */
+#define CMODE_l 0x00000080
+#define CMODE_a 0x00000400
+#define CMODE_Z 0x00000800
+#define CMODE_M 0x00001000
+#define CMODE_c 0x00002000
+#define CMODE_O 0x00004000
+#define CMODE_R 0x00008000
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t
+
+#endif
+
+
diff --git a/include/services.h b/include/services.h
index ed0f3bbab..174d14e78 100644
--- a/include/services.h
+++ b/include/services.h
@@ -178,6 +178,7 @@ typedef enum { false, true } boolean;
#include "dreamforge.h"
#include "unreal32.h"
#include "solidircd.h"
+#include "plexus.h"
typedef struct ircdvars_ IRCDVar;
typedef struct ircdcapab_ IRCDCAPAB;
diff --git a/include/sysconf.h.in b/include/sysconf.h.in
index b89165c15..26479e507 100644
--- a/include/sysconf.h.in
+++ b/include/sysconf.h.in
@@ -12,6 +12,9 @@
/* "Has sys/types.h" */
#undef HAS_SYS_TYPES_H
+/* "" */
+#undef HAVE_BACKTRACE
+
/* Define to 1 if you have the `fork' function. */
#undef HAVE_FORK
@@ -75,9 +78,6 @@
/* "" */
#undef HAVE_SYS_SELECT_H
-/* "" */
-#undef HAVE_BACKTRACE
-
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
@@ -93,19 +93,22 @@
/* "First IRCD type" */
#undef IRC_BAHAMUT
-/* "Frist IRCD type" */
-#undef IRC_DREAMFORGE
-
/* "First IRCD type" */
#undef IRC_HYBRID
/* "First IRCD type" */
+#undef IRC_PLEXUS
+
+/* "First IRCD type" */
#undef IRC_PTLINK
/* "First IRCD type" */
#undef IRC_RAGE2
/* "First IRCD type" */
+#undef IRC_SOLID
+
+/* "First IRCD type" */
#undef IRC_ULTIMATE2
/* "First IRCD type" */
@@ -120,9 +123,6 @@
/* "First IRCD type" */
#undef IRC_VIAGRA
-/* "First IRCD type" */
-#undef IRC_SOLID
-
/* "Module dir" */
#undef MODULE_PATH
@@ -227,11 +227,10 @@ int ftruncate(int fd, off_t length);
char *strsignal(int sig);
#endif
-/* Freebsd 5.2.1 actually has u_char those it throws more
+/* Freebsd 5.2.1 actually has u_char those it throws more
errors having it defined again - TSL */
#undef u_char
typedef unsigned char u_char;
-
#endif
diff --git a/src/Makefile b/src/Makefile
index 46d796985..98074f2b2 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -21,7 +21,8 @@ INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \
../include/modules.h ../include/slist.h \
../include/dreamforge.h ../include/bahamut.h ../include/ultimate2.h \
../include/ultimate3.h ../include/hybrid.h ../include/ptlink.h ../include/unreal31.h \
- ../include/viagra.h ../include/rageircd.h ../include/unreal32.h ../include/solidircd.h
+ ../include/viagra.h ../include/rageircd.h ../include/unreal32.h ../include/solidircd.h \
+ ../include/plexus.h
MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
diff --git a/src/plexus.c b/src/plexus.c
new file mode 100644
index 000000000..bafe2e33a
--- /dev/null
+++ b/src/plexus.c
@@ -0,0 +1,1380 @@
+/* Hybrid IRCD functions
+ *
+ * (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.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+#ifdef IRC_PLEXUS
+
+/* 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 = 0;
+
+const char version_protocol[] = "Plexus";
+
+IRCDVar ircd[] = {
+ {"Plexus", /* ircd name */
+ "+oiSR", /* nickserv mode */
+ "+oiSR", /* chanserv mode */
+ "+oiSR", /* memoserv mode */
+ "+oiSR", /* hostserv mode */
+ "+aoiSR", /* operserv mode */
+ "+oiSR", /* botserv mode */
+ "+iSR", /* helpserv mode */
+ "+iSR", /* Dev/Null mode */
+ "+ioSR", /* Global mode */
+ "+oiSR", /* nickserv alias mode */
+ "+oiSR", /* chanserv alias mode */
+ "+oiSR", /* memoserv alias mode */
+ "+oiSR", /* hostserv alias mode */
+ "+aoiSR", /* operserv alias mode */
+ "+oiSR", /* botserv alias mode */
+ "+iSR", /* helpserv alias mode */
+ "+iSR", /* Dev/Null alias mode */
+ "+ioSR", /* Global alias mode */
+ "+iSR", /* Used by BotServ Bots */
+ 3, /* Chan Max Symbols */
+ "-ciklmnpstMORZ", /* 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 */
+ "+R", /* Mode On Reg */
+ "-R", /* Mode on UnReg */
+ "-R", /* Mode on Nick Change */
+ 0, /* Supports SGlines */
+ 0, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 1, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 0, /* Chan Reg */
+ 0, /* Channel Mode */
+ 0, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* UMODE */
+ 0, /* O:LINE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ 0, /* ChanServ extra */
+ 0, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_h, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0,
+ 0,
+ 0,
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB ircdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ CAPAB_QS, /* QS */
+ CAPAB_UID, /* UID */
+ CAPAB_KNOCK, /* 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 */
+ }
+};
+
+
+
+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 'h':
+ update_host(user);
+ 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;
+ case 'R':
+ if (add && !nick_identified(user)) {
+ send_cmd(ServerName, "SVSMODE %s -R", user->nick);
+ user->mode &= ~UMODE_R;
+ }
+ break;
+
+ }
+ }
+}
+
+unsigned long umodes[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,
+ UMODE_R,
+ 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ 0, 0, 0, 0, 0,
+ 0, UMODE_a, 0, 0, 0, 0, 0,
+ 0,
+ UMODE_h, UMODE_i, 0, 0, 0, 0, 0, UMODE_o,
+ 0,
+ 0, 0, 0, 0, 0, 0, UMODE_w,
+ 0,
+ 0,
+ 0,
+ 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', /* (33) ! Channel Admins */
+ 0, 0, 0,
+ 'h', /* (37) % Channel halfops */
+ 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}, {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},
+ {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},
+ {0}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {0}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL}, /* O */
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL},
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {CMODE_Z, 0, NULL, NULL}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {CMODE_a, 0, NULL, NULL},
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL}, /* c */
+ {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 */
+ {0},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo cbmodeinfos[] = {
+ {'a', CMODE_a, 0, NULL, NULL},
+ {'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},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'Z', CMODE_Z, 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},
+
+ {0}, /* 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];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ if (UsePrivmsg) {
+ anope_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void anope_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void anope_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void anope_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void anope_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void anope_cmd_global(char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", buf);
+}
+
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ if (ac != 2) {
+ User *user = do_nick(source, av[0], av[4], av[5], av[7], av[9],
+ strtoul(av[2], NULL, 10), strtoul(av[8], NULL,
+ 0), 0,
+ av[6],
+ NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[3]);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac == 4) {
+ do_topic(source, ac, av);
+ } else {
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ alog("channel: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ return MOD_CONT;
+ }
+
+ if (check_topiclock(c, topic_time))
+ return MOD_CONT;
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 1 && *av[1])
+ c->topic = sstrdup(av[1]);
+
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ m = createMessage("401", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("STATS", m_stats); addCoreMessage(IRCD,m);
+ m = createMessage("TIME", m_time); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", NULL); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+void anope_cmd_sqline(char *mask, char *reason)
+{
+
+}
+void anope_cmd_unsgline(char *mask)
+{
+/* Does not support */
+}
+
+void anope_cmd_unszline(char *mask)
+{
+ /* Does not support */
+}
+
+void anope_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* Does not support */
+}
+
+void anope_cmd_svsnoop(char *server, int set)
+{
+ /* does not support */
+}
+
+void anope_cmd_sgline(char *mask, char *reason)
+{
+ /* does not support */
+}
+
+void anope_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(s_OperServ, "UNKLINE * %s %s", user, host);
+}
+
+void
+anope_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s :%s", chan, topic);
+}
+
+void anope_cmd_vhost_off(User * u)
+{
+ send_cmd(NULL, "SVSMODE %s -h", u->nick);
+}
+
+void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ if (!nick) {
+ return;
+ }
+ send_cmd(NULL, "SVSMODE %s +h", nick);
+ send_cmd(NULL, "SVSHOST %s %s", nick, vhost);
+}
+
+void anope_cmd_unsqline(char *user)
+{
+ /* Hybrid does not support SQLINEs */
+}
+
+void anope_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(NULL, "SJOIN %ld %s + :%s", time(NULL), channel, user);
+}
+
+void
+anope_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(s_OperServ, "KLINE * %ld %s %s :%s",
+ (expires - (long) time(NULL)), user, host, reason);
+}
+
+void anope_cmd_svskill(char *source, char *user, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ send_cmd(source, "KILL %s :%s", user, buf);
+}
+
+
+void anope_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %s%s%s", u->nick,
+ av[0], (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+}
+
+void anope_cmd_connect(int servernum)
+{
+ if (servernum == 1)
+ anope_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ anope_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ anope_cmd_pass(RemotePassword3);
+
+ anope_cmd_capab();
+ anope_cmd_server(ServerName, 1, ServerDesc);
+ anope_cmd_svsinfo();
+}
+
+/* SVSINFO */
+void anope_cmd_svsinfo()
+{
+ send_cmd(NULL, "SVSINFO 5 5 0 :%ld", time(NULL));
+}
+
+/* CAPAB */
+void anope_cmd_capab()
+{
+ send_cmd(NULL, "CAPAB TS5 EX IE HOPS HUB AOPS");
+}
+
+/* PASS */
+void anope_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER name hop descript */
+void anope_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+void
+anope_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick, time(NULL),
+ modes, user, host, "*", ServerName, real);
+
+}
+
+void anope_cmd_part(char *nick, char *chan, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug)
+ alog("user: SETHOST for nonexistent user %s", source);
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ char *uplink;
+
+ if (!stricmp(av[1], "1"))
+ uplink = sstrdup(av[0]);
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+void anope_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void anope_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "372 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void anope_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void anope_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void anope_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void anope_cmd_250(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s ", buf);
+}
+
+/* 307 */
+void anope_cmd_307(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s ", buf);
+}
+
+/* 311 */
+void anope_cmd_311(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s ", buf);
+}
+
+/* 312 */
+void anope_cmd_312(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s ", buf);
+}
+
+/* 317 */
+void anope_cmd_317(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s ", buf);
+}
+
+/* 219 */
+void anope_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void anope_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void anope_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void anope_cmd_242(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s ", buf);
+}
+
+/* 243 */
+void anope_cmd_243(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s ", buf);
+}
+
+/* 211 */
+void anope_cmd_211(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s ", buf);
+}
+
+void anope_cmd_mode(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "MODE %s %s", dest, buf);
+}
+
+void anope_cmd_nick(char *nick, char *name, char *mode)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick, time(NULL),
+ mode, ServiceUser, ServiceHost, "*", ServerName, (name));
+}
+
+void
+anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+void anope_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick);
+}
+
+/* QUIT */
+void anope_cmd_quit(char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+/* PONG */
+void anope_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/* INVITE */
+void anope_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* SQUIT */
+void anope_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(servname, "SQUIT %s :%s", servname, message);
+}
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+void anope_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ version_build);
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void anope_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void anope_cmd_relase_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void anope_cmd_svsnick(char *nick, char *newnick, time_t when)
+{
+ if (!nick || !newnick) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s", nick, newnick);
+}
+
+void
+anope_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick, time(NULL),
+ modes, user, host, "*", ServerName, real);
+}
+
+void anope_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void anope_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void anope_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSID %s 1", nick);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void anope_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "-R", NULL);
+ send_cmd(ServerName, "SVSID %s 1", u->nick);
+}
+
+/* SVSMODE +d */
+void anope_cmd_svid_umode2(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+R", NULL);
+ send_cmd(ServerName, "SVSID %s %s", u->nick, ts);
+ } else {
+ common_svsmode(u, "+R", NULL);
+ }
+}
+
+void anope_cmd_svid_umode3(User * u, char *ts)
+{
+}
+
+/* NICK <newnick> */
+void anope_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/* Below are additions made to this patch by anope-dev, we simply took the hybrid settings and used them. */
+
+void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ char *s;
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "%s NOTICE :\1%s \1", dest, s);
+}
+
+int anope_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+int anope_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+void anope_cmd_eob()
+{
+ send_cmd(ServerName, "EOB");
+}
+
+void anope_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+void anope_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+void anope_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ anope_cmd_squit(jserver, rbuf);
+ anope_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+void anope_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+#endif
diff --git a/version.log b/version.log
index a8509b690..041f6d390 100644
--- a/version.log
+++ b/version.log
@@ -8,10 +8,14 @@
VERSION_MAJOR="1"
VERSION_MINOR="7"
VERSION_PATCH="6"
-VERSION_BUILD="493"
+VERSION_BUILD="494"
# $Log$
#
+# BUILD : 1.7.6 (494)
+# BUGS : N/A
+# NOTES : Added support for plexus IRCD - provided by ThaPrince
+#
# BUILD : 1.7.6 (493)
# BUGS : N/A
# NOTES : Applied patch from mitch regarding unclear password emails.