jabberlib, sometimes spelled JabberLib, and also called jlib, allows Tcl programs to connect to other jabber/xmpp agents. It originated in the zABBER project, and was later forked into Coccinella. The original was subsequently also forked into Tkabber. Later, the original was forked yet again into tkchat, leaving no less than four branches of the original jabberlib.
Other than jabber UI clients, it can be used for powerful application messaging, like YAMI and spread.
For Tcl, this seems to be the only jabber library available, and like too many other open-source projects, documentation is not present.
As the Coccinella fork is the most-recently and most-actively updated fork, it is now the de-facto "standard" jabberlib. Its description is as follows:
One of the core parts in the Coccinella is the JabberLib, written in Tcl. In order to serve other Tcl developers, it is downloadable here as a separate archive. It's already included in the Coccinella distribution. It hides all of the XML stuff that the Jabber protocol uses. Some test files are included to get you started. No docs available, except a brief summary of commands in the prefix header of each source file.
Included is also a patched TclXML package that is needed for XML parsing in Tcl.
Directory containing jabberlib in Tkabber : jabberlib-tclxml
Important files:
The difficult part to understand from the code are how to register callbacks for receiving messages.
Hint: grep for uplevel usage. (Windows users, use tcllib's fileutil::grep.)
The examples code:
For receiving msg aspect, rssbot is more useful.
Flow of events on receiving message:
There is a TCP transport in transports file. I think that seems to be the code for socket receive. It calls jlib::inmsg.
jlib::inmsg → wrapper:parser → jlib::parse → client:message
It seems the calling application needs to define client:message which is the callback procedure for receive.
The above flow of calling cannot explicitly seen from the code. During jlib:connect, wrapper object is created and stored in some global array. Wrapper object creation takes the commands for parse as one of its argument. jlib::parse is passed as an argument during wrapper:new. Hence it is invoked during wrapper:parse.