Internet Citizens' Band Messenger -- A threaded Perl client for the ICB service
ICBM is a threaded ICB client written in Perl5 which supports a
superset of the functionality of CICB (the ICB C Client, the de facto standard ICB
client). This allows ICBM to be readily extended to support many features that
CICB does not, and to gracefully do a number of things that CICB does poorly if at all.
(CICB has its own advantages, including a much smaller memory footprint, though.) The
primary purpose of ICBM, however, is as a portable ICB client which can be scripted in
Perl instead of in TCL. While it has become traditional for ICB/ForumNet clients to
embed TCL, scripting in TCL via an embedded interpreter imposes many pitfalls and yields many
unexpected side effects, TCL being a much more opaque and user-hostile language than Perl.
It is ICBM's intention to far exceed the scripting capabilities of other ICB clients.
ICBM News
The parser now CORRECTLY handles environments in which ICBM receives the
four-byte sequence (27, 91, 51, 126) when the DEL key is pressed, instead of a simple
DEL character (4). The deltilde command and the associated
interpret-tilde-as-delete flag are no longer necessary and have been removed.
The /replay command now supports starttime/endtime options for specifying replay range,
which should be a lot easier to use than the old style start/count options.
(Old style start/count is still supported as well.) This functionality requires Time::Local version 1.30 or later.
Net::ICB is now distributed along with ICBM, since it is no longer to
my knowledge maintained by its author (John Vinopal, <banshee
WAKKA WAKKA!@resort
SPAMMERS CAN EAT MY SHORTS.com>)
and ICBM is one of only maybe three packages that use it, all of them ICB
clients, and all but ICBM moribund.
New option --alacritty/-a added to activate improved compatibility with the Alacritty
GPU-accelerated terminal emulator.
New 'url' hook type added, called whenever a URL is parsed in a message.
Crypt::DH::GMP now used in preference to Crypt::DH if found.
icbm.1 is now a properly formatted man page instead of raw icbm -man output.
Compatibility fixes for Perl 5.16.
Timestamps can now be enabled and the timestamp format set in the early-initialization
defaults file.
Several minor formatting changes made to encryption-related status messages, and fixed a
bug which was causing echoback of outgoing encrypted private messages to be suppressed.
The long-standing cross-window corruption problem appears to finally be fixed, following
a switch from using Thread::Semaphore to simply calling lock($semaphore). In a
magnificent piece of irony, I have concluded that Thread::Semaphore itself is not thread
safe, or at least not on multi-core processors. The lock() call, however, is.
ICBM now accepts either chr(4) or chr(126) as DEL, and either chr(8) or chr(127)
as BKSP. This solves a problem in which BKSP did not consistently work on all
Unix/Linux variants due to variations in which keycode the BKSP and DEL keys return to
an application. (tilde_as_bksp mode can be turned off using the deltilde command.)
ICBM Selected Features
Client-to-client Blowfish encryption of private messages (other
ciphers may be added later)
Threaded client with multiple-window split-screen display
Command history and message log with replay
Scriptable in Perl, including aliases and event hooks
Customizable colorization with nick highlighting
Supports multiple alternate nicks and automatically retries connection if primary nick is in use
Compatible with CICB icbserverdb files
Status line with mod status and clock
Full embedded documentation (icbm -man)
Runs on any platform with Perl 5.6/5.8, Perl ithreads, and required modules
ICBM Requirements
Perl-5.6.0 or later compiled with ithreads support
Minimum base modules: Config.pm, Curses.pm, Getopt::Long, Module::Load::Conditional,
Net::ICB (included), Pod::Usage, POSIX.pm, Socket.pm, Term::ANSIColor, Term::ReadKey,
Time::Local version 1.30 or later (required to provide timelocal_posix and
timegm_posix, which are not exported by 1.28. I may revise this to use
timelocal_modern instead.)