v1.6.0
"Time after time"
Released 2022-12-13
The /replay command now offers starttime and endtime parameters that are
    much easier to use than the old, often confusing count/start parameters.


v1.5.2
"We're so glad you could attend, come inside, come inside"
Released 2022-07-03
Since the dev-perl/Net-ICB package is long dead, I am now repackaging and
    distributing ICB.pm along with icbm.


v1.5.1
"Now with EVEN MORE alacritty!"
Released 2020-01-19
Additional tweaks to make mousewheel scrolling in Alacritty work better.
    DOES NOT WORK in tmux/screen sessions.
Set report_url_capture off by default.
    

v1.5.0
"Now with more alacritty."
Released 2019-12-31
Added an option -a/-alacritty which activates some compatibility features to make mousewheel
    scroll work again in alacritty terminals.
    

v1.4.12
"Crack that URL!"
Released 2019-10-08
Added a 'url' hook type, which required changing the calling protocol for grab_URL().
    URL hook functions receive an abbreviated packet consisting of the sender and a single
    URL token from the message packet.  I single message containing multiple URLs may cause
    the URL hook function to be called multiple times.


v1.4.11
"Back Home once again"
Released 2018-02-22
Minor fix to the URL grabber tokenizer regex.


v1.4.10
"Back Home once again"
Released 2016-06-22
Fixes in talk() to work around changes in how screen and tmux now post the
    Home and End keys


v1.4.9
"Perfectly Square"
Released 2016-03-07
Use Crypt::DH::GMP instead of Crypt::DH, eliminate need for Math::Bigint
    and Math::Bigint::GMP.  This requires changing Crypt::DH code to perform
    all initialization in the constructor.


v1.4.8.4
"Mind the pointer, Marlon."
Released 2015-07-27
Fix several potential pointer overrun errors in talk()


v1.4.8.3
"Stop that a little more politely, please."
Released 2015-02-17
Fix incorrect current-user nick displayed on the remote end of a
    /revoke command.
Changed default share directory from /usr/local/share/icb to /usr/share/icb.

v1.4.8.2
"Stop that a little more politely, please."
Released 2015-02-17
Fix behavior of 'revoke' and add timestamps to setup/revoke status
    messages.


v1.4.8.1
"Stop that.  And be careful!"
Released 2014-04-07
Fix unexpected characters in group names or nicks breaking regexps.
    Avoids "Nested quantifiers in regex" exception when group or user
    name is naughty, like "+++ATH0" (those wacky atbotters)
    Fix contributed by TTK Ciar.
Fix a minor bug in handling nick change messages (also TTK).
Fix status bar not updating when group is renamed.
Add hook types 'rename' (for group rename) and 'nickchg' (someone in
    your group changes their nick).


v1.4.8
"Stop that."
Released 2014-04-06
New command 'revoke' ends an encrypted session set up using the 'setup'
    command.
Replace use of obsolete Digest::SHA1 with Digest::SHA.
Fixed some documentation POD errors.  Hot-fix only, no version bump.
Updated README.ENCRYPTION to document the EICB_SESSION_END constant (ditto).


v1.4.7
"Get hooked!"
Released 2013-12-28
Fix to make hooks work properly in Perl 5.16.  The basic issue here was
    that in 5.16, variables shared between threads apparently now need to
    be declared 'our' instead of 'my'.
Added a 'modwarn' hook type, called when you attempt to exit while still
    moderator of a group.
Make icbm.1 a proper man page.
Add proper GPL text and declaration.


v1.4.6.2 (?)  (more likely will be 1.4.7)
"Timestamps, or it didn't happen."
unreleased
Slight change to URL grabber code to defeat people who insist on typing
    URLs wrapped by <>.


v1.4.6.1
"Timestamps, or it didn't happen."
Released 2012-04-05
Changes since v1.4.6
Applied patches from TTK Ciar:
    - add deltilde command and interpret_tilde_as_delete mode
    - fix bugs in timestamp adjustment and status line
    - set ICBNAME and ICBGROUP environment variables
    - add set_timestamps_active() function for use by scripts
    - re-implemented /redraw command
Added sleeptime as an early-settable default
Completely rewrote the encrypted-message handler to handle a corner case
    which was incorrectly generating multiple warnings


v1.4.6
"Timestamps, or it didn't happen."
Released 2012-04-05
Changes since v1.4.5
--------------------
Added timestamps and timestampformat to variables early-settable in
    the defaults file
Removed the never-used use_timestamps variable
Added timestamps to encryption status messages and revised formatting
    of some status messages.
Echobacks of outgoing encrypted private messages are now properly
    displayed.
Added the command /encryption on|off, equivalent to /set encryption 0|1,
    to interactively enable or disable decryption (if available).
The user is now informed when an encryption setup packet is received but
    encryption is unavailable or disabled.


v1.4.5
"I'll take care of that in a minute."
Released 7/22/2011
Changes since v1.4.4
--------------------
Code changes to the logging functions to allow log_start() to be called
    in the startup commands file, in which case ICBM will recognize that
    the log thread isn't running yet and delay log opening until it
    is running.
Also fixed a bug in which newlines were being stripped from log data
    BEFORE writing it to the log file.  Fixed this by the simple
    expedient of moving the log_send() call before the chomp() call.
Bug fixed in which parentheses around a URL would foil the URL grabber.


v1.4.4
"No, really.  One at a time."
Released 7/13/2011
Changes since v1.4.3
--------------------
Trying a change from Thread::Semaphore to lock($semaphore) in hopes
    if fixing the accursed race condition, Thread::Semaphore being
    (by all the evidence so far) not to be trusted.  If it works,
    this is a better solution, as it doesn't require an additional
    module.
...And it looks like this solves the problem.  Ironic conclusion:
    Thread::Semaphore is not thread-safe......    *facepalm*
Disabled all the race-mitigation code that appears to not be needed
    any more.
Replaced all 'if ($key = chr(n))' logic with 'if (ord($key) == n)'
    in talk().
ICBM now accepts either chr(4) or chr(126) as DEL, and either chr(8)
    or chr(127) as BKSP.  This change should make these two keys
    work properly everywhere.


v1.4.3
"Oh god, not again"
Unreleased
Changes since v1.4.2
--------------------
Still fighting the accursed Curses cross-window corruption bug.
    I'm almost certain it's a race condition, but I'll be damned if
    I can find it.
Added a preclear of the status line in update_status_line(), since
    I clearly still haven't solved the cross-window corruption bug,
    to make certain that we completely rewrite (and hence clean up)
    the status line, at least, every time we write it.  The other
    two windows are a more difficult problem, because we have to
    be able to get the content that ICBM/Curses thinks is currently
    in the window in order to be able to clean it up.


v1.4.2
"One at a time, please"
Released 12/11/2010
Changes since v1.4.1
--------------------
Added Thread::Semaphore and modified icb_print() to use a proper
    semaphore; hopefully this will permanently fix the input-window
    debris problem and make the refresh/redraw command, which has
    never worked well, completely unnecessary.  As part of the same
    fix, set_status() and init_status() have been rewritten to use
    a new update_status_line() function, also properly semaphored,
    into which all status line update code has been moved rather
    than using icb_print().  This works around a problem wherein
    parts of the status line update were done in set_status() before
    calling icb_print() and thus happened outside of a critical
    section, and as a result could collide with icb_print()'s 
    critical section.
Fixed handling of encryption handshake packets if encryption is
    disabled.
Fixed an off-by-one error when calculating end-of-replay timestamp.
Added an additional test for socket validity in handle_messages
    in order to eliminate a potential race condition that may be
    causing errors on exit under OSX.
Fixed input routines to properly handle raw HOME and END keys.
Rewrote the FIFO handling code in fifocmd(), which was previously
    relying (without my knowledge) on a Perl bug that I didn't know
    about which allowed the read end of the FIFO to be held open for
    multiple writers.  The logic has now been corrected; fifocmd()
    now reads the FIFO, then immediately closes and re-opens it ready
    for the next writer.
Moved the remove_stale_sockets() call MUCH deeper into initialization
    so that we don't bother checking for stale sockets unless we're
    actually going to start up a connection.
Fixed a bug in grab_URL() in which leading and trailing single and
    double quotes were not stripped from URL tokens


v1.4.1
"Never Say Anything (Again)"
Released 03/22/2009
Changes since v1.4.0
--------------------
Changed the open() call in fifocmd() to use sysopen() so that we can
    explicitly specify O_NONBLOCK, because some default Perl installs
    default to blocking opens, which causes that open() to never return
    until something writes to the FIFO, which causes fifocmd() to never
    exit and ICBM to hang on exit.
Added timestamps of original begin/end times to replay()
Enabled conditional loading of modules required for encryption.  ICBM
    will now load modules required for encryption if all are present,
    but will disable encryption and continue if one or more are not
    installed.  This makes encryption a fully runtime-enableable
    feature.


v1.4.0
"Never Say Anything"
Released 02/06/2009
Changes since v1.3.5
--------------------
Client-to-client encryption implemented using per-user session keys
    and Blowfish cipher.
Session key generation and sharing via Diffie-Hellman key exchange
    implemented.
Added the 'primes' file to hold the D-H initialization prime vector,
    and the primegen tool to generate new primes files if required.
    (Note that this is NOT recommended as it will break interoperability.)
    Valid locations for primes are the same as for icbserverdb.
Restore stty erase on exit.
Fix a packet-overflow bug affecting multi-packet encrypted messages
    with echoback on.
Fix a bug in which decryption would blow up and kill the thread in the
    event that replay began in the middle of an encrypted message.
    (Fixed by searching backwards, then if necessary forwards, for the
    beginning or end respectively of the encrypted message.)


v1.3.5
"Never Say Anything (development)"
Unreleased
Changes since v1.3.4
--------------------
Added the report_url_capture variable, default 1, set to 0 to suppress
    URL capture reports.  May set this to 0 by default, since capture
    reports appear to possibly be responsible for certain display errors.
Added a semaphore to eliminate icb_print() races between threads.  If this
    works, I should be able to take out refresh/redraw, which has never
    worked right without unanticipated side-effects.
(Found there are still occasional display glitches.  I believe at this point
    that the problems are originating somewhere in Curses.pm.)
Fixed a minor error in mainswitch() that made -version a non-exclusive
    option.
Corrected usage in the version check.
Broke private message sending out into send_private() and presend() to
    facilitate pre-sending processing such as encryption.
Preliminary implementation of encrypted personal messages, so far with
    fixed cipher (Blowfish) and encryption key for testing purposes.
    (Encryption functions are not documented yet.)


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
    <ryan@brassmonkey.com>, 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: <list of addressees>] 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
