eventmud/doc/
eventmud/help/
/*
 * This is the main headerfile
 */

#ifndef MUD_H
#define MUD_H

#include <zlib.h>
#include <pthread.h>
#include <arpa/telnet.h>

#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h>

/************************
 * Standard definitions *
 ************************/

/* define TRUE and FALSE */
#ifndef FALSE
#define FALSE   0
#endif
#ifndef TRUE
#define TRUE    1
#endif

#define eTHIN   0
#define eBOLD   1

/* A few globals */
#define PULSES_PER_SECOND     4                   /* must divide 1000 : 4, 5 or 8 works */
#define MAX_BUFFER         1024                   /* seems like a decent amount         */
#define MAX_OUTPUT         2048                   /* well shoot me if it isn't enough   */
#define MAX_HELP_ENTRY     4096                   /* roughly 40 lines of blocktext      */
#define MUDPORT            9009                   /* just set whatever port you want    */
#define FILE_TERMINATOR    "EOF"                  /* end of file marker                 */
#define COPYOVER_FILE      "../txt/copyover.dat"  /* tempfile to store copyover data    */
#define EXE_FILE           "../src/SocketMud"     /* the name of the mud binary         */

/* Connection states */
#define STATE_NEW_NAME         0
#define STATE_NEW_PASSWORD     1
#define STATE_VERIFY_PASSWORD  2
#define STATE_ASK_PASSWORD     3
#define STATE_PLAYING          4
#define STATE_CLOSED           5

/* Thread states - please do not change the order of these states    */
#define TSTATE_LOOKUP          0  /* Socket is in host_lookup        */
#define TSTATE_DONE            1  /* The lookup is done.             */
#define TSTATE_WAIT            2  /* Closed while in thread.         */
#define TSTATE_CLOSED          3  /* Closed, ready to be recycled.   */

/* player levels */
#define LEVEL_GUEST            1  /* Dead players and actual guests  */
#define LEVEL_PLAYER           2  /* Almost everyone is this level   */
#define LEVEL_ADMIN            3  /* Any admin without shell access  */
#define LEVEL_GOD              4  /* Any admin with shell access     */

/* Communication Ranges */
#define COMM_LOCAL             0  /* same room only                  */
#define COMM_LOG              10  /* admins only                     */

/* define simple types */
typedef  unsigned char     bool;
typedef  short int         sh_int;


/******************************
 * End of standard definitons *
 ******************************/

/***********************
 * Defintion of Macros *
 ***********************/

#define UMIN(a, b)		((a) < (b) ? (a) : (b))
#define IS_ADMIN(dMob)          ((dMob->level) > LEVEL_PLAYER ? TRUE : FALSE)
#define IREAD(sKey, sPtr)             \
{                                     \
  if (compares(sKey, word))           \
  {                                   \
    int sValue = fread_number(fp);    \
    sPtr = sValue;                    \
    found = TRUE;                     \
    break;                            \
  }                                   \
}
#define SREAD(sKey, sPtr)             \
{                                     \
  if (compares(sKey, word))           \
  {                                   \
    sPtr = fread_string(fp);          \
    found = TRUE;                     \
    break;                            \
  }                                   \
}

/***********************
 * End of Macros       *
 ***********************/

/******************************
 * New structures             *
 ******************************/

/* type defintions */
typedef struct  dSocket       D_SOCKET;
typedef struct  dMobile       D_MOBILE;
typedef struct  help_data     HELP_DATA;
typedef struct  lookup_data   LOOKUP_DATA;

/* the actual structures */
struct dSocket
{
  D_SOCKET      * next;
  D_MOBILE      * player;
  char          * hostname;
  char            inbuf[MAX_BUFFER];
  char            outbuf[MAX_OUTPUT];
  char            next_command[MAX_BUFFER];
  bool            bust_prompt;
  sh_int          lookup_status;
  sh_int          state;
  sh_int          control;
  sh_int          top_output;
#ifndef NOMCCP
  unsigned char   compressing;                 /* MCCP support */
  z_stream      * out_compress;                /* MCCP support */
  unsigned char * out_compress_buf;            /* MCCP support */
#endif

  void          * context;                     /* libevent context */
};

struct dMobile
{
  D_MOBILE      * next;
  D_SOCKET      * socket;
  char          * name;
  char          * password;
  sh_int          level;
};

struct help_data
{
  HELP_DATA     * next;
  time_t          load_time;
  char          * keyword;
  char          * text;
};

struct lookup_data
{
  D_SOCKET       * dsock;   /* the socket we wish to do a hostlookup on */
  char           * buf;     /* the buffer it should be stored in        */
};

struct typCmd
{
  char      * cmd_name;
  void     (* cmd_funct)(D_MOBILE *dMOb, char *arg);
  sh_int      level;
};

typedef struct buffer_type
{
  char   * data;        /* The data                      */
  int      len;         /* The current len of the buffer */
  int      size;        /* The allocated size of data    */
} BUFFER;

/******************************
 * End of new structures      *
 ******************************/

/***************************
 * Global Variables        *
 ***************************/

extern  struct event_base *io_base;
extern  evutil_socket_t    io_sock;
extern  struct event      *io_sock_event;

extern  D_SOCKET    *   dsock_free;       /* the socket free list               */
extern  D_SOCKET    *   dsock_list;       /* the linked list of active sockets  */
extern  D_MOBILE    *   dmobile_free;     /* the mobile free list               */
extern  D_MOBILE    *   dmobile_list;     /* the mobile list of active mobiles  */
extern  HELP_DATA   *   help_list;        /* the linked list of help files      */
extern  const struct    typCmd tabCmd[];  /* the command table                  */
extern  char        *   greeting;         /* the welcome greeting               */
extern  char        *   motd;             /* the MOTD help file                 */

#ifdef CYGWIN32
extern  pthread_mutex_t lookup_mutex;     /* to lock gethostbyaddr() calls      */
#endif

/***************************
 * End of Global Variables *
 ***************************/

/***********************
 *    MCCP support     *
 ***********************/

#ifndef NOMCCP

extern const unsigned char compress_will[];
extern const unsigned char compress_will2[];

#define TELOPT_COMPRESS       85
#define TELOPT_COMPRESS2      86
#define COMPRESS_BUF_SIZE   8192

#endif

/***********************
 * End of MCCP support *
 ***********************/

/***********************************
 * Prototype function declerations *
 ***********************************/

#define  buffer_new(size)             __buffer_new     ( size)
#define  buffer_strcat(buffer,text)   __buffer_strcat  ( buffer, text )

#ifdef NOCRYPT
#define crypt(s1, s2)         (s1)
#else
char  *crypt                  ( const char *key, const char *salt );
#endif

/*
 * socket.c
 */
void  init_io                 ( bool copyover );
void  kill_io                 ( void );
void  new_socket              ( int fd );
void  close_socket            ( D_SOCKET *dsock, bool reconnect );
bool  text_to_socket          ( D_SOCKET *dsock, const char *txt );  /* sends the output directly */
void  text_to_buffer          ( D_SOCKET *dsock, const char *txt );  /* buffers the output        */
void  text_to_mobile          ( D_MOBILE *dMob, const char *txt );   /* buffers the output        */
void  retrieve_cmd            ( D_SOCKET *dsock );
void  process_cmd             ( D_SOCKET *dsock );
void  handle_new_connections  ( D_SOCKET *dsock, char *arg );
void  reset_socket            ( D_SOCKET *sock_new, int sock );
void  recycle_sockets         ( void );
void *lookup_address          ( void *arg );

/*
 * interpret.c
 */
void  handle_cmd_input        ( D_SOCKET *dsock, char *arg );

/*
 * io.c
 */
void    log_string            ( const char *txt, ... );
void    bug                   ( const char *txt, ... );
time_t  last_modified         ( char *helpfile );
char   *read_help_entry       ( const char *helpfile );     /* pointer         */
char   *fread_line            ( FILE *fp );                 /* pointer         */
char   *fread_string          ( FILE *fp );                 /* allocated data  */
char   *fread_word            ( FILE *fp );                 /* pointer         */
int     fread_number          ( FILE *fp );                 /* just an integer */

/*
 * strings.c
 */
char   *one_arg               ( char *fStr, char *bStr );
bool    compares              ( const char *aStr, const char *bStr );
bool    is_prefix             ( const char *aStr, const char *bStr );
char   *capitalize            ( char *txt );
BUFFER *__buffer_new          ( int size );
void    __buffer_strcat       ( BUFFER *buffer, const char *text );
void    buffer_free           ( BUFFER *buffer );
void    buffer_clear          ( BUFFER *buffer );
int     bprintf               ( BUFFER *buffer, char *fmt, ... );

/*
 * update.c
 */
void  update_handler          ( void );

/*
 * help.c
 */
bool  check_help              ( D_MOBILE *dMob, char *helpfile );
void  load_helps              ( void );
void  add_help                ( HELP_DATA *help );

/*
 * utils.c
 */
bool  check_name              ( const char *name );
void  clear_mobile            ( D_MOBILE *dMob );
void  free_mobile             ( D_MOBILE *dMob );
void  ex_free_mob             ( D_MOBILE * dMob );
void  communicate             ( D_MOBILE *dMob, char *txt, int range );
void  load_muddata            ( bool copyover );
char *get_time                ( void );
void  copyover_recover        ( void );
D_MOBILE  *check_reconnect         ( char *player );

/*
 * action_safe.c
 */
void  cmd_say                 ( D_MOBILE *dMob, char *arg );
void  cmd_quit                ( D_MOBILE *dMob, char *arg );
void  cmd_shutdown            ( D_MOBILE *dMob, char *arg );
void  cmd_commands            ( D_MOBILE *dMob, char *arg );
void  cmd_who                 ( D_MOBILE *dMob, char *arg );
void  cmd_help                ( D_MOBILE *dMob, char *arg );
#ifndef NOMCCP
void  cmd_compress            ( D_MOBILE *dMob, char *arg );
#endif
void  cmd_save                ( D_MOBILE *dMob, char *arg );
void  cmd_copyover            ( D_MOBILE *dMob, char *arg );
void  cmd_linkdead            ( D_MOBILE *dMob, char *arg );

/*
 * mccp.c
 */
#ifndef NOMCCP
bool  compressStart           ( D_SOCKET *dsock, unsigned char teleopt );
bool  compressEnd             ( D_SOCKET *dsock, unsigned char teleopt, bool forced );
#endif

/*
 * save.c
 */
void  save_player             ( D_MOBILE *dMob );
D_MOBILE  *load_player             ( char *player );
D_MOBILE  *load_profile            ( char *player );

/*******************************
 * End of prototype declartion *
 *******************************/

#endif  /* MUD_H */