/**************************************************************************/
/* Header file for Crypt v5.3 */
/************** (Was) Header file for NUTS version 3.2.1 ******************/
#define VERSION "6.0"
/* Various filenames, most files are kept in DATAFILES directory */
#define TEXTFILES "text"
#define DATAFILES "datafiles"
#define USERFILES "userfiles"
#define USERMAIL "usermail"
#define HELPFILES "helpfiles"
#define CONFIGFILE "config"
#define NEWSFILE "newsfile"
#define MAPFILE "mapfile"
#define SITEBAN "siteban"
#define SILENTBAN "silent.ban"
#define PARTIAL_SITEBAN "partial.ban"
#define USERBAN "userban"
#define SYSLOG "var/log/syslog"
#define WHERE_TEXT "where.txt"
#define WHERE_FILE_A "ip_names.a"
#define WHERE_FILE_B "ip_names.b"
#define WHERE_FILE_C "ip_names.c"
#define NEWBIE_MOTD "newbie_motd"
#define RANKS_FILE "ranks"
#define FAQ_FILE "faq"
#define ATMOS_FILE "atmos"
#define TALKERS_FILE "talkers"
#define RULES_FILE "rules"
#define BSX_FILE "datafiles/xtush"
/* These files are kept in the same dir as the executable */
#define MOTD1 "motd1"
#define MOTD2 "motd2"
#define PARTIALBAN_MOTD "motd.ban"
/* Various support files... Most systems will have zip/pkzip in path */
#define BACKUP_NAME "users.zip"
#define ZIP_EXEC "zip"
#define DOWEB_EXEC "doweb"
/* File of who is currently logged in */
#define WEB_PAGE_FILE "www/who.html"
/* This is the string used by the .thp command */
#define TALKER_HOMEPAGE "~OLSYSTEM INFORMATION:~RS Crypt Homepage - http://churchnet2.ucsm.ac.uk/~crypt\n"
#define OUT_BUFF_SIZE 80
#define MAX_WORDS 10
#define WORD_LEN 80
#define ARR_SIZE 1000
#define MAX_LINES 10
#define MAX_NO_OF_ATMOS 10 /* The amount of lines of atmospherics to allocate memory for */
#define USER_NAME_LEN 12
#define MIN_USER_NAME_LEN 2
#define NO_OF_LICKS 3 /* More than 3 licks and you're off! */
#define USER_DESC_LEN 42 /* Length of desc + pdesc + name */
#define LOG_PHRASE_LEN 78
#define PHRASE_LEN 40
#define PASS_LEN 20 /* only the 1st 8 chars will be used by crypt() though */
#define BUFSIZE 1000
#define ROOM_NAME_LEN 24
#define ROOM_LABEL_LEN 5
#define ROOM_DESC_LEN 1201
#define TOPIC_LEN 67
#define MAX_LINKS 10
#define SITE_NAME_LEN 80
#define CONV_LINES 50
#define DNL 12
#define SHOW_PRE_LEVEL 3 /* ARCH's get prelogins */
/* For .revtell */
#define REVTELL_LINES 20
#define REVIEW_LEN 161
#define PUBLIC 0
#define PRIVATE 1
#define FIXED_PUBLIC 2
#define FIXED_PRIVATE 3
#define USER_ROOM 4
/* Internal ranks - no need to change these */
#define NEW 0
#define USER 1
#define WIZ 2
#define ARCH 3
#define GOD 4
#define UBERGOTH 5
#define USER_TYPE 0
#define CLONE_TYPE 1
#define CLONE_HEAR_NOTHING 0
#define CLONE_HEAR_SWEARS 1
#define CLONE_HEAR_ALL 2
/* Hardcoded admin password */
#define SU_PASSWORD "scott"
#define ATMOS_CHANCE 2 /* 2% chance of an atmos each cycle */
#define PROMPT_TYPES 3 /* 3 different prompt styles */
/****************************************************************************/
struct user_struct {
char name[USER_NAME_LEN+1],desc[81],pre_desc[81],pass[PASS_LEN+6];
char in_phrase[PHRASE_LEN+1],out_phrase[PHRASE_LEN+1];
char buff[BUFSIZE],site[81],last_site[81],page_file[81];
char mail_to[WORD_LEN+1],revbuff[REVTELL_LINES][REVIEW_LEN+3];
char login_phrase[LOG_PHRASE_LEN+1],logout_phrase[LOG_PHRASE_LEN+1];
char rank[38],old_tell[USER_NAME_LEN+1],ip_name[81],ip_num[20];
char email[81],www[81],afk_mesg[81];
unsigned long auth_addr;
int type,port,login,socket,attempts,buffpos,filepos;
int vis,ignall,prompt,command_mode,muzzled,charmode_echo;
int level,misc_op,edit_line,charcnt,warned;
int accreq,last_login_len,ignall_store,clone_hear,afk;
int edit_op,colour,ignshout,igntell,sex,autologout,revline;
int tell,licked,been_licked,xterm,termtype,site_port,figlet;
int vis_email,examined,home,window_x,window_y;
time_t last_input,last_login,total_login,read_mail;
char *malloc_start,*malloc_end;
struct room_struct *room,*invite_room;
struct user_struct *prev,*next,*owner;
};
typedef struct user_struct* UR_OBJECT;
UR_OBJECT user_first,user_last,create_user();
struct room_struct {
char name[ROOM_NAME_LEN+1];
char label[ROOM_LABEL_LEN+1];
char desc[ROOM_DESC_LEN+1];
char topic[TOPIC_LEN+1];
char conv_line[CONV_LINES][161];
int access; /* public , private etc */
int cln; /* conversation line number for recording */
int mesg_cnt, tlock;
char link_label[MAX_LINKS][ROOM_LABEL_LEN+1]; /* temp store for parse */
struct room_struct *link[MAX_LINKS];
struct room_struct *prev,*next;
};
typedef struct room_struct *RM_OBJECT;
RM_OBJECT room_first,room_last,create_room();
/****************************************************************************/
char *term_names[]={
"~FRC~FYo~FBl~FGo~FMu~FTr ~RScompatible, Xterm compatible terminal type",
"Non-colour, Xterm compatible terminal type",
"~FRC~FYo~FBl~FGo~FMu~FTr ~RScompatible, non Xterm terminal type",
"Non-colour, non Xterm terminal type"
};
char *syserror="Sorry, a system error has occured";
char *nosuchroom="There is no such room.\n";
char *nosuchuser="There is no such user.\n";
char *notloggedon="There is no one of that name logged on.\n";
char *invisenter="A presence enters the room...\n";
char *invisleave="A presence leaves the room.\n";
char *invisname="A presence";
char *noswearing="Swearing is not allowed here... Not at the moment anyway!\n";
/* Old level names... */
char *level_name[]={
"NEW","USER","WIZ","ARCH","GOD","UBERGOTH","*"
};
/* Keep the names less than or equal to 9 characters for proper formatting */
/* And keep the unknown levels the same as the level_name string above... The
unknown strings are also used in other bits of the program for various things
(like the min login level bit) */
static char *new_levels[3][8]={
/* Unknown, male, female */
{"NEW","USER","WIZ","ARCH","GOD","UBERGOTH","UBERGOTH","*"},
{"NEW","USER","WARLOCK","SORCEROR","GOD","UBERGOTH","UBERGOTH","*"},
{"NEW","USERESS","WITCH","SORCERESS","GODDESS","UBERGOTH", "UBERGOTH","*"}
};
char *sex_name[]={
"unknown!", "male", "female"
};
/****************************************************************************/
char *command[]={
"quit", "look", "mode", "say", "shout",
"tell", "emote", "semote", "pemote", "echo",
"go", "ignall", "prompt", "desc", "inphr",
"outphr", "public", "private", "letmein","invite",
"topic", "move", "bcast", "who", "people",
"shutdown","news", "read", "write", "join",
"wipe", "search", "review", "help", "status",
"version", "rmail", "smail", "dmail", "from",
"entpro", "examine", "rmst", "passwd", "kill",
"promote", "demote", "listbans", "ban", "unban",
"vis", "invis", "site", "wake", "wizshout",
"muzzle", "unmuzzle", "map", "logging","minlogin",
"system", "charecho", "clearline", "fix", "unfix",
"viewlog", "accreq", "revclr", "clone", "destroy",
"myclones","allclones","swho", "switch", "csay", "chear",
"swban", "afk", "cls", "colour", "cemote",
"ignshout","igntell", "suicide", "delete", "reboot",
"banner", "sing", "think", "lottery","flowers",
"lick", "where", "myxterm", "allxterm","sex",
"ranks", "sos", "termtype", "tlock",
"faq", "atmos", "ewtoo", "nuts", "hug",
"shark", "gp", "revtell", "logout", "figlet",
"hp", "thp", "setrank", "numpty", "whore",
"admin", "pdesc", "auth", "backup", "doweb",
"ignfig", "webpage", "login", "email", "vemail",
"www", "talkers", "dsay", "beep", "newuser",
"bsx", "gpemote", "home", "edit", "boot",
"rules", "poke", "sinfo", "addwhere","rose",
"window", "*"
};
/* Values of commands , used in switch in exec_com() */
enum comvals {
QUIT, LOOK, MODE, SAY, SHOUT,
TELL, EMOTE, SEMOTE, PEMOTE, ECHO,
GO, IGNALL, PROMPT, DESC, INPHRASE,
OUTPHRASE,PUBCOM, PRIVCOM, LETMEIN,INVITE,
TOPIC, MOVE, BCAST, WHO, PEOPLE,
SHUTDOWN, NEWS, READ, WRITE, JOIN,
WIPE, SEARCH, REVIEW, HELP, STATUS,
VER, RMAIL, SMAIL, DMAIL, FROM,
ENTPRO, EXAMINE, RMST, PASSWD, KILL,
PROMOTE, DEMOTE, LISTBANS, BAN, UNBAN,
VIS, INVIS, SITE, WAKE, WIZSHOUT,
MUZZLE, UNMUZZLE, MAP, LOGGING,MINLOGIN,
SYSTEM, CHARECHO, CLEARLINE,FIX, UNFIX,
VIEWLOG, ACCREQ, REVCLR, CREATE, DESTROY,
MYCLONES, ALLCLONES,SWHO, SWITCH, CSAY, CHEAR,
SWBAN, AFK, CLS, COLOUR, CEMOTE,
IGNSHOUT, IGNTELL, SUICIDE, DELETE_C, REBOOT,
BANNER, SING, THINK, LOTTERY,FLOWERS,
LICK, WHERE, MYXTERM, ALLXTERM,SEX,
RANKS, SOS, TERMTYPE, TLOCK,
FAQ, ATMOS, EWTOO, NUTS, HUG,
SHARK, GP, REVTELL, LOGOUT, FIGLET,
HP, THP, SETRANK, NUMPTY, WHORE,
SU, PDESC, AUTH, BACKUP, DOWEB,
IGNFIG, WEBPAGE, LOGIN, EMAIL, VEMAIL,
WWW, TALKERS, DSAY, BEEP, NEWUSER,
BSX, GPEMOTE, HOME, EDIT, BOOT,
RULES, POKE, SINFO, ADDWHERE, ROSE,
WINDOW
} com_num;
/* These are the minimum levels at which the commands can be executed.
Alter to suit. */
int com_level[]={
NEW, NEW, NEW, NEW, USER, /* Quit */
USER,NEW,USER,USER,USER,
USER,USER,NEW, USER,USER, /* Go */
USER,USER,USER,USER,USER,
USER,WIZ, ARCH,NEW, WIZ, /* Topic */
UBERGOTH, USER,NEW, USER,USER,
WIZ, USER,USER,NEW, NEW, /* wipe */
NEW, USER,USER,USER,USER,
USER,USER,NEW, USER,WIZ, /* entpro */
ARCH,ARCH,WIZ, ARCH,ARCH, /* promote */
ARCH,ARCH,WIZ, USER,WIZ,
WIZ, WIZ, USER,UBERGOTH, GOD, /* muzzle */
WIZ, NEW, WIZ, ARCH,ARCH, /* system */
ARCH,NEW, USER,ARCH,ARCH, /* viewlog */
ARCH,USER,NEW, ARCH,ARCH,ARCH, /* with swho added */
ARCH,USER,NEW ,NEW, ARCH,/* swban */
USER,USER,NEW, UBERGOTH, UBERGOTH,
USER,USER,USER,USER,USER, /* banner */
USER,USER,USER,ARCH,NEW,
NEW, NEW, NEW, ARCH, /* ranks */
NEW, ARCH,NEW, NEW, USER,
WIZ, USER,USER,USER,WIZ, /* shark */
USER,WIZ, USER,USER,USER, /* hp */
GOD, USER,GOD, UBERGOTH, UBERGOTH, /* su */
USER,UBERGOTH,USER,NEW,USER, /* ignfig */
USER,USER,USER,WIZ, WIZ,
GOD, USER,USER,USER,USER,
NEW, USER,GOD,UBERGOTH,USER,
NEW
};
/****************************************************************************/
#define NUM_COLS 21
char *colcode[NUM_COLS]={
/* Reset, bold, blink, reverse, underline */
"\033[0m", "\033[1m", "\033[5m", "\033[7m", "\033[4m",
/* Foreground colours:
black, red, green, yellow/orange
blue, magenta,turquiose(cyan), white */
"\033[30m","\033[31m","\033[32m","\033[33m",
"\033[34m","\033[35m","\033[36m","\033[37m",
/* Background colours */
"\033[40m","\033[41m","\033[42m","\033[43m",
"\033[44m","\033[45m","\033[46m","\033[47m"
};
/* Codes used in a string to produce the colours when prepended with a '~' */
char *colcom[NUM_COLS]={
"RS","OL","LI","RV","UL",
"FK","FR","FG","FY",
"FB","FM","FT","FW",
"BK","BR","BG","BY",
"BB","BM","BT","BW"
};
/****************************************************************************/
char *month[12]={
"January","February","March","April","May","June",
"July","August","September","October","November","December"
};
char *day[7]={
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
};
char *noyes1[]={ " NO","YES" };
char *noyes2[]={ "NO ","YES" };
char *offon[]={ "OFF","ON " };
/* These MUST be in upper case - the contains_swearing() function converts
the string to be checked to upper case before it compares it against
these */
char *swear_words[]={
"FUCK","SHIT","CUNT","BASTARD","*"
};
char atmos_array[MAX_NO_OF_ATMOS][81];
char text[ARR_SIZE*2];
char word[MAX_WORDS][WORD_LEN+1];
char wrd[8][81];
char progname[40],confile[40];
char myos[81],myhost[81];
time_t boot_time;
jmp_buf jmpvar;
int port[2],listen_sock[2],wizport_level,minlogin_level;
int colour_def,password_echo,ignore_sigterm;
int max_users,max_clones,num_of_users,num_of_logins,heartbeat;
int login_idle_time,user_idle_time,config_line,word_count;
int tmonth,tday,tmday,twday,thour,tmin,tsec;
int mesg_life,system_logging,prompt_def,no_prompt;
int force_listen,gatecrash_level,min_private_users;
int ignore_mp_level,destructed,mesg_check_hour,mesg_check_min;
int ban_swearing,crash_action;
int time_out_afks,allow_caps_in_name,atmos,atmos_no;
int backup_check_hour,backup_check_min,backup_on,userweb_on;
int spod_check_hour,spod_check_min,auto_promote;
int web_page_on,save_newbies,command_mode_def;
int total_logins,peak_logins;
#ifdef WIN_NT
HANDLE hThread;
#endif
/* extern char *sys_errlist[]; */
/******************** Figlet globals & defines ************************/
#define FIGLET_FONTS "fonts"
#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
typedef long inchr; /* "char" read from stdin */
inchr *inchrline; /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
int inchrlinelen,inchrlinelenlimit;
typedef struct fc {
inchr ord;
char **thechar; /* Alloc'd char thechar[charheight][]; */
struct fc *next;
} fcharnode;
fcharnode *fcharlist;
char **currchar;
int currcharwidth;
char **outline; /* Alloc'd char outline[charheight][outlinelenlimit+1]; */
int outlinelen;
int justification,right2left;
int outputwidth;
int outlinelenlimit;
char hardblank;
int charheight,defaultmode;
/**************************************************************************/
/* Functions to convert between UNIX/WIN socket functions */
#ifdef WIN_NT
int READ_S(int sock, char *str, int len) { return recv(sock,str,len,0); }
int WRITE_S(int sock, char *str, int len) { return send(sock,str,len,0); }
#define CLOSE closesocket
#else
#define READ_S read
#define WRITE_S write
#define CLOSE close
#endif
/**************************************************************************/