2.2.9 fixed memory leak 2.2.7 DCC SEND/GET now shows the size, if it exists. You can now use \ to escape newlines in scripts. 2.2.5 New key binding, SCROLL_START, which moves the scroll buffer to the start of the lastlog buffer. Bound to meta1-< by default. New arguemnt to /LASTLOG, -LITERAL, which allows you to specify the next argument as the pattern to match. Allows matching of numbers, eg /LASTLOG -LITERNAL 6667 Channel keys, if set, are now shown in STATUS_MODE. When DCC connections become connected, the remote IP number is shown, for additional security. 2.2.3 I think the Makefile and config.h file are easier to use now. The control characters for bold, inverse and underline have been changed to ^B ^V and ^_ respectively, so make some sort of visual connection (B to bold, _ to underline) with these characters. 2.2.2 New command, XTYPE. Happens like this; XTYPE [-LITERAL] This text gets added to the input cursor, like /type does, except bindings are ignored with the -LITERAL switch is used. New function $CURPOS() which returns the postition from the start of the input line to where the cursor is now. New STATUS_FORMAT variable, %> which makes anything beyond it right justified. It is now possible to close all DCC connections and kill all EXEC'ec process by sending the client a SIGUSR1. ON PUBLIC has now got this format: $0 sender $1 channel sent to $2- message New variable, NOTIFY_LEVEL, and window command NOTIFY_LEVEL, which affect the notification of hidden windows. Same arguments as LASTLOG_LEVEL. Two new level of /IGNORE, CRAP, and CTCP. New functions, MYCHANNELS() and MYSERVERS() added. MYCHANNELS() takes a window refnum (defaults to current window), and returns a string with a list of channels on that windows server. MYSERVERS() returns a string of the names of the servers you are connected to. New variable, XTERM_OPTIONS, which are passed to xterm, when using WINDOW CREATE. Note that -geom switches are already generated by ircII, so these will be ignored by xterm. New variables, EIGHT_BIT_CHARACTERS, which, if set, allows you to input 8 bit characters (such as the Swedish character set). New SERVER option, -DELETE, allows you to remove servers from the internal server list. New command line option, -v, which prints the version and internal version (release date). 2.2.1 New WINDOW command LOGFILE has been added. It takes one argument, the file name of the logfile to be used for this window. Nothing is appended to this name, if you use WINDOW LOG. If you don't set a logfile for the window, and use WINDOW LOG, then ircII creates a name for you (old way). ON SERVER_NOTICE has been changed, and any script which used this will most likely not work any more. In the new format, $0 is the server name, and $1- is the notice itself. New variable, SHOW_WHO_HOPCOUNT, which if set will not filter out the hopcount on a who reply. 2.2c New CTCP, ECHO, which just returns what you sent. 2.2 New alias variables `$W', `$V' and `$H' which expand to the current working directory, the internal ircII release date, in YYYYMMDD format, and the current numeric being processed, respectively. /ME and /DESCRIBE no longer add a period to the end. New variable NO_CTCP_FLOOD has been added. When set, it makes your client only send out one CTCP REPLY each second, and will ignore anyothers it gets for that second. New BINDable key function, REFRESH_INPUTLINE, which, amazingly, refreshes the input line. Several /ON NUMERICS's have been changed such that $0 is now the server name of the originating. These include the 31x series (/WHOIS replies), which in turn is /ON WHO and /ON WHOIS. Numberics 401, have also been changd for this. MSG -channel is no longer supported. Multi-channal make this switch unreliable. IRCII now supports CTCP PING. You can call this with /PING nick[,nick[,nick...]] And it will show you how many seconds to takes to get a message to them and back. Be warned that too many nick will cause the server flood control to be used, making the times calculated wrong. You can now redirect in to a dcc chat connection, with REDIRECT =nick command. 2.2pre8 New command, INPUT has been added. It takes arguments like: /INPUT "prompt" command args Where it displays "prompt" and then calls command, with args, and with the line prompted for as $*. The use of this is strongly encouraged over the use of variable $"..". Similar problems that occur in /wait. USERHOST and HOST commands have been changed to allow asymnronous command execution, depening on the return of the userhost reply. The form is /USERHOST -CMD Where $0 - $4 expand to the nick, oper status, away status, username and hostname respectively. If you want the screen to be scrolled like it was in 2.1.5 and before (A line at the bottom), edit source/window.h and define SCROLL_AFTER_DISPLAY. DCC CHAT has be improved. No longer will a collision cause nasty things to happen - the client will automatically connect if a collision is detected. LASTLOG has been changed so that you can now use it like this: /LASTLOG to get the last lines that match . LIST -TOPIC has been fixed, and its functionality changed, so that it do NOT over ride other switches, but works with them. Three new variables STATUS_USER1-3 have been added, to combine with the new STATUS_FORMAT variables, %X, %Y and %Z. New command, PARSEKEY, added. The argument is one of the key functions, and the effect is the same as would be if you pressed a key bound to that function. New command, SENDLINE added. The arguments parsed to it are processed like normal text input, except they are not caught by ON INPUT. ON INPUT changed to catch all inputted text, not just text being send to a channel or a nick. New variable INPUT_PROTECTION added to stop people shooting their own foot with the new ON INPUT. One new BIND functions has been implimented - ERASE_TO_BEG_OF_LINE (not bound to anything by default), erases from the current cursor position to the beginning of the input line - Added new variable HIGHLIGHT_CHAR. That is /setable to either BOLD, INVERSE, or UNDERLINE. It effects the character that ignore + uses. Made dcc chat messages show the time after them, if away, like normal messages. Made ctcp not reply to global messages, either in the form of $*.domain, or #*.domain. Added a new command line argument. `-S'. It does the oppsite of the `-s' option, and also made -s the default. Make then run ircserv if they want it, not if they don't know. Rewrote BreakArgs() in parse.c trying to fix a bug with referencing NULL pointers on domain/ox. More of the source files reformatted. Starting to get some distance with this finally. We now understand that &channel are channels, for the 2.8 servers that will be arriving soon. DCC LIST now shows the start time, and the number of bytes sent, and read on a dcc connection. Added a ctcp reply to dcc.c so that when a dcc collision occurs, we also inform the other client of the event, rather than them not knowing about it. (obsoleted) Added new functiality to the /TIMER command. If it is called with out arguments, then it list the commands that were added with /TIMER, that are pending to be executed. If it is called with the -DELETE flag, and given a refnum (first column in the timer list), it will attempt to delete the timer. You can also specific the TIMER command to use a refnum of your choice, with the -REFNUM n flag. It generates an error if the refnum already exists, or you specify a negative number. It is illegal to remove a timer from itself. Added new functionality to /window server command. You can now do /window server server.name:port:password:nick, and the nick will be set properly for that server. Two new functions, $ENCODE() and $DECODE(). They work as a pair, such that $ENCODE($DECODE(blah)) will return blah, and the other way around. The primary use is tha $ENCODE() always returns a value that is suitable for a variable name, so that the well used $strip_chan() alias is not needed. Added -WIDE flag to /LIST. Shows the channel names, and their sizes in as little space as possible. HELP now works properly again. No recusive calls to irc_io, and no ping timeouts, but with the same functionality as 2.2pre7. New variable added, HELP_PROMPT. If set ON, nothing different happens, but if set OFF, then ircII will not prompt for more help after showing a file. All the header files reformatted, and some of the source files. Fixed bug in window server which caused the client to become confused about nicks for each window. Fixed bug that caused ircII to continue trying to connect to the last server in the server list if it failed on every other one, and often flooded umode s people. Nasty Nasty. Fixed bug in status.c/window.c that caused the window_notify to be out of date on occasion. When changing servers, or when the last window to a server is closed, the QUIT is actually sent. 2.2pre8.troy A new command has been added - /TIMER. This takes the form: TIMER seconds command and causes the given command to be executed after the specified number of seconds. Any number of timers can be issued, and they do not need to be issued in order. For example, the following alias: ALIAS JUMBLE TIMER 10 echo one;TIMER 5 echo two; \ TIMER 15 echo three will cause "two", "one" and "three" to be printed at 5 second intervals, starting with "two" in 5 seconds. Using /TIMER should be the preferred approach over /SLEEP. ircII can now take advantage of X windows and screen to create windows in different xterms or screen windows. The command to create such a window is /WINDOW CREATE. Each window created in this manner gets its own input line. This feature is particularly useful if you use multiple channels. There are still some things to be fixed with this. In particular, prompted input can give unexpected results ($"..", /Oper and server passwords, confirmations), as can the old form of the /WAIT command. In short, when using multiple windows, expect the unexpected. To use this feature you will have to define WINDOW_CREATE in source/window.c. A new form of the WAIT command, /WAIT -CMD command, (or WAIT -CMD %process command) causes the given command to be executed after the wait condition has occured. For example, the following alias: ALIAS BACKWARDS wait -cmd echo hello there;echo hi there Will actually display "hi there" before "hello there", because the "hello there" echo is not executed until a WAIT token is received from the server. This new form of /WAIT is to be used in preference over the old form. The old form has innumerable problems, among them being: If one WAIT is executed while another is pending, both will be registered as satisfied when the first returns. A warning is now issued when this happens. If you are in a prompted input sequence (such as oper password, confirmation prompts, and $".." input), results can be unpredictable. It is not consistant with the message driven programming model which exists in ircII. With multi window enhancements the problems with WAIT become even more prohibitive, unless used in the -CMD form. If you are echoing output to the screen from within the WAIT -CMD form, it is probably a good idea to record the current window and use XECHO -WINDOW to ensure that output goes where it should. 2.2lynx.pre8 Modified /me (edit.c) to automatically append periods, feature used by new 'action' script. Revamped many scripts, the config.h, little changes to Makefile and help files. Globally replaced all put_it("*** .. by new function say() and changed put_it_always into yell. 2.2pre7.myc6.phone Added Megre support of irc 2.8, there is still a long way to go here. Code for the user mode e has been written, but not added, as it probably won't be in the server. Added window refnum to the output of the WINDOW LIST command. Notify bug on start up fixed. Two new functions GETPID() and GETPPID() added to allow the process ID, and parent process ID to be accessable with in a script. These have been left out for now. Changed the KICK command, to allow the sending of kick comments. Bug in QUIT_ON_OPERATOR_KILL fixed, where last time was not `seen' for long enough to be read. Mail checking bug fixed. Added new variable SHOW_STATUS_ALL. When set, it shows everthing in every (visible) status line. When not set, it only show things that (I think) are relevant to that window, and are not the same as the current window. Things like nickname, usermode, are only shown on one window, if connected to only one server. Made DCC with no arguments the same as DCC LIST. Added the window notification status to WINDOW command (no args). Away changed to allow different away messages on different servers. Two flags -ONE and -ALL (-ONE default) for the sending of the away message to the servers you are on. Bug in $RAND() fixed . 2.2pre7.myc6 HELP_SERVICE and HELP_PATH are now SETtable variables. Memory leak in add_to_window() is fixed. WHICH doesn't wedge the client (by corrupting load_depth) any more. MSG *, QUERY *, CTCP *, REDIRECT *, NAMES *, LIST *. [Daemon] $U inserts cut buffer. [Daemon] $RAND() is a bit more portable and doesn't use floating point. Scripts updated to use `:' as noop rather than `#'. 2.2pre7.myc5 QUOTE USERHOST *really* doesn't core dump any more. B-) `voice' script updated for new script parser. 2.2pre7.myc4 The Makefile now handles making the symlink for config.h. This has the advantage of being slightly easier to use on a machine without symbolic links; you just change the `LN' variable in the top-level Makefile to `cp'. It also has the advantage that we won't see patch files with two copies of the diffs for config.h any more. B-) Makefile.proto has been rearranged somewhat, and the dependencies have been updated. DCC GET bug from myc2 fixed. 2.2pre7.myc3 All the bloody #defines at the beginning of keys.c are now in keys.h.proto, and are handled by `count'. Stupid inverse (and bold) video bug from myc2 fixed. 2.2pre7.myc2 ^Os are no longer appended to lines before storing them in the lastlog. This avoids adding ^Os to lines in the log file when using /LASTLOG. Bleah. New commmand :, which is a noop. Using # as a noop command is strongly discouraged, as it is treated differently in scripts. (# at the beginning of a line in a script (ignoring spaces) means to ignore the whole line.) Bug in handling quoted braces from 2.2pre7.myc1 fixed. `DCC GET nickname' gets the first file offered by `nickname'. KICK comments are now displayed, if present. Removed silly whitespace limitation in scripts. JOIN no longer automatically adds a `#' to a channel name if missing. [Avalon] 2.2pre7.myc1 New commands WINDOW BACK, NEXT, PREVIOUS. [phone] New commands ON HOOK and HOOK. [Daemon] DCC SEND and GET now display speed when transfer is finished. [Avalon] (Rest of these by Mycroft:) Added declaration for `newexp' in whilecmd() which Troy left out. Removed line discipline code for AIX. Fixed ON_KICK. Tabs now display in reverse video after limit reached, so you can actually see them. -c works again. ON WINDOW doesn't recurse (and thus doesn't crash). TOPIC and ACTION messages go in the right windows. PAUSE_AFTER_MOTD is now a compile-time option and actually works. QUOTE USERHOST doesn't crash. QUOTE ISON does something sensible. USERHOST and ISON with no arguments no longer corrupt the whois queue. \ is no longer converted to \\ by /SAVE and in the history. /MSG FOO, does the right thing. /TYPE \^ now types out a caret, which you couldn't do before. White space around braces is less important. The main effect is that K&R style braces now work. You should be able to use whatever indenting style you prefer. Note that braces inside a command should be quoted now, a la \{ and \}. 2.2pre7 Meta4 is now sticky. That is, Meta4-C-D-E-F-G invokes the meta4 versions of C, D, E, F and G. This effect lasts until meta4 is invoked again. Additionally, the Meta4 characters ^h, SPACE, h, i, j, k, x, H, I, J, K, L and X have been bound in such a way that BIND ^[ META4_CHARACTER now gives a vi editing mode. Bugs in complex '@' expressions fixed. Thu Jun 11 09:48:47 1992 Charles Hannum (mycroft@ai.mit.edu): * Makefile: Change RS/6000 support. * config.h (DEFAULT_STATUS_CHANNEL): Delete duplicate definition. * script/action: Remove `on's. * script/bigcheese: Convert to 2.2pre6 syntax. script/finger.who, script/fnet, script/killpath: Likewise. script/kpstat, script/log, script/nicks, script/repeat: Likewise. script/shell, script/voice: Likewise. * script/version: Update version number. script/netsplit: Rewrite to handle multiple splits. script/brc: Fix typo. * source/alias.c: Change function prototypes to match definitions. source/ctcp.c, source/edit.c, source/status.c: Likewise. source/term.c, source/translat.c, source/vars.c: Likewise. source/window.c: Likewise. * source/edit.c: Put comment delimiters around text after #endif. source/help.c, source/hold.h, source/irc.h, source/ircaux.c: Likewise. source/lastlog.h, source/term.h: Likewise. * source/exec.c: Add support for AIX 3. source/help.c, source/irc.h, source/ircserv.c: Likewise. source/log.c, source/newio.c, source/scandir.c: Likewise. * source/ircaux.c: Rename _RS6000 to _IBMR2. source/status.c: Likewise. * source/term.c: Remove unnecessary code for AIX 3. * source/vars.c: Replace NULLs with 0s in integer context. * source/status.c (convert_sub_format): Make bletch an array to prevent being put in readonly storage. (status_channel): Use format string even if *private*. * source/notice.c (parse_server_notice): Don't call reconnect_all_channels and reinstate_user_modes if first connect (phone bug). * source/menu.c: Make sure menu cursor doesn't get redrawn if menu disappears. * source/exec.c: Make sure messages get redirected after EXEC output. * source/edit.c (evalcmd): Fix EVAL when subargs == NULL. source/if.c (ifcmd, whilecmd, foreach): Likewise for IF, WHILE, and FOREACH. * source/if.c (whilecmd): Copy exp on every iteration, as parse_inline destroys it. * source/irc.c: Update version number. * source/dcc.c: Include arpa/inet.h for prototypes. * script/ping, script/whowas: New scripts. 2.2pre6 WARNING. 2.2pre6 will almost certainly require changes to your .ircrc and script files due to changes in the parsing. The intention at this point is to keep the new syntax forever. That is, unless there's something I have missed, there will be no further script breaking changes. DISPLAY now defaults to OFF in scripts. Two new meta keys have been added. Meta3 is bound by default to META1-[, and Meta4 is left unbound. DCC SEND now checks that a file exists before sending the request. Memory allocation bugs when using DCC file transfers with ~ pathnames fixed. If you have experienced corrupted output from ircII, this should be fixed. Several display bugs, including a memory leak related to using windows have been fixed. Missed PINGs when in the help pager fixed. A new command, EVAL, has been added. EVAL causes its arguments to be passed through variable substitution and executed. Alias substitution is no longer performed in scripts, regardless of the setting of INPUT_ALIASES. To force alias substitution, use EVAL. A command beginning with '@' is taken to be an alias expression as would be normally parsed from within ${}. The expression is substituted and the substituted value discarded. The script loading path is now accessible as the SET variable, LOAD_PATH. Additionally, if you are unsure as to which directory a script being loaded is in, the /WHICH command will display the full path to a script. eg. /which global shouls give something on all systems. Bugs in Menus which caused core dumps have been fixed. Bug in DCC which caused incoming DCC messages not to be directed to window level DCC fixed. Bug with +s channels and /names fixed. Connections to servers on UNIX domain sockets are now supported. Aliases can now be recursive up to a maximum level as specified in the variable MAX_RECURSIONS. The inline variable parser now substitutes \n, \r, \0 and \p too their equivalents in the CTRL-P convention. Having ! as the first character for the INDEX function no longer causes just unescaped characters to be matched. It is now a normal character in this context. The $%FUNCTION syntax is no longer supported. You can still use functions - just remove the '%'. The parser used when INPUT_ALIASES is on has been changed again. Text between brackets (...) and {...} is no longer subject to alias expansion, unless the opening bracket is escaped (ie... \( or \{ ). This affects alii and input when INPUT_ALIASES is on. Additionally, You can return to full alias substitution within ${...} by enclosing the substitution text in [...]. Thus if $0 == test, and $bear == black ${[$0]} expands to "test" ${[$bear]} expands to "black" ${bear} also expands to "black" ${ bear == [black] } expands to "1", ${ [$0] == [test] ) expands to "1" ${ [$0] == [black] ) expands to "0" ${ [$0](this) } expands to the return value of $test(this) There is a new form for the if command. This is: if (expr) {then_commands} {else_commands} Note that because the expression, the then_commands and the else_commands are between brackets, they are not expanded in alias expansion. This is taken care of in the if statement itself. The expression is treated as if it were enclosed in ${...}. Thus all the comparisons, groupings, arithmetic and boolean operations that a available in ${...} can be used in the expression. Also note that you can have more than one command in each of the then and else parts of the condition. The result is that what used to look like this: on ^send_public * if "$^!^=^>^^<0" \ "echo $%format(11 <$N>) $^"1-" \ "echo $%format(10 <$N):$^"0> $^"1-" can (and must) now be expressed like this: on ^send_public * if ( C == [$0] ) \ { echo $format(11 <$N> $1- } \ { echo $format(10 <$N):$0> $1- } Note that this means there is no longer any need for using the ^ escaping, and this may disappear in a later version unless there are strong objections. The same thing has happened to while and foreach, which now have the syntax: WHILE (expr) {commands} AND FOREACH structure index {commands} The effect of this on WHILE and FOREACH is that you no longer need to double up occurrences of '$'. You can still get this effect if you wish by escaping the leading bracket in the appropriate expression. Additionally, both while and foreach can now be recursive. Thus the following works as expected: assign a.1.1 one one assign a.1.2 one two assign a.2.1 two one assign a.2.2 two two alias fe { foreach a i { foreach a.$i j { echo $i $j $a[$i][$j] } } } THE OLD SYNTAX FOR IF, WHILE AND FOREACH IS NO LONGER SUPPORTED. In scripts, lines beginning with '{' and containing other text are joined on to the previous line with one space placed between the two lines, thus the above example could have been written as: on ^send_public * if ( C == [$0] ) { echo $format(11 <$N> $1- } { echo $format(10 <$N):$0> $1- } Additionally, the {..} syntax for grouping within scripts can now be nested. Nested {...} pairs must have the brackets placed on their own line, and the brackets are included in the resulting text. Thus the following is equivalent to the above: on ^send_public * if ( C == [$0] ) { echo $format(11 <$N> $1- } { echo $format(10 <$N):$0> $1- } Or, for a little more verbosity: on ^send_public * if ( C == [$0] ) { echo Current Channel: echo $format(11 <$N> $1- } { echo Another Channel: echo $format(10 <$N):$0> $1- } 2.2pre5 Bug in "Password" prompt for server passwords fixed. Bug in WINDOW REFNUM fixed. Bug in ON DCC_CHAT which prevented interaction with the server fixed. Bug which caused +w'd non-opers to see their own WALLOPs twice fixed. Additional operators have been added to the ${...} expresions. They are the equality and inequality operators (==, !=, >, >=, <, <=), the unary NOT operator (!), and the conjugation operators (&&, ||, ^^). These take 0 as false and any other number as true, and return 1 as true and 0 as false. On top of these are the assignment operator (=) and the string concatenation operator (##). The assignment operator means that the following now makess sense, and causes the value of first_name and last_name to be concatenated with a space inserted between them, and the value assigned to full_name. @ full_name = first_name ## [ ] ## last_name The following is also possible: @ a = b * (c + d) A new variable has been added for script developers. The DEBUG variable enables three types of debugging output dependant on the settings of various bits. bit value purpose 0 1 Display all commands executed 1 2 Display all alias substitutions made 2 4 Display all function calls and return values More changes to parsing have occured. Firstly, there is no longer any '\' substitution on input. Thus, when you type text to a channel, in a /msg or elsewhere, it comes out exactly as you type it. On the other hand, '\' processing does exist anywhere that alias expansion occurs. The result is that if you have INPUT_ALIASES ON, you won't notice the difference. Also, aliases and ons still get the '\' substitution performed on them. All \c pairs where c is any character are collapsed to just 'c' after all parsing has been done, with the exception of ", !, =, < and >, which are required by if and while. This shouldn't be the case for much longer. Function and array index expansion now only observes unescaped bracket delimiters. Thus $%index(\) abc\)def) returns 3. Finally, the '%' is no longer needed for functions. Thus you the above example is the same as $index(\) abc\)def) The net result of all the changes to parsing in this version should be to make both command entry and alias construction much more intuitive. A new function, TDIFF, has been implemented. TDIFF takes as its argument a time interval in seconds and returns it as the english representation of that number in the form: dd days hh hours mm minutes ss seconds omiting any zero values, unless all values are zero, in which case the seconds field is returned. Bugs in dumb mode fixed. The parsing of ${} expressions has been changed. When mathematical expressions are being used, order of operations is respected and brackets are recognised and treated correctly. Additionally, functions can be referenced (without needing the % qualifier), and functions and aliases can be mixed to give versatility. This may break some numeric expressions, but will make a lot more a whole lot more legible and intuitive. For example, the following: ${3*(INDEX(x abcxdef)+2)} Yields 3*(3+2) = 15 or, if you have an alias: ALIAS TEST echo ${INDEX(x $0)*5} and then type: /TEST abcxdef you will get back 15 Then, if you have a set of functions, A.1, A.2, A.3, and the variable IND is set to 2, then ${A[$IND]()} will resolve to an invocation of A.2 as a function. If you have a function, F, and a pair of arrays A and B, each with elements numbered 1-10, and F returns either A for 1 and B for 2, then the following: ${F(2)[5]} returns element 5 from array B. Because order of operations is now respected, both ${3*2+5} and ${5+2*3} return 11. 2.2pre4 /WHO * now results in failure if you are not on a channel. Behaviour of positioning when menus are being used has been corrected. There's the possibility that I broke something else while doing it though. The worst of the memory leaks has been fixed. There are still some memory leaks apparently present. If you compile with ALLOC_DEBUG defined, then when the memory tracking table gets full (indicating a leak), IRCII will abort, generating a debug.log which lists all allocated blocks with their sizes and contents in ASCII. This should prove helpful in tracking leaks. The slosh (\) no longer quotes characters which have no special meaning, thus allowing you to enter a '\' in the text without doubling it up. Additionally, The \n sequence no longer works. Use ';' in aliases instead, and quote the CR or NL character to get the same effect interactively (ie. ^Q^J or similar). Fixes to the multitude of bugs in pre3. 2.2pre3 If the environment variable "MAIL" is set, IRCII now uses it to determine which file to check for mail. The VERBOSE_CTCP variable has been fixed. A new function, CONNECT(), gives access to TCP sockets at the application level. The arguments are the destination host and port number, and the return value is the file descriptor (fd) associated with that socket. A null file descriptor indicates that the host could not be resolved, and a negative descriptor indicates that an error occured in connecting. To test this facility, create a connection to the echo service on some machine with: /alias socktest echo $%connect(host 7) Which will echo the file descriptor. Then send messages to it with: /dcc raw fd host message These will be echoed back at you by the remote host. Incoming messages can be intercepted with ON DCC_RAW, which has the following formats: fd host D data fd host C fd host N port fd host E port The D message indicated incoming data. The C message indicates that the socket has been closed. The N message indicates that a socket listening on the specified port has accepted a connection. fd in this case is the file descriptor for the new connection. The E message is generated when a CONNECT() results in a successful connection. The LISTEN() function creates a listening socket. It takes a single argument - the port number on which to listen. If this is zero, then a port number is assigned. The return value is the port number on which the socket is listening for connections. A port number below 1025 results in an error. Conventions to be used for the socket access: Scripts using sockets should never use the serial number 0 in their hooks. As their first act before using the DCC_RAW hooks, they should set: ON ^DCC RAW * # To ensure that all raw DCC sockets produce no output. A new set of hooks should be created for each active socket at a chosen serial number. One must always exist to detect the close message, and as its last act must remove all the hooks for that file descriptor. You can now "send" a message to a command. For example, /msg /echo this is a test is the same as /echo this is a test. The primary use of this is to allow a /QUERY of a command. Thus if you /query /echo, everything you type to the current window will simply be echoed back, and if you /query /exec, you can use IRCII as a shell. Note that when querying a command, you may need to use XECHO -WINDOW to ensure output goes to the right place. CTCP UTC has been added. This is primarily for robots to send date and time information to users and have it displayed in local time. The format of the UTC CTCP is: UTC number where number is the ASCII representation of the 32 bit integer representing the time as is used on UNIX machines. When IRCII receives this CTCP, it replaces the text of the local time expressed in the local language back into the original message. Thus if you send the following: /NOTICE nick The time is ^AUTC 702777074^A The user might see: -yournick- The time is Thu Apr 9 09:51:14 1992 (if their timezone is Australian Eastern Standard Time). Menus have been added. The menus are totally user configurable and a test menu has been provided in the top level directory of the IRCII source distribution. To use this menu, copy it to your home directory, run IRC, and to the following: /MLOAD test /SET menu Main Menu Control-R is bound to ENTER_MENU, and while in the menu you can use vi-like keys or EMACS-like keys to move through the options, and either '.' or SPACE to select an option. The format of the menu file is as follows A line beginning with a '#' represents a comment. Blank lines are ignored. A line beginning with the word "MENU" starts a new menu and gives it a name. A line beginning with the word "OPTION" adds a new option to the menu, gives it a name and describes what it does. For more information, see the demonstration menu shipped with the sources. Bug which cleared the input line when calling WAIT from ON TIMER fixed. Bug which left channel names from a previous connection in the channel list even if they could not be rejoined fixed. User modes are now restored after a disconnect/reconnect. Bug which caused the scrollback buffer to duplicate messages when HOLD_MODE is on fixed. USERHOST is now used in place of WHOIS to retrieve IRC-Op information on WALLOPing users and in the case of 2.6.2 servers, user@host information for IGNORE. This means that there are now three commands going through the WHOIS queue - WHOIS, ISON and USERHOST. It is not a good idea to /quote these, as you will be likely to corrupt the WHOIS queue. USERHOST can now be issued with /HOST and /USERHOST It is now possible to have more than one ON hook executed for each event triggering a hook. This has been done by adding a new serial number concept to the ON command. Each ON hook has a serial number attached. Serial numbers can be any number from -maxint to maxint, with the default being 0. When an event triggers a hook, IRCII now goes through the ON hooks added for that event, and for each serial number used by ON hooks in that hook type, finds the best match out of those ON hooks which have that serial number and executes that ON hook. The hooks are executed in order of serial number. Thus if you set up the following set of MSG hooks. ON #^MSG -666 * echo Message coming: ON ^MSG * echo Message from $0: $1- ON #^MSG 666 * echo I got one, I got one! ON #^MSG 666 WiZ echo WiZ hath spoken will cause the following to appear when you receive a message: Message coming: Message from nick: text I got one, I got one! And the following if you receive a message from WiZ: Message coming: Message from WiZ: text WiZ hath spoken The default serial number is 0, and the serial numbers are always executed in order, starting with the lowest, and ending with the highest. Although the '^' modifier can be used with any serial number, it will only suppress the decault action if used with serial number 0. Thus if the only message hook you have is: ON #^MSG -666 * echo Incoming: You will see the following when you receive a message: Incoming: *nick* text It is advisable to place any ON hooks which do not suppress the default action in a serial number other than 0. In particular, TIMER hooks, which are generally not intended to exclude other TIMER hooks, should be placed at different serial numbers wherever possible, and never on 0 (since 0 is the most likely place to get a clash if anybody does use it). The # modifier (bind to current server) for ON commands has been changed to '&'. Fixed display bug with reverse and bold modes which caused these modes to be turned off if a line wrapped. Also fixed NOTIFY and LINKS problems. The bug in user mode processing when a MODE command makes no actual changes to the user mode has been fixed. A new status line variable, %B, gives the number of lines in the hold buffer for the current window. Its format is controlled by the STATUS_HOLD_LINES variable. %B is only updates once for every ten lines. New status line variable, %# added. This returns the current user mode. Its format is controlled by the STATUS_UMODE variable. The behaviour of FLUSH when HOLD_MODE is on has changed. it now clears the hold buffer for the current window before flushing further output from the server. The result is that with HOLD_MODE on it is now impossible to get into a situation where you are being flooded by server output with no hope of reprieve. 2.2pre2 ^G bug fixed. A couple of small things cleaned up. 2.2pre1 Note that there have been several new variables added in this version, so old config.h files won't work. Also the IRCIIhelp service is being regionalised. You should set HELP_SERVICE to the nearest IRCII help service in config.h Three new BIND functions have been implimented - SCROLL_BACKWARD (bound by default to ESC-p), SCROLL_FORWARD (bound by default to ESC-n), and SCROLL_END (bound by default to ESC-e). These allow you to scroll through the output stored in LASTLOG without having to use the LASTLOG command. SCROLL_BACKWARD causes IRCII to scroll half a window of LASTLOG data on to the screen, pushing whatever is in the window towards the bottom. ESC-p reverses this, thus looking at newer parts of the LASTLOG history. ESC-e exits this scrollback buffer facility at any time. This facility is probably best used with HOLD_MODE set to ON, and requires SCROLL to be set to ON. If you use this facility with HOLD_MODE off, then when you leave the scrollback buffer, either by SCROLL_FORWARDing to the end of it or SCROLL_ENDing, all text that has been accumulated will be printed. If you have HOLD_MODE on, the window will be held until you manually unhold it. Provision has been made for memory allocation debugging for developers. Add -DALLOC_DEBUG to the CFLAGS, and IRCII will abort (generating a core dump) should memory be freed which was never allocated. Additionally, a dump will be made showing the locations of all allocated memory with the two preceding long integers in memory. Additionally, SEGV will be trapped and will generate a similar log, with the addition that if you are using an IBM RS6000 it will dump a heap walk. People on other platforms will need to either add heap walk code for those systems or manually walk the heap using the debugging information. The dump is stored in debug.log A new XECHO flag, -WINDOW, has been implimented. Thus: XECHO -WINDOW 1 always sends output to window 1, and XECHO -WINDOW JUNK always sends output to the window named "junk". If the window does not exist, the -WINDOW flag has no effect, except to cancel any earlier -WINDOW flag. Two new modifiers have been added to /ON. If the first character of the first argument (the hook name or numeric number) is '#' or '@', the ON only affects things relating to the current server. Additionally, if it is '@', and there is no match for things in the list of ONs applying to the current server, it will not resort to the default list. [Changed in pre3] WHO -LUSERS (returns only non-operators) and WHO -NICK (returns only people matching the nickname argument) have been implimented. A new variable, DCC_BLOCK_SIZE controls the size of blocks sent when sending files using DCC SEND. The default is normally 512. Increasing this number increases network efficiency. Decreasing this number slows down the transfer, but also decreases the chances of the transfer being aborted over bad links. Use of real estate when SCROLL is ON has been improved. There is no longer a blank line between the text and the status bar. This takes a little getting used to, as now the screen scrolls before a line is printed rather than after. You can now include text modification characters (^B, ^V, ^_ and ^O) in STATUS_FORMAT. If you change the format at the start of STATUS_FORMAT, you will have to do it again after any %C or %U, as these both reset it to reverse video. You can no longer abbreviate QUIT, SIGNOFF, BYE or EXIT in NOVICE mode. All restrictions on IGNORE by user@host removed. Internals given a decent reworking. There could be bugs here. You should now never see ircd's colons marking the last argument. Added two new wildcards to the pattern matching system. '%' matches any sequence of characters except a space. '?' matches any single character. International character set support added. Translation tables are supplied for various terminal types. To activate the appropriate character set, /SET TRANSLATION charset_name eg. For an IBM PC set up for US English (Code page 437), /SET TRANSLATION CP437 The translation tables assume that text transmitted on the servers adheres to ISO 8859/1. If your terminal understands ISO8859/1, set TRANSLATION to LATIN_1. The default is ASCII, due to the fact that nothing can be safelt assumed about any terminal. Bug in /set history 1 fixed Bug with redirecting to yourself fixed. It is now illegal to redirect to yourself. $P (Chanop status variable) fixed, and a new status line substitution, %@, which subsitutes to STATUS_CHANOP if you are chanop on the channel shown on the status bar. $~ now substitutes to the last word on a line. New functions: ISCHANNEL(word) Returns 1 if word is a valid channel name. ISCHANOP(nick channel) Returns 1 if nick is a chanop on the given channel. WORD(number wordlist) Returns the specified word from wordlist. The first word is numbered 0. WINNUM() Returns the current window number. this is always the window which is indicated by STATUS_WINDOW. WINNAM() Returns the current window name. this is always the window which is indicated by STATUS_WINDOW. If the window has no name, it returns nothing. INVERSE_VIDEO variable and beyond fixed. A new character attribute, bold, has been added. This is enabled and disabled with ^_. Disabling bold has the side effect of disabling inverse and underline without recording it internally. You should allow for this when using bold text. Bold text can be enabled and disabled with the BOLD_VIDEO variable. The status line problems with attribute characters have been fixed. You can now include attribute characters in the status line and they will take effect. One application of this is to change the status bar from inverse text to bold or underlined by including ^_ or ^V at the start of STATUS_FORMAT. You can now refer to the elements of structures (normally Structure.Element) as Structure[Element]. When you do this, Element is evaluated as an expression before it is appended to Structure. Thus if A has the value "TEST", and there is a variable "B.TEST" with the value "Message": echo $B[$A] yields: Message These can be repeated, as in: $MATRIX[0][0] which becomes "$MATRIX.0.0". The result is a pseudo-array effect. New command, FOREACH has been added. The format is FOREACH structure variable command This causes command to be executed once for each element in the named structure, with variable substituted to the name of the element. Thus if you have assigned: /ASSIGN A.1 ONE /ASSIGN A.2 TWO /ASSIGN A.3 THREE /ASSIGN A.4 FOUR /ASSIGN A.5 FIVE and have an alias: /ALIAS SHOWA FOREACH a i ECHO $$i and type /SHOWA The output will be: 1 2 3 4 5 Alternatively, you can use: /ALIAS SHOWA FOREACH a i ECHO $$a[$$i] to get: ONE TWO THREE FOUR FIVE Note that if you use numbers, 11 comes before 2. The easiest way around this is to start numbering elements at a higher number, such as 100. Note that FOREACH, like WHILE, does variable substitution once when the FOREACH command is evaluated, and once for each iteration. This means that in general you will need to double up any occurences of '$'. 2.1.5b-2.1.5g Functionality of WHO -HOST and WHO -SERVER returned. New WHO flags, -HERE and -AWAY added. New functions: MATCH(pattern word-list) Returns an index into the word list of the first word that matches the pattern, starting at 1 and returning 0 for no match. RMATCH(word pattern-list) Returns an index into the pattern list of the pattern that word best matches. STRIP(charlist line) Strips all occurrences of characters contained in charlist from the line. You no longer need to supply the leading # to JOIN and PART. If the leading # is omitted, and you are on a 2.7 server, it will be inserted. Notable exceptions to this rule are channel '#', which would have no name if the # were omitted, and channels beginning with '##'. CTCP Action format changed so as not to interfere with channel text. ON ACTION and ON SEND_ACTION added. You can now suppress ACTION text with these, or reformat it. Many bugs fixed. 2.1.5-2.1.5a New functions: USERHOST() Returns the user@host of the sender of the message currently being processed. WHO -HOST and -SERVER is no more supported. (This is reenabled in a later version). The contents of an alias can now be surrounded by '{' and '}' in and broken over multiple lines. See script/finger for an example. Indentation with leading tabs and spaces is now permitted in script files. See /HELP LOAD. HOLD_MODE no longer holds when you are being active in that window. If you have SHOW_AWAY_ONCE on, away messages are remembered and only displayed when they change. Notification of the receipt of a CTCP request no longer occurs unless VERBOSE_CTCP is on. Prompts from EXECed processes now appear in the input window if $T appears in INPUT_PROMPT. Scripts and help files can now be stored in compressed format. They will be uncompressed as they are used. All the scripts have been updated and many helpfiles written and rewritten. Many bugs have been fixed, support of newer server features added. Server 2.7 compatibility improved. There have been major changes in the command parser. Commands are not expected to have a leading / unless entered interactively, if you experience incompatibilities, you will have to add 'say' and 'send' wherever you have made aliases that send to the channel or query. See also /help ircII programming for this. Also the ';' has a new meaning as command seperator within ALIAS, BIND and ON. You might have to \escape it. CTCP ACTION has been implemented which permits you to send descriptions of actions/'feelings' to other people on channels and even through queries. You can use it with /me and the action script. See also: /help load action. * 2.1.5 (by lynX) Text is historically from new to old, that is - read it from bottom to top! Updated help files: NEWS LOAD/* WHOIS IRCII/IRCII IRCII/PROGRAMMING ALIAS/ALIAS BIND/PARSE_COMMAND BIND/EXAMPLES ON/ON CTCP/* ME DESCRIBE ON/SIGNOFF SEND SAY NOTIFY SET/COMMAND_MODE ALIAS/SPECIAL RESTART SET/LASTLOG_LEVEL Threw out /who -s and -h, they were superflous and bad. Cleaned up the vars.h and hook.h by cleaning the protos... FINALLY! Wrote count.c and the proto headerfiles, adapted the Makefile.proto Added underlining mechanism with put_it-code ^V. Updated man page a bit. Added optional code to limit the notify list length (MAX_NOTIFY). Removed lots of do_hook-numeric if's by splitting the numeric's switch. Rewritten /notify list. Simplified notify.c and whois.c to no more support channel notify. (If ISON doesn't, why should we then?). Added Troy's alias functions MATCH and USERHOST, but no HELPs. Added support for { } constructs in scripts and indentation. Removed the oper-flags from the IRC commands, if you issue oper commands while you're not one, you get the beautiful ircd error messages. Seem to have fixed the problem in the status_mail sprintf... Changed the handling of 2.7 UserHost in PRIVMSG etc. The $, is now also set when you get an invitation. Added oneself's nickname as command alias for /me. "/lynx smiles." Improved HOLD_MODE: it no more holds a window if the user is being active on it. Added some numeric codes in numbers.c for 2.7 compatibility. Added support for ~ in IRCPATH, but only referring to the user's own home-dir. Suspended a piece of new code in mail.c which seems to cause weird problems. Introduced lastlog_level 'ACTIONS' to log in and outgoing CTCP ACTION lines. Made 317 (whois-idle) a tiny bit smarter (seconds or minutes). Added #ifdef SVR4 code. Added SHOW_AWAY_ONCE and VERBOSE_CTCP vars. Replaced QUIT_ON_KILL variable by a #define. Applied Allanon's patches to ctcp.c and dcc.c, removal of DCC/SENDCRC + GETCRC. Added support for numeric 364 (new LINREPLY). Old LINREPLY code not removed. New handling of process prompts. In the past they were put into the window->prompt and then inserted into the INPUT_PROMPT var mask, which looks *ugly*, also the input would not get echoed. Now it does this: If a prompt is detected you are elegantly prompted, as if you were in the program itself, when you enter your datum prompt and input are displayed in the window the way it would look outside ircII. This is a great step towards using ircII as an interface to all kinds of things, ircII + /bin/sh as a replacement for tcsh.. Ha ha I'm kidding. Well, for a MUD client it's fine. ircII can now be used as MUD client. BTW, I had to do profound changes in the handling of prompts throughout the source. Fixed ancient bug concerning process-query: you can now type 'just CR' into an exec. Fixed strange bug with /save prompt. Still don't know what was actually wrong, but it behaves correctly now. :-I Away messages are only displayed ONCE. Added #ifdef into new_free() to hunt for free's that should not take place. If you have spare time hunt some of those.. ;) Added the commands ' and : which only work in COMMAND_MODE and act like /send and /me respectively. This is a MUD standard. Added /restart, /xtra and /host which calls USERHOST. The last two have no /help files. Introduced Allanon's implementation of ZCAT help file display. Also scripts (files for /load) can be stored in compressed format if one likes. Patched /save to work with totally dumb terminals, with -d it saves without prompting. Added special sequence '$D' to the alias parser. Thanks to The_Edge for the idea. Added binding ESC-G to the 'commander' script that uses it. Applied Veggen's patch to alias.c concerning uninitialized variables. Removed /set VERBOSE_QUERY since the same can be achieved with /^query... (If you want it use /alias quer ^query) Added DCC SENDCRC and GETCRC by Allanon. These functions transmit and receive files with checksum. It has to be tested and decided if a checksum is needed or futile by TCP definition. The commands are temporary and should replace the current SEND/GET or be removed away again. Since this decision affects other client coders, too, it should be discussed via USENET or interactively. Added ';' handling: In ALIASes, ONs and BINDs it is legal to use ; as command seperator instead of \\n while in LOAD and interactive mode ';' is considered a normal character (to be able to type ;-) ). With a little magic I managed to make it possible to escape the ; with \; in aliases if you want it as character. *PHEW* Repaired /whois 317 (idle time output). Added /whois [,..] format to /whois command. Added commands /me and /describe to produce ACTION messages. Added CTCP ACTION handling. Disabled GLOBAL_IRCRC, replaced by automatic /load of 'global' which is supposed to be in the IRCPATH. This permits easier debugging and developing of scripts by redirecting everything into an other directory. If a person has an .ircrc the person is assumed to not be a novice, the /HELP NEWUSER notice is not output. Added variable QUIT_ON_KILL to select if one wants to /quit when one is killed. /ON KILL has not been implemented for obvious reasons of possible misuse.. :-( Added #ifdef AUTO_RECONNECT to make ircII not auto-reconnecting. Added CTCP TIME by Veggen. Added 'signoff reason' to signoff message. Modified some messages concerning CTCP and NOTIFY for beauty or better elequence... Added /send command which sends something to the current query or channel as if it were typed. Acts as replacement to bare text, since that is now interpreted as commands Added /say command which does the same as '/ ' and /# (or # in script mode) command which is the same as /comment. Introduced script (command) mode and COMMAND_MODE variable. Removed some code that would never get used, as my optimizer told me. Bug fixes concerning buffers, /if command with HP/UX, ... by Allanon and Veggen. * 2.1.4c Some bug fixes, including the CTCP DCC bug and substitution of '\' in alias expansion. Bug in SAVE with "-d" mode fixed. * 2.1.4b Support for server version 2.7 * 2.1.4a Bug fixes. * 2.1.4 $N now substitutes correctly to the nick on the current server. Bug with changing servers when on multiple channels fixed. ISON based NOTIFY has been implemented. In addition, the code has been modified so that NOTIFY will cause much lower network loads. /TOPIC can now change the topic of a # channel on a 2.6.2b or newer server. The new format for /TOPIC is: /TOPIC [] [] Aliases and ASSIGNed variables can now include a dot ('.') in their names. When listing aliases and assigned variables, anthing after a dot in the variable name is suppressed, unless typed explicitly. If two variables have the same name after this, only the first occurence is printed. This allows a structure-like effect. /ASSIGN A.A This is a *** Assign A.A added /ASSIGN A.B this is B *** Assign A.B added /ASSIGN A.C This is c *** Assign A.C added /ASSIGN A *** Assigns: *** A /ASSIGN A. *** Assigns: *** A.A This is a *** A.B this is B *** A.C This is c /ALIAS A.A alias a *** Alias A.A added /ALIAS A.B alias b *** Alias A.B added /ALIAS A.C alias c *** Alias A.C added /ALIAS A *** Aliases: *** A /ALIAS A. *** Aliases: *** A.A alias a *** A.B alias b *** A.C alias c Note that structures are effectively in a different naming space to non structures. Thus, you can have a structure called 'A' and a normal variable, also called 'A'. Server notices are now displayed with the SNOTE level. Four additional lastlog levels, USERLOG1-USERLOG4, are reserved for users. These can be used by displaying text with the XECHO command. Four new alias substitutions: $O substitutes to the value of STATUS_OPER if you are an operator, $P to '@' if you are a channel operator on the current channel, $M to the modes on the current channel, and $A to the current away message. * 2.1.3c A new DCC command, rename, changes the name of a file sent to you by somebody else. DCC file transfer should also accept the ~ now. Some bug fixes. * 2.1.3b A new log level, OPNOTE, has been added. This level applies to notices sent to operators, such as KILL notices. A new status line variable, %F, lists the hidden windows in which there has been activity since they were made hidden. An associated IRCII variable, STATUS_NOTIFY, sets the format for this to be displayed. New ONs: CHANNEL_NICK and CHANNEL_SIGNOFF are executed once for each channel from which the user changes nick or signs off. If all the CHANNEL_NICK and CHANNEL_SIGNOFF hooks which are matched suppress output, then the default output and the NICKNAME and SIGNOFF hooks will be suppressed. Various bug fixes. * 2.1.3a Various bug fixes. * 2.1.3 Added support for the Tektronix XD88 Added DCC talk. To use this, /DCC TALK user@host. DCC talk will only send an announcement once, rather than an infinite number of times. Fixed bug with functions which have no arguments. Added RINDEX function. * 2.1.2.2 New help files RULES and IMPORTANT included. You should read these before installing help and decide on a site by site basis if you wish to install them. If not, remove them from the help directory. Hopefully fixed the WHOIS queue once and for all. Fixed some bugs outstanding from 2.1 (HELP paging with HOLD_MODE ON, Core dumps after a WHOIS or WHOWAS if the WHOIS queue was empty, core dumps when the status line is an empty string) * 2.1.2 Added DCC file transfers (GET and SEND), and DCC CLOSE Added new window command - NOTIFY. This toggles the notification status of the current window. A window with notification on causes a message to be printed in the current window if output to that window occurs while it is hidden. Changed group message ([$#]*.domain) handling so that such messages are treated more like WALLs than MSGs. (Meaning that it beeps if you have WALLs set in BEEP_ON_MSG, not if you have MSGs set). The type of the MAIL variable has been changed from BOOLEAN back to INTEGER. If set to 2, it will now display some of the headers from incoming mail. Setting it to 1 is the same as setting it to ON used to be. /ON SERVER_NOTICE processes messages sent from the server as NOTICEs, including MOTDs and many server status messages. The easiest way to see what is trapped by this is to do a /ON ^SERVER_NOTICE * /echo [SNOTICE] $* and see what happens. /WHO -FILE performs a /WHO, displaying only those nnicks contained in the named file. This allows a larger list to be kept of people you know on IRC but not well enough to put them in the NOTIFY list. If a channel name exceeds the channel name width in the output of /NAMES or /WHO, the last character that would be displayed is shown as a '>'. Added NOVICE variable. Causes a new user message to be printed after .ircrc has been loaded if it is still set to ON, and refuses to allow any ON commands to be executed. Added /ON RAW_IRC to deal with any unknown commands coming from the server. This is primarily of use to people working on server code, or people using servers with new commands which IRCII does not yet recognise. Direct Client Connections implemented. /DCC CHAT opens a direct connection to another client. The user at the other end can either accept the chat with a /DCC chat or ignore it. Messages are sent across DCC CHAT connections with DMSG or DQUERY. A new status specifier, %D (STATUS_DQUERY) is supported, which substitutes the DQUERY value. Two more /ONs, DCC_CHAT and SEND_DCC_CHAT, deal with DMSG messages. * 2.1.1 Version 2.1.1 supports user defined functions. A user defined functions is an alias that ASSIGNs a value to FUNCTION_RETURN. Another alias can substitute the return value with $%FUNCTION(ARGUMENTS). See /HELP ALIAS FUNCTIONS Pattern matching has been improved. IRCII now has an idea of the "best" match. This allows #* to be treated differently to * in /ON NAMES, for example. IF and WHILE now only use unescaped operators. Thus if it is possible for a substitution in an if or while to produce an operator, such as a channel name containing !, it can be entered as $^!CHANNEL, escaping the ! and making IF and WHILE work as expected. Support has been added for privileged ports. If IRCII is installed setuid->root it will attempt to bind the local socket to a privileged port, allowing some servers to verify connecting users on this basis. The PP_OBJS and PP_DEFS macros in Makefile must be uncommented.