Metropoli BBS
VIEWER: bankedit.pps MODE: TEXT (CP437)
'┌──────────────────────────────────────────────────────────────────┐
'│ BANKEDIT.PPS - Program to access BANK.DBF and edit information   │
'│                                                                  │
'│ Written by Dan Shore                                             │
'│                                                                  │
'└──────────────────────────────────────────────────────────────────┘
' To install:
'
'    1) Edit your CMD.LST file(s) to add this:
'
'                             Charges Per     PPE/MNU File Specification -or-
'            Command    Sec  Minute    Use    Keystroke Substitution
'        ══════════════ ═══ ═════════════════ ═════════════════════════════════
'     1) BANKEDIT       110        0        0 C:\PCB\PPE\BANK\BANKEDIT.PPE
'
'       Note: You may have to change the pathname to the PPE.
'       Note: You may have to change the security level of the PPE.
'
'
'    ***  Make sure you have BANKEDIT, BANKPACK, BANK2 & BANK
'         all in the SAME directory!!!!!
'─────────────────────────────────────────────────────────────────────────────
'
'  Declare our variables
'
STRING main_prompt             ' Generic prompt
STRING back_space              ' Backspace
STRING key                     ' User key hit
STRING user_input              ' Generic user input
STRING user_input2             ' Generic user input #2
STRING pcb_user_name           ' Username
STRING hold                    ' Generic String Var
STRING hold2                   ' Generic String Var
STRING temp                    ' Generic String Var
STRING last_date               ' Last Date used DB
STRING current_char            ' Twirly
STRING char1                   ' Twirly
STRING char2                   ' Twirly
STRING char3                   ' Twirly
STRING char4                   ' Twirly
STRING bank_txt                ' Text file for all user prompts

INT x                          ' Generic Int
INT line_count                 ' For display of sequential user list
INT bank_time                  ' Bank Time
INT dot_number                 ' Twirly

INTEGER bank_bytes             ' Bank Bytes
INTEGER size                   ' Use for diplaying numerics with commas

FLOAT time_now                 ' Twirly
FLOAT prev_ti                  ' Twirly

BOOLEAN partial_search_found   ' Flag used when searching partial username
BOOLEAN found_user             ' Flag when a user is found in DB
BOOLEAN is_key                 ' Flag when user hit a key
BOOLEAN first_time             ' Flag for first time display
BOOLEAN partial_name           ' Flag used when seaching partial
BOOLEAN exact_name             ' Flag used when searching exact
BOOLEAN list_names             ' Flag used when listing users in DB
BOOLEAN non_stop               ' Flag used when in NS mode when listing Users
BOOLEAN did_delete             ' Flag when a user is deleted
BOOLEAN add_name               ' Flag when adding a user
'────────────────────────────────────────────────────────────────────────────
DECLARE PROCEDURE CHECK_FOR_KEY (VAR BOOLEAN is_key)
DECLARE PROCEDURE ADD_COMMAS (VAR STRING hold2)

*$USEFUNCS

BEGIN

   CLS
   char1 = "\"
   char2 = "|"
   char3 = "/"
   char4 = "-"
   back_space = CHR(8) + CHR(32) + CHR(8)

   '
   '  Define external text file - Support Language Files
   '
   bank_txt = PPEPATH() + "BANKTXT2" + LANGEXT()

   GOSUB OPEN_DATABASE
   GOSUB OPEN_INDEX
   GOSUB EDIT_FIND_USER
   GOTO EXIT_PROG

END

'───────────────────────────────
'  Subroutines for BANKEDIT.PPE
'───────────────────────────────

'
'  Display userlist from database, and also used for sequential
'  searching routines.
'
:SEQ_DISP_USER

   is_key = FALSE
   IF (DTOP(0) = FALSE) THEN
     NEWLINE
     SPRINTLN READLINE(bank_txt, 1)
     NEWLINE
     WAIT
     GOTO EXIT_PROG
   ELSE
     IF (!list_names) PRINT READLINE(bank_txt, 2)
     FOR x = 1 to DRECCOUNT(0)
       DGO 0, x
       hold = TRIM(DGET(0, DNAME(0,1))," ")
       IF (!list_names) THEN
         GOSUB MARKTIME
         IF (INSTR(hold, user_input) > 0) THEN
           PRINT back_space
           partial_search_found = TRUE
           NEWLINE
           PRINTLN READLINE(bank_txt, 3), hold
           user_input2 = NOCHAR()
           main_prompt = READLINE(bank_txt, 4)
           INPUTYN main_prompt, user_input2, @X0E
           IF (user_input2 = "" || user_input2 = "N" || user_input2 = NOCHAR()) THEN
             found_user = TRUE
             BREAK
           ELSE
             NEWLINE
             PRINT READLINE(bank_txt, 5)
           END IF
         ELSE
           CHECK_FOR_KEY(is_key)
           IF (is_key) BREAK
         END IF
       ELSE
         '
         '  Print out number and username
         '
         PRINT SPACE (5-LEN(STRING(x))), "@X0F", x, ". @X03", hold
         IF (!(x%2)) THEN
           NEWLINE
           INC line_count
         ELSE
           PRINT SPACE(33-LEN(hold))
         END IF

         '
         '  If non-stop mode, check for abort (enter key)
         '
         IF (non_stop) THEN
           CHECK_FOR_KEY(is_key)
           IF (is_key) THEN
             non_stop = FALSE
             BREAK
           END IF
         END IF

         IF (line_count > 21 && !non_stop) THEN
           main_prompt = READLINE(bank_txt, 6)
           user_input2 = YESCHAR()
           INPUTSTR main_prompt, user_input2, @X0E, 2, "NSY", UPCASE+ERASELINE
           IF (user_input2 = "N" || user_input2 = NOCHAR()) THEN
             BREAK
           ELSE IF (user_input2 = "NS") THEN
             NEWLINE
             PRINTLN READLINE(bank_txt, 7)
             DELAY 18
             NEWLINE
             non_stop = TRUE
           ELSE
             line_count = 0
           END IF
         END IF
       END IF
     NEXT
     IF (!found_user) DGO 0, 1
     PRINT back_space
     NEWLINE
   END IF
   RETURN

'
'  Subroutine to find/add username in index
'
:FIND_ADD_USER
   '
   '  Get the current users name
   '
   DSEEK 0, pcb_user_name
   IF (DCHKSTAT(0) = 0) THEN
     NEWLINE
     PRINTLN READLINE(bank_txt, 8)
     NEWLINE
     found_user = TRUE
   ELSE
     IF (!add_name) THEN
       NEWLINE
       PRINTLN READLINE(bank_txt, 9)
       NEWLINE
     END IF
     found_user = FALSE
     DELAY 18
   END IF
   RETURN

'
'
'
:EDIT_FIND_USER

   found_user = FALSE
   partial_name = FALSE
   exact_name = FALSE
   list_names = FALSE
   partial_search_found = FALSE
   non_stop = FALSE
   add_name = FALSE
   user_input = ""
   NEWLINE
   DISPFILE PPEPATH()+"EDMENU", GRAPH+LANG
   NEWLINE
   main_prompt = READLINE(bank_txt, 10)
   INPUTSTR main_prompt, user_input, @X0E, 1, "ABCD", LFAFTER+UPCASE+GUIDE+FIELDLEN
   SELECT CASE (user_input)
     CASE "A"
       partial_name = TRUE
     CASE "B"
       exact_name = TRUE
     CASE "C"
       list_names = TRUE
     CASE "D"
       add_name = TRUE
     DEFAULT
       GOTO EXIT_PROG
   END SELECT
   NEWLINE

   '
   '  If not listing all users in database, get input of
   '  name to search for
   '
   IF (!list_names && !add_name) THEN
     user_input = ""
     IF (exact_name) THEN
       main_prompt = READLINE(bank_txt, 11)
     ELSE IF (partial_name) THEN
       main_prompt = READLINE(bank_txt, 12)
     END IF
     INPUTSTR main_prompt, user_input, @X0E, 25, MASK_ASCII(), LFAFTER+UPCASE+GUIDE+FIELDLEN
     IF (user_input = "") THEN
       NEWLINE
       GOTO EDIT_FIND_USER
     END IF
   END IF

   '
   '  Start searching for username
   '
   IF (partial_name) THEN
     user_input = TRIM(user_input, " ")
     GOSUB SEQ_DISP_USER
   ELSE IF (exact_name) THEN
     pcb_user_name = user_input + SPACE(25-LEN(user_input))
     GOSUB FIND_ADD_USER
     IF (!found_user) GOTO EDIT_FIND_USER
   ELSE IF (list_names) THEN
     STARTDISP FNS
     line_count = 0
     GOSUB SEQ_DISP_USER
     STARTDISP FCL
     GOTO EDIT_FIND_USER
   ELSE IF (add_name) THEN
     GOSUB ADD_NEW_USER
     GOTO EDIT_FIND_USER
   END IF

   '
   '  See if the search found a username match
   '
   IF (found_user) THEN
     IF (exact_name) THEN
       PRINTLN READLINE(bank_txt, 13), pcb_user_name
     ELSE IF (!partial_search_found) THEN
       PRINTLN READLINE(bank_txt, 13), hold
     END IF
     user_input = YESCHAR()
     main_prompt = READLINE(bank_txt, 14)
     INPUTYN main_prompt, user_input, @X0A
     IF (user_input = "Y" || user_input = YESCHAR()) THEN
       first_time = FALSE
       GOTO EDIT_USER_INFO
       GOTO EDIT_FIND_USER
     ELSE
       NEWLINE
       GOTO EDIT_FIND_USER
     END IF
   ELSE
     IF (!is_key) THEN
       IF (partial_search_found) THEN
         NEWLINE
         PRINTLN READLINE(bank_txt, 15), user_input
         NEWLINE
       ELSE
         NEWLINE
         PRINTLN READLINE(bank_txt, 16), user_input
         NEWLINE
       END IF
     END IF
     GOTO EDIT_FIND_USER
   END IF
   NEWLINE
   RETURN

'
'
'
:ADD_NEW_USER


   user_input = ""
   main_prompt = READLINE(bank_txt, 17)
   INPUTSTR main_prompt, user_input, @X0E, 25, MASK_ASCII(), LFAFTER+UPCASE+GUIDE+FIELDLEN
   IF (user_input = "") RETURN
   pcb_user_name = TRIM(user_input," ")
   NEWLINE
   PRINT READLINE(bank_txt, 18)
   GOSUB FIND_ADD_USER
   IF (!found_user) THEN
     PRINT CHR(13)
     CLREOL
     PRINTLN "@X0E", READLINE(bank_txt, 19), MIXED(pcb_user_name)
     NEWLINE
     PRINT READLINE(bank_txt, 20)
     x = DRECCOUNT(0) + 1
     DNEW 0
     DLOCKR 0, x
     '
     '  Set the "starting" user info and "add" it to the DB
     '
     DPUT 0, "usr_name", pcb_user_name
     DPUT 0, "banktime", 0
     DPUT 0, "bankbytes", 0
     DPUT 0, "last_d_acc", "00-00-00"
     DPUT 0, "bytewddate", "00-00-00"
     DPUT 0, "timewddate", "00-00-00"
     DPUT 0, "bytewd", 0
     DPUT 0, "timewd", 0
     DADD 0
     FPUTLN 7, "###──> " , READLINE(bank_txt, 19)
     DELAY 9
     PRINT READLINE(bank_txt, 21)
     DELAY 36
     NEWLINES 2
   ELSE
     NEWLINE
     PRINT READLINE(bank_txt, 22)
     DELAY 36
   END IF
   RETURN

'
'  Close the index file, the database file, and exit program
'
:EXIT_PROG

   DNCLOSEALL 0
   DCLOSE 0

   IF (!EXIST(PPEPATH() + "BANKPACK.PPE")) END

   IF (did_delete) THEN
     NEWLINE
     user_input = NOCHAR()
     main_prompt = READLINE(bank_txt, 23)
     INPUTYN main_prompt, user_input, @X0E
     NEWLINE
     IF (user_input = "Y" || user_input = YESCHAR()) THEN
       CALL PPEPATH() + "BANKPACK.PPE"
     ELSE
       NEWLINE
       PRINTLN READLINE(bank_txt, 24)
       PRINT READLINE(bank_txt, 25)
       WHILE (key = "") DO
         key = INKEY()
         DELAY 3
       END WHILE
     END IF
   END IF
   END

'
'
'
:SHOW_INFO

   CLS
   NEWLINE
   PRINT READLINE(bank_txt, 26)
   IF (exact_name) THEN
     PRINTLN pcb_user_name
   ELSE IF (partial_search_found) THEN
     PRINTLN hold
   END IF

   PRINT READLINE(bank_txt, 27)
   last_date = DGET (0,"last_d_acc")
   IF (last_date = "00-00-00" || last_date = "        ") last_date = READLINE(bank_txt, 28)
   PRINTLN last_date + SPACE(25-LEN(last_date))

   PRINT READLINE(bank_txt, 29)
   bank_time = DGET (0,"banktime")
   size = bank_time
   ADD_COMMAS (hold2)
   PRINTLN hold2 + SPACE(20-LEN(hold2))

   PRINT READLINE(bank_txt, 30)
   PRINTLN DGET (0,"timewddate")

   PRINT READLINE(bank_txt, 31)
   bank_time = DGET (0,"timewd")
   size = bank_time
   ADD_COMMAS (hold2)
   PRINTLN hold2 + SPACE(20-LEN(hold2))

   PRINT READLINE(bank_txt, 32)
   bank_bytes = DGET (0,"bankbytes")
   size = bank_bytes
   ADD_COMMAS (hold2)
   PRINTLN hold2 + SPACE(20-LEN(hold2))

   PRINT READLINE(bank_txt, 33)
   PRINTLN DGET (0,"bytewddate")

   PRINT READLINE(bank_txt, 34)
   bank_bytes = DGET (0,"bytewd")
   size = bank_bytes
   ADD_COMMAS (hold2)
   PRINTLN hold2 + SPACE(20-LEN(hold2))

   IF (!first_time) THEN
     GOSUB HELP_INFO
   ELSE
     ANSIPOS 1, 12
   END IF
   RETURN

'
'  Subroutine to update/edit a record
'
:EDIT_USER_INFO

   '
   '  Show users current bank info
   '
   GOSUB SHOW_INFO
   NEWLINE

   WHILE (1) DO
     user_input = ""
     main_prompt = READLINE(bank_txt, 35)
     INPUTSTR main_prompt, user_input, @X07, 2, "ABDHKLTWZ", UPCASE+GUIDE+FIELDLEN+ERASELINE
     IF (user_input != "H") BREAK
     ANSIPOS 45, 2
     PRINT READLINE(bank_txt, 36)
     GOSUB HELP_INFO
     ANSIPOS 1, 13
   END WHILE

   SELECT CASE (user_input)

     '
     '  Zero out all user values
     '
     CASE "Z"
       user_input = NOCHAR()
       main_prompt = READLINE(bank_txt, 37)
       INPUTYN main_prompt, user_input, @X0E
       IF (user_input = "N" || user_input = NOCHAR()) GOTO EDIT_USER_INFO

       DPUT 0,"banktime", 0
       DPUT 0,"bankbytes", 0
       DPUT 0,"last_d_acc", "00-00-00"
       DPUT 0, "bytewddate", "00-00-00"
       DPUT 0, "timewddate", "00-00-00"
       DPUT 0, "bytewd", 0
       DPUT 0, "timewd", 0
       GOTO EDIT_USER_INFO

     '
     '  Delete User
     '
     CASE "K"
       user_input = "N"
       main_prompt = READLINE(bank_txt, 38) + MIXED(RTRIM(DGET (0, "usr_name")," ")) + " "
       INPUTYN main_prompt, user_input, @X0E
       IF (user_input = "N" || user_input = NOCHAR()) GOTO EDIT_USER_INFO
       DDELETE 0
       did_delete = TRUE
       NEWLINE
       PRINT READLINE(bank_txt, 39)
       WHILE (key = "") DO
         key = INKEY()
         DELAY 3
       END WHILE
       GOTO EDIT_USER_INFO

     '
     '  Bank Bytes withdrawn today
     '
     CASE "BW"
       user_input = ""
       main_prompt = READLINE(bank_txt, 40)
       INPUTSTR main_prompt, user_input, @X0E, 9, "0123456789", LFAFTER+GUIDE+FIELDLEN
       IF (user_input != "")  DPUT 0, "bytewd", TOINTEGER(user_input)
       GOTO EDIT_USER_INFO

     '
     '  Bank Time withdrawn today
     '
     CASE "TW"
       user_input = ""
       main_prompt = READLINE(bank_txt, 41)
       INPUTSTR main_prompt, user_input, @X0E, 3, "0123456789", LFAFTER+GUIDE+FIELDLEN
       IF (user_input != "")  DPUT 0, "timewd", TOINT(user_input)
       GOTO EDIT_USER_INFO

     '
     '  Last Time Withdraw Date
     '
     CASE "BD"
       WHILE (1) DO
         user_input = ""
         main_prompt = READLINE(bank_txt, 42)
         INPUTSTR main_prompt, user_input, @X0E, 6, "0123456789", LFAFTER+GUIDE+FIELDLEN
         IF (user_input != "" && LEN(user_input) = 6) THEN
           user_input = MID(user_input,1,2) + "-" + MID(user_input,3,2) + "-" + MID(user_input,5,2)
           DPUT 0, "bytewddate", user_input
           BREAK
         END IF
       END WHILE
       GOTO EDIT_USER_INFO

     '
     '  Last Time Withdraw Date
     '
     CASE "TD"
       WHILE (1) DO
         user_input = ""
         main_prompt = READLINE(bank_txt, 43)
         INPUTSTR main_prompt, user_input, @X0E, 6, "0123456789", LFAFTER+GUIDE+FIELDLEN
         IF (user_input != "" && LEN(user_input) = 6) THEN
           user_input = MID(user_input,1,2) + "-" + MID(user_input,3,2) + "-" + MID(user_input,5,2)
           DPUT 0, "timewddate", user_input
           BREAK
         END IF
       END WHILE
       GOTO EDIT_USER_INFO

     '
     '  Last Access Date
     '
     CASE "LA"
       WHILE (1) DO
         user_input = ""
         main_prompt = READLINE(bank_txt, 44)
         INPUTSTR main_prompt, user_input, @X0E, 6, "0123456789", LFAFTER+GUIDE+FIELDLEN
         IF (user_input != "" && LEN(user_input) = 6) THEN
           user_input = MID(user_input,1,2) + "-" + MID(user_input,3,2) + "-" + MID(user_input,5,2)
           DPUT 0, "last_d_acc", user_input
           BREAK
         END IF
       END WHILE
       GOTO EDIT_USER_INFO

     '
     '  Bank Time
     '
     CASE "BT"
       user_input = ""
       main_prompt = READLINE(bank_txt, 45)
       INPUTSTR main_prompt, user_input, @X0E, 3, "0123456789", LFAFTER+GUIDE+FIELDLEN
       IF (user_input != "") THEN
         bank_time = TOINT(user_input)
         DPUT 0, "banktime", bank_time
       END IF
       GOTO EDIT_USER_INFO

     '
     '  Bank Bytes
     '
     CASE "BB"
       user_input = ""
       main_prompt = READLINE(bank_txt, 46)
       INPUTSTR main_prompt, user_input, @X0E, 9, "0123456789", LFAFTER+GUIDE+FIELDLEN
       IF (user_input != "") THEN
         bank_bytes = TOINTEGER(user_input)
         DPUT 0, "bankbytes", bank_bytes
       END IF
       GOTO EDIT_USER_INFO

   END SELECT
   CLS
   GOTO EDIT_FIND_USER

'
'
'
:HELP_INFO

   ANSIPOS 45, 3
   PRINT READLINE(bank_txt, 47)
   ANSIPOS 45, 4
   PRINT READLINE(bank_txt, 48)
   ANSIPOS 45, 5
   PRINT READLINE(bank_txt, 49)
   ANSIPOS 45, 6
   PRINT READLINE(bank_txt, 50)
   ANSIPOS 45, 7
   PRINT READLINE(bank_txt, 51)
   ANSIPOS 45, 8
   PRINT READLINE(bank_txt, 52)
   ANSIPOS 45, 9
   PRINT READLINE(bank_txt, 53)
   ANSIPOS 45, 10
   PRINT READLINE(bank_txt, 54)
   ANSIPOS 45, 11
   PRINT READLINE(bank_txt, 55)
   ANSIPOS 1, 12
   first_time = TRUE
   RETURN

'
'  Open the datebase
'
:OPEN_DATABASE

   DOPEN 0, PPEPATH()+"bank", FALSE
   RETURN

'
'  Subroutine to open the index file
'
:OPEN_INDEX

   DNOPEN 0, PPEPATH()+"bank"
   RETURN

'
'  Add Commas to display of numeric information
'
PROCEDURE ADD_COMMAS (VAR STRING hold2)

   temp = TRIM(STRING(size)," ")
   x = LEN(temp)
   '
   '  If the number is less than 4 characters in length, no need to add
   '  any commas to it.
   '
   IF (x < 4) THEN
     hold2 = temp
     RETURN
   END IF
   '
   '  Left pad the string with spaces (easy to add commas this way)
   '
   temp = SPACE(9-x) + temp

   IF (INSTR(temp,"-")) THEN
     '
     '  String has a negative symbol in it...Do not put a comma after it
     '
     IF (INSTR(MID(temp,1,3),"-")) THEN
       hold2 = MID(temp,1,3) + MID(temp,4,3) + "," + MID(temp,7,3)
     ELSE IF (INSTR(MID(temp,4,3),"-")) THEN
       hold2 = MID(temp,4,3) + MID(temp,7,3)
     END IF
   ELSE
     '
     '  Rebuild string with comma(s) in proper places
     '
     IF (MID(temp,1,3) != "   ") THEN
       hold2 = MID(temp,1,3) + "," + MID(temp,4,3) + "," + MID(temp,7,3)
     ELSE IF (MID(temp,4,3) != "   ") THEN
       hold2 = MID(temp,4,3) + "," + MID(temp,7,3)
     END IF
   END IF
   '
   '  Remove the left padded spaces we added above
   '
   hold2 = LTRIM(hold2," ")
   RETURN

ENDPROC

'
'     This is the routine to change the twirly or character
'     every second and display it to the user.  This is done so
'     the user knows the program is running (processing).
'
:MARKTIME

    time_now = TIME()

    IF (time_now - prev_ti < 1  &&  dot_number != 0) RETURN
    prev_ti = time_now
    IF (dot_number = 0) PRINT " "
    IF (dot_number > 3) dot_number = 0
    current_char = back_space + " " + back_space
    INC dot_number
    SELECT CASE (dot_number)
      CASE 1
        current_char = current_char + char1
      CASE 2
        current_char = current_char + char2
      CASE 3
       current_char = current_char + char3
      CASE 4
         current_char = current_char + char4
    END SELECT
    PRINT current_char
    current_char = ""
    RETURN

'
'  Check for user interrupt of searching process
'
PROCEDURE CHECK_FOR_KEY (VAR BOOLEAN is_key)

STRING hold3

   hold = MGETBYTE()
   hold3 = INKEY()
   IF (hold = 13 || hold = CHR(13) || hold3 = 13 || hold3 = CHR(13)) THEN
     PRINT back_space + " " + back_space
     NEWLINE
     is_key = TRUE
     DELAY 18
   END IF

END PROC
[ RETURN TO DIRECTORY ]