156 lines
5.1 KiB
Text
156 lines
5.1 KiB
Text
10REM >EIRC
|
|
20REM The simplest IRC client you can write. Maybe.
|
|
30REM (C) Justin Fletcher, 1998
|
|
40:
|
|
50END=PAGE+1024*16
|
|
60REM Change these if you wish
|
|
70host$="irc.stealth.net"
|
|
80port=6667
|
|
90nick$="eirc"
|
|
100ourchan$="#acorn"
|
|
110:
|
|
120REM Start connecting to a host
|
|
130SYS "ESocket_ConnectToHost",host$,port TO handle
|
|
140REPEAT
|
|
150 SYS "ESocket_CheckState",handle TO state
|
|
160 IF state<-1 THENSYS "ESocket_Forget",handle:SYS "ESocket_DecodeState",state TO a$:ERROR 1,"Failed ("+a$+")"
|
|
170UNTIL state=4
|
|
180:
|
|
190REM We are now connected
|
|
200PRINT"Connected"
|
|
210:
|
|
220REM Log on to the server
|
|
230SYS "ESocket_SendLine",handle,"USER "+nick$+" x x :"+nick$
|
|
240SYS "ESocket_SendLine",handle,"NICK "+nick$
|
|
250SYS "ESocket_SendLine",handle,"JOIN "+ourchan$
|
|
260REM Install a monitor so that we don't waste time
|
|
270SYS "ESocket_Monitor",0,handle TO monitor
|
|
280SYS "ESocket_ResetMonitor",monitor,0 TO polladdr%
|
|
290:
|
|
300REM If we crash, we should tidy up after ourselves
|
|
310ON ERROR SYS "XESocket_Forget",handle:SYS "XESocket_Forget",monitor:ERROR EXT ERR,REPORT$+" at line "+STR$ERL
|
|
320:
|
|
330REM Memory buffer for our data
|
|
340bufsize%=1024
|
|
350DIM buf% bufsize%
|
|
360:
|
|
370input$="":REM The input line
|
|
380REPEAT
|
|
390 REM In a taskwindow we should yield until there is data
|
|
400 SYS "OS_UpCall",6,polladdr%
|
|
410 IF !polladdr%<>0 THEN
|
|
420 REM Reset the monitor for the time being
|
|
430 SYS "ESocket_ResetMonitor",monitor,0 TO polladdr%
|
|
440 REPEAT
|
|
450 REM Read lines from the connection until this buffer is empty
|
|
460 SYS "ESocket_ReadLine",handle,buf%,bufsize%,%100 TO ,str,len
|
|
470 IF str<>0 AND $str<>"" THEN
|
|
480 line$=$str
|
|
490 IF LEFT$(line$,4)="PING" THEN
|
|
500 REM Ping's must be replied to immediately
|
|
510 SYS "ESocket_SendLine",handle,"PONG "+MID$(line$,6)
|
|
520 ELSE
|
|
530 REM Extract source info
|
|
540 from$=MID$(LEFT$(line$,INSTR(line$+" "," ")-1),2)
|
|
550 line$=MID$(line$,INSTR(line$+" "," ")+1)
|
|
560 uid$=LEFT$(from$,INSTR(from$+"!","!")-1)
|
|
570 com$=LEFT$(line$,INSTR(line$+" "," ")-1)
|
|
580 line$=MID$(line$,INSTR(line$+" "," ")+1)
|
|
590 REM remove the input line
|
|
600 IF input$<>"" THENFORI=1TOLEN(input$):VDU127:NEXT
|
|
610 CASE FNupper(com$) OF
|
|
620 WHEN "PRIVMSG"
|
|
630 REM Extract the destination
|
|
640 chan$=LEFT$(line$,INSTR(line$+" "," ")-1)
|
|
650 line$=MID$(line$,INSTR(line$+" "," ")+2):REM Skip :
|
|
660 IF LEFT$(line$,1)=CHR$1 THEN
|
|
670 REM CTCP, so respond to it
|
|
680 line$=MID$(line$,2,LEN(line$)-2)
|
|
690 com$=LEFT$(line$,INSTR(line$+" "," ")-1)
|
|
700 line$=MID$(line$,INSTR(line$+" "," ")+1)
|
|
710 CASE FNupper(com$) OF
|
|
720 WHEN "PING"
|
|
730 REM Ping lag timing
|
|
740 line$="PONG "+line$
|
|
750 PRINTuid$;" pinged us"
|
|
760 WHEN "VERSION"
|
|
770 REM Version checking
|
|
780 line$="VERSION EIRC 1.00 (c) Justin Fletcher"
|
|
790 PRINTuid$;" wanted our version"
|
|
800 WHEN "ACTION"
|
|
810 PRINT"* ";uid$;" ";line$
|
|
820 line$=""
|
|
830 OTHERWISE
|
|
840 REM everything else is an error
|
|
850 line$="ERRMSG "+com$+" not understood"
|
|
860 PRINT"CTCP '";com$;"' from ";uid$;" (";line$;")"
|
|
870 ENDCASE
|
|
880 IF line$<>"" THEN
|
|
890 SYS "ESocket_SendLine",handle,"NOTICE "+uid$+" :"+CHR$1+line$+CHR$1
|
|
900 ENDIF
|
|
910 ELSE
|
|
920 REM Somebody said something...
|
|
930 PRINT"<";uid$;"> ";FNsafe(line$)
|
|
940 ENDIF
|
|
950 WHEN "JOIN"
|
|
960 REM We (or someone else) has joined the channel
|
|
970 chan$=LEFT$(line$,INSTR(line$+" "," ")):REM Skip :
|
|
980 IF LEFT$(chan$,1)=":" THENchan$=MID$(chan$,2)
|
|
990 PRINTuid$;" has joined ";chan$
|
|
1000 WHEN "PART"
|
|
1010 REM Someone else has left the channel
|
|
1020 chan$=LEFT$(line$,INSTR(line$+" "," ")-1)
|
|
1030 IF LEFT$(chan$,1)=":" THENchan$=MID$(chan$,2)
|
|
1040 PRINTuid$;" has left ";chan$
|
|
1050 WHEN "QUIT"
|
|
1060 REM Someone else has quit IRC
|
|
1070 PRINTuid$;" quit IRC"
|
|
1080 OTHERWISE
|
|
1090 REM Some unknown command
|
|
1100 PRINTuid$;":";com$;":";FNsafe(line$)
|
|
1110 ENDCASE
|
|
1120 REM Re-display our input line
|
|
1130 PRINTinput$;
|
|
1140 ENDIF
|
|
1150 ENDIF
|
|
1160 UNTIL str=0
|
|
1170 ENDIF
|
|
1180 b$=INKEY$(0)
|
|
1190 IF b$<>"" THEN
|
|
1200 CASE b$ OF
|
|
1210 WHEN CHR$13
|
|
1220 SYS "ESocket_SendLine",handle,"PRIVMSG "+ourchan$+" :"+input$
|
|
1230 REM Remove the line
|
|
1240 IF input$<>"" THENFORI=1TOLEN(input$):VDU127:NEXT
|
|
1250 REM We said it...
|
|
1260 PRINT"<"+nick$+"> ";input$
|
|
1270 input$=""
|
|
1280 WHEN CHR$127,CHR$8
|
|
1290 REM Backspace
|
|
1300 IF input$<>"" THENVDU127
|
|
1310 input$=LEFT$(input$)
|
|
1320 OTHERWISE
|
|
1330 REM Ad to current input
|
|
1340 input$+=b$
|
|
1350 PRINTb$;
|
|
1360 ENDCASE
|
|
1370 ENDIF
|
|
1380 REM Has the socket closed
|
|
1390 SYS "ESocket_Closed",handle,%0 TO closed
|
|
1400UNTIL closed
|
|
1410SYS "ESocket_Forget",handle
|
|
1420SYS "ESocket_Forget",monitor
|
|
1430END
|
|
1440:
|
|
1450DEFFNupper(a$):LOCAL c$,b$,I
|
|
1460FORI=1TOLEN(a$)
|
|
1470c$=MID$(a$,I,1):IF c$>="a"ANDc$<="z"THENc$=CHR$(ASC(c$)-32)
|
|
1480b$+=c$:NEXT:=b$
|
|
1490
|
|
1500REM Remove control codes
|
|
1510DEFFNsafe(line$)
|
|
1520LOCAL I
|
|
1530FORI=1TOLEN(line$)
|
|
1540 IF MID$(line$,I,1)<" " THENMID$(line$,I,1)="*"
|
|
1550NEXT
|
|
1560=line$
|