2022-08-07 10:40:42 +02:00
|
|
|
xK
|
|
|
|
==
|
2015-09-27 00:38:20 +02:00
|
|
|
|
2024-04-03 16:24:09 +02:00
|
|
|
'xK' (chat kit) is an IRC software suite consisting of a daemon, bot, notifier,
|
2024-11-12 12:40:22 +01:00
|
|
|
terminal client, and web/Windows/macOS/Linux/FreeBSD/Android/iOS frontends
|
|
|
|
for the client. It's all you're ever going to need for chatting, so long as
|
|
|
|
you can make do with slightly minimalist software.
|
2014-06-14 20:26:28 +02:00
|
|
|
|
2022-08-27 16:17:47 +02:00
|
|
|
They're all lean on dependencies, and offer a maximally permissive licence.
|
2014-06-14 20:26:28 +02:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
xC
|
|
|
|
--
|
2022-08-27 16:17:47 +02:00
|
|
|
The IRC client, and the core of 'xK'. It is largely defined by building on top
|
|
|
|
of GNU Readline or BSD Editline that have been hacked to death. Its interface
|
|
|
|
should feel somewhat familiar for weechat or irssi users.
|
2015-04-30 01:39:08 +02:00
|
|
|
|
2022-09-23 18:55:31 +02:00
|
|
|
image::xC.webp[align="center"]
|
2016-10-30 18:49:07 +01:00
|
|
|
|
2022-08-27 16:17:47 +02:00
|
|
|
It has most features you'd expect of an IRC client, such as being multiserver,
|
|
|
|
a powerful configuration system, integrated help, text formatting, automatic
|
|
|
|
message splitting, multiline editing, bracketed paste support, word wrapping
|
|
|
|
that doesn't break links, autocomplete, logging, CTCP queries, auto-away,
|
|
|
|
command aliases, SOCKS proxying, SASL EXTERNAL authentication using TLS client
|
Start X11 and web frontends for xC
For this, we needed a wire protocol. After surveying available options,
it was decided to implement an XDR-like protocol code generator
in portable AWK. It now has two backends, per each of:
- xF, the X11 frontend, is in C, and is meant to be the primary
user interface in the future.
- xP, the web frontend, relies on a protocol proxy written in Go,
and is meant for use on-the-go (no pun intended).
They are very much work-in-progress proofs of concept right now,
and the relay protocol is certain to change.
2022-08-08 04:39:20 +02:00
|
|
|
certificates, a remote relay interface, or basic support for Lua scripting.
|
|
|
|
As a unique bonus, you can launch a full text editor from within.
|
|
|
|
|
|
|
|
xP
|
|
|
|
--
|
|
|
|
The web frontend for 'xC', making use of its networked relay interface.
|
2022-09-21 17:29:12 +02:00
|
|
|
It intentionally differs in that it uses a sans-serif font, and it shows
|
|
|
|
the list of all buffers in a side panel. Otherwise it is a near replica,
|
2022-09-23 20:29:30 +02:00
|
|
|
including link:xC.adoc#_key_bindings[keyboard shortcuts].
|
2014-06-14 20:26:28 +02:00
|
|
|
|
2022-09-23 18:55:31 +02:00
|
|
|
image::xP.webp[align="center"]
|
|
|
|
|
2024-12-03 15:25:21 +01:00
|
|
|
xA, xT, xW, xM
|
|
|
|
--------------
|
|
|
|
Other frontends for 'xC'. Using them is not recommended.
|
2024-11-12 12:40:22 +01:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
xD
|
|
|
|
--
|
2022-08-27 16:50:20 +02:00
|
|
|
The IRC daemon. It is designed for use as a regular user application rather
|
|
|
|
than a system-wide daemon, and follows the XDG Base Directory Specification.
|
|
|
|
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.
|
2014-07-21 05:10:25 +02:00
|
|
|
|
2022-08-27 16:17:47 +02:00
|
|
|
It autodetects TLS on incoming connections (I'm still wondering why everyone
|
|
|
|
doesn't have this), authenticates operators via TLS client certificate
|
|
|
|
fingerprints, and supports a number of IRCv3 capabilities.
|
2014-08-10 03:47:50 +02:00
|
|
|
|
2022-08-27 16:50:20 +02:00
|
|
|
What it notably doesn't support is online changes to configuration, any limits
|
|
|
|
besides the total number of connections and mode `+l`, or server linking
|
|
|
|
(which also means no services).
|
2015-09-27 00:38:20 +02:00
|
|
|
|
2022-09-26 12:39:26 +02:00
|
|
|
xS
|
|
|
|
--
|
2022-09-26 13:40:54 +02:00
|
|
|
The IRC daemon again, this time ported to Go, additionally supporting WEBIRC,
|
|
|
|
and thus ideal for pairing with, e.g.,
|
|
|
|
https://github.com/kiwiirc/webircgateway[].
|
|
|
|
Any further development, such as P10 or TS6 linking for IRC services,
|
|
|
|
or plugin support for arbitrary bridges, will happen here.
|
2018-10-21 05:44:39 +02:00
|
|
|
|
2024-04-02 16:44:01 +02:00
|
|
|
xN
|
|
|
|
--
|
|
|
|
The IRC notifier, should you ever need to send automated messages from a script.
|
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
xB
|
|
|
|
--
|
2021-10-31 05:16:08 +01:00
|
|
|
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.
|
2015-04-30 01:39:08 +02:00
|
|
|
|
2021-10-31 05:16:08 +01:00
|
|
|
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).
|
2015-04-11 21:05:13 +02:00
|
|
|
|
2016-03-10 20:25:06 +01:00
|
|
|
Packages
|
|
|
|
--------
|
2023-07-01 22:02:04 +02:00
|
|
|
Regular releases are sporadic. git master should be stable enough.
|
|
|
|
You can get a package with the latest development version using Arch Linux's
|
|
|
|
https://aur.archlinux.org/packages/xk-git[AUR],
|
|
|
|
or as a https://git.janouch.name/p/nixexprs[Nix derivation].
|
2016-03-10 20:25:06 +01:00
|
|
|
|
2015-09-27 00:45:50 +02:00
|
|
|
Building
|
|
|
|
--------
|
2022-09-25 21:01:34 +02:00
|
|
|
Build-only dependencies: CMake, pkg-config, awk, liberty (included),
|
|
|
|
asciidoctor or asciidoc (recommended but optional) +
|
Start X11 and web frontends for xC
For this, we needed a wire protocol. After surveying available options,
it was decided to implement an XDR-like protocol code generator
in portable AWK. It now has two backends, per each of:
- xF, the X11 frontend, is in C, and is meant to be the primary
user interface in the future.
- xP, the web frontend, relies on a protocol proxy written in Go,
and is meant for use on-the-go (no pun intended).
They are very much work-in-progress proofs of concept right now,
and the relay protocol is certain to change.
2022-08-08 04:39:20 +02:00
|
|
|
Common runtime dependencies: openssl +
|
2022-09-05 14:58:44 +02:00
|
|
|
Additionally for 'xC': curses, libffi, readline >= 6.0 or libedit >= 2013-07-12,
|
|
|
|
lua >= 5.3 (optional) +
|
2014-07-21 05:10:25 +02:00
|
|
|
|
2022-08-07 10:40:42 +02:00
|
|
|
$ git clone --recursive https://git.janouch.name/p/xK.git
|
|
|
|
$ mkdir xK/build
|
|
|
|
$ cd xK/build
|
2021-10-31 05:16:08 +01:00
|
|
|
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
2022-09-05 14:58:44 +02:00
|
|
|
-DWANT_READLINE=ON -DWANT_LIBEDIT=OFF -DWITH_LUA=ON
|
2014-07-21 05:10:25 +02:00
|
|
|
$ make
|
|
|
|
|
2015-02-11 01:53:19 +01:00
|
|
|
To install the application, you can do either the usual:
|
2015-09-27 00:38:20 +02:00
|
|
|
|
2015-02-26 22:55:25 +01:00
|
|
|
# make install
|
2015-02-11 01:53:19 +01:00
|
|
|
|
2021-10-31 05:16:08 +01:00
|
|
|
Or you can try telling CMake to make a package for you:
|
2015-09-27 00:38:20 +02:00
|
|
|
|
2021-10-31 05:16:08 +01:00
|
|
|
$ cpack -G DEB # also supported: RPM, FreeBSD
|
2022-08-07 10:40:42 +02:00
|
|
|
# dpkg -i xK-*.deb
|
2014-07-21 05:10:25 +02:00
|
|
|
|
2016-03-10 20:25:06 +01:00
|
|
|
Usage
|
|
|
|
-----
|
2021-08-06 16:12:15 +02:00
|
|
|
'xC' has in-program configuration. Just run it and read the instructions.
|
|
|
|
Consult its link:xC.adoc[man page] for details about the interface.
|
2015-05-03 19:39:30 +02:00
|
|
|
|
|
|
|
For the rest you might want to generate a configuration file:
|
2015-09-27 00:38:20 +02:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
$ xB --write-default-config
|
|
|
|
$ xD --write-default-config
|
2014-07-21 05:10:25 +02:00
|
|
|
|
|
|
|
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:
|
2015-09-27 00:38:20 +02:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
$ xB
|
|
|
|
$ xD
|
2014-07-21 05:10:25 +02:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
'xB' stays running in the foreground, therefore I recommend launching it inside
|
|
|
|
a Screen or tmux session.
|
2015-07-11 17:04:36 +02:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
'xD', on the other hand, immediately forks into the background. Use the PID
|
2015-09-27 00:38:20 +02:00
|
|
|
file or something like `killall` if you want to terminate it. You can run it
|
|
|
|
as a `forking` type systemd user service.
|
|
|
|
|
2022-09-06 19:57:58 +02:00
|
|
|
xP
|
|
|
|
~~
|
2022-09-10 15:55:13 +02:00
|
|
|
The precondition for running 'xC' frontends is enabling its relay interface:
|
|
|
|
|
|
|
|
/set general.relay_bind = "127.0.0.1:9000"
|
|
|
|
|
|
|
|
To build the web server, you'll need to install the Go compiler, and run `make`
|
|
|
|
from the _xP_ directory. Then start it from the _public_ subdirectory,
|
|
|
|
and navigate to the adress you gave it as its first argument--in the following
|
|
|
|
example, that would be http://localhost:8080[]:
|
|
|
|
|
|
|
|
$ ../xP 127.0.0.1:8080 127.0.0.1:9000
|
|
|
|
|
|
|
|
For remote use, it's recommended to put 'xP' behind a reverse proxy, with TLS,
|
2022-09-16 03:52:28 +02:00
|
|
|
and some form of HTTP authentication. Pass the external URL of the WebSocket
|
|
|
|
endpoint as the third command line argument in this case.
|
2022-09-06 19:57:58 +02:00
|
|
|
|
2024-09-14 07:32:44 +02:00
|
|
|
xA
|
|
|
|
~~
|
|
|
|
The Fyne frontend supports all of Linux, FreeBSD, Windows, macOS, Android, and
|
|
|
|
iOS natively, albeit somewhat poorly. Only use `fyne` or `fyne-cross` after
|
|
|
|
running `make` first.
|
|
|
|
|
2023-07-09 07:06:19 +02:00
|
|
|
xW
|
|
|
|
~~
|
|
|
|
The Win32 frontend is a separate CMake subproject that should be compiled
|
2023-08-30 00:35:34 +02:00
|
|
|
using MinGW-w64. To avoid having to specify the relay address each time you
|
|
|
|
run it, create a shortcut for the executable and include the address in its
|
|
|
|
_Target_ field:
|
2023-07-09 07:06:19 +02:00
|
|
|
|
|
|
|
C:\...\xW.exe 127.0.0.1 9000
|
|
|
|
|
|
|
|
It works reasonably well starting with Windows 7.
|
|
|
|
|
2023-08-30 00:35:34 +02:00
|
|
|
xM
|
|
|
|
~~
|
|
|
|
The Cocoa frontend is a separate CMake subproject that requires Xcode to build.
|
|
|
|
It is currently not that usable. The relay address can either be passed on
|
|
|
|
the command line, or preset in the _defaults_ database:
|
|
|
|
|
|
|
|
$ defaults write name.janouch.xM relayHost 127.0.0.1
|
|
|
|
$ defaults write name.janouch.xM relayPort 9000
|
|
|
|
|
2015-09-27 00:45:50 +02:00
|
|
|
Client Certificates
|
|
|
|
-------------------
|
2021-08-06 16:12:15 +02:00
|
|
|
'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.
|
2021-05-29 06:38:33 +02:00
|
|
|
|
2023-07-04 23:49:49 +02:00
|
|
|
'xD' and 'xS' use SHA-256 fingerprints of TLS client certificates
|
|
|
|
to authenticate users. To get the fingerprint from a certificate file
|
|
|
|
in the required form, use:
|
2015-09-27 00:38:20 +02:00
|
|
|
|
2022-09-26 13:56:45 +02:00
|
|
|
$ openssl x509 -in public.pem -outform DER | sha256sum
|
2014-08-08 01:26:56 +02:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
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:
|
2020-09-02 19:59:21 +02:00
|
|
|
|
2016-03-12 14:38:19 +01:00
|
|
|
....
|
|
|
|
# Preload with system-wide settings
|
|
|
|
$include /etc/inputrc
|
|
|
|
|
|
|
|
# Make M-left and M-right reorder buffers
|
2021-08-06 16:12:15 +02:00
|
|
|
$if xC
|
2016-03-12 14:38:19 +01:00
|
|
|
"\e\e[C": move-buffer-right
|
|
|
|
"\e\e[D": move-buffer-left
|
|
|
|
$endif
|
|
|
|
....
|
2020-09-02 19:59:21 +02:00
|
|
|
|
2016-03-10 20:25:06 +01:00
|
|
|
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.
|
2016-03-12 14:38:19 +01:00
|
|
|
Beware that you can easily break the program if you're not careful.
|
2016-03-10 20:25:06 +01:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
How do I make xC look like the screenshot?
|
|
|
|
------------------------------------------
|
2022-08-15 15:48:45 +02:00
|
|
|
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.
|
2016-10-30 18:49:07 +01:00
|
|
|
|
2022-08-15 15:48:45 +02:00
|
|
|
Assuming that your build supports Lua plugins, and that you have a decent,
|
|
|
|
properly set-up terminal emulator, it suffices to run:
|
|
|
|
|
2022-08-26 03:43:32 +02:00
|
|
|
/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"
|
2022-09-10 15:55:13 +02:00
|
|
|
/set theme.userhost = "109"
|
|
|
|
/set theme.join = "108"
|
|
|
|
/set theme.part = "138"
|
|
|
|
/set theme.external = "248"
|
|
|
|
/set theme.timestamp = "250 255"
|
|
|
|
/set theme.read_marker = "202"
|
2016-10-30 18:49:07 +01:00
|
|
|
|
2016-07-23 20:29:25 +02:00
|
|
|
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.
|
|
|
|
|
2015-09-27 00:45:50 +02:00
|
|
|
Contributing and Support
|
|
|
|
------------------------
|
2022-08-07 10:40:42 +02:00
|
|
|
Use https://git.janouch.name/p/xK to report any bugs, request features,
|
2018-06-21 22:46:36 +02:00
|
|
|
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.
|
2015-05-07 20:27:01 +02:00
|
|
|
|
2018-06-21 22:46:36 +02:00
|
|
|
Bitcoin donations are accepted at: 12r5uEWEgcHC46xd64tt3hHt9EUvYYDHe9
|
2017-05-13 13:43:15 +02:00
|
|
|
|
2015-09-27 00:45:50 +02:00
|
|
|
License
|
|
|
|
-------
|
2018-06-21 22:42:05 +02:00
|
|
|
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.
|
2016-04-28 23:40:38 +02:00
|
|
|
|
2021-08-06 16:12:15 +02:00
|
|
|
Note that 'xC' becomes GPL-licensed when you link it against GNU Readline,
|
2020-10-28 13:10:42 +01:00
|
|
|
but that is not a concern of this source package. The licenses are compatible.
|