diff --git a/WOPO.COB b/WOPO.COB index 8e64453..d770966 100644 --- a/WOPO.COB +++ b/WOPO.COB @@ -52,14 +52,28 @@ 05 REST PIC X(480). 01 WAITING-COMMAND PIC X(16). 01 PARAMS. - 03 WORK PIC X(50). + 03 WORK PIC X(480). 03 WORK-PREFIX REDEFINES WORK PIC X. 88 IS-COMMAND VALUE "$". - 03 PARAM PIC X(50) OCCURS 5 TIMES. - 03 REG PIC X(50) OCCURS 5 TIMES. + 03 PARAM PIC X(480) OCCURS 5 TIMES. + 03 REG PIC X(480) OCCURS 5 TIMES. + + 01 BF-I-O. + 03 BF-INPUT PIC X(512) + VALUE "$NUL$". + 03 BF-CODE PIC X(512) + VALUE ",(.,).$". + 03 BF-OUTPUT PIC X(512) + VALUE SPACES. + 03 CYCLE-LIMIT PIC 9(5) + VALUE 0. + + 01 BF-STATE. + 03 MAYBE-CYCLE-LIMIT PIC 9(5) + VALUE 0. PROCEDURE DIVISION. - DISPLAY "CONFIGURATION FOLLOWS:". + DISPLAY "CONFIGURATION FOLLOWS.". CALL "PRINT-CONFIG". MOVE LENGTH OF MSG-BODY TO MSG-LENGTH. CALL "CHANNEL-INIT" @@ -113,7 +127,7 @@ ADD 1 TO MSG-LENGTH. MOVE "REAL-NAME" TO CONFIG-KEY. PERFORM READ-CONFIG-ENTRY. - STRING "BOGUS HOST :" DELIMITED BY SIZE, + STRING "BOGUS HOST; " DELIMITED BY SIZE, CONFIG-VALUE DELIMITED BY " ", INTO MSG-BODY WITH POINTER MSG-LENGTH. @@ -141,7 +155,7 @@ READ-CONFIG-ENTRY. READ CONFIG RECORD - INVALID KEY DISPLAY "REQUIRED KEY UNSPECIFIED:" + INVALID KEY DISPLAY "REQUIRED KEY UNSPECIFIED." DISPLAY CONFIG-KEY GO TO DIE. @@ -169,13 +183,15 @@ MOVE PARAM(1) TO WORK. VALIDATE-USER. + D DISPLAY "ENTERED VALIDATE-USER". MOVE NICK TO USER-NAME. READ USERS RECORD INVALID KEY MOVE 0 TO USER-LEVEL. + D DISPLAY "SUPPOSED USER LEVEL ", USER-LEVEL. IF USER-LEVEL IS GREATER THAN 0 THEN - MOVE SPACES TO MSG-BODY. + MOVE SPACES TO MSG-BODY MOVE 1 TO MSG-LENGTH - STRING "PRIVMSG NICKSERV :ACC" + STRING "PRIVMSG NICKSERV ;ACC" INTO MSG-BODY WITH POINTER MSG-LENGTH ADD 1 TO MSG-LENGTH @@ -185,7 +201,12 @@ PERFORM SEND-LINE MOVE "NOTICE" TO WAITING-COMMAND MOVE 0 TO STATE - PERFORM WAIT-FOR-ACC UNTIL DONE. + D DISPLAY "WAITING FOR ACC." + PERFORM WAIT-FOR-ACC UNTIL DONE + D DISPLAY "USER VALIDATED." + D ELSE + D DISPLAY "USER NOT VALIDATED." + . WAIT-FOR-ACC. PERFORM WAIT-FOR-COMMAND. @@ -199,12 +220,13 @@ MAIN. PERFORM RECEIVE-LINE. - MOVE 1 TO MSG-LENGTH. IF PING THEN PERFORM PONG ELSE IF PRIVMSG THEN + D DISPLAY "PROCESSING PRIVMSG" PERFORM HANDLE-MESSAGE ELSE IF NOTICE THEN + D DISPLAY "PROCESSING NOTICE" PERFORM HANDLE-MESSAGE. *THE REPLY FUNCTIONS NEED NICK, COMMAND, AND TARGET PRESERVED. @@ -224,12 +246,12 @@ INTO MSG-BODY WITH POINTER MSG-LENGTH. ADD 1 TO MSG-LENGTH. - STRING ":" + STRING ";" INTO MSG-BODY WITH POINTER MSG-LENGTH. IF TARGET IS NOT EQUAL TO WOPO-NICK THEN STRING NICK DELIMITED BY SPACES - ": " DELIMITED BY SIZE + ". " DELIMITED BY SIZE INTO MSG-BODY WITH POINTER MSG-LENGTH. @@ -248,13 +270,24 @@ HANDLE-MESSAGE. PERFORM GET-PARAMS. - MOVE PARAM(1) TO WORK. IF IS-COMMAND THEN - UNSTRING WORK DELIMITED BY "$" INTO PARAM(1), PARAM(1) + MOVE 2 TO MSG-LENGTH + UNSTRING WORK INTO PARAM(1) + WITH POINTER MSG-LENGTH + D DISPLAY "COMMAND BODY ", PARAM(1) IF PARAM(1) IS EQUAL TO "HELP" THEN PERFORM HANDLE-HELP ELSE IF PARAM(1) IS EQUAL TO "SOURCE" THEN PERFORM HANDLE-SOURCE + ELSE IF PARAM(1) IS EQUAL TO "BF-INPUT" THEN + PERFORM HANDLE-BF-INPUT + ELSE IF PARAM(1) IS EQUAL TO "BF-CODE" THEN + PERFORM HANDLE-BF-CODE + ELSE IF PARAM(1) IS EQUAL TO "BF-OUTPUT" THEN + PERFORM HANDLE-BF-OUTPUT + ELSE IF PARAM(1) IS EQUAL TO "BF-RUN" THEN + D DISPLAY "BF-RUN" + PERFORM HANDLE-BF-RUN ELSE IF PARAM(1) IS EQUAL TO "SHITFED" THEN PERFORM HANDLE-SHITFED ELSE IF PARAM(1) IS EQUAL TO "LEVEL" THEN @@ -270,7 +303,8 @@ HANDLE-HELP. PERFORM BEGIN-REPLY. - STRING "$HELP $LEVEL $JOIN $PART $QUIT $RELEVEL $SHITFED " + STRING "$BF-INPUT $BF-CODE $BF-OUTPUT $BF-RUN " + - "$HELP $LEVEL $JOIN $PART $QUIT $RELEVEL $SHITFED " - "$SOURCE" INTO MSG-BODY WITH POINTER MSG-LENGTH. @@ -285,7 +319,7 @@ HANDLE-SOURCE. PERFORM BEGIN-REPLY. - STRING "HTTPS://GITHUB.COM/HEDDWCH/WOPO" + STRING "HTTPS;//GITHUB.COM/HEDDWCH/WOPO" INTO MSG-BODY WITH POINTER MSG-LENGTH. PERFORM SEND-LINE. @@ -362,7 +396,7 @@ PERFORM REPLY-ACK MOVE SPACES TO MSG-BODY MOVE 1 TO MSG-LENGTH - STRING "QUIT :", CONFIG-VALUE + STRING "QUIT ;", CONFIG-VALUE INTO MSG-BODY WITH POINTER MSG-LENGTH PERFORM SEND-LINE @@ -393,9 +427,104 @@ WITH POINTER MSG-LENGTH. PERFORM SEND-LINE. + HANDLE-BF-CODE. + IF PARAM(2) IS EQUAL TO SPACES THEN + PERFORM BEGIN-REPLY + STRING "CODE. " DELIMITED BY SIZE, + BF-CODE DELIMITED BY " " + INTO MSG-BODY + WITH POINTER MSG-LENGTH + PERFORM SEND-LINE + ELSE + MOVE PARAM(2) TO REG(1) + * PRESERVE VARIABLES FOR REPLY. + MOVE NICK TO REG(2) + MOVE COMMAND TO REG(3) + MOVE TARGET TO REG(4) + PERFORM VALIDATE-USER + IF USER-LEVEL > 60 THEN + * RESTORE NICK AND TARGET, THEN REPLY. + MOVE REG(2) TO NICK + MOVE REG(3) TO COMMAND + MOVE REG(4) TO TARGET + MOVE SPACES TO BF-CODE + MOVE REG(1) TO BF-CODE + PERFORM REPLY-ACK. + + HANDLE-BF-INPUT. + IF PARAM(2) IS EQUAL TO SPACES THEN + PERFORM BEGIN-REPLY + STRING "INPUT. " DELIMITED BY SIZE, + BF-INPUT DELIMITED BY " " + INTO MSG-BODY + WITH POINTER MSG-LENGTH + PERFORM SEND-LINE + ELSE + MOVE PARAM(2) TO REG(1) + * PRESERVE VARIABLES FOR REPL + MOVE NICK TO REG(2) + MOVE COMMAND TO REG(3) + MOVE TARGET TO REG(4) + PERFORM VALIDATE-USER + IF USER-LEVEL > 50 THEN + * RESTORE NICK AND TARGET, THEN REPLY + MOVE REG(2) TO NICK + MOVE REG(3) TO COMMAND + MOVE REG(4) TO TARGET + MOVE SPACES TO BF-INPUT + MOVE REG(1) TO BF-INPUT + PERFORM REPLY-ACK. + + HANDLE-BF-OUTPUT. + PERFORM BEGIN-REPLY. + D DISPLAY "STRINGING BF OUTPUT". + STRING "OUTPUT. " DELIMITED BY SIZE, + BF-OUTPUT DELIMITED BY "$NUL$" + DELIMITED BY "$LF$" + DELIMITED BY "$SUB$" + INTO MSG-BODY + WITH POINTER MSG-LENGTH. + D DISPLAY "SENDING LINE". + PERFORM SEND-LINE. + D DISPLAY "SENT LINE". + + HANDLE-BF-RUN. + D DISPLAY "HANDLING BF-RUN". + MOVE PARAM(2) TO REG(1). + * PRESERVE VARIABLES FOR REPLY + MOVE NICK TO REG(2). + MOVE COMMAND TO REG(3). + MOVE TARGET TO REG(4). + PERFORM VALIDATE-USER. + IF REG(1) IS EQUAL TO SPACES THEN + MOVE 999 TO MAYBE-CYCLE-LIMIT + ELSE + UNSTRING REG(1) INTO + MAYBE-CYCLE-LIMIT. + D DISPLAY "CYCLE LIMIT. ", CYCLE-LIMIT. + * RESTORE NICK AND TARGET, THEN REPLY. + MOVE REG(2) TO NICK + MOVE REG(3) TO COMMAND + MOVE REG(4) TO TARGET + IF USER-LEVEL > 50 THEN + MOVE 1 TO MSG-LENGTH + PERFORM REPLY-ACK + MOVE MAYBE-CYCLE-LIMIT TO CYCLE-LIMIT + PERFORM BF-LIMIT-CYCLES + CALL "BF-RUN" USING BF-I-O + D DISPLAY "BF RAN" + PERFORM HANDLE-BF-OUTPUT. + + BF-LIMIT-CYCLES. + IF CYCLE-LIMIT > 999 THEN + IF USER-LEVEL < 90 THEN + IF USER-LEVEL < 70 THEN + MOVE 999 TO CYCLE-LIMIT + ELSE IF CYCLE-LIMIT > 9999 THEN + MOVE 9999 TO CYCLE-LIMIT. + QUIT. CALL "CHANNEL-CLOSE". CLOSE CONFIG. CLOSE USERS. STOP RUN. -