/* $VER: bbsDoors.rexx 8.3 (19.12.94)
copyright 1993-94 Richard Lee Stockton
FREELY DISTRIBUTABLE
Thanks to Matt English for "Jump.rexx"
*/

IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
IF ~SHOW('P','QuickSortPort') THEN EXIT 666

SIGNAL ON BREAK_C
SIGNAL ON FAILURE
SIGNAL ON SYNTAX
OPTIONS FAILAT 999999
CALL TIME('R')

ARG maxtime name pw
IF ~DATATYPE(maxtime,'N') THEN maxtime=3000

namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
IF ADDRESS()='BAUD' THEN
  DO
    frombb=1
    CR='0D'x
  END
ELSE
  DO
    frombb=0
    CR=''
  END

figarg='s:CONFIG.BBS'
IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
x=OPEN(f,figarg,'R')
IF x=0 THEN
  DO
    SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'CR
    EXIT(20)
  END
lynes.=''
DO i=1 TO 6
  lynes.i=READLN(f)
END
CALL CLOSE(f)
compos=POS('/*',lynes.1)
IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
bbsname=STRIP(lynes.1)
sysop  =WORD(lynes.2,1)
bbspath=WORD(lynes.6,1)
IF ~EXISTS(bbspath) THEN
  DO
    SAY bbspath 'does not exist!'CR
    CALL SETCLIP('BBS_STAT')
    EXIT(20)
  END
testchar=RIGHT(bbspath,1)
IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
IF GETCLIP('BBS_path')='' THEN CALL SETCLIP('BBS_path',bbspath)
CALL PRAGMA('D',bbspath'rexxDoors')
IF ARG()=0 THEN
  DO
    SAY
    SAY '                       bbsDoors.rexx'
    SAY '               Original by Matt English 9-30-92'
    SAY '            Alterations by RLS through 11-25-94'
    SAY
  END
IF name='' THEN
  DO
    SAY
    SAY
    options prompt' Are you 'sysop' ? Y or n > '
    pull answer
    if answer='Y' | answer='' then name=sysop
    else DO
      SAY
      options prompt' Please enter your name > '
      pull name
      name=strip(name)
      name=translate(name,'_',' ')
      if name='' then CALL bye
    END
    SAY
  END
file=bbspath'Users/'name
IF ~EXISTS(file) THEN
  DO
    SAY  CR
    SAY 'I can''t find' name 'on the users list!'CR
    SAY 'You should log on to the BBS before you try this!'CR
    CALL delay(100)
    CALL bye
  END

colorflag=0
userfile=bbspath'Users/'name
CALL OPEN(data,userfile,'r')
DO i=1 TO 20
  line=readln(data)
  IF i=5 THEN password=line
  IF i=8 THEN
    IF FIND(line,'COLOR')>0 THEN colorflag=1
  IF i=18 THEN winnings=WORD(line,1)
  IF i=20 THEN level=WORD(line,1)
  END
CALL close(data)
IF ~DATATYPE(winnings,'N') THEN winnings=0

def='[0m';bak2='[42m';pen3='[33m'
IF colorflag=0 THEN
  DO
    def='';bak2='';pen3=''
  END

IF pw~=password THEN
  DO
    passprompt=' 'pen3'Please Enter Password: [30m'
    DO tries=1 TO 3
      OPTIONS PROMPT passprompt
      PULL newpassword
      SAY '[0m'CR
      IF(password=newpassword) THEN LEAVE tries; /* correct password */
      IF tries=3 THEN
        DO
          SAY CR
          SAY 'Access terminated.'CR
          SAY '*** Bad password ***' newpassword '***'CR
          CALL bye
        END
      passprompt='Incorrect.  Password: '
    END
    SAY CR
    SAY' OK, 'name' here we go....'CR
    SAY CR
  END

CALL sortdoors()
temp=1
played=0
DO doorloop=1
  IF temp=0 THEN
    DO
      IF played THEN
        DO
          doors.0=''
          CALL sortdoors()
        END
      SAY CR
      SAY CENTER('- Number of accesses per file -',75)||CR
    END
  CALL showtime()
  SAY pen3||LEFT('-',75,'-')||def||CR
  DO jd=1 TO jdoors.0
    IF temp=0 THEN SAY jdoors.jd.0||CR
    ELSE SAY jdoors.jd||CR
  END
  SAY pen3||LEFT('-',75,'-')||def||CR
  IF temp=0 THEN
    DO
      OPTIONS PROMPT '                                 'pen3'Press RETURN 'def
      PULL junk
      temp=1
      SAY CR
      ITERATE doorloop
    END
  arg='Menu'
  CALL postuser()
  temp=getinput(1 0 pen3'Select Application Number. 0=Stats > 'def)
  IF temp=0 THEN ITERATE doorloop
  IF ~DATATYPE(temp,'N') | temp<1 | temp>doors.0 THEN CALL bye
  arg=doors.temp
  IF GETCLIP('BBS_door')=arg | GETCLIP('BBS_localdoor')=arg THEN
    DO
      SAY 'That door is in use!  Try again in a few minutes...'CR
      ITERATE doorloop
    END
  played=1
  IF frombb THEN CALL SETCLIP('BBS_door',arg)
  ELSE CALL SETCLIP('BBS_localdoor',arg)
  CALL Increment.rexx(bbspath'rexxDoors/'arg)
  savewinnings=0
  testwin=''
  IF frombb THEN
    DO
      CALL send2log(arg 'at' TIME('C'))
      CALL SETCLIP('BBS_winnings')
      timeleft=TRUNC(maxtime-TIME('E'))
      IF UPPER(arg)='ONE_ARMED_BANDIT.REXX' THEN
        IF getinput(1 1 'Play for this sessions time in seconds? (Ny) > ')='Y' THEN
          DO
            savewinnings=winnings
            IF savewinnings=0 THEN savewinnings=1
            winnings=timeleft
            SAY 'Playing for REAL seconds, not wimpy play-dollars!'CR
          END
      CALL postuser()
    END
  ELSE CALL TIME('R')
  comm='CALL' arg'('TRANSLATE(name,'_','-') winnings savewinnings colorflag maxtime-TIME('E')-42')'
  INTERPRET comm
  IF frombb THEN
    DO
      testwin=GETCLIP('BBS_winnings')
      IF DATATYPE(testwin,'N') THEN
        DO
          IF savewinnings>0 THEN
            DO
              IF testwin>7200 THEN
                DO
                  SAY 'Although you won' TRUNC(testwin/60) 'minutes, the maximum session time is 120 minutes.'CR
                  testwin=7200
                END
              maxtime=TRUNC(testwin+TIME('E'))
              CALL SETCLIP('BBS_maxtime',maxtime)
              winnings=savewinnings
            END
          ELSE
            DO
              winnings=testwin
              CALL SETCLIP('BBS_winnings',winnings)
            END
        END
      CALL SETCLIP('BBS_door')
    END
  ELSE CALL SETCLIP('BBS_localdoor')
END


sortdoors:
IF ~DATATYPE(jdoors.0,'W') THEN doors.0=0
IF WORDS(SHOWDIR(bbspath'rexxDoors','F'))~=doors.0 THEN
  DO
    played=0
    jdoors.=''
    doorlist=SHOWDIR(bbspath'rexxDoors','F')
    doors.=''
    doors.0=WORDS(doorlist)
    DO i=1 TO doors.0
      doors.i=WORD(doorlist,i)
    END
    CALL QSORT(1,doors.0,doors)
    jdoors.0=doors.0%3
    IF (doors.0//3)>0 THEN jdoors.0=jdoors.0+1
    DO i=1 TO jdoors.0
      DO j=0 TO 2
        k=i+j*jdoors.0
        IF k<=doors.0 THEN
          DO
            jdoors.i=jdoors.i' 'LEFT(RIGHT(k,3)'.' LEFT(doors.k,LENGTH(doors.k)-5),24)
            dcount=WORD(STATEF(bbspath'rexxDoors/'doors.k),8)
            jdoors.i.0=jdoors.i.0||LEFT(RIGHT(dcount,5) LEFT(doors.k,LENGTH(doors.k)-5),24)' '
          END
      END
    END
  END
RETURN 0


send2log:
PARSE ARG sendline
IF ~frombb THEN RETURN
logfile=bbspath'Logs/log.'DATE('S')    /* daily logs */
fl='W'
IF EXISTS(logfile) THEN fl='A'
IF ~OPEN('log',logfile,fl) THEN
  DO
    IF ~OPEN('log',logfile,fl) THEN
      DO
        SAY 'failed to open log file'CR
        RETURN
     END
  END
CALL WRITELN('log','bbsDoors:' sendline)
CALL CLOSE('log')
RETURN


getinput:
PARSE ARG upflag' 'oneflag' 'pline
CALL checkdcd()
OPTIONS PROMPT pline
PARSE PULL inarg
inarg=STRIP(inarg)
IF upflag THEN inarg=UPPER(inarg)
IF oneflag THEN inarg=LEFT(inarg,1)
inarg=cleanstring(0':'inarg)
CALL checktime()
RETURN inarg


showtime:
IF ~frombb THEN RETURN
mins=TIME('E')%60
secs=TRUNC(TIME('E')//60)+1
IF secs>59 THEN secs=59
IF secs<10 THEN secs='0'secs
line=' Time:  Used' mins':'secs
mins=(maxtime-TIME('E'))%60
secs=TRUNC((maxtime-TIME('E'))//60)
IF secs<10 THEN secs='0'secs
line=line'   Remaining' mins':'secs
SAY def||line||CR

checktime:
IF ~frombb THEN RETURN
IF TIME('E')>maxtime THEN EXIT 0
IF TIME('E')>(maxtime-120) THEN SAY '*** Less than 2 minutes left! ***'CR
MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||'[30m'||'[41m'||' 'name' level 'level' '||'[0m'
CALL checkdcd()
RETURN


waiting:
CALL checktime()
IF waitchar='Q' THEN
  DO
    waitchar=''
    RETURN
  END
waitchar=''
IF nonstop=1 THEN RETURN
OPTIONS PROMPT pen3'                          RETURN=Continue 'def
PULL waitchar
CALL checkdcd()
RETURN


checkdcd:
IF ~frombb THEN RETURN
dcd
IF RC=0 THEN
  DO
    DO dcds=1 TO 3  /* 5 second delay */
      CALL DELAY(50)
      dcd
      IF RC~=0 THEN RETURN
    END
    dcd
    IF RC=0 THEN EXIT
  END
xmsg=GETCLIP('BBS_MESSAGE')
IF xmsg~='' THEN
  DO
    CALL SETCLIP('BBS_MESSAGE')
    SAY CR
    SAY bak2' Message From BBBBS: 'def||CR
    SAY xmsg||CR
    SAY CR
    CALL waiting()
  END
IF POS('G',GETCLIP('BBS_COMMAND'))>0 THEN EXIT
RETURN


strip_ansi:
PARSE ARG aline 
n=POS('1B'x,aline)
DO WHILE n>0
  DO k=2
    IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
      leave k
  END
  aline=DELSTR(aline,n,k+1)
  n=POS('1B'x,aline)
END
RETURN aline


cleanstring:
PARSE ARG nflag':'cstr
IF nflag=1 THEN
  DO
    cstr=COMPRESS(cstr,"'`")
    cstr=TRANSLATE(cstr,,namemask)
    cstr=SPACE(cstr,1,'_')
    RETURN cstr
  END
bot=XRANGE(,'1F'x)
IF nflag=2 THEN bot=COMPRESS(bot,'1B'x)  /* ESC for ANSI */
ELSE cstr=strip_ansi(cstr)
top=XRANGE('7F'x)
cstr=COMPRESS(cstr,bot||top)
IF nflag=0 THEN cstr=STRIP(cstr)
RETURN cstr


postuser:
IF ~frombb | ~SHOW('P','BBSPOST') THEN RETURN
ptext=GETCLIP('BBSPOST4')
IF WORDS(ptext)>4 THEN ptext=LEFT(ptext,WORDINDEX(ptext,5)-1)
ptext=STRIP(ptext)
ptext=CENTER(ptext'   Door:' arg,74)
CALL SETCLIP('BBSPOST4',ptext)
ADDRESS BBSPOST 'UPDATE'
RETURN


bye:
BREAK_C:
IF frombb THEN CALL SETCLIP('BBS_door')
ELSE CALL SETCLIP('BBS_localdoor')
SAY CR
EXIT


FAILURE:
SYNTAX:
lin.1='[36m'ERRORTEXT(RC)'[0m'
lin.2=SIGL-1     SOURCELINE(SIGL-1)
lin.3=SIGL '[36m'SOURCELINE(SIGL)'[0m'
lin.4=SIGL+1     SOURCELINE(SIGL+1)
DO er=1 TO 4
  IF level>sysoplevel | ~frombb THEN SAY 'bbsDoors:' lin.er||CR
  IF frombb THEN CALL send2log(lin.er)
END
EXIT

/* bbsDoors.rexx */
