1
0
mirror of https://github.com/GeorgeMcMullen/rxIRC.git synced 2026-01-27 12:43:05 +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
* Internet Relay Chat client program for VM/CMS systems
* 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:
* Jose Maria Blasco, Doug Sewell, Martin Ahlborn, Jim McMaster,
* Scott Maxell, Juan Courcoul, Rob Blais, Mike Letourneau, Grant Pair
* (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)
*
* 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
* 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"
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',
@@ -26,6 +31,9 @@
v.=; al.=; varnames=; aliasnames=; cmdchar=; userinfo=; sourcing=0
have_rxwt=0; who_empty=0; catmode=0; catlist=; abortsource=0; skiplines=0
nflist=; nfhere=; nfcatch=0
jumpcoms=0;sourcenum=0;numons=0;display='display'
call SET 'display On'
"EXECIO * CP (STEM PF. STRING QUERY PF"
do i=1 to pf.0
a=word(pf.i,2)
@@ -37,7 +45,7 @@
"CP TERM CHARDEL OFF"
"CP TERM LINESIZE 130"
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
nice.=; u@n.=; via.=;
realname=; servername=;
@@ -156,7 +164,6 @@
if rc/=0 then call BYE "nonblocking i/o:" etc
myurl="http://"hostname"."domain":"wwwport"/"
end
call S progname||hi||vers||yo"- You are" ircnick "("ircname")"
call S "Logging is" onoff.log"; Audible bells are",
onoff.loud"; Quiet ignore is" onoff.quiet
@@ -180,7 +187,38 @@
do forever
if index(buffer, lf)=0 then leave
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
when type = 'CONS' then if data/='' then do
@@ -255,7 +293,7 @@
PARSE:
parse arg a
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)
if i=0 then leave
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='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='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='NOTICE' then select
when s='' | s=servername then do
@@ -313,14 +354,32 @@ PARSE:
if ^quiet then call SEND('NOTICE' s ':'ignore_reply)
return ''; end
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
end
end
else if ^FINDM(omit,s) & ^FINDM(omit,sad) then
if CTCP(0 g) then do
if translate(e)=target then tu='<'s'>' g
else tu='<'s':'e'>' g
else if ^FINDM(omit,s) & ^FINDM(omit,sad) then do
if CTCP(0 g) then do
m='CTCP'
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
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 .
tu=ni 'was' ui'@'no '('g')'; end
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='317' then tu='apparently idle' word(f,2)/60 'minutes'
when m='322' then do
parse var f ch n .
if ch/='*' & substr(ch,2,1)/='27'x then do
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
when m='323' then do
if catmode then do
@@ -369,10 +434,14 @@ PARSE:
else if (ch/='*' & a>length(ch)) then
k=lo||ch||hi||n||lo||copies(' ',a-length(ch)-1)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
end
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
when m='313'|m='364' then tu=f g
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 numb then tu='{'m'}' tu
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:
parse arg x
@@ -421,11 +496,26 @@ SET:
z=word(varnames,i); call S '$('z') is "'v.z'"'
end
else do
parse var z a b
if b='' then call S 'Variable' a 'has the value "'v.a'"'
else do; v.a=b; if find(varnames,a)=0 then varnames=a varnames; end
parse var z vn vv
if b='' then call S 'Variable' vn 'has the value "'v.vv'"'
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
return
EDIT:
parse arg in
@@ -438,10 +528,11 @@ EDIT:
else if left(in,2)=cmdchar' ' then call SEND 'PRIVMSG' target ':'substr(in,3)
else call SHELL substr(in,2)
return
SHELL:
parse arg lin
if abbrev('ALIAS', translate(word(lin,1)), 2) then do
lin=strip(lin)
parse var lin . name lin
if name='' then do i=1 to words(aliasnames)
name=word(aliasnames,i); call S name': "'al.name'"'
@@ -454,6 +545,18 @@ SHELL:
end
return
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/=''
if left(lin,1)='*' then return
parse var lin one '15'x lin
@@ -473,6 +576,11 @@ SHELL:
sb=sb||k||VAR(x)
end
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
if next/='' then lin=next||'15'x||lin
if find(lc, com)=0 then lc=com lc
@@ -514,6 +622,7 @@ COMMAND:
end
end
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
if words(r)=1 & target/=0 then out='INVITE' r target
else out='INVITE' r
@@ -523,11 +632,26 @@ COMMAND:
when abbrev('NICKNAME',q,1) then if r='' then out='WHOIS' ircnick
else do; out='NICK' r; ircnick=r; capnick=translate(r); end
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 abbrev('REPLY',q,1) then call QUERY lastsender
when abbrev('SERVER',q,1) then call CONNECT 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='JUMP' then if datatype(r,'w') then jumpcoms=r
when abbrev('SOURCE',q,2) then call SOURCE r
when abbrev('STATUS',q,1) then do; out='WHOIS' ircnick
call OUT 'Target:' target'; Query:' query'; Invitation:' invitation'; Last sender:' lastsender'; Last joined:' lastjoin
@@ -656,9 +780,11 @@ LOGGING:
return
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
curll=curll+1; ll.curll=k; logevent=0; k=curll-50; ll.k=; end
if log then writelog k
return
OUT:
@@ -719,7 +845,7 @@ CTCP:
when ctcp="USERINFO" then call MSAREPLY "USERINFO" userinfo
when ctcp="VERSION" then
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
end
return 0
@@ -972,6 +1098,7 @@ TELL:
SOURCE:
arg sfn, sfl
sourcenum=sourcenum+1
if sfn='' then do
call S "You must specify a file to /source"
return -1
@@ -985,6 +1112,13 @@ SOURCE:
'MAKEBUF'; 'EXECIO * DISKR' sfn '(FIFO FINIS'; skiplines=0;
do queued(); sourcing=1
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)
else skiplines=skiplines-1
end
@@ -1017,6 +1151,11 @@ INTERP:
signal on SYNTAX; INTERPRET(statement); signal off SYNTAX
return rc
ASSIGN:
parse arg asto asfrom
signal on SYNTAX; INTERPRET(statement); signal off SYNTAX
return rc
NOTIFY:
arg a
do i=1 to words(a)
@@ -1084,3 +1223,4 @@ WRITEFILE:
DROPIT:
'DROPBUF'
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