/* 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-intermud.org * License terms are available in the imc2freedom.license file. */ #ifndef __IMC2_H__ #define __IMC2_H__ #include <sstream> #include <string> #include <bitset> #include <list> using namespace std; /* 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 C++ CL-2.1a " #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 #ifndef LGST #define LGST 8192 #endif #ifndef SMST #define SMST 1024 #endif /* Connection states stuff */ enum imc_constates { IMC_OFFLINE, IMC_AUTH1, IMC_AUTH2, IMC_ONLINE }; enum imc_permissions { IMCPERM_NOTSET, IMCPERM_NONE, IMCPERM_MORT, IMCPERM_IMM, IMCPERM_ADMIN, IMCPERM_IMP }; /* Player flags */ enum imc_flags { IMC_TELL, IMC_DENYTELL, IMC_BEEP, IMC_DENYBEEP, IMC_INVIS, IMC_PRIVACY, IMC_DENYFINGER, IMC_AFK, IMC_COLORFLAG, IMC_PERMOVERRIDE, IMC_NOTIFY, IMC_MAXFLAG }; /* Flag macros */ #define IMCIS_SET(var, bit) (var).test((bit)) #define IMCSET_BIT(var, bit) (var).set((bit)) #define IMCREMOVE_BIT(var, bit) (var).reset((bit)) /* Channel flags, only one so far, but you never know when more might be useful */ enum imc_channel_flags { IMCCHAN_LOG, IMC_MAXCHANFLAG }; #define IMCPERM(ch) (CH_IMCDATA((ch))->imcperm) #define IMCFLAG(ch) (CH_IMCDATA((ch))->imcflag) #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 ) ) /* * Memory allocation macros. */ #define CREATE(result, type, number) \ do \ { \ if (!((result) = (type *) calloc ((number), sizeof(type)))) \ { \ imclog( "Malloc failure @ %s:%d\n", __FILE__, __LINE__ ); \ abort(); \ } \ } while(0) #define RECREATE(result, type, number) \ do \ { \ if(!((result) = (type *)realloc((result), sizeof(type) * (number)))) \ { \ imclog( "Realloc failure @ %s:%d\n", __FILE__, __LINE__ ); \ abort(); \ } \ } while(0) #define DISPOSE(point) \ do \ { \ if((point)) \ { \ free((point)); \ (point) = NULL; \ } \ } while(0) #define STRALLOC strdup #define STRFREE DISPOSE class imc_packet; typedef void IMC_FUN( char_data * ch, string argument ); #define IMC_CMD( name ) extern "C" void (name)( char_data *ch, string argument ) typedef void PACKET_FUN( imc_packet * q, string packet ); #define PFUN( name ) extern "C" void (name)( imc_packet *q, string packet ) /* 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_command_table { list < string > aliaslist; IMC_FUN *function; string funcname; string name; int level; bool connected; }; struct imc_help_table { string hname; string text; int level; }; struct imc_ucache_data { string name; time_t time; int gender; }; struct imc_chardata { list < string > imc_ignore; bitset < IMC_MAXFLAG > imcflag; /* Flags set on the player */ string email; /* Person's email address - for imcfinger - Samson 3-21-04 */ string homepage; /* Person's homepage - Samson 3-21-04 */ string aim; /* Person's AOL Instant Messenger screenname - Samson 3-21-04 */ string yahoo; /* Person's Y! screenname - Samson 3-21-04 */ string msn; /* Person's MSN Messenger screenname - Samson 3-21-04 */ string comment; /* Person's personal comment - Samson 3-21-04 */ string imc_listen; /* Channels the player is listening to */ string imc_denied; /* Channels the player has been denied use of */ string rreply; /* IMC reply-to */ string rreply_name; /* IMC reply-to shown to char */ string imc_tellhistory[MAX_IMCTELLHISTORY]; /* History of received imctells - Samson 1-21-04 */ int icq; /* Person's ICQ UIN Number - Samson 3-21-04 */ int imcperm; /* Permission level for the player */ }; struct imc_channel { string chname; /* name of channel */ string owner; /* owner (singular) of channel */ string operators; /* current operators of channel */ string invited; string excluded; string local_name; /* Operational localname */ string regformat; string emoteformat; string socformat; string history[MAX_IMCHISTORY]; bitset < IMC_MAXCHANFLAG > flags; short level; bool open; bool refreshed; }; class imc_packet { public: imc_packet( ); imc_packet( string from, string type, string to ); void send( ); ostringstream data; string from; string to; string type; string route; /* This is only used internally and not sent */ }; /* The mud's connection data for the server */ struct imc_siteinfo { string servername; /* name of server */ string rhost; /* DNS/IP of server */ string network; /* Network name of the server, set at keepalive - Samson */ string serverpw; /* server password */ string clientpw; /* client password */ string localname; /* One word localname */ string fullname; /* FULL name of mud */ string ihost; /* host address of mud */ string email; /* contact address (email) */ string www; /* homepage */ string base; /* Codebase of the mud */ string details; /* BRIEF description of mud */ string versionid; /* Transient version id for the imclist */ 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 SHA-256 authentication */ bool sha256pass; /* Client is using SHA-256 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 */ unsigned long outsize; int outtop; int desc; /* descriptor */ unsigned short state; /* connection state */ }; struct imc_remoteinfo { string rname; string version; string network; string path; string url; string host; string port; bool expired; }; struct who_template { string head; string plrheader; string immheader; string plrline; string immline; string tail; string master; }; extern imc_siteinfo *this_imcmud; 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( string name ); /* Externalized for comm.c spamguard checks */ void imc_register_packet_handler( string name, PACKET_FUN * func ); size_t imcstrlcat( char *dst, const char *src, size_t siz ); size_t imcstrlcpy( char *dst, const char *src, size_t siz ); template < size_t NUM > char *bitset_string( bitset < NUM > *bits, char *const flagarray[] ) { static char buf[LGST]; size_t x; buf[0] = '\0'; for( x = 0; x < bits->size( ); x++ ) { if( bits->test( x ) ) { imcstrlcat( buf, flagarray[x], LGST ); /* * don't catenate a blank if the last char is blank --Gorog */ if( buf[0] != '\0' && ' ' != buf[strlen( buf ) - 1] ) imcstrlcat( buf, " ", LGST ); } } if( ( x = strlen( buf ) ) > 0 ) buf[--x] = '\0'; return buf; } #endif