v1.3.4 "Fee, fi, fo, fum!" Released 12/16/2006 Changes since v1.3.3 -------------------- Completely rewrote the fifocmd() function. It now uses mkfifo() from POSIX.pm instead of making system() calls at all, and (this is where I smack myself upside the head) uses select() to sleep on the command FIFO's handle instead of just blindly waiting and polling it. This seems to have resolved several startup issues. Added a new color specification, 'debug', a new icb_debug() function, and a new default setting 'debugmask' to control debugging output. Setting debugmask in the defaults file causes the value supplied to be set as a hexadecimal mask in $options{debug}. Calling icb_print($window, $flag, $fmt, @args) outputs the supplied argument message using a standard debug message format if the bit indicated by $flag is set in $options{debug}. This allows inclusion of debug asserts with granular control over which debugging output is emitted. Updated mailing list information in the ICBM manual page. v1.3.3 "Survival of the Fittest" Released 12/9/2006 Changes since v1.3.2 -------------------- Added a workaround for a mknod problem on OSX reported by Ryan Powers , in which the mknod to create the ICBM remote-command FIFO behaves erratically. Ryan also provided the workaround for the problem, which is to use 'mknod -F file c' on OSX instead of 'mknod file p'. Added enhanced error reporting for connection failures, FIFO creation failures, and dropped connections. v1.3.2 "Message for you, sire!" Released 9/18/2006 Changes since v1.3.1 -------------------- Patch to capture URLs from /whois output Added newpriv hook, triggered when a private message is received that begins a conversation (i.e, from a user not in tab history) Added 'clear' as a synonym to 'purge' for the /urls command Added query-mode indicator on the status line, if space permits. The query indicator is automatically formatted as [Q: nick], [QUERY] or [Q] depending on available space. Added a server message count indicator immediately to the left of the clock, space permitting. Added the ability to disable autocorrection on a line-by-line basis by beginning the line with &&. && can be escaped as \&& to send it literally. Added 'logbuffer' setting in defaults to specify the size of the replay log buffer (default 500, minimum 100). Replaced 'mod' and 'idlemod' hooktypes with 'modgain', 'modloss' and the new 'modpass' type. A minor correction to the code for assembling the list of alternate nicks so that the command-line -n switch properly overrides the ICBNAME variable, which in turn properly overrides the nick command in the defaults file, with fallback username generation the lowest priority. The /beep command now puts the target's nick into tab history. Minor code efficiency changes in handle_input(). Minor documentation updates. Changed exit message on abnormal termination from 'Press any key to exit' to 'Press Ctrl+C to exit' since the former was not reliably working. v1.3.1 "We're on the same page here... aren't we?" Released 6/23/2005 Changes since v1.3.0 -------------------- Altered message handling in /replay so that paging, if set, is properly applied to /replay output Changed .icbm/settings to .icbm/defaults and increased the number of defaults which can be set in it Code changes in host options processing to accomodate setting default host etc Patch to properly detect and format extended /status output v1.3.0 "It's log! It's log! It's better than good, it's wood!" Released 11/30/2004 Changes since v1.2.1 -------------------- Fixed a hitherto undetected (somehow) off-by-one error in split_line() and split_output() that could, under unusual circumstances, cause a single character to be silently dropped. This bug would only trigger if a single continuous string of non-whitespace characters was too long to fit on one line and had to be hyphenated. Fixed a parsing bug which caused proto version packets output by the server in response to a /version to generate a warning. Rewrote the 'log start' login in logger() to fix a bug caused by making invalid assumptions about the return value of rindex(), which caused log open operations on non-default logfiles to fail. During the course of the fix, altered the functionality of logger() slightly to assume that a bare logfile with no path is intended to be opened in the user's home directory. Did an extensive code cleanup to remove unneeded ampersands on function calls. (Yeah, I'm finally trying to break myself of the habit of using them where they're not needed.) In the course of this I renamed connect() to connect_server() in order to avoid a namespace collision with Perl's own connect() function. Oh yeah ... updated the documentation to match. Oh yeah ... created a new sockets directory, by default ~/.icbm/SOCKETS, and moved all the sockets into it. It prevents hangs when grepping the .icbm directory. Revised the socket and fifo names for consistency. Added a case-insensitive flag option to the /grep command (/grep /foo/i) Minor revisions to GetOptions() and pod2usage() calls General code cleanup Version bumped to 1.3.0 Oops.... removed some temporary code that I added to test thread-safety of DBI.pm and forgot about Added a report_correction_set variable to allow turning off display of correction load confirmations Refactored handle_input() to break handling of the replay command out into a separate replay() function, as it was approaching half of the code of handle_input(). Fixed a bug in which message echobacks were not replayed in class msg. v1.2.1 "/whois that masked man!" Released 09/29/2004 Changes since v1.2.0 -------------------- Minor documentation corrections involving the /correct command. Rewrote parsing and handling code for /whois output to enhance output and properly syntax-colorize it. v1.2.0 "OK, let's get a closeup look at that on the ReplayCam." Released 07/31/2004 Changes since v1.1.0 -------------------- Extensively rewrote the /replay command code to make major extensions to its syntax and functionality. The rewritten /replay command, in addition to its previously existing capabilities, can now show only messages from specified nicks or only messages of specified classes. Explicit include lists, ignore lists, and message class masking can all be combined in the same command, although there's little point in using an explicit include list and an ignore list together. See icbm.1 for details. Removed a leftover commandline option that was inserted for testing purposes, then accidentally left in. Streamlined the code in set_status() somewhat Fixed the /redraw command so that it really does clean up the input window, and aliased it as /refresh Fixed /replay so that if you /replay smeggems, you get both messages from smeggems and private messages *TO* smeggems. Added a 'rawmsg' hook type for those vanishingly rare occasions when you wish to do something to, or inspect, the raw message packet. (Well, OK, it's not *totally* raw. The packet type and length bytes have already been stripped when you see it.) Added a 'leave' hook type to match the 'join' type. Added a 'trigger' hook type for use with generic-trigger functionality. Added generic-trigger functionality to allow implemention of commands which wait for a response from the server before completing execution. See the documentation for details. Added /grep command (see documentation) v1.1.0 "Where did I leave the remote, Martha?" Released 5/27/2004 Changes since v1.0.2 -------------------- v1.1.0 adds a single feature: Remote control via a FIFO located in the data directory. Any input except the exit command can be sent via the FIFO. Please take SERIOUSLY the cautions against abusing it. v1.0.2 "I'm sorry. We'll come in again." Released 4/27/2004 Changes since v1.0.1 -------------------- Found and fixed the tight-loop-on-server-exit bug. It turns out select() does NOT return -1 if the connection th the server dies or is killed. However, we can (and now do) trap an error from Net::ICB that'll tell us if the connection has croaked unexpectedly. In the process of fixing the above, found and fixed the bug which was causing a SEGV from the parent Perl process after exiting ICBM code. After finding this one, I kicked myself soundly: it was happening because on a normal, user-initiated exit (and, ironically, ONLY then) I was failing to fully clean up before exiting. v1.0.1 "Your Release Name Here For A Small Donation" Released 4/27/2004 Changes since v1.0.0 -------------------- Minor documentation fixes. Allowed changing of the format strings for the status-bar clock, message timestamps, and log open/close timestamps. Modified handle_input() to allow passing strings containing whitespace to set(), ONLY for the timeformat, logtimeformat and timestampformat variables. Modified set() to allow string variables to be set to values containing embedded whitespace. v1.0.0 'Heeeeeeeeeere's MIRV!' Released 4/25/2004 Changes since v0.99.1 --------------------- Implemented logging with the addition of the /log command. This required the addition of a new logging thread, due to the inability to share filehandles between Perl ithreads. The input and output threads pass commands and logging data to the logging thread via a per-instance UDP socket. So long as I was making code changes on this scale anyway, I took the opportunity to rearrange some of the code. Mostly this is just physically moving code around in the file, though a few variables have been renamed as well. The new logging thread is now the first thread started, followed by the input, output and status threads. The main program (thread 0) waits until the logging thread has set up the log socket before it starts any more threads; after setting up the socket, the logging thread waits a minimum of 0.1 second for the input thread to start before it begins checking the log socket for datagrams. This is intended to minimize the likelihood of any thread blocking on the log socket. The socket is removed upon exit. Implemented timestamps via the new /timestamps command. The packet history code has been changed slightly to preserve the arrival time of packets in the replay buffer. This enables replayed packets to be timestamped with their actual arrival times even if timestamping was not active when the packet was originally received, something CICB absolutely cannot do. Implemented paging. Page size is user-controlled, and can be changed -- or even disabled -- while output is paused. Pending packets are flushed if paging is disabled while paused, and a page flush is generated if page size is increased while paused. The paging algorithm preserves message timestamps. v0.99.1 'The Release Without a Name' Released 4/24/2004 Changes since v0.99 ------------------- Added new functions get_group(), get_mod(), get_nick() which return the current values of $cur_group, $cur_mod and $cur_nick, since these variables, while global and shared between threads, are not available in the context of user-loaded scripting functions. These make several scripting functions possible (maintaining nick stacks, for example) that could not be implemented before because the information was unavailable. v0.99 'Get yer hooks into THIS.' Released 3/8/2004 Changes since v0.98.7 --------------------- Modified mozilla() and related functions in sample_commands Fixed a bug in /replay which prevented selectively replaying messages from a user whose nick is entirely numeric. The problem is now worked around by allowing escaping numeric nicks (/replay \666). Added the 'notify' hook type Rewrote the hook code to pass hook functions an array of the remaining fields of the packet, rather than a single string containing the concatenated fields. Updated documentation with respect to hook functions. Added an additional example hook function to be used to dump the contents of packets in order to see what to extract from where when writing hook functions. Added the ability to use \ to escape any first character on a line, in order to be able to send open messages beginning with otherwise specially handled characters such as !, ^, \, or whatever the currently-set cmdchar happens to be. Note that this is problematic if the cmdchar is set to \. History recall and editing are also problematic in the event that the cmdchar is set to ! or ^. Therefore, we add the restriction that the cmdchar may not be set to !, ^, or \. v0.98.7 "6, 5, 4, 3 ... we have ignition ..." Released 2/9/2004 First SourceForge release Changes since v0.98.6 --------------------- Extended the /replay (or /display) command. Instead of just replaying the last N messages (optionally filtered to specific nicks only), it is now possible to replay a block of N messages beginning M messages back. M is ignored if N is greater than M. N is ignored if it is greater than the current length of the buffer. Added /version command (displays ICBM client version and sends command to server to display server version) Added a new 'ownmsg' color setting for the text of outgoing messages if echoback is turned on, with the same default as the 'personal' setting. Added './share/icb' and $datadir to the list of paths searched when trying to find the icbserverdb file. Added an option to choose whether personal messages to the icb server are displayed onscreen (display_server_messages, defaulting to 0). Fixed a bug of omission in M_BEEP handling. Beep senders are now properly inserted into the tab-history list. Found and fixed a bug in which an outgoing personal message packet echoed back from the server with /echoback verbose set was mis-identified as a who display header and displayed in bright white instead of personal-message color. This only occurred because the frelling co subtype of the type i packet is used for three different purposes that I know of, none of which are documented. This in turn occurred because the ICB protocol wasn't planned, it just sort of grew. Added a /redraw command to refresh the status bar and write window of one or the other becomes corrupted. Fixed a bug accidentally introduced into /redraw that manifested as right-arrow being disabled in the write window after invoking /redraw. Fixed a minor bug in which an escaped cmdchar was not properly un-escaped at the beginning of a line. v0.98.6 "You wanna set what, when?" Released 12/4/2003 Changes since v0.98.5 --------------------- Fixed a bug in the mozilla() sample function which caused keyword expansion to not be performed on the key following any ambiguous key. Added a $DATADIR/settings file for early-initialization variables (currently supports only setting writesize) v0.98.5 "Display, schmisplay...." Released 10/8/2003 Changes since v0.98.4 --------------------- Fixed a bug of omission in talk() -- the backspace code neglected to handle chr(127) (the DEL character, default key code returned by the BkSp key on many systems) as well as chr(8) (BKSP). Fixed a bug in tab-history which could cause tab to return an endless series of null "nicks" if the length of the tab-history list is exactly 1. Added the ICBM_DATA environment variable to allow overriding the location of ICBM's data directory. Default is still $HOME/.icbm if ICBM_DATA is not set. ICBM now honors the cicb/fn ICBNAME variable. Cosmetic fixes in the query command. v0.98.4 "Whoa there, son, back up a step." Released 9/2/2003 Changes since v0.98.3 --------------------- Fixed a bug of omission in talk() -- the backspace code neglected to handle chr(127) (the DEL character, default key code returned by the BkSp key on many systems) as well as chr(8) (BKSP). v0.98.3 "There has to be a better way to do this."[1] Released 8/21/2003 Changes since v0.98.2 --------------------- Rewrote file loading commands (external and internal). There are now separate load(script_file) and loadhook(hook_file) commands. This removes the undesirable requirement for hook functions to be in $HOME/.icbm/hooks, though they should still be in separate files from regular scripting functions and data. Modified do_hooks so that if a hook function is triggered by a private message, the sender's nick is prefixed with a * ('fred' becomes '*fred'). This enables using a single hook function to handle both open and private messages and giving it the ability to distinguish which type of event triggered it. [1] Ten-point reference! v0.98.2 "Did you see that? ...Damn. Neither did I." Released 8/17/2003 Changes since v0.98.1 ------------------- Discovered and fixed a bug of omission that caused /exclude commands to result in no visible output, even with echo_outgoing turned on, unless echoback is turned on. v0.98.1 "I'm still talking to you, boy." Released 8/16/2003 Changes since v0.98 ------------------- Implemented query mode. /personalto is an alias for /query, to keep old-time cicb users comfortable. Fixed a minor bug in mod detection that caused mod reacquires after a disconnect and rejoin to be missed. Linked README.ICBM to icbm.1 in distribution v0.98 "Release without a name" Released 8/15/2003 Changes since v0.97 ------------------- MAJOR CHANGE: In order to fix the bug which caused hook functions not to update when reloaded on the fly (this is a Perl threads issue), all hook functions have been moved into a new file, $HOME/.icbm/hooks. Hook functions in the .icbm/commands file will still load at startup, but they MUST be in .icbm/hooks if you want them to be reloadable during a session. This bug fix also involved changes to the load() and delhook() functions and a complete rewrite of the handle_messages() function. The code changes allow addhook() and delhook() calls initiated in the context of the input thread to be executed in the context of the output thread, where hooks are actually processed. In order to do this, the handle_messages loop had to be rewritten to get a socket descriptor for the ICB server connection in order to be able to select() for pending output on it, since the Net::ICB API provides only a blocking version of the connection->readmsg() function, which would cause hook reloads to be indefinitely delayed until a message was received by the server. Modified the URL grabber code to try to eliminate adding duplicate URLs to the list, which should not happen but somehow was still occasionally happening. Input parser now clears the input window before, instead of after, executing the typed command. Input parser now strips trailing whitespace from input lines before sending them to the server. v0.97 "Now hear this!" Released 7/18/2003 Changes since v0.96 ------------------- The /msg command, when used with multiple recipients, now prefixes the message with [CC: ] if the new variable cc_msg_list is set. You can now recall a previously-typed line to the input window for editing and re-sending using !foo, or perform substitutions in the last command you typed using ^foo^bar, bash-style. Both operators can be combined in a single command. Errors that occur when loading a file SHOULD now all be caught by ICBM and displayed cleanly in the output window. Tweaked mod detection to handle the regain-mod-after-disconnect case (variant server message) Fixed a bug in the URL grabber that caused errors if a URL was posted wrapped in parentheses. v0.96 "He was right here just a minute ago!" Released 6/18/2003 Changes since v0.95 ------------------- Added hooktype 'awol' to separate out 'user not found' errors from actual *serious* errors. v0.95 "I'll grab his wallet, you get the tricorder." Released 5/28/2003 Changes since v0.94 ------------------- Fixed a bug in status-line nick tracking Incorporated the URL grabber code directly into the ICBM core to work around problems involving accessing shared variables from scripts Added a get_urls() function to return the contents of the shared @urllist variable to clientside scripts, because they don't seem to be able to access it otherwise v0.94 "I know what I said, but you know what I meant." Released 5/21/2003 Changes since v0.93.2 --------------------- Added capability for on-send correction of common typos using a user-defined corrections list. Supports regexps. New commands: /correct New functions: correct() Added /show as a general-purpose command to list client data. Currently, %aliases, %corrections and @highlights are showable. Removed /aliases command (replaced by /show aliases) v0.93.2 "Watch out for the cliff edg..." Released 5/19/2003 Changes since v0.93.1 --------------------- BUGFIX RELEASE -- Decreased the maximum number of characters of text ICBM tries to put into an ICB protocol message packet from 250 to 240 to make sure we're not overflowing the packet, after discovering a bug in which from one to several characters were being dropped approximately every 250 characters in long multi-packet messages. v0.93.1 "Did you say bananananana problem?" Released 5/16/2003 Changes since v0.93 ------------------- BUGFIX RELEASE -- Fixed a tokenization bug which manifested when the third token in a command was an exact substring of the second. -- Added a /replay rate limiter to fix a problem in which large /replays would corrupt the screen. v0.93 "And if my interest in them fades -- Well, there's always Captain Hook..." Released 5/15/2003 Changes since v0.92 ------------------- Implemented event hooks. Provided event hook types at this time are: openmsg, privmsg, connect, status, alert, error, group, join, beep, mod, idlemod, idleboot, boot, ping New commands: /delhook New functions: addhook(), delhook() Added one-time warning if you attempt to quit while still mod of current group Added new client variable $modwarn to disable mod-quit warning Added explicit set() command v0.92 "Outside of a dog, a book is a man's best friend. Inside of a dog, it's too dark to read." Released 5/14/2003 Changes since v0.91 ------------------- Added nick-list restriction capability to /replay Removed redundant legacy set_status() calls in handle_messages Fixed incomplete mod state tracking Added ability to dynamically resize incoming packet history buffer and command history buffer v0.91 "Alias Smith and Jones" Released 5/13/2003 Changes since v0.90 ------------------- Added support for alternate nicks (specify -nick multiple times), used in order listed on command line /! subshell turns out to be a bad idea in ICBM. It has been dropped from the planned feature list, but this shouldn't be much of a problem because it's trivial to write a userside function to run anything desired from system(). /! will be better used for input-history recall and editing later. Added command aliases New commands: /alias, /unalias, /aliases New functions: alias() Added server message logging New command: /replay Split handle_messages() into handle_messages() and parse_packet() to enable adding /replay Added global @builtins list of commands which cannot be redefined using /alias Added token count in handle_input() for better arg count checking Added do_beep function to allow for hooking later Added variable echo_outgoing (controls whether outgoing open and personal messages are echoed to the read window) Changed icb_print() to allow variable args (should have done this in the first place) Minor bug fixes v0.90 Released 5/12/2003 Initial public release