/* The Other Realm Account Code */ #include <sys/types.h> #include <sys/time.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include "include.h" extern const struct acnt_cmdfun_type acnt_cmdfun_table[]; void account_gen(DESCRIPTOR_DATA *d, char *arg ) { ACCOUNT *pAcnt; char buf[MSL]; if(d->account) pAcnt = d->account; switch(d->connected) { case CON_GET_ACCOUNT_NAME: if( ( pAcnt = load_account(d, arg ) ) == NULL ) { sprintf(buf, "{DWelcome to The Other Realm. The account by the name {r'{W%s{r'{D\r\n" "was not found. Your account name is rarely used; mostly for OOC purposes\n\r" "such as in the who list, global channels, and the like. By choosing this\n\r" "this name, you will not be able to create a character with the same name.\n\r" "If this is a problem, use another name. You do not need to keep the name\n\r" "Rpish, {r({WUnlike the name of your character{r){D however, you should keep\n\r" "it decent. As it will be shown globally. {r({WIe. No swearing, racial slurs and the like.{r){D\n\r" "\n\rWould you like to create a new account, going by that name? {r[{WY{D/{WN{r]{x\n\r", capitalize(arg) ); write_to_buffer(d, buf, 0 ); pAcnt = account_new(); pAcnt->name = str_dup(capitalize(arg) ); d->account = pAcnt; pAcnt->desc = d; d->connected = CON_CONFIRM_ACCOUNT_NAME; return; } write_to_buffer(d, "{DPlease enter your password\n\r{W-->", 0 ); d->connected = CON_CHECK_ACCOUNT_PASSWORD; return; case CON_CONFIRM_ACCOUNT_NAME: switch(UPPER(arg[0] ) ) { case 'Y': sprintf(buf, "{W%s{D it is! Welcome. Now, we require a password for your account\n\r{W-->{x", pAcnt->name ); write_to_buffer(d, buf, 0); d->connected = CON_GET_ACCOUNT_PASSWORD; break; case 'N': write_to_buffer(d, "{DOk then. What shall your name be?{x\n\r", 0); free_account(pAcnt); d->connected = CON_GET_ACCOUNT_NAME; break; default: write_to_buffer(d, "{DPlease choose either {WY{Des, or {WN{Do{x.\n\r",0); break; } break; case CON_GET_ACCOUNT_PASSWORD: while(isspace(*arg)) arg++; if(arg[0] == '\0' ) { write_to_buffer(d, "{DWhat type of password is that!? Please choose another\n\r{W-->",0); return; } pAcnt->password = str_dup(arg); write_to_buffer(d, "{DPlease retype so that we can confirm your password.\n\r{W-->", 0 ); d->connected = CON_CONFIRM_ACCOUNT_PASSWORD; return; case CON_CONFIRM_ACCOUNT_PASSWORD: if(!strcmp(pAcnt->password, arg ) ) { write_to_buffer(d, "{DPassword confirmed.\n\r", 0); sprintf(buf, "{DWelcome to The Other Realm, {W%s{D. Please choose an option.\n\r\n\r", pAcnt->name ); write_to_buffer(d, buf, 0); write_to_buffer(d, "No choice for you! To the Chat with you! Play with the Forums!\n\r", 0); d->connected = CON_OOC_CHAT; return; } free_string(pAcnt->password); write_to_buffer(d, "{DPasswords did not match. What would you like your password to be?\n\r{W-->", 0 ); d->connected = CON_GET_ACCOUNT_PASSWORD; return; case CON_CHECK_ACCOUNT_PASSWORD: if(!strcmp(arg, pAcnt->password ) ) { sprintf(buf, "{DWelcome back to The Other Realm, {W%s{D. Please choose an option.\n\r\n\r", pAcnt->name ); write_to_buffer(d, buf, 0); write_to_buffer(d, "No choice for you! To the Chat with you! Play with the Forums!\n\r", 0); d->connected = CON_OOC_CHAT; return; } write_to_buffer(d, "{DSorry, that password was incorrect.\n\r",0 ); close_socket(d); free_account(pAcnt); return; case CON_ACCOUNT_MENU: if(arg[0] == '\0' ) { send_accnt_menu(pAcnt); return; } switch (arg[0]) { case '1': write_to_buffer(d, "{DWelcome to The Other Realm Chat Room, for OOC chatter.\n\r",0); d->connected = CON_OOC_CHAT; break; case '2': write_to_buffer(d, "The Forums havn't been written!\n\r", 0 ); return; default: send_accnt_menu(pAcnt); break; } break; default: write_to_buffer(d, "You suck\n\r",0); break; } return; } void send_accnt_menu(ACCOUNT *pAcnt ) { write_to_buffer(pAcnt->desc, "{D*****************************************************\n\r",0 ); write_to_buffer(pAcnt->desc, "{D* * * * * * * * * * * * * * * * * * * * * * * * * * *\n\r",0 ); write_to_buffer(pAcnt->desc, "{D*****************************************************\n\r",0 ); write_to_buffer(pAcnt->desc, "{D* *{W Other Realm Account Menu {D* *\n\r",0 ); write_to_buffer(pAcnt->desc, "{D*{r*{D*{W Please choose one of the Following Options {D*{r*{D*\n\r",0 ); write_to_buffer(pAcnt->desc, "{D* ************************************************* *\n\r",0 ); write_to_buffer(pAcnt->desc, "{D*{r*{D* * * * * * * * * * * * * * * * * * * * * * * * *{r*{D*\n\r",0 ); write_to_buffer(pAcnt->desc, "{D* ************************************************* *\n\r",0 ); write_to_buffer(pAcnt->desc, "{D* {r({D1{r){w Log into Chat {r({D2{r){w Check MUD-Forum {D*\n\r",0 ); write_to_buffer(pAcnt->desc, "{D*****************************************************\n\r",0 ); write_to_buffer(pAcnt->desc, "{D* * * * * * * * * * * * * * * * * * * * * * * * * * *\n\r",0 ); write_to_buffer(pAcnt->desc, "{D*****************************************************\n\r",0 ); write_to_buffer(pAcnt->desc, "{D\n\rPlease choose an option\n\r{W-->", 0 ); return; } void interp_acnt_cmd(ACCOUNT *pAcnt, char *argument ) { ACNT_CMD *pCmd; char cmd[MSL]; while(isspace(*argument)) argument++; if(argument[0] == '\0' ) return; argument = one_argument(argument,cmd); for(pCmd = acnt_cmd_list ; pCmd ; pCmd = pCmd->next ) { if (LOWER(cmd[0]) == LOWER(pCmd->name[0]) && !str_prefix( cmd,pCmd->name)) { if(pCmd->level > pAcnt->level ) break; ( *pCmd->do_fun ) (pAcnt, argument ); return; } } write_to_buffer(pAcnt->desc, "That isn't a valid command.\n\r",0 ); return; } void load_accnt_cmds() { FILE *fp; ACNT_CMD *pCmd; char *word; char buf[MSL]; sprintf(buf, "%s%s%s", DATA_DIR, CMD_DIR, ACNT_CMD_FILE ); if( ( fp = fopen(buf, "r") ) == NULL ) { perror(buf); return; } for(word = fread_word(fp); strcasecmp(word, END_CHAR); word = fread_word(fp) ) { if(!strcasecmp(word, "name" ) ) { pCmd = acnt_cmd_new(); if(!acnt_cmd_list) acnt_cmd_list = pCmd; if(acnt_cmd_last) acnt_cmd_last->next = pCmd; acnt_cmd_last = pCmd; SREAD(pCmd->name); continue; } if(!strcasecmp(word, "dofun" ) ) { if( (pCmd->do_fun = acntdofun_lookup(fread_string(fp)) ) == NULL ) //When I get a logging function. Gotta be added here. { logfp("CmdFun not found: %s" word); break; } continue; } IREAD("Lvl", pCmd->level ); //Another logging function here to state that something wasn't valid. } fclose(fp); return; } AC_CMD * acntdofun_lookup( const char *name ) { int cmd; for( cmd = 0; acnt_cmdfun_table[cmd].name != NULL; cmd++ ) { if(LOWER(name[0]) == LOWER(acnt_cmdfun_table[cmd].name[0]) && !str_prefix(name, acnt_cmdfun_table[cmd].name ) ) return acnt_cmdfun_table[cmd].do_fun; } return NULL; } void save_account(ACCOUNT *pAcnt ) { FILE *fp; char buf[MSL]; int i; sprintf(buf, "%s%s", ACCOUNT_DIR, pAcnt->name ); if( ( fp = fopen(buf, "w" ) ) == NULL ) { logfp(LOG_BUG, "SAVE_ACCOUNT: Failed on Fopen, %s\n", pAcnt->name ); return; } fprintf(fp, "Name %s~\n", pAcnt->name ); fprintf(fp, "Pswd %s~\n", pAcnt->password ); fprintf(fp, "Lvl %d\n", pAcnt->level ); fprintf(fp, "CmnF " ); save_flags(common_table, fp, COMMON_MAX, pAcnt->common_flags ); if(IS_SET(pAcnt->common_flags, COMMON_AFK ) ) fprintf(fp, "AfkS %s~\n", pAcnt->afk_string ); fprintf(fp, "Read %s~\n", pAcnt->read ); fprintf(fp, "%s\n", END_CHAR ); fclose(fp); return; } ACCOUNT *load_account(DESCRIPTOR_DATA *d, char *name) { FILE *fp; char buf[MSL]; char *word; ACCOUNT *pAcnt; int char_spot = 0; sprintf(buf, "%s%s", ACCOUNT_DIR, capitalize(name) ); if( ( fp = fopen(buf, "r" ) ) == NULL ) return NULL; pAcnt = account_new(); for(word = fread_word(fp); strcmp(word, END_CHAR); word = fread_word(fp) ) { if(!strcasecmp(word, "Name" ) ) { SREAD(pAcnt->name); continue; } if(!strcasecmp(word, "Pswd" ) ) { SREAD(pAcnt->password); continue; } if(!strcasecmp(word, "Read") ) { SREAD(pAcnt->read); continue; } if(!strcasecmp(word, "CmnF" ) ) { load_flags(common_table, fp, COMMON_MAX, pAcnt->common_flags ); continue; } if(!strcasecmp(word, "AfkS" ) ) { SREAD(pAcnt->afk_string ); continue; } IREAD("lvl", pAcnt->level ); logfp(LOG_BUG, "Unexpected reference in Account file %s: %s\n",name, word ); continue; } d->account = pAcnt; pAcnt->desc = d; return pAcnt; } ACCOUNT * get_account( const char *name ) { ACCOUNT *pAcnt; for(pAcnt = account_list; pAcnt ; pAcnt = pAcnt->next ) { if(LOWER(pAcnt->name[0]) == LOWER(name[0]) && !str_prefix(name, pAcnt->name ) ) return pAcnt; } return NULL; } const struct acnt_cmdfun_type acnt_cmdfun_table[] = { { "acnt_who", acnt_who }, { "acnt_chat", acnt_chat }, { "acnt_save", acnt_save }, { "acnt_quit", acnt_quit }, { "acnt_typo", acnt_typo }, { "acnt_copyover", acnt_copyover }, { "acnt_command", acnt_command }, { "acnt_afk", acnt_afk }, { "acnt_advance", acnt_advance }, { "acnt_socket", acnt_socket }, { "acnt_filecount", acnt_filecount}, { "acnt_olc", acnt_olc }, { "acnt_forums", acnt_forums }, { "acnt_thread", acnt_thread }, { "acnt_romcode", acnt_romcode }, { "acnt_smaugcode", acnt_smaugcode }, { "acnt_envycode", acnt_envycode }, { "acnt_circlecode",acnt_circlecode }, { "acnt_lpccode", acnt_lpccode }, { "acnt_newbie", acnt_newbie }, { "acnt_admin", acnt_admin }, { "acnt_legal", acnt_legal }, { "acnt_building", acnt_building }, { NULL, NULL } };