dotd-2.3.7/area/
dotd-2.3.7/clans/
dotd-2.3.7/classes/
dotd-2.3.7/councils/
dotd-2.3.7/deity/
dotd-2.3.7/dict/
dotd-2.3.7/doc/mudprogs/
dotd-2.3.7/player/a/
dotd-2.3.7/player/g/
/******************************************************
            Desolation of the Dragon MUD II
      (C) 1997-2002  Jesse DeFer
          http://www.dotd.com  dotd@dotd.com
 ******************************************************/

#include <netdb.h>

typedef struct irc_user_list IRC_USERLIST;
typedef struct irc_user IRC_USER;
typedef struct irc_channel IRC_CHANNEL;

#define IRC_MAX_NICK_LENGTH	9
#define IRC_MAX_CHANNEL_LENGTH  200
#define IRC_MAX_MESSAGE_LENGTH  512
#define IRC_MAX_OUTPUT_LENGTH   4096

#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 64
#endif

/* IRC Channel Modes */
#define IRC_CMODE_OPER			BV00
#define IRC_CMODE_PRIVATE		BV01
#define IRC_CMODE_SECRET		BV02
#define IRC_CMODE_INVITE		BV03
#define IRC_CMODE_TOPIC_OPER		BV04
#define IRC_CMODE_NO_OUTSIDE_MSG	BV05
#define IRC_CMODE_MODERATED		BV06
#define IRC_CMODE_USERLIMIT             BV07
#define IRC_CMODE_BAN                   BV08
#define IRC_CMODE_MODERATOR             BV09
#define IRC_CMODE_KEY                   BV10

/* IRC User Modes */
#define IRC_UMODE_SERVER                BV00
#define IRC_UMODE_INVISIBLE		BV01
#define IRC_UMODE_SERVER_NOTICES	BV02
#define IRC_UMODE_WALLOPS		BV03
#define IRC_UMODE_OPER			BV04

#define IRC_SERVER(u)		(IS_SET((u)->mode, IRC_UMODE_SERVER))
#define IRC_NICK(u)		((u)->nick[0]?(u)->nick:"*")
#define IRC_MUD_USER(u)		((u)->ch)
#define IRC_LOCAL_USER(u)	((u)->descriptor)

#define IRC_USER_MODE(u,flag)   (IS_SET((u)->mode, (flag)))
#define IRC_CHAN_MODE(c,flag)	(IS_SET((c)->mode, (flag)))

typedef enum
{
    IRC_STATE_REG1, IRC_STATE_REG2, IRC_STATE_CONN
} irc_states;

typedef enum
{
    IRC_CMD_UNKNOWN, IRC_CMD_PASS, IRC_CMD_NICK, IRC_CMD_USER,
    IRC_CMD_SERVER, IRC_CMD_OPER, IRC_CMD_QUIT, IRC_CMD_SQUIT,
    IRC_CMD_JOIN, IRC_CMD_PART, IRC_CMD_MODE, IRC_CMD_TOPIC,
    IRC_CMD_NAMES, IRC_CMD_LIST, IRC_CMD_INVITE, IRC_CMD_KICK,
    IRC_CMD_VERSION, IRC_CMD_STATS, IRC_CMD_LINKS, IRC_CMD_TIME,
    IRC_CMD_CONNECT, IRC_CMD_TRACE, IRC_CMD_ADMIN, IRC_CMD_INFO,
    IRC_CMD_PRIVMSG, IRC_CMD_NOTICE, IRC_CMD_WHO, IRC_CMD_WHOIS,
    IRC_CMD_WHOWAS, IRC_CMD_KILL, IRC_CMD_PING, IRC_CMD_PONG,
    IRC_CMD_ERROR,

    IRC_CMD_MAX_COMMANDS
} irc_commands;

struct irc_user_list
{
    IRC_USERLIST *next;
    IRC_USERLIST *prev;
    IRC_USER *user;
};

struct irc_user
{
    CHAR_DATA *ch;
    int descriptor;
    irc_states state;
    unsigned int idle;
    char nick[IRC_MAX_NICK_LENGTH+1];
    char *username;
    char *hostname;
    char *servname;
    char *realname;
    char *inbuf;
    unsigned short int inlen;
    char *outbuf;
    unsigned short int outlen;
    char last_command[IRC_MAX_MESSAGE_LENGTH+1];
    unsigned int mode;
};

struct irc_channel
{
    IRC_CHANNEL *next;
    IRC_CHANNEL *prev;
    char name[IRC_MAX_CHANNEL_LENGTH+1];
    char topic[IRC_MAX_CHANNEL_LENGTH+1];
    unsigned int mode;
    unsigned int numusers;
    unsigned int userlimit;
    IRC_USERLIST *first_user;
    IRC_USERLIST *last_user;
    IRC_USERLIST *first_oper;
    IRC_USERLIST *last_oper;
    IRC_USERLIST *first_speaker;
    IRC_USERLIST *last_speaker;
    char *bans;
    char *invites;
    char *key;
};

extern int irc_socket;

void irc_startup(bool copyover);
void irc_shutdown(void);
void irc_loop(void);

void irc_logon(CHAR_DATA *ch);
void irc_logoff(CHAR_DATA *ch);

void irc_mud_to_channel(CHAR_DATA *ch, char *channel, char *message);