This is my chat client. Only IRC is really supported. The beginnings of XMPP support are present, but there are various issues that make it difficult; XMPP is, to put it mildly, not a very pleasant protocol, and I wouldn't be doing anything at all with it except that $REALJOB wanted it. It is stalled because $REALJOB was too impatient, so I'm now using a bloated GUI XMPP client on a pi instead of something civilized - or at least less uncivilized - in a terminal window. As you can see from the Makefile, you will need various libraries. -lcurses and -ltermcap will normally come from your OS; the others are mine, or, in one case (-lyxml), my slight adaptation of someone else's work. libyxml, libbase64, libsha, and libaio are all available from my public git repos (if this was cloned from .../Mouse/chc, then you can clone .../libyxml, .../libbase64, .../libsha, and .../libaio to get them). As mentioned above, libyxml is not my work, or, more precisely, except for a few lines and some repackaging, it is not my work; libbase64, libsha, and libaio are entirely my work. This is the IRC client I use when I IRC. It probably has plenty of bugs, but none I trip over (in the IRC code, that is; the XMPP support is known to be incomplete at best). Stress it in directions I haven't, though, and you may well find bugs. I typically run this as .../client -host HOSTNAME -tag SHORT-TAG -name REALNAME -login LOGIN -nick NICK -join \#channel -join \#otherchannel ... where HOSTNAME is the IRC server hostname, SHORT-TAG is a short tag for the server in the interface (usually just a few characters), and NICK is the nick I'm using for that connection. LOGIN and REALNAME are the first and last args on the USER line (login name and real name). You of course will need to provide your own values for these. In the interface, just typing composes text which is sent to the destination you have set, but, by default, there is no destination set. You need to set one before text will go anywhere. There are actually three editors - or, from a different point of view, three instances of the same editor; they differ mostly in what happens when you are done with a line and hit RETURN. The default one is for text sent to channels or users. There is also the slash-command editor and the colon-line editor. ESC-/ enters the slash-command editor and ESC-: the colon-line editor - or, if you're already in whichever editor the command would switch to, switches back to the default editor. Each editor has its own input line, independent of the others, but they share almost all their behaviour - the only real differences are, as outlined above, what happens when you hit RETURN and how they handle ESC-/, and ESC-:. The default editor's action on RETURN is to send the text to your chosen destination(s) - or, if you have none set, complain. Unlike traditional IRC clients, nothing special happens if the first character of the line is a / - see the slash-command editor for that functionality. The colon-line editor's action on RETURN is also to send the text to your chosen destination(s), but as an action (emote, pose, etc) rather than as speech. The slash-command editor's action is to interpret the line as a command. They are listed here with a leading / because that's how I think of them. /on SERVER COMMAND This is part of planned support for being connected to multiple servers at once. Doing that doesn't really work at present, making /on relatively useless. /to DEST [DEST ...] This sets the DESTs (which can be nicks or channel names) as destinations for text from the default editor. Text is sent to all of these. /msg DEST ...TEXT... This sends the TEXT to the DEST. It is semantically equivalent to /on DEST, then typing the TEXT, then resetting /on to what it was before, but it is a good deal shorter and often more convenient. (It is, however, limited to a single DEST.) /away ...TEXT... Sends `away' status to the server. /hide SHOWHIDE-THING /show SHOWHIDE-THING These hide or show various things in the interface. There are three things that can be hidden or shown: lt Line types. Each line of displayed output has a type, which can be: IN Internally generated by the client (for example, if you type text and have no destinations selected, the message telling you so has this type). SE Server-generated lines (eg, /who output). CH On-channel messages. PR Private (off-channel) message sent to you. TC Text you sent to a channel you weren't listening to at the time (and thus don't expect to see echoed back). TP Private (off-channel) message you sent. Showing these is mostly useful for debugging. ts Timestamp. This is the timestamp showing when the line was seen. It can be displayed as: ss.fffff Seconds and fractional seconds. Used when the message is less than a minute old. mm:ss.ff Minutes, seconds, and fractional seconds. Used when the message is over a minute old but less than 30 minutes old. hh:mm:ss Hours, minutes, and seconds. Used when the message is over 30 minutes old but less than 24 hours old. dd hh:mm Day-of-month, hours, and minutes. Used when the message is over 24 hours old but less than 7 days old. mm-dd hh Month, day-of-month, and hours. Used when the message is over 7 days old but less than about 6 months old. yy-mm-dd Year-mod-100, month, and day-of-month. Used when the message is over about 6 months old. fts Full timestamp. This is the same timestamp as ts, above, but it is always formatted as yyyy-mm-dd hh:mm:ss.ff If fts is being shown, ts, if selected, is suppressed. /idle The clock in the upper right stops displaying seconds after fifteen minutes of idle time, to save on update CPU. This causes it to go into it's "I'm idle" mode immediately. /join CHANNEL /part CHANNEL /leave CHANNEL Joins (/join) or leaves (/part, /leave) a channel. /nick NICK Changes your nick. /server COMMAND [ARG...] Performs various server-level operations. There is internal help; try "/server ?" for it. /quit Quits immediately. /debug [ARG...] Controls internal debugging. This is designed for debugging the implementation and hence is not documented here; see the source. /wrhist Prints internal statistics on want-redraw values seen by the redraw code. This really should be subsumed into /debug. The client maintains scrollback. Some of the input editor commands put you into a scrollback-reading mode. In this mode, the input editor is hidden, the status par changes to say "Viewing scrollback", and typed characters are interpreted differently: digits, backspace, delete Enters a numeric argument, which is used by some commands. space Moves down (towards more recent lines) by about 75% of one screenful. b Moves up (towards older lines) by about 75% of one screenful. d u Moves down (d) or up (u) by as many lines as the argument, default 10. j n k p Moves down (j, n) or up (k, p) by as many lines as the argument, default 1. ESC-^L Toggles displaying line types. ESC-^T Cycles through displaying no timestamps, short timestamps (ts style), or long timestamps (fts style). ESC-< Moves to the oldest end of scrollback. ESC-> Moves to the newest end of scrollback (see below). ESC-n ESC-p Moves down (ESC-n) or up (ESC-p) about 75% of one screenful, like space and b. Moving to the very newest line in scrollback automatically exits scrollback-reading mode. If output is received while in scrollback-reading mode, a number is displayed at the left end of the status bar at the bottom of the screen, indicating how many lines of such output have been received.