It is in REXX EXEC for VM/CMS. The original CHATDISC EXEC was written by Eric Thomas of the Ecole Centrale de Paris and of CERN, the inventor of LISTSERV, and founder of L-Soft.
Some functionality which is irrelevant to the MGonz story has been removed here.
/*
------------------------------------------------------------------------
The MGonzNet
System Source Code
Mark Humphrys Jun 17, 1989
------------------------------------------------------------------------
*/
quote = d2c(125) /* the ' character */
lowcasechars = 'abcdefghijklmnopqrstuvwxyz'
upcasechars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
digits = '0123456789'
true = 1
false = 0
Address 'COMMAND' /* So that msgs don't get upcased */
Parse arg userid nodeid message /* Retrieve arguments from Chat */
message = Strip(message) /* Strip blanks from msg
Crucial */
lowmessage = Lowcase(message)
upmessage = Upcase(message)
goodmessage = removebadchars(message,'dont remove digits')
Parse pull discmsg /* Retrieve standard disc msg */
discmsg = Strip(discmsg)
discmsg = substr(discmsg,19) /* get rid of Disconnected -- .. */
nickname = '' /* Default values */
virtualuser = ''
'FINIS * * *' /* Close all files to prevent
possible loss of data if system
crashes or suchlike... */
/* Try to find person in NAMES file */
'NAMEFIND :userid' userid ':node' nodeid ':nick (LIFO'
If rc == 0 Then
Parse pull nickname
If nickname ^= '' Then nickname = Capitalise(nickname)
userid = Lowcase(userid)
nodeid = Lowcase(nodeid)
If nodeid = 'irlearn'
Then msgcmd = 'MSG' Upcase(userid)
Else msgcmd = 'SMSG RSCS MSG' Upcase(nodeid) Upcase(userid)
/* --- Copy message to Vax --------------------------------- */
/* Tell my Vax a/c about incoming message
Care to avoid message war with rscs
*/
dontcopy = 'Ccvax Irlearn Printers Vax'
Select
When Find(dontcopy,nickname) ^== 0 Then Nop
When userid = 'vmutil' & nodeid = 'irlearn' Then Nop
When nickname = 'Relay' Then Call Vax message /* forget nasty header */
When nodeid = 'irlearn' & left(userid,3) = 'log' & ,
left(lowmessage,8) = 'vax sys '
Then Nop /* Vax will receive msg anyway */
Otherwise
Do
'GLOBALV SELECT CHATDISC STACK LOGGEDON'
Parse pull loggedon
If loggedon ^= false Then Do
/* Copy to Vax unless explicitly told loggedon = false */
If nickname ^= ''
Then Call Vax '* Message from' nickname '('userid 'at' nodeid') ...'
Else Call Vax '* Message from' userid 'at' nodeid '...'
Call Vax message
End
End
End
/* --- Process message ------------------------------------- */
/* Local users from whom messages must be ignored */
dontreply = 'mhumph89 operator vmutil dirmaint'
/* Centre people - give standard disc msg
don't let them stumble across MGonzNet
*/
centre = ' adillon adviser annmarie bernie bonnie brianm'
centre = centre || ' carrick cecily deirdre dobeirne ebairead emcgrath'
centre = centre || ' eoin guest1 guest2'
centre = centre || ' harringt helen jacklowe jchester jennings joanc'
centre = centre || ' larry listserv maevem mailmnt mailr2 maint'
centre = centre || ' mallen mbreslin mcgrath mnorris'
centre = centre || ' mokeeffe mokelly molooney moriarty msexton'
centre = centre || ' noreilly odonnel'
centre = centre || ' oneillu pdoyle rosemary sinead tinac tmcgrath'
centre = centre || ' twade t_wade vmaccnt walter walsh'
/* ^ don't forget spaces between names at end of
one line and start of next */
Select
When nickname = 'Printers' Then /* Divert msgs to the pmsguser */
Do
Call divert 'P'
Exit 0
End
When nickname = 'Irlearn' & left(upmessage,10) = 'LINK CCVAX' Then
Do
Call divert 'VAX' /* Divert msgs to the vaxmsguser */
'GLOBALV SELECT CHATDISC SET LOGGEDON' false /* beautiful */
Exit 0
End
When nickname = 'Ccvax' Then
Do
Call divert 'VAX' /* Divert msgs to the vaxmsguser */
If left(upcase(goodmessage),12) == 'H236 007 NOT' Then
'GLOBALV SELECT CHATDISC SET LOGGEDON' false
/* some nasty char in there */
Exit 0
End
When userid = 'rscs' Then Exit 0 /* Don't reply to RSCS please! */
When userid = 'mailer' Then Exit 0 /* Ditto for MAILER */
When userid = 'relay' Then Exit 0
When Left(message,1) == '*' Then Exit 0
/* Ignore starred messages */
When nodeid = 'irlearn' & Find(dontreply,userid) ^== 0 Then Exit 0
When Find(centre,userid) ^== 0 Then
Do
Call Tellback '* Disconnected -- message is recorded'
Exit 0
End
When nodeid = 'irlearn' & left(userid,3) = 'log' Then
Do
Call Log /* Divert virtual users here */
Exit 0
End
When lowmessage = 'help'
Then Do
Call Tellback '* MGonzNet '
Call Tellback '* --------------------------------------------------'
Call Tellback '* help Help '
Call Tellback '* dir Directory of available files '
Call Tellback '* get :fn :ft: Get a file '
Call Tellback '* who Nice VM Who '
Call Tellback '* p Query VM/SCS printer queues '
Call Tellback '* p :printer: Query specific printer '
if nickname = 'Vax' then do
Call Tellback '* q Query reader '
Call Tellback '* q files Receive all files '
Call Tellback '* q mail :nb: Receive all mail into :nb: '
Call Tellback '* q all :nb: Receive everything '
Call Tellback '* tell :mgonznetuser: :msg: '
Call Tellback '* cms tell :realuser: :msg: '
end
Call Tellback '* :msg: Talk to the Gonz '
Call Tellback '* * :msg: Talk to the Gonzkeeper '
Call Tellback '* --------------------------------------------------'
Exit 0
End
When lowmessage = 'who' Then
Do
Call Who
Exit 0
End
When lowmessage = 'dir' Then
Do
Call Dir
Exit 0
End
When left(lowmessage,4) = 'get ' Then
Do
Call Get substr(message,5)
Exit 0
End
When Find(lowmessage, 'hi') ^== 0 |,
Find(lowmessage,'hello') ^== 0 |,
Find(lowmessage, 'yo') ^== 0 Then
Do
Call ID /* standard discmsg */
Exit 0
End
When nodeid ^= 'irlearn' & nodeid ^= 'ccvax' Then
Do
Call MGonz /* Divert non-UCD users here */
Exit 0
End
When lowmessage = 'p'
Then Do
Call P /* call with no parameters */
Exit 0
End
When left(lowmessage,2) = 'p '
Then Do
Call P substr(message,3)
Exit 0
End
When nickname = 'Vax' Then
Do
Call Sys
Exit 0
End
Otherwise
Do
Call MGonz
Exit 0
End
End
Exit 0 /* Just in case instructions are added to the SELECT without an
Exit statement */
ID:
If nickname ^= '' Then
Call Tellback '* Yo 'nickname'! What'quote's happenin?'
Else
Call Tellback '* Yo dude! Please introduce yourself!'
Call Tellback '* 'discmsg
Return
MGonz:
Address 'CMS' 'COPYFILE MGONZ SOURCE A MGONZ LSP A (REPLACE'
'GLOBALV SELECT CHATDISC STACK NUM'
parse pull num
if num = '' | ^DataType(num,'W') then num = 0
num = num + 1
if (num < 1) | (100 < num) then num = 1
'GLOBALV SELECT CHATDISC SETP NUM' num
/* write to LASTING GLOBALV */
index = num /* cycles 1 to 100 */
select
when nickname ^= '' then name = nickname
when virtualuser ^= '' then name = virtualuser
otherwise name = userid /* pass originid into lisp program */
end
arg = removebadchars(message) /* bad chars will crash LISP */
arg = strip(arg)
arg = left(arg,50) /* else lisp truncates, thus losing brackets */
'EXECIO 1 DISKW MGONZ LSP A (FINIS STRING (setq index' index ')'
'EXECIO 1 DISKW MGONZ LSP A (FINIS STRING (setq index2' index ')'
'EXECIO 1 DISKW MGONZ LSP A (FINIS STRING (setq name 'quote''name ')'
'EXECIO 1 DISKW MGONZ LSP A (FINIS STRING (response 'quote'(' arg '))'
Address 'CMS' 'LISP MGONZ LSP'
'EXECIO 1 DISKR MGONZ LISTING A 441'
'EXECIO * DISKR MGONZ LISTING A (LOCATE /VALUE IS/'
'EXECIO 1 DISKR MGONZ LISTING A (LIFO'
parse pull line
line = lowcase(line) /* MGONZ LISTING will be all upper case */
do until queued()=0
pull rubbish
end
line = strip(line)
line = strip(line,'L','(')
line = strip(line,'T',')') /* discard enclosing brackets */
replymsg = '* 'line
If nickname ^= 'Vax' Then /* get both sides of the conversation */
Address 'CMS' 'TELL ME' replymsg
Call Tellback replymsg
Return
Dir:
Call Tellback '*--------------------------------------------------------- '
Call Tellback '* P EXEC printing utility for UCD'quote's VM service '
Call Tellback '* P COM printing utility for UCD'quote's CCVAX service '
Call Tellback '* P SH printing utility for UCD'quote's UTS service '
Call Tellback '* QR EXEC query reader utility for VM/CMS '
Call Tellback '* TITLE EXEC printing utility for VM/CMS '
Call Tellback '* THE TRUTH the truth about MGonz '
Call Tellback '* THE BIBLE the Bible of the Church of MGonz '
Call Tellback '*--------------------------------------------------------- '
Return
Get:
thing = arg(1)
parse var thing fn ft
filename = upcase(strip(fn)' 'strip(ft))
filename = strip(filename)
Select
When filename == '' Then Do
Call Tellback '* Syntax is GET FN FT '
Call Tellback '* available files : '
Call Dir
End
When filename == 'P EXEC' Then
If nodeid == 'irlearn' then do
Call Tellback '* P EXEC on its way ...'
Call Tellback '* type RECEIVE = to receive it and P to run it'
Address 'CMS' 'SF' filename userid
end
Else do
Call Tellback '* ----------- Warning !!! ---------------------'
Call Tellback '* P EXEC will only run on UCD'quote's VM service'
Call Tellback '* ---------------------------------------------'
Call Tellback '* here it is anyway ...'
Address 'CMS' 'SF' filename userid 'AT' nodeid
end
When filename == 'P COM' Then
If nodeid == 'ccvax' then do
Call Tellback '* P.COM on its way ...'
Call Tellback '* type RECEIVE * to receive it and @P to run it'
Address 'CMS' 'SF' filename userid 'AT CCVAX'
end
Else do
Call Tellback '* ----------- Warning !!! ---------------------'
Call Tellback '* P.COM will only run on UCD'quote's CCVAX service'
Call Tellback '* ---------------------------------------------'
Call Tellback '* here it is anyway ...'
Address 'CMS' 'SF' filename userid 'AT' nodeid
end
When filename == 'P SH' Then Do
Call Tellback '* ----------- Warning !!! ---------------------'
Call Tellback '* P SH will only run on UCD'quote's UTS service'
Call Tellback '* ---------------------------------------------'
Call Tellback '* here it is anyway ...'
Address 'CMS' 'SF' filename userid 'AT' nodeid
End
When filename == 'QR EXEC' | filename == 'TITLE EXEC' Then Do
Call Tellback '* file' filename 'on its way ...'
Call Tellback '* note this program only runs on VM/CMS systems'
Address 'CMS' 'SF' filename userid 'AT' nodeid
End
When filename == 'THE TRUTH' | filename == 'THE BIBLE' Then Do
Call Tellback '* file sent via mail ...'
subject = filename', (C) MGonzNet Publications Inc.'
argstring = '(NOEDIT NOLOG NOPROMPT FILE' filename 'SUBJECT' subject
Address 'CMS' 'MAIL' userid'@'nodeid argstring
End
Otherwise Do
Call Tellback '* Error - file' filename 'does not exist'
Call Tellback '* Use DIR to get list of available files'
End
End
Return
P:
/* Set pmsguser to this user
( in fact, this user will receive all msgs from Printers
until someone else sends a p request )
*/
If nodeid = 'irlearn' Then Do
Call Tellback '* Well, I'quote'll give you the info, but in future '
Call Tellback '* use the program P EXEC, which I have just sent you '
Address 'CMS' 'SENDFILE P EXEC' userid
End
'GLOBALV SELECT CHATDISC SET PMSGUSER' userid
'GLOBALV SELECT CHATDISC SET PMSGNODE' nodeid
If Arg(1) = ''
Then Do
Call Tellback '* VM and SCS printer queues : '
Call Tellback '* S=file being printed, Q=files queued'
printermsg = 'SMSG RSCS CMD PRTRSCS Q SY Q'
End
Else Do
printer = Arg(1)
Call Tellback '* Queue for printer' printer ': '
Call Tellback '* S=file being printed, Q=files queued'
printermsg = 'SMSG RSCS CMD PRTRSCS Q' Upcase(printer) 'F'
End
Call Diag 8,printermsg
Return
divert:
/* Incoming message from someone
Pass it to to the Arg(1)msguser, if found
*/
'GLOBALV SELECT CHATDISC STACK' Arg(1)'MSGUSER'
Parse pull msguser
If msguser ^= '' Then Do
'GLOBALV SELECT CHATDISC STACK' Arg(1)'MSGNODE'
Parse pull msgnode
If msgnode ^= '' Then Do
If Lowcase(msgnode) = 'irlearn'
Then thiscmd = 'MSG' Upcase(msguser)
Else thiscmd = 'SMSG RSCS MSG' Upcase(msgnode) Upcase(msguser)
Call Diag 8,thiscmd message
End
End
/* else no Arg(1)msguser set, so do nothing */
Return
Sys: /* My vax a/c has sweeping powers to do things on VM */
Select
When left(lowmessage,5) = 'tell ' Then Do
virtualuser = 'Sys on Vax'
Call MSG false,substr(message,6)
End
When lowmessage = 'on' Then Do
'GLOBALV SELECT CHATDISC SET LOGGEDON' true
Call Vax '* Message copy to Vax is ON'
End
When lowmessage = 'off' Then Do
'GLOBALV SELECT CHATDISC SET LOGGEDON' false
Call Vax '* Message copy to Vax is OFF'
End
/* I can tell VM myself when to copy msgs to me */
When lowmessage = 'status' Then Do
'GLOBALV SELECT CHATDISC STACK LOGGEDON'
Parse pull loggedon
If loggedon ^= false Then
Call Vax '* Message copy to Vax is ON'
Else
Call Vax '* Message copy to Vax is OFF'
End
When left(upmessage,3) = 'CMS' Then
Do
cmd = lowcase(substr(message,5))
cmd = strip(cmd)
Address 'CMS' cmd
If rc ^= 0 Then
Call Vax '* Command failed, return code' rc
Else
Call Vax '* Command returned ok'
End
When left(upmessage,2) = 'CP' Then
Do
cmd = upcase(substr(message,4))
cmd = strip(cmd)
Call Diag 8,cmd
If rc ^= 0 Then
Call Vax '* Command failed, return code' rc
Else
Call Vax '* Command returned ok'
End
When lowmessage = 'q' Then
Call q /* query reader, Call Vax the result */
Otherwise
Call MGonz
End
Return
Tellback:
Call Diag 8,msgcmd Arg(1)
Return
Vax:
vaxmsgcmd = 'SMSG RSCS MSG CCVAX H236_007'
Call Diag 8,vaxmsgcmd Arg(1)
Return
Lowcase: procedure expose lowcasechars upcasechars
Return translate(Arg(1),lowcasechars,upcasechars)
Upcase: procedure expose lowcasechars upcasechars
Return translate(Arg(1),upcasechars,lowcasechars)
Capitalise: procedure expose lowcasechars upcasechars
firstchar = substr(Arg(1),1,1)
rest = substr(Arg(1),2)
Return Upcase(firstchar)''Lowcase(rest)
Mytime: procedure
timenow = left(time(),5)
hr = left(timenow,2)
min = right(timenow,2)
if hr > 12 then timenow = (hr - 12)'.'min' pm'
else if hr = 12 then timenow = hr'.'min' pm'
else timenow = hr'.'min' am'
if left(timenow,1) = '0' then timenow = substr(timenow,2)
dow = left(date('weekday'),3)
day = right(date('sorted'),2)
if left(day,1) = '0' then day = substr(day,2)
month = left(date('month'),3)
year = left(date('sorted'),4)
Return timenow',' dow day month year
fileexists: procedure expose true false
filename = arg(1)
upper filename
'ESTATE' filename
if rc = 0 then return true
else return false
removebadchars: procedure expose lowcasechars upcasechars digits
/* substitutes spaces for non-alphabetic chars
in arg(1)
*/
goodchars = lowcasechars || upcasechars
if arg(2) ^= '' then
goodchars = goodchars || digits
string = arg(1)
do i = 1 to length(string)
char = substr(string,i,1)
if pos(char,goodchars) = 0 /* not one of the goodchars */
then string = left(string,i-1)' 'substr(string,i+1)
end
return string