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$