578 lines
11 KiB
C
578 lines
11 KiB
C
/*****************************************************************************
|
|
*
|
|
* $Id$
|
|
* Purpose ...............: Time/Bytes Bank
|
|
*
|
|
*****************************************************************************
|
|
* Copyright (C) 1997-2001
|
|
*
|
|
* Michiel Broek FIDO: 2:2801/16
|
|
* Beekmansbos 10 Internet: mbroek@ux123.pttnwb.nl
|
|
* 1971 BV IJmuiden
|
|
* the Netherlands
|
|
*
|
|
* This file is part of MBSE BBS.
|
|
*
|
|
* This BBS is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2, or (at your option) any
|
|
* later version.
|
|
*
|
|
* MBSE BBS is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with MBSE BBS; see the file COPYING. If not, write to the Free
|
|
* Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*****************************************************************************/
|
|
|
|
#include "../lib/libs.h"
|
|
#include "../lib/mbse.h"
|
|
#include "../lib/structs.h"
|
|
#include "../lib/records.h"
|
|
#include "../lib/clcomm.h"
|
|
#include "../lib/common.h"
|
|
#include "bank.h"
|
|
#include "input.h"
|
|
#include "language.h"
|
|
#include "dispfile.h"
|
|
#include "timeout.h"
|
|
#include "timecheck.h"
|
|
#include "whoson.h"
|
|
#include "exitinfo.h"
|
|
|
|
|
|
/*
|
|
* internal function prototypes
|
|
*/
|
|
int BankMenu(void);
|
|
void AddAccount(void);
|
|
void Deposit(void);
|
|
void Withdraw(void);
|
|
void DepositTime(void);
|
|
void WithdrawTime(void);
|
|
|
|
void DepositBytes(void);
|
|
void WithdrawBytes(void);
|
|
|
|
FILE *pBank;
|
|
int usernum = 0;
|
|
long bankset;
|
|
|
|
|
|
|
|
/*
|
|
* Timebank, called from the menu system.
|
|
*/
|
|
void Bank()
|
|
{
|
|
int FoundName = FALSE;
|
|
int Loop = TRUE;
|
|
char *temp, temp1[81];
|
|
|
|
DisplayFile((char *)"bank");
|
|
temp = calloc(PATH_MAX, sizeof(char));
|
|
|
|
while(Loop) {
|
|
FoundName = FALSE;
|
|
usernum = 0;
|
|
WhosDoingWhat(TIMEBANK);
|
|
|
|
sprintf(temp, "%s/etc/bank.data", getenv("MBSE_ROOT"));
|
|
if ((pBank = fopen(temp, "r+")) == NULL) {
|
|
/* Create a new database */
|
|
pBank = fopen(temp, "a+");
|
|
bankhdr.hdrsize = sizeof(bankhdr);
|
|
bankhdr.recsize = sizeof(bank);
|
|
fwrite(&bankhdr, sizeof(bankhdr), 1, pBank);
|
|
fclose(pBank);
|
|
chmod(temp, 0660);
|
|
Syslog('-', "Created %s", temp);
|
|
AddAccount();
|
|
if ((pBank = fopen(temp, "r+")) == NULL) {
|
|
WriteError("Unable to open %s", temp);
|
|
free(temp);
|
|
return;
|
|
}
|
|
}
|
|
|
|
fread(&bankhdr, sizeof(bankhdr), 1, pBank);
|
|
fseek(pBank, bankhdr.hdrsize, 0);
|
|
while (fread(&bank, bankhdr.recsize, 1, pBank) == 1) {
|
|
if((strcmp(bank.Name, exitinfo.sUserName)) == 0) {
|
|
FoundName = TRUE;
|
|
break;
|
|
} else
|
|
usernum++;
|
|
} /* End of while */
|
|
|
|
fclose(pBank);
|
|
|
|
if(!FoundName)
|
|
AddAccount();
|
|
|
|
if ((pBank = fopen(temp, "r+")) == NULL)
|
|
AddAccount();
|
|
|
|
bankset = bankhdr.hdrsize + (usernum * bankhdr.recsize);
|
|
if (fseek(pBank, bankset, 0) != 0)
|
|
WriteError("Can't move pointer there.");
|
|
|
|
fread(&bank, bankhdr.recsize, 1, pBank);
|
|
|
|
sprintf(temp1, "%s", (char *) GetDateDMY());
|
|
if ((strcmp(temp1, bank.Date)) != 0) {
|
|
bank.TimeWithdraw = 0;
|
|
bank.KByteWithdraw = 0;
|
|
bank.TimeDeposit = 0;
|
|
bank.KByteDeposit = 0;
|
|
sprintf(bank.Date, "%s", (char *) GetDateDMY());
|
|
}
|
|
|
|
Loop = BankMenu();
|
|
}
|
|
free(temp);
|
|
}
|
|
|
|
|
|
|
|
int BankMenu()
|
|
{
|
|
int i;
|
|
|
|
clear();
|
|
/* MBSE BBS System Bank */
|
|
language(4, 7, 11);
|
|
colour(15, 0);
|
|
sLine();
|
|
/* Bank Account: */
|
|
language(3, 0, 12);
|
|
poutCR(15, 0, bank.Name);
|
|
colour(15, 0);
|
|
sLine();
|
|
|
|
/* Time in account */
|
|
language(10, 0, 13);
|
|
colour(15, 0);
|
|
printf("%d\n", bank.TimeBalance);
|
|
|
|
/* Bytes in account */
|
|
language(10, 0, 14);
|
|
colour(15, 0);
|
|
printf("%d\n", bank.KByteBalance);
|
|
|
|
/* Time deposited today */
|
|
language(10, 0, 15);
|
|
colour(15, 0);
|
|
printf("%d\n", bank.TimeDeposit);
|
|
|
|
/* Bytes deposited today */
|
|
language(10, 0, 16);
|
|
colour(15, 0);
|
|
printf("%d\n", bank.KByteDeposit);
|
|
|
|
/* Time withdrawn today */
|
|
language(10, 0, 17);
|
|
colour(15, 0);
|
|
printf("%d\n", bank.TimeWithdraw);
|
|
|
|
/* Bytes withdrawn today */
|
|
language(10, 0, 18);
|
|
colour(15, 0);
|
|
printf("%d\n", bank.KByteWithdraw);
|
|
|
|
colour(15, 0);
|
|
sLine();
|
|
TimeCheck();
|
|
/* (D)eposit, (W)ithdraw, (Q)uit */
|
|
language(12, 0, 19);
|
|
Enter(2);
|
|
|
|
/* Bank > */
|
|
language(15, 0, 20);
|
|
fflush(stdout);
|
|
|
|
alarm_on();
|
|
i = toupper(Getone());
|
|
|
|
if (i == Keystroke(19, 0))
|
|
Deposit();
|
|
else
|
|
if (i == Keystroke(19, 1))
|
|
Withdraw();
|
|
else
|
|
if (i == Keystroke(19, 2))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
void AddAccount()
|
|
{
|
|
char *temp;
|
|
|
|
temp = calloc(PATH_MAX, sizeof(char));
|
|
|
|
sprintf(temp, "%s/etc/bank.data", getenv("MBSE_ROOT"));
|
|
|
|
if ((pBank = fopen(temp, "a+")) == NULL)
|
|
WriteError("Can't open %s for updating", temp);
|
|
else {
|
|
memset(&bank, 0, sizeof(bank));
|
|
strcpy(bank.Name, exitinfo.sUserName);
|
|
sprintf(bank.Date, "%s", (char *) GetDateDMY());
|
|
fwrite(&bank, sizeof(bank), 1, pBank);
|
|
fclose(pBank);
|
|
}
|
|
free(temp);
|
|
}
|
|
|
|
|
|
|
|
void Deposit()
|
|
{
|
|
int i;
|
|
|
|
/* (T)ime, (B)ytes, (Q)uit : */
|
|
language(3, 0, 21);
|
|
fflush(stdout);
|
|
|
|
alarm_on();
|
|
i = toupper(Getone());
|
|
|
|
if (i == Keystroke(21, 0))
|
|
DepositTime();
|
|
else
|
|
if (i == Keystroke(21, 1))
|
|
DepositBytes();
|
|
}
|
|
|
|
|
|
|
|
void Withdraw()
|
|
{
|
|
int i;
|
|
|
|
/* (T)ime, (B)ytes, (Q)uit : */
|
|
language(3, 0, 21);
|
|
fflush(stdout);
|
|
|
|
alarm_on();
|
|
i = toupper(Getone());
|
|
|
|
if (i == Keystroke(21, 0))
|
|
WithdrawTime();
|
|
else
|
|
if (i == Keystroke(21, 1))
|
|
WithdrawBytes();
|
|
}
|
|
|
|
|
|
|
|
void DepositTime()
|
|
{
|
|
int x;
|
|
char *temp;
|
|
|
|
temp = calloc(PATH_MAX, sizeof(char));
|
|
|
|
ReadExitinfo();
|
|
fflush(stdin);
|
|
|
|
if(exitinfo.iTimeLeft <= 5) {
|
|
Enter(2);
|
|
/* You must have at least 5 minutes remaining to deposit */
|
|
language(12, 0, 22);
|
|
Enter(2);
|
|
Pause();
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
Enter(1);
|
|
/* How much time. Minutes available to you is */
|
|
language(15, 0, 23);
|
|
printf("%d: ", exitinfo.iTimeLeft - 5);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
|
|
if((strcmp(temp, "")) == 0) {
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
x = atoi(temp);
|
|
bank.TimeDeposit += x;
|
|
bank.TimeBalance += x;
|
|
|
|
if(bank.TimeDeposit > CFG.iMaxTimeDeposit) {
|
|
colour(10, 0);
|
|
Enter(1);
|
|
/* You have tried to deposit more than the maximum limit today. */
|
|
language(10, 0, 24);
|
|
Enter(1);
|
|
|
|
/* Maximum allowed minutes to deposit per day: */
|
|
language(12, 0, 25);
|
|
printf("%d.\n\n", CFG.iMaxTimeDeposit);
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
if(bank.TimeBalance > CFG.iMaxTimeBalance) {
|
|
Enter(1);
|
|
/* You have exeeded your account balance. */
|
|
language(10, 0, 26);
|
|
/* Maximum allowable minutes in bank account is: */
|
|
language(12, 0, 27);
|
|
printf("%d\n", CFG.iMaxTimeBalance);
|
|
/* You are allowed to deposit: */
|
|
language(14, 0, 28);
|
|
printf("%d\n\n", CFG.iMaxTimeBalance - (bank.TimeBalance - x) );
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
Time2Go -= (x * 60);
|
|
TimeCheck();
|
|
|
|
bankset = bankhdr.hdrsize + (usernum * bankhdr.recsize);
|
|
if(fseek(pBank, bankset, 0) != 0)
|
|
WriteError("Can't move pointer there.");
|
|
|
|
fwrite(&bank, sizeof(bank), 1, pBank);
|
|
fclose(pBank);
|
|
|
|
free(temp);
|
|
}
|
|
|
|
|
|
|
|
void WithdrawTime()
|
|
{
|
|
char *temp;
|
|
int x;
|
|
|
|
temp = calloc(PATH_MAX, sizeof(char));
|
|
|
|
ReadExitinfo();
|
|
|
|
/* How much time. Minutes available to you is */
|
|
Enter(1);
|
|
language(15, 0, 23);
|
|
printf("%d: ", bank.TimeBalance);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
|
|
if((strcmp(temp, "")) == 0) {
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
x = atoi(temp);
|
|
|
|
bank.TimeWithdraw += x;
|
|
bank.TimeBalance -= x;
|
|
|
|
if(bank.TimeWithdraw > CFG.iMaxTimeWithdraw) {
|
|
Enter(1);
|
|
/* You have tried to withdraw more than the maximum limit today. */
|
|
language(10, 0, 29);
|
|
/* Maximum allowed to withdraw per day: */
|
|
language(12, 0, 30);
|
|
printf("%d.\n\n", CFG.iMaxTimeWithdraw);
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
if(x > bank.TimeBalance + x) {
|
|
Enter(1);
|
|
/* You have tried to withdraw more time than is in your bank account. */
|
|
language(10, 0, 31);
|
|
/* Current bank balance: */
|
|
language(10, 0, 32);
|
|
printf("%d.\n\n", bank.TimeBalance + x);
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
Time2Go += (x * 60);
|
|
TimeCheck();
|
|
|
|
bankset = bankhdr.hdrsize + (usernum * bankhdr.recsize);
|
|
|
|
if(fseek(pBank, bankset, 0) != 0)
|
|
WriteError("Can't move pointer there.");
|
|
|
|
fwrite(&bank, sizeof(bank), 1, pBank);
|
|
fclose(pBank);
|
|
free(temp);
|
|
}
|
|
|
|
|
|
|
|
void DepositBytes()
|
|
{
|
|
char *temp;
|
|
int x;
|
|
|
|
temp = calloc(PATH_MAX, sizeof(char));
|
|
|
|
ReadExitinfo();
|
|
|
|
if(exitinfo.DownloadKToday <= 5) {
|
|
Enter(2);
|
|
/* You must have at least 5 bytes remaining to deposit */
|
|
language(12, 0, 22);
|
|
Enter(2);
|
|
Pause();
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
Enter(1);
|
|
/* Bytes available: */
|
|
language(15, 0, 36);
|
|
printf("%lu: ", exitinfo.DownloadKToday);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
|
|
if((strcmp(temp, "")) == 0) {
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
x = atoi(temp);
|
|
bank.KByteDeposit += x;
|
|
bank.KByteBalance += x;
|
|
|
|
if(bank.KByteDeposit > CFG.iMaxByteDeposit * 1000) {
|
|
Enter(1);
|
|
/* You have tried to deposit more than the maximum limit today. */
|
|
language(10, 0, 25);
|
|
Enter(1);
|
|
colour(12, 0);
|
|
/* Maximum allowed kilobytes to deposit per day: */
|
|
language(12, 0, 33);
|
|
printf("%d.\n\n", CFG.iMaxByteDeposit);
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
if(bank.KByteBalance > CFG.iMaxByteBalance * 1000) {
|
|
Enter(1);
|
|
/* You have exeeded your account balance. */
|
|
language(10, 0, 34);
|
|
Enter(1);
|
|
/* Maximum allowable kilobytes in bank account is: */
|
|
language(12, 0, 35);
|
|
printf("%d\n", CFG.iMaxByteBalance);
|
|
colour(14, 0);
|
|
/* You are allowed to deposit: */
|
|
language(14, 0, 28);
|
|
printf("%d\n\n", CFG.iMaxByteBalance - (bank.KByteBalance - x) );
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
exitinfo.DownloadKToday -= x;
|
|
WriteExitinfo();
|
|
|
|
bankset = bankhdr.hdrsize + (usernum * bankhdr.recsize);
|
|
|
|
if(fseek(pBank, bankset, 0) != 0)
|
|
WriteError("Can't move pointer there.");
|
|
|
|
fwrite(&bank, sizeof(bank), 1, pBank);
|
|
fclose(pBank);
|
|
free(temp);
|
|
}
|
|
|
|
|
|
|
|
void WithdrawBytes()
|
|
{
|
|
char *temp;
|
|
int x;
|
|
|
|
temp = calloc(PATH_MAX, sizeof(char));
|
|
|
|
ReadExitinfo();
|
|
|
|
Enter(1);
|
|
/* How many bytes. Bytes available to you is */
|
|
language(15, 0, 36);
|
|
printf("%d: ", bank.KByteBalance);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
|
|
if((strcmp(temp, "")) == 0) {
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
x = atoi(temp);
|
|
bank.KByteWithdraw += x;
|
|
bank.KByteBalance -= x;
|
|
|
|
if(bank.KByteWithdraw > CFG.iMaxByteWithdraw * 1000) {
|
|
Enter(1);
|
|
/* You have tried to withdraw more than the maximum limit today. */
|
|
language(10, 0, 29);
|
|
Enter(1);
|
|
colour(12, 0);
|
|
/* Maximum allowed to withdraw per day: */
|
|
language(12, 0, 30);
|
|
printf("%d bytes.\n\n", CFG.iMaxByteWithdraw);
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
if(x > bank.KByteBalance + x) {
|
|
Enter(1);
|
|
/* You have tried to withdraw more time than is in your bank account. */
|
|
language(10, 0, 31);
|
|
Enter(1);
|
|
colour(12, 0);
|
|
/* Current bank balance: */
|
|
language(12, 0, 32);
|
|
printf("%d.\n\n", bank.KByteBalance + x);
|
|
Pause();
|
|
fclose(pBank);
|
|
free(temp);
|
|
return;
|
|
}
|
|
|
|
exitinfo.DownloadKToday += x;
|
|
WriteExitinfo();
|
|
|
|
bankset = bankhdr.hdrsize + (usernum * bankhdr.recsize);
|
|
|
|
if(fseek(pBank, bankset, 0) != 0)
|
|
WriteError("Can't move pointer there.");
|
|
|
|
fwrite(&bank, sizeof(bank), 1, pBank);
|
|
fclose(pBank);
|
|
free(temp);
|
|
}
|
|
|
|
|