From 8676ef66d1581c8ed452f52150950faa5247ae4c Mon Sep 17 00:00:00 2001 From: George McMullen Date: Sat, 8 Jun 2013 14:40:36 -0700 Subject: [PATCH] Version 2.0 of rxIRC (By Lynx (244661 at DOLUNI1) 1993) --- action.helpirc | 4 +- custom.helpirc | 56 +-- faq.helpirc | 70 ++-- rxirc.$package | 35 +- rxirc.exec | 1000 ++++++++++++++++++++++++++++++++++------------- rxirc.helpmenu | 17 +- rxirc.install | 53 ++- rxirc.names | 28 +- special.helpirc | 351 +++++++++++++++-- syntax.helpirc | 8 +- 10 files changed, 1221 insertions(+), 401 deletions(-) diff --git a/action.helpirc b/action.helpirc index 950209c..db5416a 100644 --- a/action.helpirc +++ b/action.helpirc @@ -1,4 +1,4 @@ -.cm last change by lynx -- january, 1992 +.cm last change by lynx -- may 93 _______ *|^^^^^^^|* The Internet Relay Chat program @@ -18,7 +18,7 @@ ACTION commands: You'll find out by experimenting. The commands at disposition in the present rxIRC version are: - BOW, COMFORT, CUDDLE, DANCE, GIGGLE, GRIN, HUG, LAUGH + APPLAUD, BOW, COMFORT, CUDDLE, DANCE, GIGGLE, GRIN, HUG, LAUGH NOD, SHRUG, SIGH, SMile, THank, WAVE, WINK, YAWN You should know that you can also produce your own message lines diff --git a/custom.helpirc b/custom.helpirc index 17a71c6..e6ef9c0 100644 --- a/custom.helpirc +++ b/custom.helpirc @@ -10,16 +10,19 @@ *** How to customize rxIRC *** -The IRC PROFILE startup file: - This file should contain a series of lines that are executed by - rxIRC as if you would type them in as soon as you get connected to - a server. You could for instance do "/join #fun" or "/who bunny" +The PROFILE RXIRC startup file: +| This file should contain a series of lines that are /source'd by +| rxIRC as soon as you get connected to the first server. You could +| for instance do "join #fun" or "who bunny", probably you will +| want to set up some aliases. See /source for more. +| The file IRC PROFILE is obsolete. For a conversion you have +| to rename it and remove all the command characters (the slashes). Namesfile settings: rxIRC gets your default nickname and full name from your namesfile unless otherwise specified in the command line. You can also set a 'motto' line by adding a :motto tag to your self-entry in your - namesfile which will be displayed when VERSION requests are sent + namesfile which will be displayed when USERINFO requests are sent to you while you are ircing with rxIRC. Environment settings: @@ -28,25 +31,30 @@ Environment settings: IRCNAME and IRCPORT. rxIRC uses 'SELECT CENV' for compatibility with other IRC programs. -Defaults in the RXIRC NAMES file: - Some defaults for the rxIRC program are defined here: - server: the Internet address of an irc server - port: the TCP/IP port it runs on, usually 6667 - timeout: when rxIRC should give up on connections - logging: make it ON or OFF - quiet_ignore: usually OFF - loud_beeps: ON only when a BEEP MODULE is available. - show_numbers: ON shows the reply numbers of server replies, for freaks. - list_all: show also channels without topic in /list, i use OFF. - beep_char: the character that gets translated into a beep and back. - highlight_char: the char that gets translated into an inverse on ircII. +The RXIRC PFKEYS file is obsolete. You can use the 'PF' commands +| from PROFILE RXIRC now. + +Defaults in the RXIRC NAMES file (the rxIRC configuration file): + server: The internet address of an IRC server + port: The TCP/IP port it runs on, usually 6667 +| browser: Name of a command good for showing files. +| Typically BROWSE, but if that's not there try XEDIT. +| timeout: Not used anymore, you can remove it + logging: Set it to ON or OFF for default logging + quiet_ignore: Usually OFF + loud_beeps: Switch it ON only when a BEEP MODULE is available. + show_numbers: When ON, rxIRC shows the numerics of IRC server replies + list_all: Show also channels without topic in /list +| beep_char: The character that gets translated into a beep and back. +| bold_char: If you define this one, you can make 'bold' messages +| by inserting this character in your messages. They +| will appear hilighted on rxIRC and bold on ircII +| clients (at least) +| highlight_char: Not used anymore +| show_time: When the current time will be displayed on the +| screen. Choices are 0 (never), 10 (every ten +| minutes), 20 (every 20 minutes), 30 (every 30 +| minutes), and 60 (every 60 minutes). You might choose to copy this file onto your disk to be able to modify the values. - --- -You have 10069612 experience points, 99159963 gold coins, 9127 spell points. -You also have 9999 hit points out of 9999. -Strength: 966; Dexterity: 939; Intelligence: 957; Constitution: 948. -Your age: 50 days 15 hours 37 minutes 32 seconds. - diff --git a/faq.helpirc b/faq.helpirc index e22aa6a..04013d0 100644 --- a/faq.helpirc +++ b/faq.helpirc @@ -1,28 +1,32 @@ Frequently asked questions: -------------------------- -1. Why can't rxIRC have /alias and /on and /notify and everything else - that ircII has? +What am I supposed to write into the :server field in RXIRC NAMES? + + You don't have a server? If you're in the US then Trillian + (hrose@eff.org) will most probably be able to tell you the nearest + server to you. You can however connect to IRC through an open server + like irc.mit.edu (18.70.0.224), fairhope.andrew.cmu.edu (128.2.11.213) + magpie.ee.su.oz.au (129.78.13.28) or ucsu.colorado.edu (128.138.129.83) +| and then ask operators for the nearest server to you. + You can also examine the /links list, but geographical vicinity + usually is not network vicinity! + +|Why can't rxIRC have /on and /notify and everything else +|that ircII has? Because ircII is a giant program that a lot of people have worked on to be able to do all of that. rxIRC is a relatively little program which I also want to stay that way, or it might get unpleasantly slow in execution! +| +|Strange says: +| There is no /on because no one wants to code it. None of the people +| who have worked on rxIRC NEED or WANT /on. :P +| +| Concerning /notify: Use a /note server! :) - I am sure that /alias and /on are functionalities that take a lot - of time to develop and most of all consume to much speed. And they - would look really ugly in the sourcecode. If you just would learn - a little REXX you'd see that you can easily add commands into the - EDIT: procedure and add hooks into the PARSE: procedure. You don't - need any /on or /alias! - - Concerning /notify, this could even be done, though it's a little - tough to simulate a timer when REXTCPIP doesn't offer it. I might - be inclined to do it, but I don't even use rxIRC myself, so why - should I spend serious time on it? If you care, go ahead and do - it yourself. Then send a copy of it to me, so I can release it. - -2. Why when I do something outside of rxIRC with /exec, or simply read - the /help files, the server signs me off? +Why when I do something outside of rxIRC with /exec, or simply read +the /help files, the server signs me off? In this case the evil ping goblin has bitten you. A particularity of the IRC protocol is that the server expects your client program to reply to @@ -30,22 +34,30 @@ Frequently asked questions: idle. When you start a command with ! or /exec, rxIRC is not able to reply to the PING and the server closes the connection on you. Poof. -3. You have a bug, "/who -h *.il" doesn't work! +You have a bug, "/who -h *.il" doesn't work! No, I don't have such a bug. The "-h" and "-s" options are specific to ircII. They are NOT standard. It is the normal and natural way - to do it simply with "/who *.il" + to do it simply with "/who *.il". Or what about trying /local. -4. When I use one of the new action commands on a channel, like /smile - I get a lot of error messages. +When I use one of the new action commands on a channel, like /smile +I get error messages. - The CTCP ACTION protocol is still rather new, not everyone likes, not - everyone supports it, and most of all, a lot of people do not have up - to date IRC programs. When you get such error messages better not use - the commands on those channels. On other channels you might find people, - who have newer clients, and you'll be able to communicate with the new - commands. +| There are controverse notions of the ethics of the CTCP ACTION protocol. +| I think it's a valid alternative form of communication and should be +| supported, but since I invented it I might be biased. Well some IRC +| client programmers insist on not supporting this protocol and return +| all sorts of funny messages. Eventually avoid using these commands +| on channels where people's clients answer with sarcastic comments. + +rxIRC crashes and then no communication software (like CHAT) works +anymore! + +| rxIRC should not crash, if it does please report that to me. +| To unlock your machine in such a situation it is not necessary to +| re-IPL it, instead just do "NUCXDROP REXXWAIT". "NUCXMAP" shows +| what so-called nucleus extensions are loaded in your machine. You still have a question? -Write mail to 244661 at DOLUNI1 (.bitnet) or to -'loesch@informatik.uni-oldenburg.de' (internet). +Write mail to 'loesch@informatik.uni-oldenburg.de' (internet). +or to '244661 at DOLUNI1' (bitnet) diff --git a/rxirc.$package b/rxirc.$package index 8a595ce..14cfca2 100644 --- a/rxirc.$package +++ b/rxirc.$package @@ -1,18 +1,21 @@ * -* This file contains the definition of the RXIRC package. +* This file contains the definition of the rxIRC package. * -* Filename Filetype -* -------- -------- - RXIRC $PACKAGE recursion! - RXIRC EXEC the client program - RXIRC NAMES the installation defaults file - RXIRC INSTALL little installation readme - RXIRC HELPMENU the documentation - ACTION HELPIRC about the set of action commands - CUSTOM HELPIRC how to customize - ETIQ HELPIRC irc etiquette (from unix irc distribution) - FAQ HELPIRC frequently asked questions - MANUAL HELPIRC irc manual (from unix irc dist) - SPECIAL HELPIRC rxIRC specific extra commands - SYNTAX HELPIRC command line usage and options - SETENV EXEC unixlike globalv utility +* Filename Filetype Filelist +* -------- -------- -------- + RXIRC $PACKAGE REXXLIB recursion! + RXIRC README REXXLIB introductory information about IRC and rxIRC + RXIRC EXEC REXXLIB the client program + RXIRC NAMES REXXLIB the installation defaults file + RXIRC INSTALL REXXLIB little installation readme + RXIRC HELPMENU REXXLIB the documentation menu + ACTION HELPIRC REXXLIB about the set of action commands + CUSTOM HELPIRC REXXLIB how to customize rxIRC + FAQ HELPIRC REXXLIB frequently asked questions (and answers) + INTRO HELPIRC REXXLIB IRC introductory manual + SPECIAL HELPIRC REXXLIB rxIRC specific extra commands + STANDARD HELPIRC REXXLIB IRC standard commands + SYNTAX HELPIRC REXXLIB command line usage and options of rxIRC + MONTH RXIRC REXXLIB an example of the rxIRC scripting language + PROFILE RXIRC REXXLIB rxIRC profiling script to start off with + SETENV EXEC REXXLIB unixlike globalv utility diff --git a/rxirc.exec b/rxirc.exec index a1378bd..cef0d11 100644 --- a/rxirc.exec +++ b/rxirc.exec @@ -1,45 +1,92 @@ /* 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 - * last change by Lynx (244661 at DOLUNI1) on Friday, 10 Jan 1992 - * Version 1.3 (using PREXX) - * Code contributions/suggestions by: Doug Sewell + * 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! * - * requires REXTCPIP MODULE by Ken Hornstein (kxh105@psuvm.bitnet) - * available from LISTSERVs carrying the VM-UTIL list + * requires RXSOCKET MODULE version 2 by Arty Ecock (eckcu@cunyvm.bitnet) * - * Copyright (C)1991 by Carlo v. Loesch and Uni Oldenburg, Germany - * All rights reserved. No guarantees implied. ("AS IS" etc.) + * Copyright (C)1991,2,3 by Lynx & CvO University Oldenburg, Germany + * You may freely use this software at your own risk. * No distribution of modified copies permitted, pls send changes to me. - */ vers='1.3' - cmds='AWAY AWAIT ADMIN CHANNEL CONNECT DEOPER DIE GRPH HASH INVITE', - 'INFO ISON JOIN NICK KILL LIST LINKS LUSERS MODE MAIL MOTD NAMES', - 'NICK NOTICE NOTE OPER PASS PART REHASH RESTART QUIT SERVICE SQUIT', - 'SUMMON STATS TOPIC TIME TRACE USERS USERHOST VOICE VERSION WHOIS', - 'WHOWAS WALLOPS WALL XTRA' - log=0; query=; ignore=; lastsender=; onoff.1="on"; onoff.0="off" - cmdchar=; userinfo=; profile="IRC PROFILE *"; target=time('R') - invitation=; writelog = "EXECIO 1 DISKW IRC LOG A0 (STRI" - tcprc=0; msa=d2c(1); realname=; c=0 + * + * By the way, this is _not_ the source code of rxIRC. There exists a + * special file IRC PREXX which when run through a preprocessor produces + * the actual RXIRC EXEC. That file is commented. This one is not. + */ vers='2.0'; 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', + 'PART REHASH RESTART QUIT SERVICE SQUIT SUMMON STATS TOPIC TIME TRACE', + 'USERS USERHOST VOICE WHOWAS WALLOPS WALL XTRA' + log=0; query=; ignore=; lastjoin=; lastsender=; onoff.1="on"; onoff.0="off" + invitation=; away=; ll.=; curll=1; logevent=0; target=time('R') + v.=; al.=; varnames=; aliasnames=; cmdchar=; userinfo=; sourcing=0 + have_rxwt=0; who_empty=0; catmode=0; catlist=; abortsource=0; skiplines=0 + "EXECIO * CP (STEM PF. STRING QUERY PF" + do i=1 to pf.0 + a=word(pf.i,2) + if a/='UNDEFINED' & a/='RETRIEVE' then, + "CP SET" subword(pf.i,1,2) '!'subword(pf.i,3) + end + "EXECIO * CP (STEM QT. STRING QUERY TERM" + "CP TERM LINEND OFF" + "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 + bold='1f'x; hi='1de8'x; lo='1d60'x; yo='1d44'x + nice.=; u@n.=; via.=; + realname=; servername=; ignore_reply = "Your messages are not being received." - address "COMMAND"; trace 'O' - "IDENTIFY (LIFO" - pull me . mynode . via . - - "REXTCPIP" /* oh how i still love this command */ - if rc^=0 then call BYE "REXTCPIP MODULE returning" rc - - "NAMEF :NICK RXIRC :SERVER :PORT :TIMEOUT :LOGGING :QUIET_IGNORE", - ":HILIGHTCHAR :BEEPCHAR :LOUD_BEEPS :SHOW_NUMBERS :LIST_ALL", + "IDENTIFY (LIFO"; pull me . mynode . rscs a . + logfile=translate(a,'_','/') "IRCLOG A0" + writelog="EXECIO 1 DISKW" logfile "(STRI" + 'STATE RXSOCKET MODULE *' + if rc=0 then do + parse value SOCKET('version') with . . rc . + if rc >= 2.0 then rc=0 + else rc=28 + end + if rc/=0 then call BYE "RXSOCKET version 2 required" + do 3 + parse value SOCKET('INITIALIZE', 'rxIRC', 1) with rc . etc + if rc=2004 then do + say '' + 'NUCXDROP RXSOCKET' + end + else leave + end + if rc/=0 then call BYE "initialize error:" etc + parse value SOCKET('GETHOSTNAME') with . hostname + parse value SOCKET('GETDOMAINNAME') with . domain + 'REXXWAIT TEST' + select + when rc=0 then nop + when rc=1 then do + 'REXXWAIT LOAD' + if rc/=0 then call BYE "REXXWAIT can't be loaded" + end + otherwise call BYE "REXXWAIT MODULE required" + end + have_rxwt=1 + 'IMMCMD SET HI' + "NAMEF :NICK RXIRC :SERVER :PORT :LOGGING :QUIET_IGNORE :SHOW_TIME ", + ":BOLD_CHAR :BEEP_CHAR :LOUD_BEEPS :SHOW_NUMBERS :LIST_ALL :BROWSER", "(LIFO FILE RXIRC" - if rc^=0 then call BYE "missing or unreadable RXIRC NAMES file" - pull def_listall; pull def_numb; pull def_loud; parse pull beep - parse pull hilight; pull def_quiet; pull def_log - parse pull timeout; parse pull def_port; parse pull def_server + if rc/=0 then call BYE "missing or unreadable RXIRC NAMES file" + pull viewcmd; pull def_listall; pull def_numb; pull def_loud + parse pull beepch; parse pull boldch; parse pull showtime; pull def_quiet + pull def_log; parse pull def_port; parse pull def_server + if viewcmd='' then call BYE 'no ":browser" tag defined in RXIRC NAMES' + if beepch='' then beepch=d2c(0) + if boldch='' then boldch=d2c(0) "GLOBALV SELECT CENV GET IRCNICK IRCSERVER IRCNAME IRCPORT" - "NAMEFIND :USERID" me ":NICK :NAME :MOTTO :CMDCHAR :IRCNICK :IRCNAME", - "(LIFO" + "NAMEFIND :USERID" me ":NICK :NAME :MOTTO :CMDCHAR :IRCNICK :IRCNAME (LIFO" if rc=0 then do parse pull name; parse pull nick if ircnick="" then ircnick=nick @@ -51,15 +98,15 @@ end parse arg nick server name '('o; upper o - if nick^='' then ircnick = nick + if nick/='' then ircnick = nick if ircnick='' then ircnick=me capnick = translate(ircnick) - if server^='' then ircserver=server + if server/='' then ircserver=server else if ircserver='' then ircserver=def_server - if name^='' then ircname = name + if name/='' then ircname = name if ircname='' then ircname=me "at" mynode".bitnet" if cmdchar="" then cmdchar="/" - do while o^="" + do while o/="" parse var o opt o select when abbrev("PORT", opt, 1) then parse var o ircport o @@ -68,115 +115,159 @@ when abbrev("LOUD_BEEPS", opt, 3) then parse var o def_loud o when abbrev("NUMBERS", opt, 1) then parse var o def_numb o when abbrev("QUIET_IGNORE", opt, 1) then parse var o def_quiet o - when abbrev("TIMEOUT", opt, 1) then parse var o timeout o - otherwise call BYE "Unknown option" opt + otherwise call BYE "unknown option" opt end end if ircport='' then ircport=def_port - if timeout="" then timeout=25 if def_listall="ON" then listall=1; else listall=0 if def_log="ON" then log=1; else log=0 if def_loud="ON" then loud=1; else loud=0 if def_numb="ON" then numb=1; else numb=0 if def_quiet="ON" then quiet=1; else quiet=0 - if log then writelog "* IRC Session started on" date() "at" time() + if log then writelog "IRC Session started on" date() "at" time() if datatype(left(ircnick,1))='NUM' then ircnick='u'ircnick - "IMMCMD SET HI" + if ^datatype(showtime,'w') then showtime=80 if userinfo="" then userinfo="- no info given by user -" - "VMFCLEAR" - call OUT "rxIRC v"vers "- You are" ircnick "("ircname")" - call OUT "Logging is" onoff.log"; Loud beeps are", + parse value RESETVALUE('ALL') with rc . + if rc/=0 then call BYE "problem w/RESETVALUE" + parse value SETVALUE('TIME ==:=0:00') with rc . + if rc/=0 then call BYE "problem w/SETVALUE TIME" + parse value SETVALUE('MSG IUCV') with rc . + if rc/=0 then call BYE "problem w/SETVALUE MSG IUCV" + call S "rxIRC"hi||vers||yo"- You are" ircnick "("ircname")" + call S "Logging is" onoff.log"; Audible bells are", onoff.loud"; Quiet ignore is" onoff.quiet + if showtime=80 then say "Time display is off" + else say "Time is displayed every" showtime "minutes" call CONNECT ircserver - say copies("-",79) - "CP TERM LINEND OFF" - "CP TERM CHARDEL OFF" - + call S copies("-",79)lo do forever "IMMCMD STATUS HI" - if rc^=0 then call EDIT "hi" - if c^=0 then do - TCPRECEIVE(c, "WAITKB", "EXPAND") - select - when tcprc=0 then do i=1 to tcpline.0 - call OUT PARSE(tcpline.i) + if rc/=0 then call S, + 'Sorry, "hi" is a system reserved word. Try an other operating system.' + parse value WAIT('TIME','CONS','MSG','SOCKET READ' sock) with rc type data + select + when rc/=0 then call BYE "REXXWAIT returning code" rc + when type='SOCKET' then do + parse value SOCKET('READ', sock) with rc . data + if rc=54 then call BYE + if rc/=0 then call BYE 'socket read error' rc + buffer = buffer || data + do forever + if index(buffer, lf)=0 then leave + parse var buffer in (lf) buffer + call OUT PARSE(strip(in,,cr)) end - when tcprc=25 then do externals() - parse external ext; call CONS ext; ext=time('R') - end - when tcprc=12 then do; c=0; call CLOSE "Oops"; end - when tcprc=18|tcprc=20 then call CLOSE - when tcprc=0|tcprc=8|tcprc=9 then nop - otherwise - call CLOSE "Unknown error" tcprc "from REXTCPIP" end + when type = 'CONS' then if data/='' then do + rc=time('R') + call EDIT data + curll=curll+1; ll.curll=hi||data||lo; k=curll-50; ll.k=; + if log then writelog ' 'data + end + when type = 'MSG' then do + parse var data . . no'('id'): 'data + if id='' then id='RSCS' + origin=id'@'no + ni=NICE(origin) + if FINDM(ignore,origin) | FINDM(ignore,ni) then do + if ^quiet & left(data,1)/='*' then call TELL origin '*' ignore_reply + end; else do + call OUT hi||ni':'lo||data + if away/='' & left(data,1)/='*' then call TELL origin '* away:' away + end + end + when type = 'TIME' then do + parse var data . hh':'mm':' . + if datatype(mm/showtime,'w') then call S 'It is now' hh':'mm + 'EXECIO 1 CP(VAR A STR Q' me + parse var a . '-' a . + if a='DSC' then do + data='virtual machine runs disconnected' + call SEND 'QUIT :'data + call BYE data + end + end + otherwise + call S 'Unexpected event:' type data end end - call BYE "Murphy's Law" - -CONS: - parse arg keys - call EDIT keys - if out^="" then TCPSEND(c, out) - return + call BYE "a rexx oddity" PARSE: parse arg a - if loud & pos(x2c(2f),a)^=0 then "BEEP" - b=; a=translate(a,hilight||beep||"_",d2c(2)x2c(2f)x2c(32)) + if loud & pos(beep,a)/=0 then "BEEP" + b=; a=translate(a,"%"||beepch||"_",rev||beep||undl) + 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) + else a=insert(lo,a,i) + a=delstr(a,i,1) + j=1-j + end + if j=1 then a=a||lo if left(a,1)=':' then do parse var a ':'s m e f ':'g parse var s s'!'sad end else do; s=''; parse var a m e f ':'g; end f=strip(f) + logevent = 1 select when m='CHANNEL' then if e="0" then b='***' s 'leaves this channel' else b='***' s 'joins this channel' when m='INVITE' then do + f=strip(word(f g,1)) invitation = f - b='***' s 'invites you to channel' f; end + lastsender = s + b='***' s '('sad') invites you to channel' f; end when m='JOIN' then do - b='***' s 'joins channel' e - if s=ircnick then target=word(e,1) + e=strip(word(e g,1)) + b='***' s '('sad') joins channel' e + if s=ircnick then target=translate(e) + else lastjoin=s end when m='KICK' then b='***' s 'kicks' f 'off channel' e - when m='KILL' then b='*** You were killed by' s subword(g,2) - when m='MODE' then b='*** Mode change:' s 'sets' e f + when m='KILL' then b='You were killed by' s subword(g,2) + when m='MODE' then b='Mode change:' s 'sets' f 'on' e when m='MSG' then b='<'s'>' g - when m='NICK' then b='***' s 'is now known as' e + when m='NICK' then b='***' s 'is now known as' e||g when m='NOTICE' then select - when s='' then b=g + when s='' | s=servername then do + if word(g,1)="***" then b=subword(g,2) + else b=g + a=; parse var b 'Your host is 'g'['a . + if a/='' then servername=g + end when translate(e)=capnick then do - if find(ignore,translate(s))^=0 then do + if FINDM(ignore,s) | FINDM(ignore,sad) then do return ''; end else do; b='-'s'-' g lastsender=s end end - when left(e,1)='+'|left(e,1)='-'|datatype(left(e,1))='NUM' then b=s g otherwise b='-'s':'e'-' g; end when m='PART' then b='***' s 'parts channel' e - when m='PING' then TCPSEND(c, "PONG :"ircnick) + when m='PING' then call SEND("PONG :"ircnick) when m='PRIVMSG' then select when translate(e)=capnick then do - if find(ignore,translate(s))^=0 then do - if ^quiet then TCPSEND(c, 'NOTICE' s ':'ignore_reply) + if FINDM(ignore,s) | FINDM(ignore,sad) then do + if ^quiet then call SEND('NOTICE' s ':'ignore_reply) return ''; end else do if CTCP(1 g) then b='*'s'*' g lastsender=s end end - when e=target|left(e,1)='+'|left(e,1)='-'|datatype(left(e,1))='NUM' - then if CTCP(0 g) then b='<'s'>' g + when translate(e)=target then if CTCP(0 g) then b='<'s'>' g otherwise if CTCP(0 g) then b='<'s':'e'>' g; end - when m='QUIT' then b='*** Signoff:' s '('g')' + when m='QUIT' then b='Signoff by' s '('g')' when m='TOPIC' then b='***' s 'sets the topic to:' g - when m='WALLOPS' then b='*** Wallops from' s':' g - when m='WALL' then b='*** Broadcast from' s':' g + when m='WALLOPS' then b='Wallops from' s':' g + when m='WALL' then b='Broadcast from' s':' g + when m='221' then b='Your mode is' g when m='301' then b=f 'is away:' g when m='311' then do parse var f ni ui no . @@ -184,150 +275,295 @@ PARSE: end when m='314' then do; parse var f ni ui no . b=ni 'was' ui'@'no '('g')'; end - when m='312' then b='via server' f '('g')' + when m='312' then b='via' word(f,2) '('g')' + when m='315' then if who_empty then call S 'No matches for /who' when m='319' then b='on channels:' g when m='317' then b='and has been idle' word(f,2) 'seconds' when m='322' then do - parse var f ch n - if listall | g^="" | n>2 then - b=left(ch,13) left(n,4)g - else return '' + 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 + end; end + when m='323' then do + if catmode then do + call OUT 'Channels:' catlist; catlist=; catmode=0; end; end + when m='324' then b='The mode on channel' word(f,1) 'is' word(f,2) + when m='332' then b='The topic is:' g + when m='341' then b='Inviting' word(f,1) 'to channel' word(f,2) + when m='352' then do + parse var f ch us no . ni st . + if st="S" then return '' + who_empty=0; n=subword(g,2) + do forever; a=64-(length(n)+length(us)+length(no)) + if (length(no)+a > 13) then leave + n=subword(n, 1, words(n)-1)'..'; end + if (a < 0) then k=hi||n||lo||us"@*"right(no,length(no)+a-1) + 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 + call S left(st,3)yo||left(ni,9)k end - when m='324' then b='*** The mode on channel' word(f,1) 'is' word(f,2) - when m='332' then b='*** The topic is:' g - when m='341' then b='*** Inviting' word(f,1) 'to channel' word(f,2) - when m='353' then b=left(word(f,2),10) g - when m='NAMREPLY' then do - parse var f na ni; b=left(na,10) ni; end - when m='WHOREPLY'|m='352' then do - if m='352' then parse var f . us no . ni st . - else parse var f us no . ni st . - b=left(st,3)left(ni,10)left(us"@"no,31) 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 end - when m='313'|m='364'|m='LINREPLY' then b=f g - when m='315'|m='318'|m='321'|m='323'|m='365'|m='366'|m='406' - then nop + when m='313'|m='364' then b=f g + when m='004'|m='318'|m='321'|m='365'|m='366'|m='406' then nop + when m='001' then do; servername=s; b=subword(g,1,words(g)-1); end + when m='252'|m='254' then b=f g otherwise select when g="" then b=f when f=""|f=s then b=g otherwise b=f":" g end - if s^="" then b='('s')' b - if numb then b=m b + if s/="" & s/=servername then b='('s')' b + if numb then b='{'m'}' b end return translate(b,"@",msa) +VAR: + parse arg x + select + when x=',' then return lastsender + when x=':' then return lastjoin + when x='A' then return away + when x='C' then return target + when x='H' then return m + when x='I' then return invitation + when x='K' then return cmdchar + when x='N' then return ircnick + when x='Q' then return query + when x='S' then return servername + when x='T' then do + if query='' then return target + else return query + end + when x='V' then return vers + when x='Z' then return left(time(),5) + when x='$' then return '$' + otherwise return v.x + end + return '' + +SET: + parse arg r + if r='' then do i=1 to words(varnames) + r=word(varnames,i); call S '$('r') is "'v.r'"' + end + else do + parse var r 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 + end + return + EDIT: - out=; parse arg in - if in='' then nop - else if left(in,1)="!" then do - address CMS substr(in,2); say "rxIRC ready("rc");"; end - else if left(in,1)^=cmdchar then do - if query='' then out='PRIVMSG' target ':'in - else out='PRIVMSG' query ':'in + parse arg in + if left(in,1)="!" then call EXECUTE substr(in,2) + else if left(in,1)/=cmdchar then do + if query/='' then call SEND 'PRIVMSG' query ':'in + else if target/=0 then call SEND 'PRIVMSG' target ':'in + else call S 'You should join a channel or query a user first' end - else if left(in,2)=cmdchar' ' then do - parse var in 3 r; out='MSG :'r + 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 + parse var lin . name lin + if name='' then do i=1 to words(aliasnames) + name=word(aliasnames,i); call S name': "'al.name'"' + end + else do + upper name + if lin='' then call S name': "'al.name'"' + else do; al.name=lin + if find(aliasnames,name)=0 then aliasnames=name aliasnames; end + end + return end - else do; parse var in 2 q r; upper q - select - when q=''|q='SAY' then out='PRIVMSG' target ':'r - when left(q,1)='*' then return - when abbrev('ABORT',q,2) then call BYE "user abort request" - when abbrev('BYE',q,1)|abbrev('SIGNOFF',q,1) then - do; TCPSEND(c, 'QUIT'); TCPCLOSE(c); call BYE; end - when abbrev('CHANNEL',q,1) then do - if r="" then do; call OUT "* Talking to" target; return; end - if target^="" then TCPSEND(c, "PART" target); - out="JOIN" r + do while lin^='' + if left(lin,1)='*' then return + parse var lin one '15'x lin + par=; lc=; com='$'; al.com = one + do while al.com^=''; a=al.com + do while left(a,1)='%' + parse var a '%'var a + parse var par b par + v.var=b end - when abbrev('CLEAR',q,2) then "VMFCLEAR" - when abbrev('CMDCHARACTER',q,2) then cmdchar=left(r,1) - when abbrev('EXECUTE',q,1) then do - address 'CMS' r; say "rxIRC ready("rc");"; end - when abbrev('FOLLOW',q,1) then out='JOIN' invitation - when abbrev('HELP',q,1) then do - address CMS "HELP RXIRC"; say; end - when abbrev('LOGGING',q,2) then call LOGGING r - when abbrev('NICKNAME',q,2) then if r='' then out='WHOIS' nick - else do; out='NICK' r; ircnick=r; capnick=translate(r); end - when abbrev('REPLY',q,1) then call QUERY lastsender - when abbrev('SERVER',q,3) then call CONNECT r - when abbrev('STATUS',q,2) then do; out='WHOIS' ircnick - call OUT '* Target:' target'; Query:' query'; Invitation:' invitation'; Last sender:' lastsender - end - when abbrev('TALKTO',q,2) then do - if r^="" then target=word(r,1) - call OUT '* Now talking to' target - end - when abbrev('VERSION',q,3) then do; out='VERSION' - call OUT '* rxIRC v'vers 'written by the lynx (lynx@dm.unirm1.it)' - end - when abbrev('XAMINE',q,1) then out='WHOIS' lastsender - when abbrev('DATE',q,1) then out="TIME" r - when abbrev('DESCRIBE',q,2) then do; parse var r whom desc - out='PRIVMSG' whom ':'msa'ACTION' desc||msa; end - when abbrev('IGNORE',q,2) then call IGNORE r - when abbrev('MSG',q,1)|abbrev('MESSAGE',q,3) then out='PRIVMSG' r - when abbrev('QUERY',q,1) then call QUERY r - when abbrev('REQUEST',q,3)|q='CTCP' then do - parse var r ni rq .; upper rq - if ni="" then ni=capnick - if rq="" then rq="VERSION" - out='PRIVMSG' ni ':'msa||rq||msa - end - when q='WHO' then if r="" then out='WHO' target - else out='WHO' r - when abbrev('TCPIPSTATUS',q,3) then do; CONNSTAT(c) - call OUT '*' local_addr'!'local_port '->' foreign_addr'!'foreign_port, - conn_stat '(BU:'bytes_to_read', UB:'unacked_bytes')' - end - otherwise if ACTION(q r) then do - call OUT ircnick r - if query="" then out='PRIVMSG' target ':'msa'ACTION' r||msa - else out='PRIVMSG' query ':'msa'ACTION' r||msa + if par^='' then do; a=a par; par=''; end + b=; do while a^='' + parse var a k'$'y a + if y='' then do; b=b||k; leave; end + if left(y,1)='(' then do; parse var y 2 x')'y; a=y a; end + else do; x=left(y,1); a=substr(y,2) a; end + b=b||k||VAR(x) end + parse var b com par '::' next + upper com + if next^='' then lin=next||'15'x||lin + if find(lc, com)=0 then lc=com lc + else do; call S 'Alias loop of "'com'" encountered'; return; end + end + call COMMAND com par + end + return + +COMMAND: + parse arg q r; out=; upper q + select + when abbrev('ABORT',q,2) then call BYE "your abort request" + when abbrev('AWAY',q,2) then do; away=r; out="AWAY" r; end + when abbrev('BYE',q,1)|abbrev('SIGNOFF',q,6)|abbrev('QUIT',q,3) then do + call SEND('QUIT' r); call BYE; end + when abbrev('CATALOG',q,2) then do; catmode=1; out='LIST' r; end + when abbrev('CHANNEL',q,1) then do + if r="" then do; call S "Talking to" target; return; end + if target/="" & target/=0 then call SEND("PART" target); + out="JOIN" r + end + when abbrev('CLEAR',q,2) then "VMFCLEAR" + when abbrev('CMDCHARACTER',q,2) then cmdchar=left(r,1) + when q='ECHO' then call OUT r + when abbrev('EXECUTE',q,1) then call EXECUTE r + when abbrev('EXPRESSION',q,4) then call SET word(r,1) EXPR(subword(r,2)) + when abbrev('FOLLOW',q,1) then out='JOIN' invitation + when abbrev('HELP',q,1) then do + address 'CMS' "HELP RXIRC"; say; end + when q='IF' then do + parse var r cond a r + if translate(a)^='THEN' then call S "IF" cond": THEN is missing" else do - li=cmds; out=q r - do while li^=''; parse var li el li - if abbrev(el,q,1) then do; out=el r; leave; end - end + rc = INTERP("if ("cond") then rc=0; else rc=1") + if rc=0 then call COMMAND r end end - end - out=translate(out,x2c(2f),beep) - return out + when abbrev('INTERPRET',q,3) then call INTERP r + when abbrev('INVITE',q,1) then do + if words(r)=1 & target/=0 then out='INVITE' r target + else out='INVITE' r + end + when abbrev('LASTLOG',q,2) then call LASTLOG r + when abbrev('LOGGING',q,2) then call LOGGING r + when abbrev('NICKNAME',q,1) then if r='' then out='WHOIS' ircnick + else do; out='NICK' r; ircnick=r; capnick=translate(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 q='SKIP' & sourcing then if datatype(r,'w') then skiplines=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 + end + when q='STOP' & sourcing then abortsource=1 + when abbrev('TALKTO',q,2) then do + if r/="" then target=translate(word(r,1)) + call S 'Now talking to' target + end + when abbrev('TELL',q,2) then call TELL r + when abbrev('TOGGLE',q,3) then call TOGGLE r + when abbrev('VERSION',q,3) then do; out='VERSION' r + if r='' then call S 'rxIRC' vers + end + when abbrev('VIEWLOG',q,2) & viewcmd/='' then do + address 'CMS' viewcmd logfile; say; end + when abbrev('XAMINE',q,1) then out='WHOIS' lastsender + when abbrev('YELL',q,1) then call TELL word(r,1) '<'ircnick'>' subword(r,2) + when q='CHOP' then out="MODE" target "+ooo" r + when abbrev('DATE',q,1) then out="TIME" r + when abbrev('DESCRIBE',q,2) then do; parse var r whom desc + out='PRIVMSG' whom ':'msa'ACTION' desc||msa; end + when abbrev('IGNORE',q,2) then call IGNORE r + when q='K' then out="KICK" target r + when abbrev('LOCALWHO',q,1)|q="LCL" then do + who_empty=1; out="WHO *"right(domain,trunc(length(domain)/2)); end + when q='M'|q='MSG'|abbrev('MESSAGE',q,3) then do + parse var r ni r; out='PRIVMSG' ni ':'r; end + when abbrev('QUERY',q,1) then call QUERY r + when abbrev('REQUEST',q,3)|q='CTCP' then do + parse var r ni rq .; upper rq + if ni="" then ni=capnick + if rq="" then rq="VERSION" + out='PRIVMSG' ni ':'msa||rq||msa + end + when q='SAY' then out='PRIVMSG' target ':'r + when q='SWHO' then out='NAMES' + when q='T' then out='TOPIC' target ':'r + when q='WHO' then do + who_empty=1 + if r="" then out='WHO' target + else out='WHO' r + end + when abbrev('TCPIPSTATUS',q,3) then do + parse value SOCKET('SOCKETSETSTATUS') with rc . q etc + call S 'Status' q '('rc');' etc'; Input buffer length is' length(buffer) + end + when abbrev('WHOIS',q,1) then if r="" then out='WHOIS' ircnick + else out='WHOIS' r + when abbrev('UMODE',q,1) then out='MODE' ircnick r + when q='UNCHOP' then out="MODE" target "-ooo" r + otherwise if ACTION(q r) then do + call OUT '*' ircnick r + if query="" then out='PRIVMSG' target ':'msa'ACTION' r||msa + else out='PRIVMSG' query ':'msa'ACTION' r||msa + end + else do + li=cmds; out=q r + do while li/=''; parse var li el li + if abbrev(el,q,1) then do; out=el r; leave; end + end; end; end + call SEND out + out=; return IGNORE: arg a do words(a) parse var a ig a - z=find(ignore,ig); if z^=0 then + z=find(ignore,ig); if z/=0 then ignore=strip(delword(ignore,z,1)) else ignore=ig ignore end call OUT 'You are ignoring:' ignore - if quiet then say "And you don't send notices about it (quiet ignore)." + if quiet then call S "And you don't send notices about it (quiet ignore)." return QUERY: parse arg qq - if query^='' then call OUT '* Terminating query with' query + if query/='' then call S 'Terminating query with' query query=qq - if qq^='' then call OUT '* Starting a query with' qq - else call OUT '* Talking to' target + if qq/='' then call S 'Starting a query with' qq + else call S 'Talking to' target return +LASTLOG: + arg a + if ^datatype(a,"W") | a<1 | a>80 then a=20 + else a=a-1 + 'VMFCLEAR'; call S lo'Messages received last:' + do i=curll-a to curll; if ll.i/='' then call OUT hi'|'yo||ll.i; end + return LOGGING: arg a if a='ON' & log=0 then do - writelog "IRC Log started on" date() "at" time() - say '* Logging started.'; log=1; end + writelog "<--> IRC log started on" date() "at" time() + say 'Logging started.'; log=1; end else if a='OFF' & log=1 then do - writelog "IRC Log ended on" date() "at" time() - say '* Logging ended.'; log=0; end - else say '* Logging is' onoff.log + writelog "<--> IRC log ended on" date() "at" time() + say 'Logging ended.'; log=0; end + else call S 'Logging is' onoff.log + return + +S: + parse arg k + say k + if logevent/=0 then do + curll=curll+1; ll.curll=x; logevent=0; k=curll-50; ll.k=; end + if log then writelog k return OUT: @@ -335,127 +571,355 @@ OUT: if x="" then return if length(x) < 81 then q=0 else do 1 - q=pos(word(x,2),x)-1; if q>30 then q=0 + q=pos(word(x,2),x)-1; if q>30 | q<0 then q=3 p=lastpos(" ",x,80) - if p<40 then do; q=0; leave; end - b=left(x,p); x=substr(x,p+1) - say b; if log then writelog b + if p<30 then do; q=3; p=77; end + call S left(x,p); x=substr(x,p+1) do while length(x)+q > 80 - p=lastpos(" ",x,80-q); if p<40 then leave - b=copies(" ",q)left(x,p); x=substr(x,p+1) - say b; if log then writelog b + p=lastpos(" ",x,80-q); if p<30 then do; q=3; p=77; end + call S copies(" ",q)left(x,p); x=substr(x,p+1) end end - x=copies(" ",q)x; say x; if log then writelog x + call S copies(" ",q)x return CONNECT: - parse arg ircserver port time . + parse arg ircserver port . if ircserver="" then do - call OUT "* Provide an internet server address as arguement" + call S "Tell me the internet address of an IRC server" return end if datatype(port)="NUM" then ircport = port - if datatype(time)="NUM" then timeout = time - if c ^= 0 then do - TCPSEND(c, "QUIT"); TCPCLOSE(c); "CP SLEEP 3 SEC"; end - if (datatype(left(ircserver,1))^="NUM") then do - say "Resolving domain name address" ircserver - ircserver = GETIPADDR(ircserver) - if tcprc^=0 then call BYE "unresolvable address" ircserver - end - say "Connecting to" ircserver "on port" ircport", timeout after" timeout "seconds" - c = TCPOPEN(ircserver, ircport, timeout) - select - when tcprc=6 then call CLOSE "Host not responding within time" - when tcprc=8 then call CLOSE "No server running on port" ircport - when tcprc^=0 & tcprc^=2004 then - call CLOSE "Unknown error" tcprc "while trying to connect" - when c=0 then call CLOSE "Have no connection!" - otherwise - TCPSEND(c, "NICK" ircnick) - TCPSEND(c, "USER" me mynode "." ircname) - "STATE" profile - if rc=0 then do - "EXECIO * DISKR" profile "(FINIS STEM IN." - do i=1 to in.0 - call EDIT in.i - if out^="" then TCPSEND(c, out) - end - end - end + if sock/='' then do; call SEND("QUIT"); call SHUT; "CP SLEEP 3 SEC"; end + in.2=me x2c('4b404b') ':'ircname + parse value SOCKET('SOCKET', 'AF_INET', 'SOCK_STREAM') with rc sock etc + if rc/=0 then do; sock=; call BYE "socket error:" etc; end + parse value SOCKET('SETSOCKOPT', sock,'SOL_SOCKET','SO_ASCII','ON') with rc . etc + if rc/=0 then call BYE "SetSockOpt error:" etc + call S "Connecting to" ircserver "on port" ircport"." etc + parse value SOCKET('CONNECT', sock, 'AF_INET' ircport ircserver) with rc . etc + if rc/=0 then call BYE "connect error:" etc + parse value SOCKET('IOCTL', sock, 'FIONBIO', 1) with rc . etc + if rc/=0 then call BYE "nonblocking I/O:" etc + call SEND(x2c('D5C9C3D2') ircnick) + call SEND(x2c('E4E2C5D9') in.2) + call SOURCE "PROFILE", 1 return - CTCP: parse arg fla bla if pos(msa,bla)=0 then return 1 - bla=translate(bla,'\',d2c(1)) - parse var bla . '\' ctcp bla '\' . + parse var bla . (msa) ctcp bla (msa) . select - when ctcp="ACTION" then call OUT s bla + when ctcp="ACTION" then call OUT '*' s bla when ctcp="CLIENTINFO" then - call MSAREPLY "CLIENTINFO ACTION CLIENTINFO FINGER VERSION USERINFO" + call MSAREPLY "CLIENTINFO ACTION CLIENTINFO FINGER TIME USERINFO VERSION" when ctcp="FINGER" then - call MSAREPLY "FINGER" realname '('me'@'mynode'.bitnet) - Idle time is', - time('E') + call MSAREPLY "FINGER" realname '('me'@'hostname'.'domain',', + me'@'mynode') - Idle' trunc(time('E'),2) 'seconds' + when ctcp="TIME" then call MSAREPLY "TIME" left(time(),5) + when ctcp="USERINFO" then call MSAREPLY "USERINFO" userinfo when ctcp="VERSION" then - call MSAREPLY "VERSION rxIRC v"vers "VM/CMS", - ":The best you can get for VM/CMS systems..." - when ctcp="USERINFO" then - call MSAREPLY "USERINFO" userinfo - otherwise if fla=1 then - call MSAREPLY "ERRMSG Huh? Can't do" ctcp + call MSAREPLY "VERSION rxIRC" vers "VM/CMS", + ":Survival package for VM-struck humans" + otherwise if fla=1 then call MSAREPLY "ERRMSG Huh? Can't do" ctcp end return 0 MSAREPLY: parse arg lyrics - TCPSEND(c, "NOTICE" s ":"msa||lyrics||msa) + call SEND("NOTICE" s ":"msa||lyrics||msa) return -CLOSE: - parse arg culprit - if c^=0 then do - TCPCLOSE(c); c=0 - end - call BYE culprit +SYNTAX: + say errortext(rc) return +HALT: + call BYE "halt request" BYE: - parse arg culprit - if culprit^= "" then say "Terminating:" culprit" (tcprc:" tcprc")" + parse arg reason + save_rc = rc + if reason/="" then call S "Terminating because of" reason '('rc')' if log then do - writelog "IRC Session ended on" date() "at" time() + writelog "<--> IRC session ended on" date() "at" time() "FINIS * * *" end - "IMMCMD CLEAR HI" - "NUCXDROP REXTCPIP" - /* "CP TERM CHARDEL @" -- do you need this one? let me know */ - "CP TERM LINEND #" - exit tcprc + do i=1 to pf.0 + a=word(pf.i,2) + if a='RETRIEVE' then iterate + if a='UNDEFINED' then "CP SET" word(pf.i,1) + else "CP SET" pf.i + end + i=1; parse var qt.i 'LINEND' a',' . 'CHARDEL' k',' . + 'CP TERM LINEND' a 'CHARDEL' k + i=2; parse var qt.i 'LINESIZE' a',' . + 'CP TERM LINESIZE' a + if sock/='' then do + call SHUT + parse value SOCKET('TERMINATE') with . + "NUCXDROP RXSOCKET" + end + if have_rxwt then RESETVALUE('ALL') + exit save_rc ACTION: parse arg q r select + when abbrev("APPLAUD",q,3) then a="applauds wholeheartedly" when q="BOW" then a="bows gracefully" - when q="COMFORT" then a="comforts you" - when q="CUDDLE" then a="cuddles you" - when q="DANCE" then a="dances a waltz with you" - when q="GIGGLE" then a="giggles inanely" - when q="GRIN" then a="grins evilly" + when abbrev("COMFORT",q,3) then a="comforts you" + when abbrev("CUDDLE",q,3) then a="cuddles you" + when abbrev("DANCE",q,3) then a="dances a waltz with you" + when abbrev("GIGGLE",q,3) then a="giggles inanely" + when abbrev("GRIN",q,2) then a="grins" when q="HUG" then a="hugs you" - when q="LAUGH" then a="falls down laughing" + when abbrev("LAUGH",q,2) then a="laughs wholeheartedly" when q="ME"|abbrev("EMOTE",q,1) then return 1 when q="NOD" then a="nods solemnly" - when q="SHRUG" then a="shrugs helplessly" - when q="SIGH" then a="sighs deeply" - when abbrev("SMILE",q,2) then a="smiles happily" + when abbrev("SHRUG",q,2) then a="shrugs" + when abbrev("SIGH",q,2) then a="sighs deeply" + when abbrev("SMILE",q,2) then a="smiles" when abbrev("THANK",q,2) then a="thanks you from the bottom of the heart" - when q="WAVE" then a="waves goodbye to you" - when q="WINK" then a="winks suggestively" - when q="YAWN" then a="yawns tiredly" + when abbrev("WAVE",q,2) then a="waves goodbye to you" + when abbrev("WINK",q,2) then a="winks suggestively" + when abbrev("YAWN",q,2) then a="yawns tiredly" otherwise return 0; end if r="" then r=a'.' else r=word(a,1) r'.' return 1 + +FINDM: procedure + arg patlist, token + do words(patlist) + parse var patlist a patlist + if MATCH(a,token) then return 1 + end + return 0 + +MATCH: procedure + arg pattern, token + do i = 1 by 1 while i < length(pattern) + ss = substr(pattern,i,2) + select + when ss = '**' then do + pattern = delstr(pattern,i,1) + i = i - 1 + end + when ss = '*?' then pattern = overlay('?*',pattern,i,2) + otherwise nop + end + end + return MATCHINT(pattern,token) + +MATCHINT: procedure + arg pattern, token + if pattern == token then return 1 + if pattern == '*' then return 1 + if verify(pattern,'*?','M') = 0 then return 0 + ptrp = 1 + ptrt = 1 + lenp = length(pattern) + lent = length(token) + do search = 1 by 1 + select + when ptrp > lenp & ptrt > lent + then return 1 + when ptrp > lenp then return 0 + when ptrt > lent then return 0 + otherwise nop + end + pchar = substr(pattern,ptrp,1) + tchar = substr(token,ptrt,1) + select + when pchar = tchar | pchar = '?' + then do + ptrp = ptrp + 1 + ptrt = ptrt + 1 + iterate search + end + when pchar = '*' & ptrp = lenp + then return 1 + when pchar = '*' then do + ptrp = ptrp + 1 + pchar = substr(pattern,ptrp,1) + do ptrt = ptrt to lent + tchar = substr(token,ptrt,1) + if pchar = tchar then do + if ptrp = lenp & ptrt = lent + then return 1 + if MATCHINT(substr(pattern,ptrp+1),substr(token,ptrt+1)) then return 1 + end + end + return 0 + end + otherwise return 0 + end + end + call BYE 'a mistake' + +SEND: + parse arg qp + if qp='' then return + if left(qp, 9)='PRIVMSG +' then do + parse var qp . '+'ni' :'tx + call TELL ni tx + end + else do + qp=translate(qp,beep||bold,beepch||boldch) + parse value SOCKET('WRITE', sock, qp||cr||lf) with rc . etc + if rc/=0 then call BYE "socket write error:" etc + end + return + +SHUT: + a=sock; sock=; servername=; + parse value SOCKET('SHUTDOWN', a,'BOTH') with rc . etc + if rc/=0 then call BYE "socket shut error:" etc + parse value SOCKET('CLOSE', a) with rc . etc + if rc/=0 then call BYE "socket close error:" etc + return + +NICE: + parse arg a'@'b;if b="" then b=mynode + if nice.a.b^='*' then do + if nice.a.b^='' then return nice.a.b + 'NAMEF :userid' a ':node' b ':nick (LIFO' + if rc=0 then do;parse pull nice.a.b . + return nice.a.b;end + if b=mynode then do; 'NAMEF :userid' a ':node :nick (LIFO' + if rc=0 then do;parse pull nice.a.b . + pull ln .;if ln='' then return nice.a.b;end + end + nice.a.b='*';end + if a='RSCS' then return b + return a + +U@N: + parse arg q p; if q='' then return 0 'missing args' + upper q; parse var q q'@'r + if r^='' then return q r p + if word(p,1)='AT' then do + parse var p . r p; upper r + if r='' then return 0 'missing node' + return q r p;end + if u@n.q^='' then return u@n.q p + 'NAMEF :nick' q ':userid :node :via (LIFO' + if rc=0 then do 1 + pull la; pull ln; pull li + if li='' then leave + parse value li ln mynode with a r . + u@n.q=a r; if via.a.r='' then via.a.r=la + return a r p + end + u@n.q = q mynode;return q mynode p + +TELL: + parse arg tea + parse value U@N(tea) with xid xnod tea + if xid=0 then do + call OUT xnod tea + return + end + err=; if translate(left(tea,4))='VIA ' then do + parse var tea . via tea + upper via + if via='NONE' then via=; + via.xid.xnod = via + end + else via=via.xid.xnod + select + when via='SMSG'|via='SEND' then do + if xnod^=mynode then err='SEND & SMSG only local' + else do + if via='SMSG' then parse value diagrc(8,'SMSG' xid tea) with rc . err + else do + parse var tea cp? tea? + if translate(cp?)='CP' then + parse value diagrc(8,'SEND CP' xid translate(tea?)) with rc . err + else parse value diagrc(8,'SEND' xid tea) with rc . err + end; end; end + when via=''|left(via,1)^="'" then do + if via='RSCS' then do;viar=1;via='';end;else viar=0 + if via^='' then via='CMD' via + if xid='RSCS'|(xid=rscs&xnod=mynode) then do + if xnod=mynode&^viar then parse value diagrc(8,'SM' rscs tea) with rc . err + else parse value diagrc(8,'SM' rscs via 'CMD' xnod tea) with rc . err + end + else do + if xnod=mynode&^viar then parse value diagrc(8,'M' xid tea) with rc . err + else parse value diagrc(8,'SM' rscs via 'MSG' xnod xid tea) with rc . err + end + end + otherwise + parse var via "'"via"'" + if word(via,1)='CP' then do + parse value diagrc(8,subword(via,2) tea) with rc . err + if rc=1 then err=via "unknown." + end + else do + if xnod=mynode|xnod='' then address cms via xid tea + else address cms via NICE(xid'@'xnod) tea + if rc>0 then err='Rc' rc 'from' via'.' + if rc<0 then do;rc=24;err='Invalid VIA'; end + end; end + if err/='' then call OUT strip(translate(err,' ','15'x)) + return + +SOURCE: + arg a, b + if a='' then do + call S "You must specify a file to /source" + return -1 + end + a=a 'RXIRC *' + "STATE" a + if rc/=0 then do + if b/=1 then call S 'Could not access' a + end + else do + 'MAKEBUF'; 'EXECIO * DISKR' a '(FIFO FINIS'; skiplines=0; + do queued(); sourcing=1 + parse pull l; if abortsource then iterate + if skiplines=0 then call SHELL strip(l) + else skiplines=skiplines-1 + end + abortsource=0; sourcing=0; 'DROPBUF' + end + return + +TOGGLE: + parse arg n o + if ^datatype(n,'W')|n<1|n>24 then do + call S 'Invalid PF key "'n'".'; return; end + o = strip(o); sep = left(o,1) + parse var o (sep) com (sep) o + 'CP SET PF'n 'IMM /TOGGLE' n sep||o||sep||com + call SHELL strip(com) + drop sep + return + +EXPR: + procedure + parse arg expr + signal on SYNTAX + INTERPRET("expr = ("expr")") + signal off SYNTAX + return expr + +INTERP: + procedure + arg statement + signal on SYNTAX; INTERPRET(statement); signal off SYNTAX + return rc + +EXECUTE: + parse arg r + if r='' then do + say 'Suspending rxIRC; Enter "return" to return' + r='SUBSET' + end + address 'CMS' r + if rc=0 then say "rxIRC ready" + else say "rxIRC ready("rc")" + return diff --git a/rxirc.helpmenu b/rxirc.helpmenu index f84ef47..27e4fc0 100644 --- a/rxirc.helpmenu +++ b/rxirc.helpmenu @@ -1,20 +1,19 @@ .cm last change by lynx. .mt IRC - rxIRC v1.3 - + rxIRC + ^^^ Internet Relay Chat client program for VM/CMS systems ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Written by Carl 'lynX' v. Loesch - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Move the cursor onto a topic and press ENTER. + written by Carl 'LynX' v. Loesch + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Move the cursor onto a topic and press ENTER -MANUAL General Overview about IRC -ETIQ The IRC Netiquette - How to behave on IRC - +INTRO Introductory manual for IRC users +STANDARD Standard IRC commands +SPECIAL Special features of rxIRC only SYNTAX Usage format of rxIRC -SPECIAL Special commands you can only issue from rxIRC ACTION A set of commands to let you express virtual actions CUSTOM How to customize your rxIRC FAQ Frequently asked questions about rxIRC diff --git a/rxirc.install b/rxirc.install index df0ecc5..64c1bb0 100644 --- a/rxirc.install +++ b/rxirc.install @@ -1,21 +1,38 @@ rxIRC Installation Guide ======================== - -To run rxIRC you need: - REXTCPIP which is available from your nearest VM-UTIL - LISTSERV. - For example by doing "tell listserv at dearn get rextcpip module". - Otherwise you might request it by mail to Ken (KXH105 at PSUVM), - but I'm not sure, if he'd be happy about it. - -Before you start rxIRC you should: - Edit the RXIRC NAMES file which contains all the default values for - rxIRC. Most important: the address of your default server! - -If you have any problems/improvements/suggestions/etc. send mail to me. -Also if you want to be informed of future rxIRC releases, and you do -not read alt.irc or operlist or VM-UTIL or dnet.chat or comp.archives. - + +| To run rxIRC you need RXSOCKET 2 and REXXWAIT. +| You don't need REXTCPIP anymore (Sorry Ken). + + Before you start rxIRC you should edit the RXIRC NAMES file which + contains all the default values for rxIRC. Most important: the address + of your default IRC server host! + +| On VM/ESA systems you might have to enter the 'NXA' command before +| starting up rxIRC. I'm not familiar with those systems so I don't know +| what needs to be changed to make that work right, same goes for other +| exotic VM derivates on which rxIRC makes problems. If you manage to +| fix rxIRC up on such systems please send me your changes! + +| The VM Gopher client is written to work with the old RXSOCKET version +| so you get the problem that either you have Gopher or you have rxIRC +| working by default. Sorry but I guess Gopher needs an update! + +| If you have any problems/improvements/suggestions/etc. contact the rxIRC +| mailing list rxIRC-l@vmtecqro.qro.itesm.mx. + +| You can subscribe to the mailing list with 'SUB RXIRC-L ' +| sent to listserv@vmtecqro.qro.itesm.mx or LISTSERV AT VMTECQRO. + +| With the AFD and FUI commands you can get automatic information +| about new releases of rxIRC from the LISTSERV. You can also decide +| to look out for announcements of mine in the VMUTIL-L, alt.irc +| or de.comm.internet newsgroups. + +| However don't expect frequent announcements. Changes to rxIRC +| happen seldomly. I usually don't have the time for it. :( + Ciao -lynx -o----------------------------------------------------------------------o -| Carlo "Lynx" v. Loesch is loesch@informatik.uni-oldenburg.de | -| ----------------------- or 244661 at DOLUNI1.bitnet / .earn | +o-------------------------------------------------------------------o +| Carl "LynX" v. Loesch is loesch@informatik.uni-oldenburg.de | +| ---------------------- or 244661 at DOLUNI1.bitnet / .earn | diff --git a/rxirc.names b/rxirc.names index 3dc7e82..55a7b7b 100644 --- a/rxirc.names +++ b/rxirc.names @@ -2,20 +2,34 @@ * contains installationwide defaults for rxIRC :nick.rxIRC * -* insert the network address of a server near to you into here +* Insert the network address of an IRC server near to you into here.. +* Or activate a temporary choice to be able to contact an IRC +* operator for help on proper choice of IRC server +* (join #Twilight_Zone to meet irc operators) * - :server.arbi.informatik.uni-oldenburg.de + :server.irc.uni-erlangen.de +* :server.irc.mit.edu +* :server.irc.eunet.fi +* :server.irc.technion.ac.il +* :server.irc.virginia.edu + +* Some preferences.. You can look into this later on. +* See also the helpfile about customization. * -* some preferences.. you can look into this later on, see also the helpfile * :logging.off :quiet_ignore.off :loud_beeps.off :show_numbers.off :list_all.off - :beepchar.~ - :hilightchar.% + :show_time.60 + :bold_char.| + :beep_char.~ + +* A command to view files. If there is no BROWSE on your +* system you can use XEDIT aswell. * -* no change should be necessary here + :browser.BROWSE + +* No change should be necessary below here * :port.6667 - :timeout.20 diff --git a/special.helpirc b/special.helpirc index 065c1d1..0393187 100644 --- a/special.helpirc +++ b/special.helpirc @@ -1,50 +1,260 @@ -.cm last change by lynx -- january, 1992 +.cm last change by lynx -- may 93 _______ - *|^^^^^^^|* The Internet Relay Chat program - *| rxIRC |* for VM/CMS systems written in - *|_______|* RexX by Carl "lynx" v. Loesch. + *|^^^^^^^|* The Internet Relay Chat client + *| rxIRC |* program for VM/CMS systems written + *|_______|* in RexX by Carl "LynX" v. Loesch. ^^^^^^^ -Special commands of this IRC client program: +Special features of rxIRC: + +Variables: +| rxIRC has it's own particular implementation of variables. You can +| set variables with /set or /expr, then use them anywhere within a +| command line like this: +| +| set c #rxIRC +| join $c +| expr date date() +| echo $(date) +| set helpkey 1 +| pf$(helpkey) immed /help +| +| Note how you can use variables even within command names. Variables +| can be used with or without the braces. However, without braces only +| the first character is considered part of the name. So 'echo $date' +| will probably only output 'ate' since '$d' is not defined yet. +| This is compatible to the way the make program handles variables. +| +| With rxIRC variable names are case sensitive! +| +| rxIRC provides a set of predefined variables which is compatible +| to ircII. Here goes a list: +| $, the nickname that last sent you a message, notice or invitation +| $: the nickname that last joined your channel +| $A your current away message +| $C your current channel (or rather 'target' in rxIRC-speak) +| $H last protocol command or numeric received +| $I channel you were invited to last +| $K the command character (usually '/') +| $N your IRC nickname +| $Q current query nickname +| $S current IRC server's name +| $T your query partner, if you are in a query, or otherwise +| your target (channel usually) +| $V rxIRC version +| $Z current time +| $$ the $ symbol itself + +Multiple commands: +| You can execute multiple commands in a row by putting '::' between them. +| Like this: +| /smile::grin::giggle +| +| Notice how the slash is valid for all three of the commands! +| You need not and may not call something like "/smile::/grin". + +Bitnet support: +| rxIRC now fully supports BITNET messaging, first you have the /tell +| and /yell commands for traditional way of sending bitnet messages, +| but you also have /msg +nickname (or /query +nick, /target +nick). +| When a message target begins with a leading plus sign, rxIRC will +| not send the message to IRC, but instead send it to the BITNET +| user specified. So you can easily query a bitnet user with /query +. +| +| BITnet message receivers can be specified by nickname from NAMES +| file or with @ or ' at ' or . +| +| rxIRC handles incoming BITnet messages properly and will +| display them as neat as possible. It also checks for /ignore +| by both nickname and userid@node. If you are /away, also bitnet +| users are informed of this when they talk to you. +| +| rxIRC is capable of sending messages over alternative routes +| than BITnet allows by default. To achieve this you need to +| specify "via " at the beginning of a message and all following +| messages will be forwarded through that node. For instance: +| +| /m +strange via psuvm hello! +| +| This will send 'hello!' first to PSUVM which then forwards it to MAINE. +| +| You can also generate local CP SMSG or CP SEND by specifying "smsg" or +| "send" as arguments to "via". +| You can remove a 'via' redirection with "via none". +| You can set up different via's for each userid@node. +| +| To speed up operation, rxIRC keeps internal mappings from nickname to +| userid@node and from userid@node to nickname. That is, your NAMES file +| is only queried once. So should you change the userid@node information +| in your NAMES file from within rxIRC for a nickname that has already +| been read in, you'll have to restart rxIRC. + +Escape characters: + There are two escape characters in rxIRC. One is the rxIRC command + character, which is by default a slash ('/'). Two is the CMS command + escape character '!'. You can abbreviate /exec by just typing !. + +Default PF keys: + rxIRC stores your regular CMS PF-keys setup and re-defines it with + leading ! symbols which is the command escape of rxIRC. That means, + your normal CMS PF setup works also within rxIRC, unless you redefine + keys during your rxIRC session. When leaving, rxIRC puts the PF key + settings back as they were before (or almost). + +Special commands of rxIRC: /ABort You may leave your session non-caring about the status of your TCPIP connection. Use this only when you can't get out with /bye. +/ALias [ [[] ]] +| You may create your own abbreviations for simple or complex commands. +| Commands may not contain the command char. Multiple commands can be +| specified by separating them with '::'. User-provided arguments can be put +| into variables by writing as many '%' as you need in front of the +| command string. Alias names are case insensitive. +| +| Some examples: +| alias ni msg nickserv@service.de +| This will convince rxIRC to send a message to NickServ with /ni . +| +| alias date expr date date()::echo $(date) +| This makes rxIRC output today's date. Notice how I first used the +| /expr command, then the /echo command. +| +| alias ctoggle %k %c pf$k imm /toggle $k |join $c|part $c +| This allows you to setup a PF key to join or leave a channel +| alternatingly simply by typing "/ctoggle 9 #PartyZone". +| Notice how it catches the two arguments and puts it into $k and $c. +| Then it calls pf$k which in our case is 'PF9', the rxIRC command +| to setup the PF9 key. The key then will immediately perform +| "/toggle 9 |join #PartyZone|part #PartyZone" which takes +| care of the alternating impact of the pf9 key. See /toggle for details. +| +| alias sgg smile::grin::giggle +| /alias is treated differently from all other commands, in the sense +| that the line following /alias is not preprocessed as usual. +| This means $(variable) is only replaced _when_ the alias is actually +| used, not when you define it. Also you can specify multiple commands +| within an alias by putting '::' between them. The commands will be +| executed in a row as soon as the alias is used. +| +| alias sgg +| Using /alias with just one argument will display the definition of +| that particular alias. +| +| alias +| Using /alias without arguments will list the aliases. +| +| Note: I have not provided a command to un-alias an alias as it's +| not really needed. + +/CAtalog +| This command will show you a compact list of all channel names that have at +| least 5 persons on them. Unfortunately it takes quite some time to perform +| as it has to process a lot of data from the IRC server before being able +| to display the collected information. + /Channel This command will automatically /part you from your previous channel before joining this new channel. If you don't want to get confused by multiple channels, better always use this command instead of /join. Without argument it will tell you what channel you are on. +/CHOP [ []] +| Make people channel operators of the current channel. +| A shorthand for "/mode $C +o " + /CLear - Clear the screen. + Clear the screen. Just in case you're not used to hitting PA2. /CMdchar - Use an other character than '/' to introduce commands. + Use another character than '/' to introduce commands. +/DEscribe +| This command generates a CTCP ACTION description like /ME and the +| other action commands, but you can specify where to send it to. +| Target can be a nickname or a channel, not a bitnet user of course. + +/ECHO +| Display a line of text to the screen. Typically used combined with +| variables like this: +| expr t left(time(),5) +| echo The time is $t + /Execute or more easily just: ! - You may execute CMS commands with this, but remember not to stay too - long outside IRC or the IRC-server might close the connection. + You can execute CMS commands with this, but remember not to stay too + long outside IRC or the IRC-server will most likely close your connection. +/EXPRession +| This allows you to store the value of a rexx expression into a variable. +| You can use RexX builtin functions such as substr(), words() giving you +| a quite powerful medium to operate on variables. +| Some examples: +| expr time time() +| expr t left('$(time)',5) +| echo $t +| Notice the trick that makes the contents of $(time) a valid rexx +| string by putting '' around it. + /Follow If you have just been invited to a channel this is an easier way to join it. rxIRC will remember the name of the channel for you. -/IGnore [ ] +/IF THEN +| This will make rxIRC perform only when is met. +| The must not contain spaces, in exchange it may contain +| RexX builtin function.. you can even make floating point calculus! +| Here goes an example: +| expr a 5/2 +| if 2*$a=5 then echo People really win on IRC! + +/IGnore | [] If you don't want to receive a person's messages, you can use /ignore on him. Use it again to remove the /ignore. Without arguments you - get the list of people being ignored by you. The ignore function - captures both /msg's and /notice's from the specified person. It - sends a notice back to the sender telling him that you are not - receiving his messages unless you specify it to be silent with - the startup option "(Quiet". +| get the list of people being ignored by you. The ignore function +| catches /msg's, /notice's and bitnet messages from the specified + nickname. It also sends a notice back to the sender telling him that + you are not receiving his messages unless you specify it to be silent with +| the rxIRC option "(Quiet". An is a string that will +| match a set of hosts from whom you don't want to hear anything. +| For example "*.ais.org" will keep any message from a user of that +| organization away from you. You can apply this to BITnet nodes aswell. +/INTerpret +| This will simply execute a RexX statement. A command for hackers. + +/Invite [] +| I made the channel argument optional. "/i lynx" will invite me to +| your current channel without hassle. + +/K +| The quick way to kick somebody off a channel. This is a shorthand +| for /kick $C + +/LAstlog [] + This shows you the last messages you received, usually 12 lines, but + you can request more (up to 50) or less. + +/LIst + Shows a list of channel names, number of users and topic. +| There must be at least 8 people on the channel for it to be listed, + unless you are running in LIST_ALL mode (See options in SYNTAX). + +/Localwho (you may as well type /LCL) +| Shows you a list of IRC users that are from the same site as you or +| are using an IRC server which runs at your institution. + /LOgging [ON | OFF] You can switch the logging on and off. That means you get a transcription of your IRC session into the file IRC LOG A0 on disk. +/NAmes +| Shows a list of channels and people on them, but only those channels +| that have at least 7 visible persons aboard. This should be modified into +| something more flexible but for now it's like this. See also: /cat + /Query [ | ] You can get into a dialogue mode with a person, all lines you type are sent as private message to this person. If you want to talk onto a @@ -52,25 +262,71 @@ Special commands of this IRC client program: leaving the /query. To leave the /query use /query without arguments. If you want to use #-type channels you need to /query those, too. +/PF +| You can use /pf1 through /pf24 to setup your PF keys. This command is +| actually nothing but a short form of !cp set pf +| so better refer to the CP SET manual for details on usage. +| Ok, I will resume: can either be IMMediate or DELayed. + /Reply This is a shortcut to get into a /query with the person that last sent - you a message. + you a message, notice or invitation. /Request | Send a CTCP (Client To Client Protocol) Version Request to a person or a whole Channel. IRC program that have this implemented will automatically respond as does rxIRC when it gets such a request. +/SAY +| Speaks to the channel. Useful for aliases and source-scripts. + /SErver
[ [ ] ] Switch to another IRC server. rxIRC will exit if the server does not respond. +/SET [ []] +| Set or query the contents of a variable, or if used without arguments, +| give a listing of all user-defined variables. + +/SKIP +| Tell rxIRC to skip the next of lines of the file being +| sourced. Meaningless to be entered interactively. Lookup up /source +| for a practical example of skip's use. + +/SOurce +| Looks for a file called ' RXIRC *' on all linked disks, +| then attempts to read it and execute it line by line. +| /source profile is automatically executed when you start up rxIRC. +| Lines are always treated as commands. The commands may not have the +| leading command character (the slash). Multiple commands can be specified +| in one line separated by '::' and lines can be indented. +| Especially interesting for scripts are the commands /if, /skip, /stop. +| For instance like this: +| +| expr month word(date(),2) +| if word(date(),1)/=1 then skip 2 +| echo Hey! Today is the 1st of $(month)! +| skip 1 +| echo Today is just another day of $(month)... +| echo Anyway.. what I really wanted to say... +| +| This shows how to make an if-then-else construct in an rxIRC script +| in a pretty assembler-like manner.. ;) +| Indenting improves readability slightly. + /STatus This outputs some of rxIRC's variables, tells you what channel you are talking to (Target), what query, where you got invited to last and who last sent a message to you. It also shows a /whois of yourself. +/STOP +| This command only makes sense within scripts. It stops rxIRC from +| executing scripts any longer. Might be useful combined with /if. + +/T +| Set a topic on the current channel. Shorthand for "/topic $C ". + /TAlkto This is the ONLY command to allow you to switch to another channel when you are on multiple channels! You can NOT use /join for that. @@ -81,15 +337,64 @@ Special commands of this IRC client program: command. /TCPipstatus - Gives a brief not very useful information about your TCPIP status. +| Gives some information about your connection to IRC. The number of bytes +| in the input buffer might be interesting. If there are any, then your +| connection to the server is probably suffering from netlag. -/WHO - The /who command can now be used without arguements, if you are talking - to a channel, it will show you the WHO list of that channel. +/TEll || [via ] message +| Use this command to send a message to a user in BITNet. +| See note about the bitnet support of rxIRC at the top of this file. + +/TOGgle +| This is a tricky feature to allow you to program pf keys with alternating +| function each time you use them. is the number of the pf key. +| is the character used to separate the commands. I use '|' usually. +| Toggle performs , then sets up PF to call the +| inverted command '/TOGGLE ' +| Here's one practical example you can include in your PROFILE RXIRC: +| +| pf5 imm toggle 5 |query Nickserv@service.de|query +| +| This will set up the PF05 key to /query or un-/query NickServ. +| Look also for the 'ctoggle' alias described in /alias. + +/Umode +| Change your "mode", that is change some flags in the IRC server +| concerning your connection. See IRC documentation about this. +| This is just a shorthand for "/mode ". + +/UNCHOP [ []] +| Remove channel operatorship of the current channel from some people. +| A shorthand for "/mode $C -o " + +/VIewlog +| A handy command to check out today's IRC log. +| Uses the CMS command 'BROWSE'. Hope that one exists on every CMS. + +/WHO [ | | ] +| The /who command can now be used without arguments, if you are talking +| to a channel, it will show you the WHO list of that channel. + You can match hosts as well as real names with , so + the normal way to get a list of e.g. all italians is to type '/who *.it'. +| The logic that displays WHO output has become very complex (and +| colourful if you have colours by the way). It will display the channel +| information only if it still fits into the line. Also, if there is still +| not enough space, it will truncate the hostname and put an '*' after the +| '@' to indicate that. But it will only truncate the hostname to a certain +| minimum, from then on it will shorten the real name information and +| indicate that with a pair of periods, but that only happens in extreme +| cases. /who should always give you as much info as possible without +| wrapping lines. If you however do need more info don't forget about /whois. /Xamine Quicky to get a /whois of the person that lest sent you a message. -/* [ */ ] - With this you can add RexX-style comments in your IRC PROFILE. - Lines beginning with /* are skipped. +/Yell +| This is just like /tell with one little difference. Yell prepends +| your own nickname in front of the message. Use it when it's likely +| that your dialogue partner is not running a message handling program +| and doesn't know your userid by heart. + +* +| With this you can add CMS-style comments in your RXIRC source files. +| Lines beginning with * are skipped. diff --git a/syntax.helpirc b/syntax.helpirc index 9db23cb..f4fdd97 100644 --- a/syntax.helpirc +++ b/syntax.helpirc @@ -14,14 +14,12 @@ Usage from CMS: Options: Port IRC usually runs on port 6667, here you might - set another.. but you might not find a server - on an other port... + set another.. but you might not find a server + on an other port... LIst_all {ON | OFF} Show also channels without topic with /list. Logging {ON | OFF} You may start the logging from the command line. LOUd {ON | OFF} This defines if an external 'BEEP' module should - be called whenever you receive an IRC beep. + be called whenever you receive an IRC beep. Numbers {ON | OFF} Shows the numbers of IRC server replies. Quiet {ON | OFF} If you want to use the quiet ignoring. - Timeout The time to wait before giving up trying to connect - the server.