LOP/
LOP/area/
LOP/boards/
LOP/channels/
LOP/clans/
LOP/classes/
LOP/color/
LOP/councils/
LOP/deity/
LOP/races/
LOP/src/specials/
/*
 * IMC2 Freedom Client - Developed by Mud Domain.
 *
 * Copyright (C)2004 by Roger Libiez ( Samson )
 * Contributions by Johnathan Walker ( Xorith ), Copyright (C)2004
 * Additional contributions by Jesse Defer ( Garil ), Copyright (C)2004
 * Additional contributions by Rogel, Copyright (c) 2004
 * Comments and suggestions welcome: imc@imc2.org
 * License terms are available in the imc2freedom.license file.
 */

#ifndef __IMC2_H__
#define __IMC2_H__

/* The all important version ID string, which is hardcoded for now out of laziness.
 * This name was chosen to represent the ideals of not only the code, but of the
 * network which spawned it.
 */
#define IMC_VERSION_STRING "IMC2 Freedom CL-2.1 "
#define IMC_VERSION 2

/* Number of entries to keep in the channel histories */
#define MAX_IMCHISTORY 20
#define MAX_IMCTELLHISTORY 20

/* Remcon: Ask and ye shall receive. */
#define IMC_DIR          "imc/"

#define IMC_CHANNEL_FILE IMC_DIR "imc.channels"
#define IMC_CONFIG_FILE  IMC_DIR "imc.config"
#define IMC_BAN_FILE     IMC_DIR "imc.ignores"
#define IMC_UCACHE_FILE  IMC_DIR "imc.ucache"
#define IMC_COLOR_FILE   IMC_DIR "imc.color"
#define IMC_HELP_FILE    IMC_DIR "imc.help"
#define IMC_CMD_FILE     IMC_DIR "imc.commands"
#define IMC_HOTBOOT_FILE IMC_DIR "imc.hotboot"
#define IMC_WHO_FILE     IMC_DIR "imc.who"

/* Make sure you set the macros in the imccfg.h file properly or things get ugly from here. */
#include "imccfg.h"

#define IMC_BUFF_SIZE 16384

/* Connection states stuff */
enum imc_constates
{
   IMC_OFFLINE, IMC_AUTH1, IMC_AUTH2, IMC_ONLINE
};

typedef enum
{
   IMCPERM_NOTSET, IMCPERM_NONE, IMCPERM_MORT, IMCPERM_IMM, IMCPERM_ADMIN, IMCPERM_IMP
} imc_permissions;

/* Flag macros */
#define IMCIS_SET( var, bit )       ( (var) & (bit) )
#define IMCTOGGLE_BIT( var, bit )   ( (var) = !(bit) )
#define IMCSET_BIT( var, bit )      ( (var) |= (bit) )
#define IMCREMOVE_BIT( var, bit )   ( (var) &= ~(bit) )

/* Channel flags, only one so far, but you never know when more might be useful */
#define IMCCHAN_LOG      ( 1 <<  0 )

/* Player flags */
#define IMC_TELL         ( 1 <<  0 )
#define IMC_DENYTELL     ( 1 <<  1 )
#define IMC_BEEP         ( 1 <<  2 )
#define IMC_DENYBEEP     ( 1 <<  3 )
#define IMC_INVIS        ( 1 <<  4 )
#define IMC_PRIVACY      ( 1 <<  5 )
#define IMC_DENYFINGER   ( 1 <<  6 )
#define IMC_AFK          ( 1 <<  7 )
#define IMC_COLORFLAG    ( 1 <<  8 )
#define IMC_PERMOVERRIDE ( 1 <<  9 )
#define IMC_NOTIFY       ( 1 << 10 )

#define IMCPERM( ch )            ( CH_IMCDATA( (ch) )->imcperm )
#define IMCFLAG( ch )            ( CH_IMCDATA( (ch) )->imcflag )
#define FIRST_IMCIGNORE( ch )    ( CH_IMCDATA( (ch) )->imcfirst_ignore )
#define LAST_IMCIGNORE( ch )     ( CH_IMCDATA( (ch) )->imclast_ignore )
#define IMC_LISTEN( ch )         ( CH_IMCDATA( (ch) )->imc_listen )
#define IMC_DENY( ch )           ( CH_IMCDATA( (ch) )->imc_denied )
#define IMC_RREPLY( ch )         ( CH_IMCDATA( (ch) )->rreply )
#define IMC_RREPLY_NAME( ch )    ( CH_IMCDATA( (ch) )->rreply_name )
#define IMC_EMAIL( ch )          ( CH_IMCDATA( (ch) )->email )
#define IMC_HOMEPAGE( ch )       ( CH_IMCDATA( (ch) )->homepage )
#define IMC_AIM( ch )            ( CH_IMCDATA( (ch) )->aim )
#define IMC_ICQ( ch )            ( CH_IMCDATA( (ch) )->icq )
#define IMC_YAHOO( ch )          ( CH_IMCDATA( (ch) )->yahoo )
#define IMC_MSN( ch )            ( CH_IMCDATA( (ch) )->msn )
#define IMC_COMMENT( ch )        ( CH_IMCDATA( (ch) )->comment )
#define IMCTELLHISTORY( ch, x )  ( CH_IMCDATA( (ch) )->imc_tellhistory[(x)] )
#define IMCISINVIS( ch )         ( IMCIS_SET( IMCFLAG( (ch) ), IMC_INVIS ) )
#define IMCAFK( ch )             ( IMCIS_SET( IMCFLAG( (ch) ), IMC_AFK ) )

/* Should not need to edit anything below this point */

#define LGST 4096 /* Large String */
#define SMST 1024 /* Small String */

/* Macro taken from DOTD codebase. Fcloses a file, then nulls its pointer for safety. */
#define IMCFCLOSE( fp )  fclose( (fp) ); (fp) = NULL;

/*
 * No real functional difference in alot of this, but double linked lists DO seem to handle better,
 * and they look alot neater too. Yes, readability IS important! - Samson
 */
typedef struct imc_channel IMC_CHANNEL;         /* Channels, both local and non-local */
typedef struct imc_packet IMC_PACKET;           /* It's a packet! */
typedef struct imc_packet_data IMC_PDATA;       /* Extra data fields for packets */
typedef struct imc_siteinfo SITEINFO;           /* The given mud :) */
typedef struct imc_remoteinfo REMOTEINFO;       /* Information on a mud connected to IMC */
typedef struct imc_ban_data IMC_BAN;            /* Mud level bans */
typedef struct imcchar_data IMC_CHARDATA;       /* Player flags */
typedef struct imc_ignore IMC_IGNORE;           /* Player level ignores */
typedef struct imcucache_data IMCUCACHE_DATA;   /* User cache data for gender targetting socials */
typedef struct imc_color_table IMC_COLOR;       /* The Color config */
typedef struct imc_command_table IMC_CMD_DATA;  /* Command table */
typedef struct imc_help_table IMC_HELP_DATA;    /* Help table */
typedef struct imc_cmd_alias IMC_ALIAS;         /* Big, bad, bloated command alias thing */
typedef struct imc_packet_handler IMC_PHANDLER; /* custom packet handlers added dynamically */
typedef struct who_template WHO_TEMPLATE;       /* The who templates */

typedef void IMC_FUN( CHAR_DATA *ch, char *argument );
#define IMC_CMD( name ) void (name)( CHAR_DATA *ch, char *argument )

typedef void PACKET_FUN( IMC_PACKET *q, char *packet );
#define PFUN( name ) void (name)( IMC_PACKET *q, char *packet )

extern REMOTEINFO *first_rinfo;
extern REMOTEINFO *last_rinfo;
extern SITEINFO *this_imcmud;

/*
 * Oh yeah, baby, that raunchy looking Merc structure just got the facelift of the century.
 * Thanks to Thoric and friends for the slick idea.
 */
struct imc_cmd_alias
{
   IMC_ALIAS *next, *prev;
   char *name;
};

struct imc_command_table
{
   IMC_CMD_DATA *next, *prev;
   IMC_ALIAS *first_alias, *last_alias;
   IMC_FUN *function;
   char *name;
   int level;
   bool connected;
};

struct imc_help_table
{
   IMC_HELP_DATA *next, *prev;
   char *name;
   char *text;
   int level;
};

struct imc_color_table
{
   IMC_COLOR *next, *prev;
   char *name;    /* the name of the color */
   char *mudtag;  /* What the mud uses for the raw tag */
   char *imctag;  /* The imc tilde code that represents the mudtag to the network */
};

struct imc_ignore
{
   IMC_IGNORE *next, *prev;
   char *name;
};

struct imcucache_data
{
   IMCUCACHE_DATA *next, *prev;
   char *name;
   time_t time;
   int gender;
};

struct imcchar_data
{
   IMC_IGNORE *imcfirst_ignore, *imclast_ignore;
   char *rreply;       /* IMC reply-to */
   char *rreply_name;  /* IMC reply-to shown to char */
   char *imc_listen;   /* Channels the player is listening to */
   char *imc_denied;   /* Channels the player has been denied use of */
   char *imc_tellhistory[MAX_IMCTELLHISTORY];   /* History of received imctells - Samson 1-21-04 */
   char *email;        /* Person's email address - for imcfinger - Samson 3-21-04 */
   char *homepage;     /* Person's homepage - Samson 3-21-04 */
   char *aim;          /* Person's AOL Instant Messenger screenname - Samson 3-21-04 */
   char *yahoo;        /* Person's Y! screenname - Samson 3-21-04 */
   char *msn;          /* Person's MSN Messenger screenname - Samson 3-21-04 */
   char *comment;      /* Person's personal comment - Samson 3-21-04 */
   long imcflag;       /* Flags set on the player */
   int icq;            /* Person's ICQ UIN Number - Samson 3-21-04 */
   int imcperm;        /* Permission level for the player */
};

struct imc_channel
{
   IMC_CHANNEL *next, *prev;
   char *name; /* name of channel */
   char *owner;   /* owner (singular) of channel */
   char *operators;  /* current operators of channel */
   char *invited;
   char *excluded;
   char *local_name; /* Operational localname */
   char *regformat;
   char *emoteformat;
   char *socformat;
   char *history[MAX_IMCHISTORY];
   long flags;
   short level;
   bool open;
   bool refreshed;
};

struct imc_packet_data
{
   IMC_PDATA *next, *prev;
   char field[IMC_BUFF_SIZE];
};

struct imc_packet
{
   IMC_PDATA *first_data, *last_data;
   char from[SMST];
   char to[SMST];
   char type[SMST];
   char route[SMST]; /* This is only used internally and not sent */
};

/* The mud's connection data for the server */
struct imc_siteinfo
{
   char *servername;       /* name of server */
   char *rhost;            /* DNS/IP of server */
   char *network;          /* Network name of the server, set at keepalive - Samson */
   char *serverpw;         /* server password */
   char *clientpw;         /* client password */
   char *localname;        /* One word localname */
   char *fullname;         /* FULL name of mud */
   char *ihost;            /* host AND port of mud */
   char *email;            /* contact address (email) */
   char *www;              /* homepage */
   char *base;             /* The mud's codebase name */
   char *details;          /* BRIEF description of mud */
   int iport;              /* The port the mud itself is on */
   int minlevel;           /* Minimum player level */
   int immlevel;           /* Immortal level */
   int adminlevel;         /* Admin level */
   int implevel;           /* Implementor level */
   unsigned short rport;   /* remote port of server */
   bool sha256;            /* Client will support MD5 authentication */
   bool sha256pass;        /* Client is using MD5 authentication */
   bool autoconnect;       /* Do we autoconnect on bootup or not? - Samson */

   /* Conection parameters - These don't save in the config file */
   char inbuf[IMC_BUFF_SIZE];   /* input buffer */
   char incomm[IMC_BUFF_SIZE];
   char *outbuf;                /* output buffer */
   char *versionid;             /* Transient version id for the imclist */
   unsigned long outsize;
   int outtop;
   int desc;                    /* descriptor */
   unsigned short state;        /* connection state */
};

struct imc_remoteinfo
{
   REMOTEINFO *next, *prev;
   char *name;
   char *version;
   char *network;
   char *path;
   char *url;
   char *host;
   char *port;
   bool expired;
};

/* A mudwide ban */
struct imc_ban_data
{
   IMC_BAN *next, *prev;
   char *name;
};

struct imc_packet_handler
{
   IMC_PHANDLER *next, *prev;
   PACKET_FUN *func;
   char *name;
};

struct who_template
{
   char *head;
   char *plrheader;
   char *immheader;
   char *plrline;
   char *immline;
   char *tail;
   char *master;
};

bool imc_command_hook( CHAR_DATA *ch, char *command, char *argument );
void imc_hotboot( void );
void imc_startup( bool force, int desc, bool connected );
void imc_shutdown( bool reconnect );
void imc_initchar( CHAR_DATA *ch );
bool imc_loadchar( CHAR_DATA *ch, FILE *fp, const char *word );
void imc_savechar( CHAR_DATA *ch, FILE *fp );
void imc_freechardata( CHAR_DATA * ch );
void imc_loop( void );
IMC_CHANNEL *imc_findchannel( char *name );  /* Externalized for comm.c spamguard checks */
void imc_register_packet_handler( char *name, PACKET_FUN *func );

#endif