200 lines
7.5 KiB
Plaintext
200 lines
7.5 KiB
Plaintext
xK
|
|
==
|
|
|
|
'xK' (chat kit) is an IRC software suite consisting of a terminal client,
|
|
daemon, and bot. It's all you're ever going to need for chatting,
|
|
so long as you can make do with slightly minimalist software.
|
|
|
|
They come with these potentially interesting properties:
|
|
|
|
- supporting IRCv3, SOCKS, IPv6, TLS (including client certificates)
|
|
- lean on dependencies
|
|
- compact and arguably easy to hack on
|
|
- maximally permissive license
|
|
|
|
xC
|
|
--
|
|
The IRC client, and the core of 'xK'. It is largely defined by being built
|
|
on top of GNU Readline that has been hacked to death. Its interface should feel
|
|
somewhat familiar for weechat or irssi users.
|
|
|
|
image::xC.png[align="center"]
|
|
|
|
It has most of the stuff you'd expect of an IRC client, such as being
|
|
multiserver, a powerful configuration system, integrated help, text formatting,
|
|
automatic splitting of overlong messages, multiline editing, bracketed paste
|
|
support, decent word wrapping, autocomplete, logging, CTCP queries, auto-away,
|
|
command aliases, and basic support for Lua scripting. As a unique bonus,
|
|
you can launch a full text editor from within.
|
|
|
|
xD
|
|
--
|
|
The IRC daemon. It is designed to be used as a regular user application rather
|
|
than a system-wide daemon. If all you want is a decent, minimal IRCd for
|
|
testing purposes or a small network of respectful users (or bots), this one will
|
|
do it just fine.
|
|
|
|
Notable features:
|
|
|
|
- TLS autodetection (I'm still wondering why everyone doesn't have this)
|
|
- IRCop authentication via TLS client certificates
|
|
- partial IRCv3 support
|
|
|
|
Not supported:
|
|
|
|
- server linking (which also means no services); I consider existing protocols
|
|
for this purpose ugly and tricky to implement correctly; I've also found no
|
|
use for this feature yet
|
|
- online changes to configuration; the configuration system from 'xC' could
|
|
be used to implement this feature if needed
|
|
- limits of almost any kind, just connections and mode `+l`
|
|
|
|
This program has been
|
|
https://git.janouch.name/p/haven/src/branch/master/hid[ported to Go],
|
|
and development continues over there.
|
|
|
|
xB
|
|
--
|
|
The IRC bot. While originally intended to be a simple rewrite of my old GNU AWK
|
|
bot in C, it fairly quickly became a playground, and it eventually got me into
|
|
writing the rest of this package.
|
|
|
|
Its main characteristic is that it runs plugins as coprocesses, allowing for
|
|
enhanced reliability and programming language freedom. Moreover, it recovers
|
|
from any crashes, and offers native SOCKS support (even though socksify can add
|
|
that easily to any program).
|
|
|
|
Packages
|
|
--------
|
|
Regular releases are sporadic. git master should be stable enough. You can get
|
|
a package with the latest development version from Archlinux's AUR.
|
|
|
|
Building
|
|
--------
|
|
Build dependencies: CMake, pkg-config, asciidoctor or asciidoc, awk,
|
|
liberty (included) +
|
|
Runtime dependencies: openssl +
|
|
Additionally for 'xC': curses, libffi, lua >= 5.3 (optional),
|
|
readline >= 6.0 or libedit >= 2013-07-12
|
|
|
|
Avoid libedit if you can, in general it works but at the moment history is
|
|
acting up and I have no clue about fixing it.
|
|
|
|
$ git clone --recursive https://git.janouch.name/p/xK.git
|
|
$ mkdir xK/build
|
|
$ cd xK/build
|
|
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
-DWANT_READLINE=ON -DWANT_LIBEDIT=OFF -DWANT_LUA=ON
|
|
$ make
|
|
|
|
To install the application, you can do either the usual:
|
|
|
|
# make install
|
|
|
|
Or you can try telling CMake to make a package for you:
|
|
|
|
$ cpack -G DEB # also supported: RPM, FreeBSD
|
|
# dpkg -i xK-*.deb
|
|
|
|
Usage
|
|
-----
|
|
'xC' has in-program configuration. Just run it and read the instructions.
|
|
Consult its link:xC.adoc[man page] for details about the interface.
|
|
|
|
For the rest you might want to generate a configuration file:
|
|
|
|
$ xB --write-default-config
|
|
$ xD --write-default-config
|
|
|
|
After making any necessary edits to the file (there are comments to aid you in
|
|
doing that), simply run the appropriate program with no arguments:
|
|
|
|
$ xB
|
|
$ xD
|
|
|
|
'xB' stays running in the foreground, therefore I recommend launching it inside
|
|
a Screen or tmux session.
|
|
|
|
'xD', on the other hand, immediately forks into the background. Use the PID
|
|
file or something like `killall` if you want to terminate it. You can run it
|
|
as a `forking` type systemd user service.
|
|
|
|
Client Certificates
|
|
-------------------
|
|
'xC' will use the SASL EXTERNAL method to authenticate using the TLS client
|
|
certificate specified by the respective server's `tls_cert` option if you add
|
|
`sasl` to the `capabilities` option and the server supports this.
|
|
|
|
'xD' uses SHA-1 fingerprints of TLS client certificates to authenticate users.
|
|
To get the fingerprint from a certificate file in the required form, use:
|
|
|
|
$ openssl x509 -in public.pem -outform DER | sha1sum
|
|
|
|
Custom Key Bindings in xC
|
|
-------------------------
|
|
The default and preferred frontend used in 'xC' is GNU Readline. This means
|
|
that you can change your bindings by editing '~/.inputrc'. For example:
|
|
|
|
....
|
|
# Preload with system-wide settings
|
|
$include /etc/inputrc
|
|
|
|
# Make M-left and M-right reorder buffers
|
|
$if xC
|
|
"\e\e[C": move-buffer-right
|
|
"\e\e[D": move-buffer-left
|
|
$endif
|
|
....
|
|
|
|
Consult the source code and the GNU Readline manual for a list of available
|
|
functions. Also refer to the latter for the exact syntax of this file.
|
|
Beware that you can easily break the program if you're not careful.
|
|
|
|
How do I make xC look like the screenshot?
|
|
------------------------------------------
|
|
With the defaults, 'xC' doesn't look too fancy because I don't want to have
|
|
a hard dependency on either Lua for the bundled script that provides an easily
|
|
adjustable enhanced prompt, or on 256-colour terminals. Moreover, it's nearly
|
|
impossible to come up with a colour theme that would work well with both
|
|
black-on-white and white-on-black terminals, or anything wild in between.
|
|
|
|
Assuming that your build supports Lua plugins, and that you have a decent,
|
|
properly set-up terminal emulator, it suffices to run:
|
|
|
|
/set general.pager = Press Tab here and change +Gb to +Gb1d
|
|
/set general.date_change_line = "%a %e %b %Y"
|
|
/set general.plugin_autoload += "fancy-prompt.lua"
|
|
/set attributes.userhost = "\x1b[38;5;109m"
|
|
/set attributes.join = "\x1b[38;5;108m"
|
|
/set attributes.part = "\x1b[38;5;138m"
|
|
/set attributes.external = "\x1b[38;5;248m"
|
|
/set attributes.timestamp = "\x1b[48;5;255m\x1b[38;5;250m"
|
|
/set attributes.read_marker = "\x1b[38;5;202m"
|
|
|
|
Configuration profiles
|
|
----------------------
|
|
Even though the applications don't directly support configuration profiles,
|
|
they conform to the XDG standard, and thus you can change the location they
|
|
load configuration from via XDG_CONFIG_HOME (normally '~/.config') and the
|
|
location where store their data via XDG_DATA_HOME (normally '~/.local/share').
|
|
|
|
It would be relatively easy to make the applications assume whatever name you
|
|
run them under (for example by using symbolic links), and load different
|
|
configurations accordingly, but I consider it rather messy and unnecessary.
|
|
|
|
Contributing and Support
|
|
------------------------
|
|
Use https://git.janouch.name/p/xK to report any bugs, request features,
|
|
or submit pull requests. `git send-email` is tolerated. If you want to discuss
|
|
the project, feel free to join me at ircs://irc.janouch.name, channel #dev.
|
|
|
|
Bitcoin donations are accepted at: 12r5uEWEgcHC46xd64tt3hHt9EUvYYDHe9
|
|
|
|
License
|
|
-------
|
|
This software is released under the terms of the 0BSD license, the text of which
|
|
is included within the package along with the list of authors.
|
|
|
|
Note that 'xC' becomes GPL-licensed when you link it against GNU Readline,
|
|
but that is not a concern of this source package. The licenses are compatible.
|