1
0
mirror of https://github.com/GeorgeMcMullen/rxIRC.git synced 2026-01-27 20:48:33 +00:00

4 Commits

Author SHA1 Message Date
George McMullen
2a8bb81121 Merged v2.1 with original 2.0 Plus (my 2.2) 2013-06-08 16:30:31 -07:00
George McMullen
34051b49ad Merged v2.1 with original 2.0 Plus (my 2.2) 2013-06-08 16:29:23 -07:00
George McMullen
75c03e2bdc Updated to remove errors that occurred by scanning the document. 2013-06-08 15:37:22 -07:00
George McMullen
e341a3219c Initial commit of v2.2, which was actually based off of 2.0, should include functionality like the /on command. 2013-06-08 15:15:14 -07:00
2 changed files with 174 additions and 21 deletions

View File

@@ -1,11 +1,16 @@
/* rxIRC /* rxIRC
* Internet Relay Chat client program for VM/CMS systems * Internet Relay Chat client program for VM/CMS systems
* written by Carl 'LynX' v. Loesch (loesch@informatik.uni-oldenburg.de) * written by Carl 'LynX' v. Loesch (loesch@informatik.uni-oldenburg.de)
* created by Lynx (244661 at DOLUNI1) on Thursday, 14 Feb 1991
* Credits for suggestions, code contribution, miscellaneous help go to: * Credits for suggestions, code contribution, miscellaneous help go to:
* Jose Maria Blasco, Doug Sewell, Martin Ahlborn, Jim McMaster, * Jose Maria Blasco, Doug Sewell, Martin Ahlborn, Jim McMaster,
* Scott Maxell, Juan Courcoul, Rob Blais, Mike Letourneau, Grant Pair * Scott Maxell, Juan Courcoul, Rob Blais, Mike Letourneau, Grant Pair
* (in historical order mostly). Thank y'all very much! * (in historical order mostly). Thank y'all very much!
* *
* Extras (Pluses) written by George McMullen
* Thanks to Carl 'LynX' v. Loesch for his suggestions, ideas, and
* explanations of code, which made much of the additions possible.
*
* requires RXSOCKET MODULE version 2 by Arty Ecock (eckcu@cunyvm.bitnet) * requires RXSOCKET MODULE version 2 by Arty Ecock (eckcu@cunyvm.bitnet)
* *
* Copyright (C)1991,2,3,4 by LynX & CvO University Oldenburg, Germany * Copyright (C)1991,2,3,4 by LynX & CvO University Oldenburg, Germany
@@ -14,7 +19,7 @@
* Warning: Changing the code to display fake user information is * Warning: Changing the code to display fake user information is
* considered an offense by many IRC administrators! * considered an offense by many IRC administrators!
* *
*/ progname='rxIRC'; vers='2.1'; trace 'O' */ progname='rxIRC'; vers='2.2 (GM Branch)'; trace 'O'
address "COMMAND"; signal on HALT; "VMFCLEAR" address "COMMAND"; signal on HALT; "VMFCLEAR"
cmds='AWAY AWAIT ADMIN CHANNEL CONNECT DEOP DIE HASH INFO ISON JOIN KICK', cmds='AWAY AWAIT ADMIN CHANNEL CONNECT DEOP DIE HASH INFO ISON JOIN KICK',
'KILL LIST LINKS LUSERS MODE MAIL MOTD NAMES NICK NOTICE NOTE OPER PASS', 'KILL LIST LINKS LUSERS MODE MAIL MOTD NAMES NICK NOTICE NOTE OPER PASS',
@@ -26,6 +31,9 @@
v.=; al.=; varnames=; aliasnames=; cmdchar=; userinfo=; sourcing=0 v.=; al.=; varnames=; aliasnames=; cmdchar=; userinfo=; sourcing=0
have_rxwt=0; who_empty=0; catmode=0; catlist=; abortsource=0; skiplines=0 have_rxwt=0; who_empty=0; catmode=0; catlist=; abortsource=0; skiplines=0
nflist=; nfhere=; nfcatch=0 nflist=; nfhere=; nfcatch=0
jumpcoms=0;sourcenum=0;numons=0;display='display'
call SET 'display On'
"EXECIO * CP (STEM PF. STRING QUERY PF" "EXECIO * CP (STEM PF. STRING QUERY PF"
do i=1 to pf.0 do i=1 to pf.0
a=word(pf.i,2) a=word(pf.i,2)
@@ -37,7 +45,7 @@
"CP TERM CHARDEL OFF" "CP TERM CHARDEL OFF"
"CP TERM LINESIZE 130" "CP TERM LINESIZE 130"
sock=; buffer=; alphalo=xrange('a','z'); alphahi=xrange('A','Z') sock=; buffer=; alphalo=xrange('a','z'); alphahi=xrange('A','Z')
lf='25'x; cr='0d'x; msa='01'x; rev='02'x; beep='2f'x; undl='32'x lf='25'x; cr='0d'x; msa='01'x; rev='02'x; beep='2fx; undl='32'x
bold='1f'x; hi='1de8'x; lo='1d60'x; yo='1d44'x bold='1f'x; hi='1de8'x; lo='1d60'x; yo='1d44'x
nice.=; u@n.=; via.=; nice.=; u@n.=; via.=;
realname=; servername=; realname=; servername=;
@@ -156,7 +164,6 @@
if rc/=0 then call BYE "nonblocking i/o:" etc if rc/=0 then call BYE "nonblocking i/o:" etc
myurl="http://"hostname"."domain":"wwwport"/" myurl="http://"hostname"."domain":"wwwport"/"
end end
call S progname||hi||vers||yo"- You are" ircnick "("ircname")" call S progname||hi||vers||yo"- You are" ircnick "("ircname")"
call S "Logging is" onoff.log"; Audible bells are", call S "Logging is" onoff.log"; Audible bells are",
onoff.loud"; Quiet ignore is" onoff.quiet onoff.loud"; Quiet ignore is" onoff.quiet
@@ -180,7 +187,38 @@
do forever do forever
if index(buffer, lf)=0 then leave if index(buffer, lf)=0 then leave
parse var buffer in (lf) buffer parse var buffer in (lf) buffer
call OUT PARSE(strip(in,,cr)) see=PARSE(strip(in,,cr))
parse var see com sndr' ### 'eye
call OUT eye
if sndr/='' & sndr/=servername & pos(sndr,v.0)^=0 then
call SET 0 sndr
see=com
do i= 0 to 9
see=see v.i
end
upper see
if numons>0 then do test=1 to numons
parse var on.test look '::' com
upper look
do exam=1 to words(look)
single=word(look,exam)
if single=word(see,exam)|single="*" then iterate
if right(single,1)="*" then
if pos(left(single,length(single)-1),word(see,exam))=1 then
iterate
if left(single,1)="*" then
if right(single,1)="*" then
if pos(substr(single,2,length(single)-2),word(see,exam)),
>=1 then iterate
else nop
else
if lastpos(right(single,length(single)-1),word(see,exam)),
= length(word(see,exam))-(length(single)-2)&,
length(word(see,exam))-(length(single)-2)^=0 then iterate
leave
end
if exam=words(look)+1 then call SHELL com
end
end end
end end
when type = 'CONS' then if data/='' then do when type = 'CONS' then if data/='' then do
@@ -255,7 +293,7 @@
PARSE: PARSE:
parse arg a parse arg a
if loud & pos(beep,a)/=0 then "BEEP" if loud & pos(beep,a)/=0 then "BEEP"
tu=; a=translate(a,"%"||beepch||"_",rev||beep||undl) tu=; a=translate(a,"%"||beepch||"_",rev||beep||undl); bm=;
i=1; j=0; do forever; i=index(a,bold,i) i=1; j=0; do forever; i=index(a,bold,i)
if i=0 then leave if i=0 then leave
if j=0 then a=insert(hi,a,i) if j=0 then a=insert(hi,a,i)
@@ -289,7 +327,10 @@ PARSE:
when m='KICK' then tu='***' s 'kicks' f 'off channel' e '('g')' when m='KICK' then tu='***' s 'kicks' f 'off channel' e '('g')'
when m='KILL' then tu='You were killed by' s subword(g,2) when m='KILL' then tu='You were killed by' s subword(g,2)
when m='MODE' then tu='Mode change:' s 'sets' f 'on' e||g when m='MODE' then tu='Mode change:' s 'sets' f 'on' e||g
when m='MSG' then tu='<'s'>' g when m='MSG' then do
tu='<'s'>' g
m='PUBLIC'
end
when m='NICK' then tu='***' s 'is now known as' e||g when m='NICK' then tu='***' s 'is now known as' e||g
when m='NOTICE' then select when m='NOTICE' then select
when s='' | s=servername then do when s='' | s=servername then do
@@ -313,14 +354,32 @@ PARSE:
if ^quiet then call SEND('NOTICE' s ':'ignore_reply) if ^quiet then call SEND('NOTICE' s ':'ignore_reply)
return ''; end return ''; end
else do else do
if CTCP(1 g) then tu='*'s'*' g if CTCP(1 g) then do
tu='*'s'*' g
m='MSG'
end
else do
m='CTCP'
parse var g . (msa) bm g (msa) .
bm=s bm g
end
lastsender=s lastsender=s
end end
end end
else if ^FINDM(omit,s) & ^FINDM(omit,sad) then else if ^FINDM(omit,s) & ^FINDM(omit,sad) then do
if CTCP(0 g) then do if CTCP(0 g) then do
if translate(e)=target then tu='<'s'>' g m='CTCP'
else tu='<'s':'e'>' g parse var g . (msa) bm g (msa) .
bm=s bm g
end
if translate(e)=target then then if CTCP(0 g) then do
yu='<'s'>' g
m='PUBLIC'
end
otherwise if CTCP(0 g) then do
tu='<'s':'e'>' g
m='PUBLIC'
end
end end
end end
when m='QUIT' then tu='Signoff by' s '('g')' when m='QUIT' then tu='Signoff by' s '('g')'
@@ -343,14 +402,20 @@ PARSE:
when m='314' then do; parse var f ni ui no . when m='314' then do; parse var f ni ui no .
tu=ni 'was' ui'@'no '('g')'; end tu=ni 'was' ui'@'no '('g')'; end
when m='312' then tu='via' word(f,2) '('g')' when m='312' then tu='via' word(f,2) '('g')'
when m='315' then if who_empty then call S 'No matches for /who' when m='315' then if who_empty then do
bm='No matches for /who'
call S bm
end
when m='319' then tu='on channels:' g when m='319' then tu='on channels:' g
when m='317' then tu='apparently idle' word(f,2)/60 'minutes' when m='317' then tu='apparently idle' word(f,2)/60 'minutes'
when m='322' then do when m='322' then do
parse var f ch n . parse var f ch n .
if ch/='*' & substr(ch,2,1)/='27'x then do if ch/='*' & substr(ch,2,1)/='27'x then do
if catmode then do; if n>4 then catlist=ch catlist; end if catmode then do; if n>4 then catlist=ch catlist; end
else if listall | n>7 then call OUT left(ch,13) left(n,4)g else if listall | n>7 then do
bm=left(ch,13) left(n,4)g
call OUT left(ch,13) left(n,4)g
end
end; end end; end
when m='323' then do when m='323' then do
if catmode then do if catmode then do
@@ -369,10 +434,14 @@ PARSE:
else if (ch/='*' & a>length(ch)) then else if (ch/='*' & a>length(ch)) then
k=lo||ch||hi||n||lo||copies(' ',a-length(ch)-1)us"@"no k=lo||ch||hi||n||lo||copies(' ',a-length(ch)-1)us"@"no
else k=hi||n||lo||copies(' ',a)us"@"no else k=hi||n||lo||copies(' ',a)us"@"no
bm=st ni ch us no n
call S left(st,3)yo||left(ni,9)k call S left(st,3)yo||left(ni,9)k
end end
when m='353' then do; ch=word(f,2); a=words(g) when m='353' then do; ch=word(f,2); a=words(g)
if ch/='*' & (a>6 | translate(ch)=target) then call OUT hi||left(ch,15)yo||g if ch/='*' & (a>6 | translate(ch)=target) then do
bm=left(ch,15)||g
call OUT hi||left(ch,15)yo||g
end
end end
when m='313'|m='364' then tu=f g when m='313'|m='364' then tu=f g
when m='004'|m='318'|m='321'|m='365'|m='366'|m='406' then nop when m='004'|m='318'|m='321'|m='365'|m='366'|m='406' then nop
@@ -387,7 +456,13 @@ PARSE:
if s/="" & s/=servername then tu='('s')' tu if s/="" & s/=servername then tu='('s')' tu
if numb then tu='{'m'}' tu if numb then tu='{'m'}' tu
end end
return translate(tu,"@",msa) if bm=''&b/='' then bm=tu
do jjj=1 to 10
if word(bm,jjj)^='' then call SET jjj-1 word(bm,jjj)
else call UNSET jjj-1
if jjj>=10 then leave
end
return m s '###' translate(tu,"@",msa)
VAR: VAR:
parse arg x parse arg x
@@ -421,9 +496,24 @@ SET:
z=word(varnames,i); call S '$('z') is "'v.z'"' z=word(varnames,i); call S '$('z') is "'v.z'"'
end end
else do else do
parse var z a b parse var z vn vv
if b='' then call S 'Variable' a 'has the value "'v.a'"' if b='' then call S 'Variable' vn 'has the value "'v.vv'"'
else do; v.a=b; if find(varnames,a)=0 then varnames=a varnames; end else do; v.vn=vv; if find(varnames,vn)=0 then varnames=vn varnames; end
end
return
UNSET:
parse arg z etc
if z='' then do;call S "Deleting all set variables..."
do i=1 to words(varnames)
z=word(varnames,i); v.z=;
end;varnames=;end
else do
nvn=' '
do i=1 to words(varnames)
if z=word(varnames,i) then nop
else nvn=nvn word(varnames,i);end
v.z=;varnames=nvn
end end
return return
@@ -442,6 +532,7 @@ EDIT:
SHELL: SHELL:
parse arg lin parse arg lin
if abbrev('ALIAS', translate(word(lin,1)), 2) then do if abbrev('ALIAS', translate(word(lin,1)), 2) then do
lin=strip(lin)
parse var lin . name lin parse var lin . name lin
if name='' then do i=1 to words(aliasnames) if name='' then do i=1 to words(aliasnames)
name=word(aliasnames,i); call S name': "'al.name'"' name=word(aliasnames,i); call S name': "'al.name'"'
@@ -454,6 +545,18 @@ SHELL:
end end
return return
end end
if abbrev('ON', translate(word(lin,1)), 2) then do
lin=strip(lin)
parse var lin . lin
if lin=''&numons>0 then do i=1 to numons
call S i'- ON: "'on.i'"'
end
else if lin\='' then do
numons=numons+1
on.numons=lin
end
return
end
do while lin/='' do while lin/=''
if left(lin,1)='*' then return if left(lin,1)='*' then return
parse var lin one '15'x lin parse var lin one '15'x lin
@@ -473,6 +576,11 @@ SHELL:
sb=sb||k||VAR(x) sb=sb||k||VAR(x)
end end
parse var sb com par '::' next parse var sb com par '::' next
do while jumpcoms>0 & next ^=''
parse var next com par '::' next
jumpcoms = jumpcoms-1
end
jumpcoms=0
upper com upper com
if next/='' then lin=next||'15'x||lin if next/='' then lin=next||'15'x||lin
if find(lc, com)=0 then lc=com lc if find(lc, com)=0 then lc=com lc
@@ -514,6 +622,7 @@ COMMAND:
end end
end end
when abbrev('INTERPRET',q,3) then call INTERP r when abbrev('INTERPRET',q,3) then call INTERP r
when abbrev('ASSIGN',q,3) then call ASSIGN r
when abbrev('INVITE',q,1) then do when abbrev('INVITE',q,1) then do
if words(r)=1 & target/=0 then out='INVITE' r target if words(r)=1 & target/=0 then out='INVITE' r target
else out='INVITE' r else out='INVITE' r
@@ -523,11 +632,26 @@ COMMAND:
when abbrev('NICKNAME',q,1) then if r='' then out='WHOIS' ircnick when abbrev('NICKNAME',q,1) then if r='' then out='WHOIS' ircnick
else do; out='NICK' r; ircnick=r; capnick=translate(r); end else do; out='NICK' r; ircnick=r; capnick=translate(r); end
when q='NF'|abbrev('NOTIFY',q,4) then call NOTIFY r when q='NF'|abbrev('NOTIFY',q,4) then call NOTIFY r
when abbrev('SEND',q,4) then if r='' then do
call S "Send what?"
end
else do
call S "Sent command ("r")."
call SEND(r)
end
when abbrev('QUOTE',q,4) then if r='' then do
call S "Quote what?"
end
else do
call SEND(r)
end
when left(q,2)='PF' then 'CP SET' q r when left(q,2)='PF' then 'CP SET' q r
when abbrev('REPLY',q,1) then call QUERY lastsender when abbrev('REPLY',q,1) then call QUERY lastsender
when abbrev('SERVER',q,1) then call CONNECT r when abbrev('SERVER',q,1) then call CONNECT r
when q='SET' then call SET r when q='SET' then call SET r
when abbrev('UNSET',q,3) then call UNSET r
when q='SKIP' & sourcing then if datatype(r,'w') then skiplines=r when q='SKIP' & sourcing then if datatype(r,'w') then skiplines=r
when q='JUMP' then if datatype(r,'w') then jumpcoms=r
when abbrev('SOURCE',q,2) then call SOURCE r when abbrev('SOURCE',q,2) then call SOURCE r
when abbrev('STATUS',q,1) then do; out='WHOIS' ircnick when abbrev('STATUS',q,1) then do; out='WHOIS' ircnick
call OUT 'Target:' target'; Query:' query'; Invitation:' invitation'; Last sender:' lastsender'; Last joined:' lastjoin call OUT 'Target:' target'; Query:' query'; Invitation:' invitation'; Last sender:' lastsender'; Last joined:' lastjoin
@@ -656,9 +780,11 @@ LOGGING:
return return
S: S:
parse arg k; say k; if log then writelog k parse arg k
if translate(v.display)/='OFF' then say k
if logevent/=0 then do if logevent/=0 then do
curll=curll+1; ll.curll=k; logevent=0; k=curll-50; ll.k=; end curll=curll+1; ll.curll=k; logevent=0; k=curll-50; ll.k=; end
if log then writelog k
return return
OUT: OUT:
@@ -719,7 +845,7 @@ CTCP:
when ctcp="USERINFO" then call MSAREPLY "USERINFO" userinfo when ctcp="USERINFO" then call MSAREPLY "USERINFO" userinfo
when ctcp="VERSION" then when ctcp="VERSION" then
call MSAREPLY "VERSION" progname vers "VM/CMS", call MSAREPLY "VERSION" progname vers "VM/CMS",
":Survival package for VM-struck humans" ":Beta Version of Improved rxIRC - The Survival package for VM-struck humans"
otherwise if fla=1 then call MSAREPLY "ERRMSG Huh? Can't do" ctcp otherwise if fla=1 then call MSAREPLY "ERRMSG Huh? Can't do" ctcp
end end
return 0 return 0
@@ -972,6 +1098,7 @@ TELL:
SOURCE: SOURCE:
arg sfn, sfl arg sfn, sfl
sourcenum=sourcenum+1
if sfn='' then do if sfn='' then do
call S "You must specify a file to /source" call S "You must specify a file to /source"
return -1 return -1
@@ -985,6 +1112,13 @@ SOURCE:
'MAKEBUF'; 'EXECIO * DISKR' sfn '(FIFO FINIS'; skiplines=0; 'MAKEBUF'; 'EXECIO * DISKR' sfn '(FIFO FINIS'; skiplines=0;
do queued(); sourcing=1 do queued(); sourcing=1
parse pull l; if abortsource then iterate parse pull l; if abortsource then iterate
if right(strip(l),2)='::' then
ll=ll||l
else do
ll=ll||l
call SHELL strip(ll)
ll=''
end
if skiplines=0 then call SHELL strip(l) if skiplines=0 then call SHELL strip(l)
else skiplines=skiplines-1 else skiplines=skiplines-1
end end
@@ -1017,6 +1151,11 @@ INTERP:
signal on SYNTAX; INTERPRET(statement); signal off SYNTAX signal on SYNTAX; INTERPRET(statement); signal off SYNTAX
return rc return rc
ASSIGN:
parse arg asto asfrom
signal on SYNTAX; INTERPRET(statement); signal off SYNTAX
return rc
NOTIFY: NOTIFY:
arg a arg a
do i=1 to words(a) do i=1 to words(a)
@@ -1084,3 +1223,4 @@ WRITEFILE:
DROPIT: DROPIT:
'DROPBUF' 'DROPBUF'
return return

13
setenv.exec Normal file
View File

@@ -0,0 +1,13 @@
/* SETENV EXEC
* Set an environment variable for C programs to access
* last change by Lynx_VM (244661 at DOLUNI1) on Sunday, 12 May 1991
*/
address 'COMMAND'
parse arg n c; upper n
if n="" then
'GLOBALV SELECT CENV LIST'
else if c="" then
'GLOBALV SELECT CENV LIST' n
else
'GLOBALV SELECT CENV SETL' n c
exit rc