summaryrefslogtreecommitdiff
path: root/include/services.h
diff options
context:
space:
mode:
authorrob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-07-19 14:08:30 +0000
committerrob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-07-19 14:08:30 +0000
commita1479a87757fb5e9b48f3c8bb5dd9cc247406f1a (patch)
tree06d23a51082a398c512ed8f1e39bdac60d4dd658 /include/services.h
parent7fffea77edbe72cd66f7a55f41a3966204f9cf86 (diff)
BUILD : 1.7.4 (264) BUGS : N/A NOTES : Switched to autoconf - try to commit part 1
git-svn-id: svn://svn.anope.org/anope/trunk@264 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@169 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'include/services.h')
-rw-r--r--include/services.h1521
1 files changed, 1521 insertions, 0 deletions
diff --git a/include/services.h b/include/services.h
new file mode 100644
index 000000000..42dc83dfa
--- /dev/null
+++ b/include/services.h
@@ -0,0 +1,1521 @@
+/*
+ *
+ * (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.
+ *
+ *
+ */
+
+#ifndef SERVICES_H
+#define SERVICES_H
+
+/*************************************************************************/
+
+#include "sysconf.h"
+#include "config.h"
+
+#ifndef MAX_CMD_HASH
+#define MAX_CMD_HASH 1024
+#endif
+
+/* Some Linux boxes (or maybe glibc includes) require this for the
+ * prototype of strsignal(). */
+#define _GNU_SOURCE
+
+/* Some AIX boxes define int16 and int32 on their own. Blarph. */
+#if INTTYPE_WORKAROUND
+# define int16 builtin_int16
+# define int32 builtin_int32
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+#include <grp.h>
+#include <limits.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/stat.h> /* for umask() on some systems */
+#include <sys/types.h>
+#include <sys/time.h>
+
+#ifdef USE_RDB
+# define MAX_SQL_BUF 4096
+#endif
+
+#ifdef USE_MYSQL
+# define MYSQL_WARNING 2
+# define MYSQL_ERROR 4
+
+#ifdef HAVE_MYSQL_MYSQL_H
+#ifdef MYSQL_HEADER_PREFIX
+ #include <mysql/mysql.h>
+ #include <mysql/errmsg.h>
+#else
+ #include <mysql.h>
+ #include <errmsg.h>
+#endif
+#endif
+
+
+#endif
+
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#ifdef USE_THREADS
+# include <pthread.h>
+#endif
+
+#ifdef _AIX
+/* Some AIX boxes seem to have bogus includes that don't have these
+ * prototypes. */
+extern int strcasecmp(const char *, const char *);
+extern int strncasecmp(const char *, const char *, size_t);
+# if 0 /* These break on some AIX boxes (4.3.1 reported). */
+extern int gettimeofday(struct timeval *, struct timezone *);
+extern int socket(int, int, int);
+extern int bind(int, struct sockaddr *, int);
+extern int connect(int, struct sockaddr *, int);
+extern int shutdown(int, int);
+# endif
+# undef FD_ZERO
+# define FD_ZERO(p) memset((p), 0, sizeof(*(p)))
+#endif /* _AIX */
+
+/* Alias stricmp/strnicmp to strcasecmp/strncasecmp if we have the latter
+ * but not the former. */
+#if !HAVE_STRICMP && HAVE_STRCASECMP
+# define stricmp strcasecmp
+# define strnicmp strncasecmp
+#endif
+
+/* We have our own versions of toupper()/tolower(). */
+#include <ctype.h>
+#undef tolower
+#undef toupper
+#define tolower tolower_
+#define toupper toupper_
+extern int toupper(char), tolower(char);
+
+/* We also have our own encrypt(). */
+#define encrypt encrypt_
+
+
+#if INTTYPE_WORKAROUND
+# undef int16
+# undef int32
+#endif
+
+
+/* Miscellaneous definitions. */
+#include "defs.h"
+#include "slist.h"
+
+/*************************************************************************/
+
+typedef struct server_ Server;
+typedef struct user_ User;
+typedef struct channel_ Channel;
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Protocol tweaks */
+
+
+
+#ifdef IRC_HYBRID
+# define HAS_HALFOP
+# define HAS_EXCEPT /* Has +e (chan excepts) */
+# define NICKSERV_MODE "+o"
+# define CHANSERV_MODE "+o"
+# define MEMOSERV_MODE "+o"
+# define BOTSERV_MODE "+o"
+# define HELPSERV_MODE "+h"
+# define OPERSERV_MODE "+io"
+# define DEVNULL_MODE "+i"
+# define GLOBAL_MODE "+io"
+# define NICKSERV_ALIAS_MODE "+o"
+# define CHANSERV_ALIAS_MODE "+o"
+# define MEMOSERV_ALIAS_MODE "+o"
+# define BOTSERV_ALIAS_MODE "+o"
+# define HELPSERV_ALIAS_MODE "+h"
+# define OPERSERV_ALIAS_MODE "+io"
+# define DEVNULL_ALIAS_MODE "+i"
+# define GLOBAL_ALIAS_MODE "+io"
+# define BOTSERV_BOTS_MODE "+"
+#endif
+
+#ifdef IRC_VIAGRA
+# define HAS_HALFOP
+# define HAS_VHOST
+# define HAS_VIDENT
+# define HAS_EXCEPT
+# define NICKSERV_MODE "+oS"
+# define CHANSERV_MODE "+oS"
+# define HOSTSERV_MODE "+oS"
+# define MEMOSERV_MODE "+oS"
+# define BOTSERV_MODE "+oS"
+# define HELPSERV_MODE "+oS"
+# define OPERSERV_MODE "+ioS"
+# define DEVNULL_MODE "+i"
+# define GLOBAL_MODE "+ioS"
+# define NICKSERV_ALIAS_MODE "+oS"
+# define CHANSERV_ALIAS_MODE "+oS"
+# define MEMOSERV_ALIAS_MODE "+oS"
+# define BOTSERV_ALIAS_MODE "+oS"
+# define HELPSERV_ALIAS_MODE "+oS"
+# define OPERSERV_ALIAS_MODE "+ioS"
+# define DEVNULL_ALIAS_MODE "+iS"
+# define GLOBAL_ALIAS_MODE "+ioS"
+# define HOSTSERV_ALIAS_MODE "+ioS"
+# define BOTSERV_BOTS_MODE "+qS"
+#endif
+
+#if defined(IRC_BAHAMUT) && !defined(IRC_ULTIMATE3) && !defined(IRC_VIAGRA) && !defined(IRC_RAGE2)
+# define HAS_NICKIP
+# define HAS_EXCEPT
+# define HAS_SVSHOLD
+# define NICKSERV_MODE "+o"
+# define CHANSERV_MODE "+o"
+# define MEMOSERV_MODE "+o"
+# define BOTSERV_MODE "+o"
+# define HELPSERV_MODE "+h"
+# define OPERSERV_MODE "+io"
+# define DEVNULL_MODE "+i"
+# define GLOBAL_MODE "+io"
+# define NICKSERV_ALIAS_MODE "+o"
+# define CHANSERV_ALIAS_MODE "+o"
+# define MEMOSERV_ALIAS_MODE "+o"
+# define BOTSERV_ALIAS_MODE "+o"
+# define HELPSERV_ALIAS_MODE "+h"
+# define OPERSERV_ALIAS_MODE "+io"
+# define DEVNULL_ALIAS_MODE "+i"
+# define GLOBAL_ALIAS_MODE "+io"
+# define BOTSERV_BOTS_MODE "+"
+#endif
+
+#ifdef IRC_RAGE2
+# define HAS_HALFOP
+# define HAS_EXCEPT
+# define HAS_VHOST
+# define HAS_NICKVHOST
+# define NICKSERV_MODE "+dS"
+# define CHANSERV_MODE "+dS"
+# define HOSTSERV_MODE "+dS"
+# define MEMOSERV_MODE "+dS"
+# define BOTSERV_MODE "+dS"
+# define HELPSERV_MODE "+dSh"
+# define OPERSERV_MODE "+diS"
+# define DEVNULL_MODE "+diS"
+# define GLOBAL_MODE "+diS"
+# define NICKSERV_ALIAS_MODE "+o"
+# define CHANSERV_ALIAS_MODE "+o"
+# define MEMOSERV_ALIAS_MODE "+o"
+# define BOTSERV_ALIAS_MODE "+o"
+# define HELPSERV_ALIAS_MODE "+h"
+# define OPERSERV_ALIAS_MODE "+io"
+# define DEVNULL_ALIAS_MODE "+i"
+# define GLOBAL_ALIAS_MODE "+io"
+# define HOSTSERV_ALIAS_MODE "+io"
+# define BOTSERV_BOTS_MODE "+S"
+#endif
+
+#ifdef IRC_PTLINK
+# define HAS_NICKVHOST
+# define HAS_VHOST
+# define HAS_FMODE
+# define HAS_EXCEPT
+# define NICKSERV_MODE "+o"
+# define CHANSERV_MODE "+o"
+# define HOSTSERV_MODE "+o"
+# define MEMOSERV_MODE "+o"
+# define BOTSERV_MODE "+o"
+# define HELPSERV_MODE "+h"
+# define OPERSERV_MODE "+io"
+# define DEVNULL_MODE "+i"
+# define GLOBAL_MODE "+io"
+# define NICKSERV_ALIAS_MODE "+o"
+# define CHANSERV_ALIAS_MODE "+o"
+# define MEMOSERV_ALIAS_MODE "+o"
+# define BOTSERV_ALIAS_MODE "+o"
+# define HELPSERV_ALIAS_MODE "+h"
+# define OPERSERV_ALIAS_MODE "+io"
+# define DEVNULL_ALIAS_MODE "+i"
+# define GLOBAL_ALIAS_MODE "+io"
+# define HOSTSERV_ALIAS_MODE "+io"
+# define BOTSERV_BOTS_MODE "+"
+#endif
+
+#ifdef IRC_ULTIMATE
+# define HAS_FMODE /* Has +f chan mode */
+# define HAS_HALFOP
+# define HAS_LMODE /* Has +L chan mode */
+# define HAS_VHOST
+# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */
+# define HAS_EXCEPT
+# define NICKSERV_MODE "+S"
+# define CHANSERV_MODE "+S"
+# define HOSTSERV_MODE "+oS"
+# define MEMOSERV_MODE "+S"
+# define BOTSERV_MODE "+S"
+# define HELPSERV_MODE "+Sh"
+# define OPERSERV_MODE "+iS"
+# define DEVNULL_MODE "+iS"
+# define GLOBAL_MODE "+iS"
+# define NICKSERV_ALIAS_MODE "+oS"
+# define CHANSERV_ALIAS_MODE "+oS"
+# define MEMOSERV_ALIAS_MODE "+oS"
+# define BOTSERV_ALIAS_MODE "+oS"
+# define HELPSERV_ALIAS_MODE "+oS"
+# define OPERSERV_ALIAS_MODE "+ioS"
+# define DEVNULL_ALIAS_MODE "+iS"
+# define GLOBAL_ALIAS_MODE "+ioS"
+# define HOSTSERV_ALIAS_MODE "+ioS"
+# define BOTSERV_BOTS_MODE "+pS"
+#endif
+
+#ifdef IRC_UNREAL
+# define HAS_FMODE /* Has +f chan mode */
+# define HAS_HALFOP
+# define HAS_LMODE /* Has +L chan mode */
+# define HAS_NICKVHOST
+# define HAS_VHOST
+# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */
+# define HAS_EXCEPT
+# define NICKSERV_MODE "+oS"
+# define CHANSERV_MODE "+oS"
+# define HOSTSERV_MODE "+oS"
+# define MEMOSERV_MODE "+oS"
+# define BOTSERV_MODE "+oS"
+# define HELPSERV_MODE "+oS"
+# define OPERSERV_MODE "+ioS"
+# define DEVNULL_MODE "+iS"
+# define GLOBAL_MODE "+ioS"
+# define NICKSERV_ALIAS_MODE "+oS"
+# define CHANSERV_ALIAS_MODE "+oS"
+# define MEMOSERV_ALIAS_MODE "+oS"
+# define BOTSERV_ALIAS_MODE "+oS"
+# define HELPSERV_ALIAS_MODE "+oS"
+# define OPERSERV_ALIAS_MODE "+ioS"
+# define DEVNULL_ALIAS_MODE "+iS"
+# define GLOBAL_ALIAS_MODE "+ioS"
+# define HOSTSERV_ALIAS_MODE "+ioS"
+# define BOTSERV_BOTS_MODE "+qS"
+#endif
+
+#ifdef IRC_ULTIMATE3
+# define HAS_HALFOP
+# define HAS_VHOST
+# define HAS_NICKVHOST
+# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */
+# define HAS_EXCEPT
+# define NICKSERV_MODE "+S"
+# define CHANSERV_MODE "+S"
+# define HOSTSERV_MODE "+o"
+# define MEMOSERV_MODE "+S"
+# define BOTSERV_MODE "+S"
+# define HELPSERV_MODE "+Sh"
+# define OPERSERV_MODE "+iS"
+# define DEVNULL_MODE "+iS"
+# define GLOBAL_MODE "+iS"
+# define NICKSERV_ALIAS_MODE "+o"
+# define CHANSERV_ALIAS_MODE "+o"
+# define MEMOSERV_ALIAS_MODE "+o"
+# define BOTSERV_ALIAS_MODE "+o"
+# define HELPSERV_ALIAS_MODE "+h"
+# define OPERSERV_ALIAS_MODE "+io"
+# define DEVNULL_ALIAS_MODE "+i"
+# define GLOBAL_ALIAS_MODE "+io"
+# define HOSTSERV_ALIAS_MODE "+io"
+# define BOTSERV_BOTS_MODE "+S"
+#endif
+
+/*
+ This gets ugly since serval ircds use both DREAMFORCE and their own define
+*/
+
+#ifdef IRC_DREAMFORGE
+ #ifndef NICKSERV_MODE
+ # define NICKSERV_MODE "+o"
+ #endif
+ #ifndef CHANSERV_MODE
+ # define CHANSERV_MODE "+o"
+ #endif
+ #ifndef MEMOSERV_MODE
+ # define MEMOSERV_MODE "+o"
+ #endif
+ #ifndef BOTSERV_MODE
+ # define BOTSERV_MODE "+o"
+ #endif
+ #ifndef HELPSERV_MODE
+ # define HELPSERV_MODE "+h"
+ #endif
+ #ifndef OPERSERV_MODE
+ # define OPERSERV_MODE "+io"
+ #endif
+ #ifndef DEVNULL_MODE
+ # define DEVNULL_MODE "+i"
+ #endif
+ #ifndef GLOBAL_MODE
+ # define GLOBAL_MODE "+io"
+ #endif
+ #ifndef BOTSERV_BOTS_MODE
+ # define BOTSERV_BOTS_MODE "+"
+ #endif
+ #ifndef NICKSERV_ALIAS_MODE
+ # define NICKSERV_ALIAS_MODE "+o"
+ #endif
+ #ifndef CHANSERV_ALIAS_MODE
+ # define CHANSERV_ALIAS_MODE "+o"
+ #endif
+ #ifndef MEMOSERV_ALIAS_MODE
+ # define MEMOSERV_ALIAS_MODE "+o"
+ #endif
+ #ifndef BOTSERV_ALIAS_MODE
+ # define BOTSERV_ALIAS_MODE "+o"
+ #endif
+ #ifndef HELPSERV_ALIAS_MODE
+ # define HELPSERV_ALIAS_MODE "+h"
+ #endif
+ #ifndef OPERSERV_ALIAS_MODE
+ # define OPERSERV_ALIAS_MODE "+io"
+ #endif
+ #ifndef DEVNULL_ALIAS_MODE
+ # define DEVNULL_ALIAS_MODE "+i"
+ #endif
+ #ifndef GLOBAL_ALIAS_MODE
+ # define GLOBAL_ALIAS_MODE "+io"
+ #endif
+#endif
+
+/*************************************************************************/
+
+/* File version for each database. Was one version for all before but was
+ changed so they are now easier to maintain. =) */
+
+#define BOT_VERSION 10
+#define CHAN_VERSION 16
+#define EXCEPTION_VERSION 9
+#define NEWS_VERSION 9
+#define NICK_VERSION 13
+#define PRE_NICK_VERSION 1
+#define OPER_VERSION 13
+
+/**
+ * ModuleData strucs used to allow modules to add / delete module Data from existing structs
+ */
+typedef struct ModuleData_ ModuleData; /* ModuleData struct */
+typedef struct ModuleDataItem_ ModuleDataItem; /* A Module Data Item struct */
+
+struct ModuleDataItem_ {
+ char *key; /* The key */
+ char *value; /* The Value */
+ ModuleDataItem *next; /* The next ModuleDataItem in this list */
+};
+
+struct ModuleData_ {
+ char *moduleName; /* Which module we belong to */
+ ModuleDataItem *di; /* The first Item they own */
+ ModuleData *next; /* The next ModuleData record */
+};
+
+
+
+typedef enum { false, true } boolean;
+
+/*************************************************************************/
+
+/* Memo info structures. Since both nicknames and channels can have memos,
+ * we encapsulate memo data in a MemoList to make it easier to handle. */
+
+typedef struct memo_ Memo;
+struct memo_ {
+ uint32 number; /* Index number -- not necessarily array position! */
+ int16 flags;
+ time_t time; /* When it was sent */
+ char sender[NICKMAX];
+ char *text;
+ ModuleData *moduleData[1024]; /* Module saved data attached to the Memo */
+};
+
+#define MF_UNREAD 0x0001 /* Memo has not yet been read */
+#define MF_RECEIPT 0x0002 /* Sender requested receipt */
+
+typedef struct {
+ int16 memocount, memomax;
+ Memo *memos;
+} MemoInfo;
+
+/*************************************************************************/
+
+/* NickServ nickname structures. */
+typedef struct nickrequest_ NickRequest;
+typedef struct nickalias_ NickAlias;
+typedef struct nickcore_ NickCore;
+
+struct nickrequest_ {
+ NickRequest *next, *prev;
+ char *nick;
+ char *passcode;
+ char *password;
+ char *email;
+
+ time_t requested;
+
+ time_t lastmail; /* Unsaved */
+};
+
+struct nickalias_ {
+ NickAlias *next, *prev;
+
+ char *nick; /* Nickname */
+
+ char *last_quit; /* Last quit message */
+ char *last_realname; /* Last realname */
+ char *last_usermask; /* Last usermask */
+
+ time_t time_registered; /* When the nick was registered */
+ time_t last_seen; /* When it was seen online for the last time */
+
+ int16 status; /* See NS_* below */
+
+ NickCore *nc; /* I'm an alias of this */
+
+ /* Not saved */
+ ModuleData *moduleData[1024]; /* Module saved data attached to the nick alias */
+ User *u; /* Current online user that has me */
+};
+
+struct nickcore_ {
+ NickCore *next, *prev;
+
+ char *display; /* How the nick is displayed */
+ char *pass; /* Password of the nicks */
+
+ char *email; /* E-mail associated to the nick */
+ char *greet; /* Greet associated to the nick */
+ uint32 icq; /* ICQ # associated to the nick */
+ char *url; /* URL associated to the nick */
+
+ int32 flags; /* See NI_* below */
+ uint16 language; /* Language selected by nickname owner (LANG_*) */
+
+ int16 accesscount; /* # of entries */
+ char **access; /* Array of strings */
+
+ MemoInfo memos;
+
+ uint16 channelcount; /* Number of channels currently registered */
+ uint16 channelmax; /* Maximum number of channels allowed */
+
+ /* Unsaved data */
+ ModuleData *moduleData[1024]; /* Module saved data attached to the NickCore */
+ time_t lastmail; /* Last time this nick record got a mail */
+ SList aliases; /* List of aliases */
+};
+
+/* Nickname status flags: */
+#define NS_VERBOTEN 0x0002 /* Nick may not be registered or used */
+#define NS_NO_EXPIRE 0x0004 /* Nick never expires */
+#define NS_IDENTIFIED 0x8000 /* User has IDENTIFY'd */
+#define NS_RECOGNIZED 0x4000 /* ON_ACCESS true && SECURE flag not set */
+#define NS_ON_ACCESS 0x2000 /* User comes from a known address */
+#define NS_KILL_HELD 0x1000 /* Nick is being held after a kill */
+#define NS_GUESTED 0x0100 /* SVSNICK has been sent but nick has not
+ * yet changed. An enforcer will be
+ * introduced when it does change. */
+#define NS_MASTER 0x0200 /* Was a master nick; used to import old databases */
+#define NS_TRANSGROUP 0xC000 /* Status flags that can be passed to a nick of the
+ same group during nick change */
+#define NS_TEMPORARY 0xFF00 /* All temporary status flags */
+/* These two are not used anymore */
+#define NS_OLD_ENCRYPTEDPW 0x0001 /* Nickname password is encrypted */
+
+/* Nickname setting flags: */
+#define NI_KILLPROTECT 0x00000001 /* Kill others who take this nick */
+#define NI_SECURE 0x00000002 /* Don't recognize unless IDENTIFY'd */
+#define NI_MSG 0x00000004 /* Use PRIVMSGs instead of NOTICEs */
+#define NI_MEMO_HARDMAX 0x00000008 /* Don't allow user to change memo limit */
+#define NI_MEMO_SIGNON 0x00000010 /* Notify of memos at signon and un-away */
+#define NI_MEMO_RECEIVE 0x00000020 /* Notify of new memos when sent */
+#define NI_PRIVATE 0x00000040 /* Don't show in LIST to non-servadmins */
+#define NI_HIDE_EMAIL 0x00000080 /* Don't show E-mail in INFO */
+#define NI_HIDE_MASK 0x00000100 /* Don't show last seen address in INFO */
+#define NI_HIDE_QUIT 0x00000200 /* Don't show last quit message in INFO */
+#define NI_KILL_QUICK 0x00000400 /* Kill in 20 seconds instead of 60 */
+#define NI_KILL_IMMED 0x00000800 /* Kill immediately instead of in 60 sec */
+#define NI_SERVICES_OPER 0x00001000 /* User is a Services operator */
+#define NI_SERVICES_ADMIN 0x00002000 /* User is a Services admin */
+#define NI_ENCRYPTEDPW 0x00004000 /* Nickname password is encrypted */
+#define NI_SERVICES_ROOT 0x00008000 /* User is a Services root */
+#define NI_MEMO_MAIL 0x00010000 /* User gets email on memo */
+#define NI_HIDE_STATUS 0x00020000 /* Don't show services access status */
+
+/* Languages. Never insert anything in the middle of this list, or
+ * everybody will start getting the wrong language! If you want to change
+ * the order the languages are displayed in for NickServ HELP SET LANGUAGE,
+ * do it in language.c.
+ */
+#define LANG_EN_US 0 /* United States English */
+#define LANG_JA_JIS 1 /* Japanese (JIS encoding) */
+#define LANG_JA_EUC 2 /* Japanese (EUC encoding) */
+#define LANG_JA_SJIS 3 /* Japanese (SJIS encoding) */
+#define LANG_ES 4 /* Spanish */
+#define LANG_PT 5 /* Portugese */
+#define LANG_FR 6 /* French */
+#define LANG_TR 7 /* Turkish */
+#define LANG_IT 8 /* Italian */
+#define LANG_DE 9 /* German */
+#define LANG_CAT 10 /* Catalan */
+#define LANG_GR 11 /* Greek */
+#define LANG_NL 12 /* Dutch */
+#define LANG_RU 13 /* Russian */
+
+#define NUM_LANGS 14 /* Number of languages */
+#define USED_LANGS 11 /* Number of languages provided */
+
+#define DEF_LANGUAGE LANG_EN_US
+
+/*************************************************************************/
+
+/* Bot info structures. Note that since there won't be many bots,
+ * they're not in a hash list.
+ * --lara
+ */
+
+typedef struct botinfo_ BotInfo;
+
+struct botinfo_ {
+
+ BotInfo *next, *prev;
+
+ char *nick; /* Nickname of the bot */
+ char *user; /* Its user name */
+ char *host; /* Its hostname */
+ char *real; /* Its real name */
+
+ int16 flags; /* Bot flags -- see BI_* below */
+
+ time_t created; /* Birth date ;) */
+ int16 chancount; /* Number of channels that use the bot. */
+
+ /* Dynamic data */
+ time_t lastmsg; /* Last time we said something */
+};
+
+#define BI_PRIVATE 0x0001
+
+/* Channel info structures. Stored similarly to the nicks, except that
+ * the second character of the channel name, not the first, is used to
+ * determine the list. (Hashing based on the first character of the name
+ * wouldn't get very far. ;) ) */
+
+/* Access levels for users. */
+typedef struct {
+ int16 in_use; /* 1 if this entry is in use, else 0 */
+ int16 level;
+ NickCore *nc; /* Guaranteed to be non-NULL if in use, NULL if not */
+ time_t last_seen;
+} ChanAccess;
+
+/* Note that these two levels also serve as exclusive boundaries for valid
+ * access levels. ACCESS_FOUNDER may be assumed to be strictly greater
+ * than any valid access level, and ACCESS_INVALID may be assumed to be
+ * strictly less than any valid access level.
+ */
+#define ACCESS_FOUNDER 10000 /* Numeric level indicating founder access */
+#define ACCESS_INVALID -10000 /* Used in levels[] for disabled settings */
+
+/* Levels for xOP */
+
+#define ACCESS_VOP 3
+#ifdef HAS_HALFOP
+# define ACCESS_HOP 4
+#endif
+#define ACCESS_AOP 5
+#define ACCESS_SOP 10
+
+/* AutoKick data. */
+typedef struct {
+ int16 in_use; /* Always 0 if not in use */
+ int16 is_nick; /* 1 if a regged nickname, 0 if a nick!user@host mask */
+
+ int16 flags;
+
+ union {
+ char *mask; /* Guaranteed to be non-NULL if in use, NULL if not */
+ NickCore *nc; /* Same */
+ } u;
+ char *reason;
+
+ char *creator;
+ time_t addtime;
+} AutoKick;
+
+#define AK_USED 0x0001
+#define AK_ISNICK 0x0002
+#define AK_STUCK 0x0004
+
+/* Structure used to contain bad words. */
+
+typedef struct badword_ BadWord;
+
+struct badword_ {
+ int16 in_use;
+
+ char *word;
+ int16 type; /* BW_* below */
+};
+
+#define BW_ANY 0
+#define BW_SINGLE 1
+#define BW_START 2
+#define BW_END 3
+
+typedef struct chaninfo_ ChannelInfo;
+struct chaninfo_ {
+ ChannelInfo *next, *prev;
+ char name[CHANMAX];
+ NickCore *founder;
+ NickCore *successor; /* Who gets the channel if the founder
+ * nick is dropped or expires */
+ char founderpass[PASSMAX];
+ char *desc;
+ char *url;
+ char *email;
+
+ time_t time_registered;
+ time_t last_used;
+ char *last_topic; /* Last topic on the channel */
+ char last_topic_setter[NICKMAX]; /* Who set the last topic */
+ time_t last_topic_time; /* When the last topic was set */
+
+ uint32 flags; /* See below */
+ char *forbidby;
+ char *forbidreason;
+
+ int16 bantype;
+
+ int16 *levels; /* Access levels for commands */
+
+ int16 accesscount;
+ ChanAccess *access; /* List of authorized users */
+ int16 akickcount;
+ AutoKick *akick; /* List of users to kickban */
+
+ uint32 mlock_on, mlock_off; /* See channel modes below */
+ uint32 mlock_limit; /* 0 if no limit */
+ char *mlock_key; /* NULL if no key */
+#ifdef HAS_FMODE
+ char *mlock_flood; /* NULL if no +f */
+#endif
+#ifdef HAS_LMODE
+ char *mlock_redirect; /* NULL if no +L */
+#endif
+
+ char *entry_message; /* Notice sent on entering channel */
+
+ MemoInfo memos;
+
+ struct channel_ *c; /* Pointer to channel record (if *
+ * channel is currently in use) */
+
+ ModuleData *moduleData[1024]; /* Module saved data attached to the ChannelInfo */
+
+ /* For BotServ */
+
+ BotInfo *bi; /* Bot used on this channel */
+ uint32 botflags; /* BS_* below */
+ int16 *ttb; /* Times to ban for each kicker */
+
+ int16 bwcount;
+ BadWord *badwords; /* For BADWORDS kicker */
+ int16 capsmin, capspercent; /* For CAPS kicker */
+ int16 floodlines, floodsecs; /* For FLOOD kicker */
+ int16 repeattimes; /* For REPEAT kicker */
+};
+
+/* Retain topic even after last person leaves channel */
+#define CI_KEEPTOPIC 0x00000001
+/* Don't allow non-authorized users to be opped */
+#define CI_SECUREOPS 0x00000002
+/* Hide channel from ChanServ LIST command */
+#define CI_PRIVATE 0x00000004
+/* Topic can only be changed by SET TOPIC */
+#define CI_TOPICLOCK 0x00000008
+/* Those not allowed ops are kickbanned */
+#define CI_RESTRICTED 0x00000010
+/* Don't allow ChanServ and BotServ commands to do bad things to bigger levels */
+#define CI_PEACE 0x00000020
+/* Don't allow any privileges unless a user is IDENTIFY'd with NickServ */
+#define CI_SECURE 0x00000040
+/* Don't allow the channel to be registered or used */
+#define CI_VERBOTEN 0x00000080
+/* Channel password is encrypted */
+#define CI_ENCRYPTEDPW 0x00000100
+/* Channel does not expire */
+#define CI_NO_EXPIRE 0x00000200
+/* Channel memo limit may not be changed */
+#define CI_MEMO_HARDMAX 0x00000400
+/* Send notice to channel on use of OP/DEOP */
+#define CI_OPNOTICE 0x00000800
+/* Stricter control of channel founder status */
+#define CI_SECUREFOUNDER 0x00001000
+/* Always sign kicks */
+#define CI_SIGNKICK 0x00002000
+/* Sign kicks if level is < than the one defined by the SIGNKICK level */
+#define CI_SIGNKICK_LEVEL 0x00004000
+/* Use the xOP lists */
+#define CI_XOP 0x00008000
+/* Channel is suspended */
+#define CI_SUSPENDED 0x00010000
+
+/* TEMPORARY - ChanServ is on the channel. */
+#define CI_INHABIT 0x80000000
+
+/* Indices for cmd_access[]: */
+#define CA_INVITE 0
+#define CA_AKICK 1
+#define CA_SET 2 /* but not FOUNDER or PASSWORD */
+#define CA_UNBAN 3
+#define CA_AUTOOP 4
+#define CA_AUTODEOP 5 /* Maximum, not minimum */
+#define CA_AUTOVOICE 6
+#define CA_OPDEOP 7 /* ChanServ commands OP and DEOP */
+#define CA_ACCESS_LIST 8
+#define CA_CLEAR 9
+#define CA_NOJOIN 10 /* Maximum */
+#define CA_ACCESS_CHANGE 11
+#define CA_MEMO 12
+#define CA_ASSIGN 13 /* BotServ ASSIGN command */
+#define CA_BADWORDS 14 /* BotServ BADWORDS command */
+#define CA_NOKICK 15 /* Not kicked by the bot */
+#define CA_FANTASIA 16
+#define CA_SAY 17
+#define CA_GREET 18
+#define CA_VOICEME 19
+#define CA_VOICE 20
+#define CA_GETKEY 21
+#define CA_AUTOHALFOP 22
+#define CA_AUTOPROTECT 23
+#define CA_OPDEOPME 24
+#define CA_HALFOPME 25
+#define CA_HALFOP 26
+#define CA_PROTECTME 27
+#define CA_PROTECT 28
+#define CA_KICKME 29
+#define CA_KICK 30
+#define CA_SIGNKICK 31
+/* #define CA_AUTOADMIN 32
+#define CA_ADMINME 33
+#define CA_ADMIN 34 */
+#define CA_BANME 32
+#define CA_BAN 33
+#define CA_TOPIC 34
+#define CA_INFO 35
+
+#define CA_SIZE 36
+
+/* BotServ SET flags */
+#define BS_DONTKICKOPS 0x00000001
+#define BS_DONTKICKVOICES 0x00000002
+#define BS_FANTASY 0x00000004
+#define BS_SYMBIOSIS 0x00000008
+#define BS_GREET 0x00000010
+#define BS_NOBOT 0x00000020
+
+/* BotServ Kickers flags */
+#define BS_KICK_BOLDS 0x80000000
+#define BS_KICK_COLORS 0x40000000
+#define BS_KICK_REVERSES 0x20000000
+#define BS_KICK_UNDERLINES 0x10000000
+#define BS_KICK_BADWORDS 0x08000000
+#define BS_KICK_CAPS 0x04000000
+#define BS_KICK_FLOOD 0x02000000
+#define BS_KICK_REPEAT 0x01000000
+
+/* Indices for TTB (Times To Ban) */
+#define TTB_BOLDS 0
+#define TTB_COLORS 1
+#define TTB_REVERSES 2
+#define TTB_UNDERLINES 3
+#define TTB_BADWORDS 4
+#define TTB_CAPS 5
+#define TTB_FLOOD 6
+#define TTB_REPEAT 7
+
+#define TTB_SIZE 8
+
+/*************************************************************************/
+
+/* ChanServ mode utilities commands */
+
+typedef struct csmodeutil_ CSModeUtil;
+
+struct csmodeutil_ {
+ char *name; /* Name of the ChanServ command */
+ char *bsname; /* Name of the BotServ fantasy command */
+
+ char *mode; /* Mode (ie. +o) */
+ int32 notice; /* Notice flag (for the damn OPNOTICE) */
+
+ int level; /* Level required to use the command */
+ int levelself; /* Level required to use the command for himself */
+};
+
+#define MUT_DEOP 0
+#define MUT_OP 1
+#define MUT_DEVOICE 2
+#define MUT_VOICE 3
+#ifdef HAS_HALFOP
+#define MUT_DEHALFOP 4
+#define MUT_HALFOP 5
+#endif
+#ifdef IRC_UNREAL
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+#endif
+#ifdef IRC_ULTIMATE3
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+#endif
+#ifdef IRC_RAGE2
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+#endif
+#ifdef IRC_VIAGRA
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+#endif
+#ifdef IRC_PTLINK
+#define MUT_DEPROTECT 4
+#define MUT_PROTECT 5
+#endif
+/*************************************************************************/
+
+/* Server CAPAB flags */
+#ifdef IRC_BAHAMUT
+# define CAPAB_NOQUIT 0x0001
+# define CAPAB_TSMODE 0x0002
+# define CAPAB_UNCONNECT 0x0004
+#endif
+
+/* Server data */
+
+struct server_ {
+ Server *next, *prev;
+
+ char *name; /* Server name */
+ uint16 hops; /* Hops between services and server */
+ char *desc; /* Server description */
+ uint16 flags; /* Some info flags, as defined below */
+
+ Server *links; /* Linked list head for linked servers */
+ Server *uplink; /* Server which pretends to be the uplink */
+};
+
+#define SERVER_ISME 0x0001
+#define SERVER_JUPED 0x0002
+
+/*************************************************************************/
+
+/* Online user and channel data. */
+struct user_ {
+ User *next, *prev;
+
+ char nick[NICKMAX];
+
+ char *username;
+ char *host; /* User's real hostname */
+#ifdef HAS_VHOST
+ char *vhost; /* User's virtual hostname */
+#endif
+#ifdef HAS_VIDENT
+ char *vident; /* User's virtual ident */
+#endif
+ char *realname;
+ Server *server; /* Server user is connected to */
+
+ char *nickTrack; /* Nick Tracking */
+
+ time_t timestamp; /* Timestamp of the nick */
+ time_t my_signon; /* When did _we_ see the user? */
+ uint32 svid; /* Services ID */
+ uint32 mode; /* See below */
+
+ NickAlias *na;
+
+ ModuleData *moduleData[1024]; /* defined for it, it should allow the module Add/Get */
+
+ int isSuperAdmin; /* is SuperAdmin on or off? */
+
+ struct u_chanlist {
+ struct u_chanlist *next, *prev;
+ Channel *chan;
+ int16 status; /* Associated flags; see CSTATUS_* below. */
+ } *chans; /* Channels user has joined */
+
+ struct u_chaninfolist {
+ struct u_chaninfolist *next, *prev;
+ ChannelInfo *chan;
+ } *founder_chans; /* Channels user has identified for */
+
+ short invalid_pw_count; /* # of invalid password attempts */
+ time_t invalid_pw_time; /* Time of last invalid password */
+
+ time_t lastmemosend; /* Last time MS SEND command used */
+ time_t lastnickreg; /* Last time NS REGISTER cmd used */
+ time_t lastmail; /* Last time this user sent a mail */
+};
+
+#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
+
+#ifdef IRC_ULTIMATE
+#define UMODE_p 0x04000000
+#define UMODE_R 0x08000000
+#define UMODE_P 0x20000000
+#endif
+
+#ifdef IRC_ULTIMATE3
+#define UMODE_p 0x04000000
+#define UMODE_Z 0x08000000
+#define UMODE_P 0x20000000
+#endif
+
+#ifdef IRC_DREAMFORGE
+# define UMODE_g 0x80000000
+#endif
+
+#ifdef IRC_BAHAMUT
+# define UMODE_R 0x80000000
+#endif
+
+#ifdef IRC_VIAGRA
+#define UMODE_p 0x04000000
+#endif
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA) || defined(IRC_RAGE2)
+# define UMODE_x 0x40000000
+#endif
+
+/* Returns *current* user hostname */
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA) || defined(IRC_RAGE2)
+# define GetHost(x) ((x)->mode & UMODE_x ? (x)->vhost : (x)->host)
+#elif defined(IRC_PTLINK)
+# define GetHost(x) ((x)->mode & UMODE_o ? (x)->vhost ? (x)->vhost : (x)->host : (x)->host)
+#else
+# define GetHost(x) ((x)->host)
+#endif
+
+/* Returns *current* user ident */
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+# define GetIdent(x) ((x)->mode & UMODE_x ? (x)->vident ? (x)->vident : (x)->username : (x)->username)
+#else
+# define GetIdent(x) ((x)->username)
+#endif
+
+/* This will introduce a pseudo client with the given nick, username, hostname,
+ realname and modes. It will also make a Q line for the nick on demand.
+ --lara */
+#if defined(IRC_HYBRID)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", (nick), time(NULL), (modes), \
+ (user), (host), ServerName, (real)); \
+ } while (0)
+#elif defined(IRC_ULTIMATE3)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "CLIENT %s 1 %ld %s + %s %s * %s 0 0 :%s", (nick), time(NULL), (modes), \
+ (user), (host), ServerName, (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_RAGE2)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "SNICK %s %ld 1 %s %s 0 * %s 0 %s :%s", (nick), time(NULL), (user), \
+ (host), ServerName, (modes), (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_BAHAMUT) && !defined(IRC_ULTIMATE3) && !defined(IRC_RAGE2)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", (nick), time(NULL), (modes), \
+ (user), (host), ServerName, (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_UNREAL)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 %s * :%s", (nick), time(NULL), \
+ (user), (host), ServerName, (modes), (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_DREAMFORGE)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", (nick), time(NULL), \
+ (user), (host), ServerName, (real)); \
+ if (strcmp(modes, "+")) send_cmd((nick), "MODE %s %s", (nick), (modes)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_PTLINK)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %lu %s %s %s %s %s :%s", (nick), time(NULL), \
+ (modes), (user), (host), (host), ServerName, (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#endif
+
+typedef struct cbmode_ CBMode;
+typedef struct cbmodeinfo_ CBModeInfo;
+typedef struct cmmode_