/*rx
**/

/* 1.0 */

PARSE ARG STARTUPMODE
STARTUPMODE=UPPER(STARTUPMODE)

Signal On BREAK_C

norm='9b'x'0m'
bold='9b'x'1m'
ital='9b'x'3m'

NL=x2c(0a)

Call Open(CON,'con:0/0/600/100/ASWPOP Log/AUTO/INACTIVE','W')

TOTMAILS=0 ; POSTOPER=0 ; POSTSTR=''

CALL GETSETTINGS

WRITELN(CON,'Started ASWPOP with mode "'STARTUPMODE'"....'NL)

IF STARTUPMODE='CONTCHECK' THEN DO FOREVER
CALL DOALL
CALL Close(MBOX) ; Call Close(POP3)
WRITELN(CON,NL||bold'ASWPOP is waiting...'norm||NL)
TEND=TIME(s)+STARTUPMODEOPTS*60
address command "c:wait "STARTUPMODEOPTS*60
END

IF STARTUPMODE='?' THEN DO
                        SAY d2c(7)||bold'ASWPOP 1.0'norm' written by Andrew Walker (andyw@enterprise.net)'
                        EXIT
                        END

IF STARTUPMODE='CONTCHECK' THEN EXIT

IF STARTUPMODE='ONCE' THEN DO
                           CALL DOALL
                           WRITELN(CON,nl||bold'Mailbox checked...quitting...'norm)
                           address command "c:wait 3"
                           EXIT
                           END

Writeln(CON,d2c(7)'ASWPOP aborting: Unknown startup mode "'STARTUPMODE'"!!!!!!')
address command "c:wait 3"
EXIT



/* PROCEDURES */

DOALL:
CALL CONNECT
CALL CHECK
IF NUM_MSG>0 THEN DO
CALL GETSIZES
CALL GETMAILS
TOTMAILS=TOTMAILS+NUM_MSG
END
RETURN

GETMAILS:
/* Get all mails waiting! */
MSGNO=1 ; DO FOREVER
GOTADD='NO'
address command "c:delete t:poptemp FORCE >NIL:"
TXT=''
Call Open(tmpo,'t:poptemp','W')
CALL GETMSG
WRITEMAIL='YES'
CALL ACTION
CALL WRITEM
WRITELN(POP3,'DELE 'MSGNO) ; IN=READLN(POP3)
MSGNO=MSGNO+1
IF MSGNO>NUM_MSG THEN BREAK
END
/* Got all mails.. quitting server and program! */
WRITELN(POP3,'QUIT')
/* Bye! */
RETURN

WRITEM:
IF WRITEMAIL='YES' THEN DO
  Call Open(tmpo,'t:poptemp','R')
    DO FOREVER
      IN=READCH(tmpo,65536)
      WRITECH(MBOX,IN)
      IF EOF(tmpo) THEN BREAK
    END
  Call Close(tmpo)
END
RETURN

GETMSG:

  IF NUM_MSG>0 THEN DO

/* Create header */

  DAY=SUBSTR(date(w),1,3)||','
  DATE=date() ; POSA=POS(' 19',DATE) ; DATE=DELSTR(DATE,(POSA+1),2)
  TIME=time() ; HEAD='From 'username'@'popserver DAY DATE TIME
   ADDY=''
   WRITELN(tmpo,HEAD)

/* Start receiving mail.. assumes mails are small to this point */

   CSIZE=MSGSIZE.MSGNO ; BIT='NO'
   WRITELN(POP3,'RETR 'MSGNO) ; IN=READLN(POP3)
   IF MSGSIZE.MSGNO<5000 THEN DO
   NSIZE=(MSGSIZE.MSGNO-100)
   IF NSIZE<10 THEN NSIZE=1
   TXT=READCH(POP3,NSIZE)
   END

/* If mail is a biggie, execute READCH loop */
   else do forever
      CSIZE=CSIZE-2000
      TXT=TXT||READCH(POP3,2000)
      IF CSIZE<2100 | LENGTH(TXT)>60000 THEN DO
                         WRITECH(tmpo,COMPRESS(TXT,d2c(13)))
                         TXT=''
                         END
      IF CSIZE<2100 THEN BREAK
   END

/* Read in remainder of msg */

   CHICKEN=1
   DO FOREVER
   TXT2=COMPRESS(READLN(POP3),d2c(13))
   TX=WORD(TXT2,1)
   IF TX='.' | TX='.'NL | COMPRESS(TX,d2c(13))='.' THEN BREAK
   else IF CHICKEN~=1 THEN TXT=TXT||NL||TXT2
        else DO
             TXT=TXT||TXT2
             CHICKEN=2
             END
   END

/* write mail to temp file */

   WRITELN(tmpo,COMPRESS(TXT,d2c(13)))

/* Seek back to beginning of temp file and extract header (stuff before
   first blank line, into a variable! */

   Call Seek(tmpo,0,B)
   HTXT='' ; DO FOREVER
   NEWT=READLN(tmpo)
   IF NEWT='' THEN BREAK
   HTXT=HTXT||NL||NEWT
   END
   Call Close(tmpo)
   CALL GETADDY
END
RETURN

/* Sizes of mails stored in MSGSIZE.1 to .NUM_MSG */

GETSIZES:
WRITELN(POP3,'list') ; IN=READLN(POP3) ; IF WORD(IN,1)~='+OK' THEN DO
                                                              ERROR='List failed'
                                                              CALL POPERROR
                                                              END
NO=1 ; DO FOREVER
MSGSIZE.NO=COMPRESS(WORD(READLN(POP3),2),'')
NO=NO+1
IF NO>NUM_MSG THEN BREAK
END
IN=READLN(POP3)
RETURN

CONNECT:

/* open mailbox */

IF ~Open(MBOX,MAILBOX,'A') THEN DO
     IF ~Open(MBOX,MAILBOX,'W') THEN DO
        ERROR='Cannot open mailbox: 'MAILBOX'!!!'
        CALL POPERROR
     END
END

/* connect to popserver */

IF ~Open(POP3,'tcp:'POPSERVER'/'POPPORT,'W') THEN DO
  ERROR='Connection to POP Server has failed!!! :-('
  CALL POPERROR
END

/* log on using settings */

IN=READLN(POP3) ; IF WORD(IN,1)~='+OK' THEN DO
                  ERROR="Oops.. this isn't a POP3 server! :o)"
                  CALL POPERROR
                  END
Writeln(POP3,'user 'USERNAME)
IN=READLN(POP3)
Writeln(POP3,'pass 'PASSWORD)

/* If password OK, would have received number of messages */

IN=READLN(POP3) ; IF WORD(IN,1)~='+OK' THEN DO
                    ERROR='Login failed..'
                    CALL POPERROR
                    END
RETURN

CHECK:

/* Suss out how many messages are waiting on the POP server */

NUM_MSG=WORD(IN,4) ; WRITELN(CON,'You have 'NUM_MSG' mails waiting!!')
IF NUM_MSG=0 THEN DO
 WRITELN(CON,'Hahahaha.. no mails for you!!!! Nobody loves you, you faggot! :o)')
 WRITELN(POP3,QUIT)
END
RETURN

POPERROR:
WRITELN(CON,bold'ASWPOP failed due to: 'norm||ERROR'!!!!')
address command "c:wait 3"
Call Close(CON)
EXIT
RETURN

ACTION:
ACTSTR='' ; ACTION=''

IF ~Open(ACTPREFS,ASWPOPPATH'/aswpop.acton','R') THEN DO
                                                       ERROR="Can't open ACTON prefs file, "ASWPOPPATH"/aswpop.acton!!!!"
                                                       CALL POPERROR
                                                       END
DO FOREVER
LN=READLN(ACTPREFS) ; WD=WORD(LN,1)
IF FIND(UPPER(WD),UPPER(SUBJ))>0 THEN BREAK
IF FIND(UPPER(WD),UPPER(ADDY))>0 THEN BREAK
IF EOF(ACTPREFS) THEN BREAK
END
IF FIND(UPPER(WD),UPPER(SUBJ))>0 THEN ACTSTR=SUBJ
IF FIND(UPPER(WD),UPPER(ADDY))>0 THEN ACTSTR=ADDY
Call Close(ACTPREFS)
IF ACTSTR~='' THEN DO
                               ACTLINE=LN
                               ACTION=UPPER(SUBWORD(ACTLINE,2,1))
                               OPTIONS=DELWORD(ACTLINE,1,2)
/* redirect */

IF ACTION='REDIRECT' THEN DO
 WRITELN(CON,'Re-directing mail from 'ADDY' to mailbox: 'WORD(OPTIONS,1)'....'NL)
 IF ~Open(RDBOX,WORD(OPTIONS,1),'A') THEN CALL Open(RDBOX,WORD(OPTIONS,1),'W')
 Call Close(tmpo)
 Call Open(tmpo,'t:poptemp','R')
    DO FOREVER
      IN=READCH(tmpo,65536)
      WRITECH(RDBOX,IN)
      IF EOF(tmpo) THEN BREAK
    END
  Call Close(RDBOX)
  Call Close(tmpo)
 WRITEMAIL='NO'
END

/* kill */

IF ACTION='KILL' THEN DO
 WRITELN(CON,"Hahaha.. you'll never see that message from the fuckwit, "ADDY', :o)')
 WRITEMAIL='NO'
 RETURN
END

/* urgent */

IF ACTION='HIGHLIGHT' THEN DO
 WRITELN(CON,'OI!!!!! Message has come in from 'ADDY', read the sucker straight away! :o)'d2c(7))
 WRITEMAIL='YES'
 RETURN
END

/* External Run */

IF ACTION='EXTERN' THEN DO
 WRITEMAIL='YES'
 OPTSTR=DELWORD(OPTIONS,1,1)
 address command "echo "ADDY" >env:FROM"
 address command "echo "SUBJ" >env:SUBJ"
 address command "echo "DATE" >env:DATE"
 IF FIND(UPPER(OPTSTR),'FILENAME') THEN DO
    POSA=FIND(UPPER(OPTSTR),'FILENAME')
    OPTSTR=DELWORD(OPTSTR,POSA,1)
    OPTSTR='t:poptemp 'OPTSTR
 END
 IF FIND(UPPER(OPTSTR),'NOWRITE')>0 THEN DO
    POSA=FIND(UPPER(OPTSTR),'NOWRITE')
    WRITEMAIL='NO'
    OPTSTR=DELWORD(OPTSTR,POSA,1)
 END
 WRITELN(CON,"Executing external, '"WORD(OPTIONS,1)"' with arguments '"OPTSTR"'!!")
 CALL Close(tmpo)
 address command WORD(OPTIONS,1) OPTSTR
 RETURN
END

/* Internal Run */

IF ACTION='INTERN' THEN DO

 WRITEMAIL='NO'
 OPTSTR=DELWORD(OPTIONS,1,1)
 WRITELN(CON,NL||"Executing internal script, '"WORD(OPTIONS,1)"'!!"||NL)
 IF ~Open(INRUN,WORD(OPTIONS,1),'R') THEN DO
                                          ERROR='Eemm.. invalid path to INTERN script, it would seem!'
                                          CALL POPERROR
                                          END
 INSCR=READCH(INRUN,65536)
 INSCR=INSCR||READLN(INRUN)
 IF EOF(INRUN)=0 THEN DO
                     ERROR='Aha! INTERN script is over 65k in size!'NL'Just what the F*CK are you doing writing something THAT big?!'
                     CALL POPERROR
                     END
 Call Close(INRUN)
 INTERPRET INSCR
 WRITELN(CON,NL||'End of internal script'||NL)
 RETURN
END

GETSETTINGS:
IF ~Open(SETTINGS,'s:aswpop.prefs','R') THEN DO
  ERROR='No settings file exists, you dumb shit! :o)'
  CALL POPERROR
  END
  DO FOREVER
  TXT=READLN(SETTINGS)
  IF WORD(TXT,1)='POPSERVER' THEN POPSERVER=WORD(TXT,2)
  IF WORD(TXT,1)='POPPORT' THEN POPPORT=WORD(TXT,2)
  IF WORD(TXT,1)='USERNAME' THEN USERNAME=WORD(TXT,2)
  IF WORD(TXT,1)='PASSWORD' THEN PASSWORD=WORD(TXT,2)
  IF WORD(TXT,1)='MAILBOX' THEN MAILBOX=WORD(TXT,2)
  IF WORD(TXT,1)='ASWPOPPATH' THEN ASWPOPPATH=WORD(TXT,2)
  if (WORD(TXT,1)='STARTUPMODE')&(STARTUPMODE='') THEN STARTUPMODE=WORD(TXT,2)
  IF WORD(TXT,1)='STARTUPMODEOPTS' THEN STARTUPMODEOPTS=WORD(TXT,2)
  IF WORD(TXT,1)='POSTPULL' THEN POSTPULL=DELWORD(TXT,1,1)
  IF EOF(SETTINGS) THEN BREAK
  END
  Call Close(SETTINGS)
RETURN

GETADDY:
   ADDY=''
   POSA=POS(NL||'From: ',HTXT)
   POSB=POS(NL,HTXT,(POSA+1))
   IF POSA=0 THEN POSA=1
   ADDY=COMPRESS(SUBSTR(HTXT,POSA,(POSB-POSA)),d2c(13))
   ADDY=COMPRESS(COMPRESS(ADDY,'<'),'>')
   POSA=POS('@',ADDY)
   IF POSA=0 THEN POSA=LENGTH(ADDY)
   SPOS=LASTPOS(' ',ADDY,POSA) ; EPOS=(LENGTH(ADDY)+1)
   ADDY=SUBSTR(ADDY,SPOS,(EPOS-SPOS))
   WORDNUM=1 ; DO FOREVER
   IF POS('@',WORD(ADDY,WORDNUM))>0 THEN ADDY=WORD(ADDY,WORDNUM)
   WORDNUM=WORDNUM+1
   IF WORDNUM>WORDS(ADDY) THEN BREAK
   END
   WRITELN(CON,ITAL||'Mail number 'MSGNO' from :'norm||bold||ADDY||norm)
   CALL GETSUB
RETURN

GETSUB:
   SUBJ=''
   POSA=POS(NL||'SUBJECT: ',UPPER(HTXT))
   POSB=POS(NL,HTXT,(POSA+1))
   IF POSB=0 THEN POSB=(LENGTH(HTXT)+1)
   IF POSA~=0 THEN DO
   SUBJ=COMPRESS(SUBSTR(HTXT,(POSA),((POSB)-(POSA))),d2c(13))
   SUBJ=DELWORD(SUBJ,1,1)
   END
   else SUBJ='<none>'
   WRITELN(CON,ITAL||'Subject :'norm||bold||SUBJ||norm)
   CALL GETDATE
RETURN

GETDATE:
   GETDATE=''
   POSA=POS(NL||'DATE: ',UPPER(HTXT))
   POSB=POS(NL,HTXT,(POSA+1))
   IF POSA~=0 THEN DO
   DATEY=COMPRESS(SUBSTR(HTXT,(POSA+1),(POSB-(POSA+1))),d2c(13))
   DATEY=DELWORD(DATEY,1,1)
   END
   else DATEY='Not found'
   WRITELN(CON,ITAL||'Date :'norm||bold||DATEY||norm)
RETURN

BREAK_C:
WRITELN(CON,bold'ASWPOP has quit....'norm' mails grabbed in this session = 'TOTMAILS)
if (POSTPULL~='NONE')&(POSTPULL~='') THEN DO
                         WRITELN(CON,NL||bold'Running 'POSTPULL'!!!')
                         address command "run "POSTPULL
                         END
IF TEND~>TIME(s) THEN WRITELN(POP3,'QUIT')
address command "c:wait 3"
EXIT
RETURN
END
