/* * Copyright (c) 2000 Fatal Dimensions * * See the file "LICENSE" or information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ /* Ported to Smaug 1.4a by Samson of Alsherok. * Consolidated for cross-codebase compatibility by Samson of Alsherok. * Modifications and enhancements to the code * Copyright (c)2001-2003 Roger Libiez ( Samson ) * Registered with the United States Copyright Office * TX 5-562-404 */ #ifndef __I3_H__ #define __I3_H__ /* Number of messages to store in the channel history */ #define MAX_I3HISTORY 20 #define MAX_I3TELLHISTORY 20 /* Locations of the configuration files */ /* Remcon: Ask and ye shall receive. */ #define I3_DIR "../i3/" #define I3_CONFIG_FILE I3_DIR "i3.config" #define I3_CHANNEL_FILE I3_DIR "i3.channels" #define I3_PASSWORD_FILE I3_DIR "i3.password" #define I3_UCACHE_FILE I3_DIR "i3.ucache" #define I3_MUDLIST_FILE I3_DIR "i3.mudlist" #define I3_CHANLIST_FILE I3_DIR "i3.chanlist" #define I3_BAN_FILE I3_DIR "i3.bans" #define I3_COLOR_FILE I3_DIR "i3.color" #define I3_HELP_FILE I3_DIR "i3.help" #define I3_CMD_FILE I3_DIR "i3.commands" #define I3_ROUTER_FILE I3_DIR "i3.routers" /* Make sure you've examined the i3cfg.h file and set your information accordingly! * If you don't, things below this point will fail - Samson 7-15-03 */ #include "i3cfg.h" typedef enum { I3PERM_NOTSET, I3PERM_NONE, I3PERM_MORT, I3PERM_IMM, I3PERM_ADMIN, I3PERM_IMP } permissions; /* Flag macros */ #define I3IS_SET(flag, bit) ((flag) & (bit)) #define I3SET_BIT(var, bit) ((var) |= (bit)) #define I3REMOVE_BIT(var, bit)((var) &= ~(bit)) /* Channel flags, only one so far, but you never know when more might be useful */ #define I3CHAN_LOG (1 << 0) /* Player flags */ #define I3_TELL (1 << 0) #define I3_DENYTELL (1 << 1) #define I3_BEEP (1 << 2) #define I3_DENYBEEP (1 << 3) #define I3_INVIS (1 << 4) #define I3_PRIVACY (1 << 5) #define I3_DENYFINGER (1 << 6) #define I3_AFK (1 << 7) #define I3_COLORFLAG (1 << 8) #define I3_PERMOVERRIDE (1 << 9) /* You should not need to edit anything below this line if I've done this all correctly. */ /* The current revision of the I3 code */ #define I3DRIVER "AFKMud I3 Driver 2.40b" /* IPS: Inbound packet size. * OPS: Outbound packet size. * You would be well advised not to mess with these things or Bad Things(tm) will happen to you. */ #define IPS 131072 #define OPS 65536 #define I3PERM(ch) (CH_I3DATA((ch))->i3perm) #define I3FLAG(ch) (CH_I3DATA((ch))->i3flags) #define FIRST_I3IGNORE(ch) (CH_I3DATA((ch))->i3first_ignore) #define LAST_I3IGNORE(ch) (CH_I3DATA((ch))->i3last_ignore) #define I3LISTEN(ch) (CH_I3DATA((ch))->i3_listen) #define I3DENY(ch) (CH_I3DATA((ch))->i3_denied) #define I3REPLY(ch) (CH_I3DATA((ch))->i3_replyname) #define I3TELLHISTORY(ch,x) (CH_I3DATA((ch))->i3_tellhistory[(x)]) #define I3INVIS(ch) ( I3IS_SET( I3FLAG((ch)), I3_INVIS ) ) #define CH_I3AFK(ch) ( I3IS_SET( I3FLAG((ch)), I3_AFK ) ) #define I3ISINVIS(ch) ( I3INVIS((ch)) ) #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 I3FCLOSE(fp) fclose((fp)); (fp)=NULL; /* * Memory allocation macros. */ #define I3CREATE(result, type, number) \ do \ { \ if (!((result) = (type *) calloc ((number), sizeof(type)))) \ { \ i3log( "Malloc failure @ %s:%d\n", __FILE__, __LINE__ ); \ abort(); \ } \ } while(0) #define I3DISPOSE(point) \ do \ { \ if((point)) \ { \ free((point)); \ (point) = NULL; \ } \ } while(0) #define I3STRALLOC strdup #define I3STRFREE I3DISPOSE /* double-linked list handling macros -Thoric ( From the Smaug codebase ) */ /* Updated by Scion 8/6/1999 */ #define I3LINK(link, first, last, next, prev) \ do \ { \ if ( !(first) ) \ { \ (first) = (link); \ (last) = (link); \ } \ else \ (last)->next = (link); \ (link)->next = NULL; \ if ((first) == (link)) \ (link)->prev = NULL; \ else \ (link)->prev = (last); \ (last) = (link); \ } while(0) #define I3INSERT(link, insert, first, next, prev) \ do \ { \ (link)->prev = (insert)->prev; \ if ( !(insert)->prev ) \ (first) = (link); \ else \ (insert)->prev->next = (link); \ (insert)->prev = (link); \ (link)->next = (insert); \ } while(0) #define I3UNLINK(link, first, last, next, prev) \ do \ { \ if ( !(link)->prev ) \ { \ (first) = (link)->next; \ if((first)) \ (first)->prev = NULL; \ } \ else \ { \ (link)->prev->next = (link)->next; \ } \ if( !(link)->next ) \ { \ (last) = (link)->prev; \ if((last)) \ (last)->next = NULL; \ } \ else \ { \ (link)->next->prev = (link)->prev; \ } \ } while(0) /* Internal structures */ typedef struct I3_channel I3_CHANNEL; typedef struct I3_mud I3_MUD; typedef struct I3_header I3_HEADER; typedef struct I3_ignore I3_IGNORE; typedef struct I3_ban I3_BAN; typedef struct ucache_data UCACHE_DATA; typedef struct i3_chardata I3_CHARDATA; typedef struct router_data ROUTER_DATA; typedef struct i3_color_table I3_COLOR; /* The Color config */ typedef struct i3_command_table I3_CMD_DATA; /* Command table */ typedef struct i3_help_table I3_HELP_DATA; /* Help table */ typedef struct i3_cmd_alias I3_ALIAS; /* Big, bad, bloated command alias thing */ typedef void I3_FUN( CHAR_DATA * ch, char *argument ); #define I3_CMD( name ) void (name)( CHAR_DATA *ch, char *argument ) extern int I3_socket; extern I3_MUD *first_mud; extern I3_MUD *this_i3mud; /* 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 i3_cmd_alias { I3_ALIAS *next; I3_ALIAS *prev; char *name; }; struct i3_command_table { I3_CMD_DATA *next; I3_CMD_DATA *prev; I3_ALIAS *first_alias; I3_ALIAS *last_alias; I3_FUN *function; char *name; int level; bool connected; }; struct i3_help_table { I3_HELP_DATA *next; I3_HELP_DATA *prev; char *name; char *text; int level; }; struct i3_color_table { I3_COLOR *next; I3_COLOR *prev; char *name; /* the name of the color */ char *mudtag; /* What the mud uses for the raw tag */ char *i3tag; /* This client's internal code that represents the mudtag to the network */ char *i3fish; /* The Pinkfish code for this color - bleh at having to do this twice! */ }; struct router_data { ROUTER_DATA *next; ROUTER_DATA *prev; char *name; char *ip; int port; int reconattempts; }; struct ucache_data { UCACHE_DATA *next; UCACHE_DATA *prev; char *name; int gender; time_t time; }; struct I3_ignore { I3_IGNORE *next; I3_IGNORE *prev; char *name; }; struct I3_ban { I3_BAN *next; I3_BAN *prev; char *name; }; struct i3_chardata { I3_IGNORE *i3first_ignore; /* List of people to ignore stuff from - Samson 2-7-01 */ I3_IGNORE *i3last_ignore; char *i3_replyname; /* Target for reply - Samson 1-23-01 */ char *i3_listen; /* The I3 channels someone is listening to - Samson 1-30-01 */ char *i3_denied; /* The I3 channels someone is forbidden to use - Samson 6-16-03 */ char *i3_tellhistory[MAX_I3TELLHISTORY]; /* History of received i3tells - Samson 1-21-04 */ int i3flags; /* Flag settings such as invis, tell on/off, beep on/off, etc. - Samson 6-30-03 */ int i3perm; /* Your permission setting. None, All, Imm, Admin, Imp - Samson 6-25-03 */ }; struct I3_header { char originator_mudname[256]; char originator_username[256]; char target_mudname[256]; char target_username[256]; }; struct I3_channel { I3_CHANNEL *next; I3_CHANNEL *prev; char *local_name; char *host_mud; char *I3_name; char *layout_m; char *layout_e; char *history[MAX_I3HISTORY]; int status; int i3perm; long flags; }; struct I3_mud { I3_MUD *next; I3_MUD *prev; /* * Stuff for the first mapping set */ int status; char *name; char *ipaddress; char *mudlib; char *base_mudlib; char *driver; char *mud_type; char *open_status; char *admin_email; char *telnet; char *web_wrong; /* This tag shows up in the wrong location on several implementations, including previous AFKMud versions */ int player_port; int imud_tcp_port; int imud_udp_port; bool tell; bool beep; bool emoteto; bool who; bool finger; bool locate; bool channel; bool news; bool mail; bool file; bool auth; bool ucache; int smtp; int ftp; int nntp; int http; int pop3; int rcp; int amrcp; /* * Stuff for the second mapping set - can be added to as indicated by i3log messages for missing keys */ char *banner; char *web; char *time; char *daemon; int jeamland; /* * only used for this mud */ char *routerName; bool autoconnect; int password; int mudlist_id; int chanlist_id; int minlevel; int immlevel; int adminlevel; int implevel; }; /* External hooks */ void I3_main( bool forced, int mudport, bool isconnected ); bool I3_is_connected( void ); void I3_loop( void ); void I3_shutdown( int delay ); bool I3_command_hook( CHAR_DATA * ch, char *command, char *argument ); void i3init_char( CHAR_DATA * ch ); void i3save_char( CHAR_DATA * ch, FILE * fp ); bool i3load_char( CHAR_DATA * ch, FILE * fp, const char *word ); void free_i3chardata( CHAR_DATA * ch ); void I3_loadmudlist( void ); void I3_loadchanlist( void ); void I3_savemudlist( void ); void I3_savechanlist( void ); void I3_savehistory( void ); #endif