#include <strings.h> #include <stdio.h> #include <ctype.h> #include "structs.h" #include "utils.h" #include "comm.h" #include "db.h" #define ATM_FILE "atm.accounts" /* File for bank */ #define BAN_FILE "sites.banned" /* File for banned sites */ typedef struct ATMtAccount { char name[20]; long balance; } ATMtAccount; extern struct room_data *world; extern struct zone_data *zone_table; int real_object(int i); struct char_data *get_char_vis(struct char_data *ch,char *name); void ATMwithdraw(struct char_data *ch, char *arg, int cmd); void ATMdeposit(struct char_data *ch, char *arg, int cmd); void ATMbalance(struct char_data *ch, char *arg, int cmd); /**********************************************************************/ int ATMisPresent(struct char_data *ch) { struct obj_data *tmp; bool found = FALSE; for (tmp = world[ch->in_room].contents; tmp != NULL && !found; tmp = tmp->next_content) { if ((tmp->item_number == real_object(3036)) && (CAN_SEE_OBJ(ch, tmp))) { found = TRUE; } /* if */ } /* for */ return found; } /* ATMisPresent */ /*******************************************************************/ void do_deposit(struct char_data *ch, char *argument, int cmd) { if (ATMisPresent(ch)) { ATMdeposit(ch, argument, cmd); } else { send_to_char("There's no ATM here!\n\r", ch); } /* if */ } /* do_deposit */ /*******************************************************************/ void do_balance(struct char_data *ch, char *argument, int cmd) { if (ATMisPresent(ch)) { ATMbalance(ch, argument, cmd); } else { send_to_char("There's no ATM here!\n\r", ch); } /* if */ } /* do_balance */ /*******************************************************************/ void do_withdraw(struct char_data *ch, char *argument, int cmd) { if (ATMisPresent(ch)) { ATMwithdraw(ch, argument, cmd); } else { send_to_char("There's no ATM here!\n\r", ch); } /* if */ } /* do_withdraw */ /*****************************************************************/ int checkban(char *theaddress) { FILE *fptr; char buf[MAX_STRING_LENGTH]; char tmpadd[MAX_STRING_LENGTH]; if ((fptr = fopen(BAN_FILE,"r"))==NULL) { log("Error opening BAN_FILE!"); exit(0); } strcpy(tmpadd,theaddress); strcat(tmpadd,"\n"); while(!feof(fptr)) { fgets(buf,100,fptr); if (!strcmp(buf,tmpadd)) { fclose(fptr); return (1); } } fclose(fptr); return (0); } void do_ban(struct char_data *ch, char *argument, int cmd) { FILE *fptr; char buf[MAX_STRING_LENGTH]; char theaddress[MAX_STRING_LENGTH]; char storage[50][50]; bool found=FALSE; int i=0; one_argument(argument,theaddress); if (!*theaddress) { if ((fptr = fopen(BAN_FILE,"r"))==NULL) { log("Error opening BAN_FILE!"); exit(0); } send_to_char("Banned Sites...\n\r",ch); while(!feof(fptr)) { fgets(buf,100,fptr); send_to_char(buf,ch); } return; } if ((fptr = fopen(BAN_FILE,"r"))==NULL) { log("Error opening BAN_FILE!"); exit(0); } strcat(theaddress,"\n"); while(!feof(fptr)) { fgets(buf,100,fptr); if (!strcmp(buf,theaddress)) { found=TRUE; continue; } strcpy(storage[i++],buf); } fclose(fptr); if (!found) { if ((fptr = fopen(BAN_FILE,"a"))==NULL) { log("Error opening BAN_FILE for append!"); exit(0); } sprintf(buf,"Banned Site: %s\r",theaddress); send_to_char(buf,ch); fputs(theaddress,fptr); fclose(fptr); return; } if ((fptr = fopen(BAN_FILE,"w"))==NULL) { log("Error rewriting to BAN_FILE!"); exit(0); } while (i--) { fputs(storage[i],fptr); } sprintf(buf,"Allowed Site: %s\r",theaddress); send_to_char(buf,ch); fclose(fptr); } int ATMgetUser(char *name, ATMtAccount *acc) { FILE *fp; int offset = 0; if ((fp = fopen(ATM_FILE, "r")) == NULL) { log("Error opening ATM_FILE!"); exit(0); } /* if */ while (!feof(fp)) { fread(acc, sizeof(ATMtAccount), 1, fp); if ((str_cmp(acc->name, name) == 0) && (!feof(fp))) { /* Found the player, return this record */ offset = ftell(fp) - (int)sizeof(ATMtAccount); fclose(fp); return offset; } /* if */ } /* while */ /* * If the person is not in the bank file, then create an entry. */ strcpy(acc->name, name); acc->balance = 0; fseek(fp, 0, 2); /* Seek to end of file */ offset = ftell(fp); fwrite(acc, sizeof(ATMtAccount), 1, fp); fclose(fp); return offset; } /* ATMgetUser */ /*****************************************************************/ void ATMputUser(int offset, ATMtAccount *acc) { FILE *fp; bool found = FALSE; ATMtAccount temp; if ((fp = fopen(ATM_FILE, "r+")) == NULL) { log("Error opening ATM_FILE!"); exit(0); } /* if */ fseek(fp, offset, 0); fwrite(acc, sizeof(ATMtAccount), 1, fp); fclose(fp); return; } /* ATMputUser */ /*****************************************************************/ void ATMbalance(struct char_data *ch, char *arg, int cmd) { ATMtAccount acc; char buf[MAX_INPUT_LENGTH]; struct char_data *who; if(GET_LEVEL(ch)>=21 && *arg) { if(!(who=get_char_vis(ch,arg))) { send_to_char("Get whose bank balance?\n\r",ch); return; } } else who=ch; (void)ATMgetUser(who->player.name, &acc); if (acc.balance == 0) { sprintf(buf, "%s's balance is a big fat zero!\n\r",who->player.name); } else if (acc.balance != 1) { sprintf(buf,"%s's balance is %ld coins.\n\r",who->player.name,acc.balance); } else { sprintf(buf,"%s's balance is %ld coin.\n\r",who->player.name,acc.balance); } /* if */ send_to_char (buf, ch); } /* ATMbalance */ /*****************************************************************/ void ATMdeposit(struct char_data *ch, char *arg, int cmd) { ATMtAccount acc; char buf[MAX_INPUT_LENGTH]; char number[MAX_INPUT_LENGTH]; char logit[MAX_INPUT_LENGTH]; long amount; int offset; offset = ATMgetUser(ch->player.name, &acc); sprintf(logit,"WIZINFO: (%s) deposit %s",GET_NAME(ch),arg); log(logit); one_argument(arg, number); if (!*number) { send_to_char("Usage :: DEPOSIT <value>\n\r", ch); return; } /* if */ if (strlen(number)>7){ /* Was getting overflow...fix--Swiftest */ send_to_char("Usage :: DEPOSIT <value>\n\r",ch); return; } if (!(amount = atol(number))) { send_to_char("Usage :: DEPOSIT <value>\n\r", ch); return; } /* if */ if (amount < 0) { send_to_char("The amount to deposit must be non-negative.\n\r",ch); return; } /* if */ if (amount > GET_GOLD(ch)) { send_to_char("You don't have that much gold.\n\r", ch); } else { acc.balance += amount; GET_GOLD(ch) -= amount; ATMputUser(offset, &acc); if (amount == 1) { sprintf(buf, "You deposit 1 coin.\n\r"); } else if (amount == 0) { sprintf(buf, "A most unproductive effort.\n\r"); } else { sprintf(buf, "You deposit %ld coins.\n\r", amount); } /* if */ send_to_char(buf, ch); } /* if */ } /* ATMdeposit */ /*****************************************************************/ void ATMwithdraw(struct char_data *ch, char *arg, int cmd) { ATMtAccount acc; char buf[MAX_INPUT_LENGTH]; char number[MAX_INPUT_LENGTH]; char logit[MAX_INPUT_LENGTH]; long amount; int offset; offset = ATMgetUser(ch->player.name, &acc); sprintf(logit,"WIZINFO: (%s) withdraw %s",GET_NAME(ch),arg); log(logit); one_argument(arg, number); if (!*number) { send_to_char("Usage :: WITHDRAW <value>\n\r", ch); return; } /* if */ if (strlen(number)>7){ /* Was getting overflow error--Swiftest */ send_to_char("Usage :: WITHDRAW <value>\n\r",ch); return; } /* if */ if (!(amount = atol(number))) { send_to_char("Usage :: WITHDRAW <value>\n\r", ch); return; } /* if */ if (amount < 0) { send_to_char("The amount to withdraw must be non-negative.\n\r",ch); return; } /* if */ if (amount > acc.balance) { send_to_char("You don't have that much gold in your account.\n\r", ch); } else { acc.balance -= amount; GET_GOLD(ch) += amount; ATMputUser(offset, &acc); if (amount == 1) { sprintf(buf, "You withdraw 1 coin.\n\r"); } else if (amount == 0) { sprintf(buf, "A most unproductive effort.\n\r"); } else { sprintf(buf, "You withdraw %ld coins.\n\r", amount); } /* if */ send_to_char(buf, ch); } /* if */ } /* ATMwithdraw */ /*****************************************************************/