mirror of
https://github.com/GeorgeMcMullen/rxIRC.git
synced 2026-01-27 04:33:01 +00:00
Compare commits
4 Commits
master
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a8bb81121 | ||
|
|
34051b49ad | ||
|
|
75c03e2bdc | ||
|
|
e341a3219c |
182
rxirc.exec
182
rxirc.exec
@@ -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
13
setenv.exec
Normal 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
|
||||
Reference in New Issue
Block a user