This is not a pipe (jj version 2)

My favorite XMPP client has been working really nicely every day for the last couple of years. Since releasing jj version 1, I have added some minor features and fixed bugs.

Here is a list of most important changes for jj version 2:

  • Support for MUC private messages
  • Status information to contact's directory
  • More precise time format for output

Writing status information every time contact's status information changes might use excess amount of disk space. I advice to monitor jj's disk space usage. Biggest status file found from my jj directory was only 1.5M, but there might be a problems with some other setups. There is also option -n to disable status output entirely if needed.

I am using some tools with my jj setup. I will put those to tools directory on the jj source code repository. For now there is only fecho utility. Fecho is a wrapper around echo that prevents blocking if one of jj's fifos does not read the input right away.

Version 2 of jj can be downloaded from jj's home page

For those who are interested the full source code changes of version 2 can be inspected at github.

Categories: Jj, Jabber, English
Date: 2012-11-29 21:23:54

Event based Jabber/XMPP bot

Some time ago I wrote superb Jabber/XMPP client based on the ideas of even more superb IRC client ii. I named the client jj and put the source code to github. Since then me and my friends have been using jj for our Jabber MUC (multiuser chat room, something like channel in IRC). And it has been serving us nicely.

Our jj bot resolves URL titles and aggregates Twitter, Google Plus and some RSS feeds to our MUC. The process how this is done is quite easy. Jj has outfile and input FIFO for each channel it sits on. The bot functionality can be distinguished into two different tasks: 1) reacting to input and 2) cron jobs:

  1. URL resolving is done by reacting to what input is coming in. There is one shell script that listens our mucs outfile with inotify. When it gets notified that something is said on the MUC it will inspect the line. If it finds URL on that line, it will call the title resolver and write the resolved title to the MUC in file.

    Here is pseudo bash for it (external tools fecho and are used), note also that I divided the long greps to multiple lines without testing the code:

    while true; do
        inotifywait -e modify $outfile
        line=$(tail -1 "$outfile" |\
               grep -v "^[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]\
               [0-9][0-9]:[0-9][0-99][0-9] <$nickname>" |\
               grep "^[0-9][0-9]"|\
               grep -v "[0-9] -\!-" |\
               grep -m 1 -i -E "https?://")
        if [ ! -z "$line" ]; then
            url=$(echo "$line"| grep -o -i -E "https?://.*" | cut -d" " -f1)
            title=$(echo "$url" |
            fecho "$title" $infile

    Basically this can be used for any kind of reaction tasks. For example for the classic sed like line "s/from/to".

  2. Feeds (Twitter, Google Plus, RSS etc.) are done with cron jobs. Here is pseudo bash example for that (it uses external tools feedcheck and fecho):
    feedlist=$(cat <<EOF
    # Set IFS to newline only. See BASH(1) manpage for details on IFS.
    for feed in $feedlist; do
         for x in $(feedcheck $feed); do
             fecho "$x" jabber.tld/mucs/conf@conference.jabber.tld/in
             sleep 5

Sadly I had to write the external tools fecho, and feedcheck, since there we no proper ones available. Fecho is already in jj source code repository, but the other ones are not yet. For fecho source see here.

Hopefully these examples will illustrate how to make jj bots. I will try to polish the instructions later and add these to jj source code repository as examples.

Categories: Jabber, English, Jj, Avoin
Date: 2012-07-13 14:13:28