An XMPP client with OTR support

xmpp-client setup

go get github.com/agl/xmpp-client

(If you don't have Go already installed then see below.)

xmpp-client use

xmpp-client is a simple XMPP client written in pure Go. It's a terminal program and so probably doesn't work on Windows.

xmpp-client expects a config file in ~/.xmpp-client. You can set the location of the config file with --config-file on the command line. If it fails to parse a config file, it'll enter enrollment: where it'll ask a series of questions to configure itself and will then write a config file from the answers.

The config file is just a JSON file and can be edited by hand. (Although xmpp-client will rewrite it, blowing away any comments or custom formatting.)

xmpp-client will prompt for a password each time it's run. If you want to save the password you have to edit the config file and insert a string element called Password. (This ensures that you understand that the password is stored in plaintext.)

Once the connection has been established, the commands are quite simple. Type /help for a listing.

Messages are sent by entering the JID of a contact and hitting tab to complete the address, followed by a colon. The message can then be entered after the colon, IRC style. Like this:

> [email protected]: Hi there!

On subsequent lines you don't have to enter their address again, unless you want to direct messages to someone else:

> [email protected]: Hi there!
> I was thinking
> about that thing
> [email protected]: I'll be right with you!
> [email protected]: back again

Messages from others are written in a similar fashion: the address is omitted for subsequent lines and replaced with a colon. The colon is red for unencrypted and green for encrypted.

If a contact name isn't recognised before a colon then it's ignored. Don't assume that you're sending a message to who you think you are unless you tab completed the address.

The client functions, but is very rudimentary.

Installation instructions

Build and run instructions for Ubuntu 13.10 (codename Saucy Salamander, go version 1.1.2). Note the version of Go shipped with this distro is very old any may be broken now.

sudo apt-get install git golang mercurial
export GOPATH=$HOME/go
go get github.com/agl/xmpp-client
$GOPATH/bin/xmpp-client

## If you want to set up an alias
echo "alias xmpp-client='$GOPATH/bin/xmpp-client' " >> ~/.bashrc
. ~/.bashrc
xmpp-client

Build and run instructions for Tails (tested on version 1.2, go version 1.2)

## If you don't have already
sudo apt-get update

## Debian old-stable, on which Tails is currently based, doesn't have Go packages
sudo apt-get install -t unstable golang

## Git is already included in tails so we only need to get Mercurial
sudo apt-get install mercurial

## Assuming you have created a persistant volume
export GOPATH=/home/amnesia/Persistent/go/

go get github.com/agl/xmpp-client
$GOPATH/bin/xmpp-client
Comments
  • panic: runtime error: slice bounds out of range

    panic: runtime error: slice bounds out of range

    I just had my first-ever xmpp-client crash. Prior to crashing I'd had one OTR conversation, which the other party ended, and then a number of presence messages. Server is jabber.ccc.de.

    panic: runtime error: slice bounds out of range
    
    goroutine 22 [running]:
    runtime.panic(0x826a860, 0x83e4aef)
        /usr/lib/go/src/pkg/runtime/panic.c:279 +0xe9
    code.google.com/p/go.crypto/ssh/terminal.(*Terminal).writeLine(0x18610340, 0x1864b130, 0x1, 0x2a)
        /home/amnesia/Persistent/go/src/code.google.com/p/go.crypto/ssh/terminal/terminal.go:565 +0x24c
    code.google.com/p/go.crypto/ssh/terminal.(*Terminal).handleKey(0x18610340, 0x20, 0x0, 0x0, 0x18610300)
        /home/amnesia/Persistent/go/src/code.google.com/p/go.crypto/ssh/terminal/terminal.go:550 +0x7ea
    code.google.com/p/go.crypto/ssh/terminal.(*Terminal).readLine(0x18610340, 0x0, 0x0, 0x0, 0x0)
        /home/amnesia/Persistent/go/src/code.google.com/p/go.crypto/ssh/terminal/terminal.go:665 +0x4a4
    code.google.com/p/go.crypto/ssh/terminal.(*Terminal).ReadLine(0x18610340, 0x0, 0x0, 0x0, 0x0)
        /home/amnesia/Persistent/go/src/code.google.com/p/go.crypto/ssh/terminal/terminal.go:639 +0xab
    main.(*Input).ProcessCommands(0x18646d9c, 0x187bbe30)
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp-client/input.go:358 +0x19a
    created by main.main
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp-client/ui.go:371 +0x1680
    
    goroutine 16 [select]:
    main.main()
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp-client/ui.go:385 +0x52a3
    
    goroutine 19 [finalizer wait, 18 minutes]:
    runtime.park(0x806ebc0, 0x83e7444, 0x83e67e9)
        /usr/lib/go/src/pkg/runtime/proc.c:1369 +0x94
    runtime.parkunlock(0x83e7444, 0x83e67e9)
        /usr/lib/go/src/pkg/runtime/proc.c:1385 +0x3f
    runfinq()
        /usr/lib/go/src/pkg/runtime/mgc0.c:2644 +0xc5
    runtime.goexit()
        /usr/lib/go/src/pkg/runtime/proc.c:1445
    
    goroutine 20 [syscall]:
    os/signal.loop()
        /usr/lib/go/src/pkg/os/signal/signal_unix.go:21 +0x24
    created by os/signal.init·1
        /usr/lib/go/src/pkg/os/signal/signal_unix.go:27 +0x37
    
    goroutine 21 [chan receive]:
    main.func·002()
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp-client/ui.go:200 +0x5b
    created by main.main
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp-client/ui.go:203 +0x2a6
    
    goroutine 23 [IO wait, 6 minutes]:
    net.runtime_pollWait(0xb7549478, 0x72, 0x0)
        /usr/lib/go/src/pkg/runtime/netpoll.goc:146 +0x62
    net.(*pollDesc).Wait(0x1863e5b8, 0x72, 0x0, 0x0)
        /usr/lib/go/src/pkg/net/fd_poll_runtime.go:84 +0x48
    net.(*pollDesc).WaitRead(0x1863e5b8, 0x0, 0x0)
        /usr/lib/go/src/pkg/net/fd_poll_runtime.go:89 +0x46
    net.(*netFD).Read(0x1863e580, 0x18854000, 0x8000, 0x8000, 0x0, 0xb7548218, 0xb)
        /usr/lib/go/src/pkg/net/fd_unix.go:242 +0x28d
    net.(*conn).Read(0x1860e2c0, 0x18854000, 0x8000, 0x8000, 0x0, 0x0, 0x0)
        /usr/lib/go/src/pkg/net/net.go:122 +0xc6
    crypto/tls.(*block).readFromUntil(0x1869a0c0, 0xb75494e8, 0x1860e2c0, 0x5, 0x0, 0x0)
        /usr/lib/go/src/pkg/crypto/tls/conn.go:451 +0xb0
    crypto/tls.(*Conn).readRecord(0x18694180, 0x17, 0x0, 0x0)
        /usr/lib/go/src/pkg/crypto/tls/conn.go:536 +0x1be
    crypto/tls.(*Conn).Read(0x18694180, 0x18617000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/lib/go/src/pkg/crypto/tls/conn.go:901 +0x140
    bufio.(*Reader).fill(0x187bb770)
        /usr/lib/go/src/pkg/bufio/bufio.go:97 +0x14c
    bufio.(*Reader).ReadByte(0x187bb770, 0xb747008c, 0x0, 0x0)
        /usr/lib/go/src/pkg/bufio/bufio.go:199 +0x75
    encoding/xml.(*Decoder).getc(0x18676c00, 0xb747dc8c)
        /usr/lib/go/src/pkg/encoding/xml/xml.go:851 +0x8d
    encoding/xml.(*Decoder).rawToken(0x18676c00, 0x0, 0x0, 0x0, 0x0)
        /usr/lib/go/src/pkg/encoding/xml/xml.go:511 +0x12d
    encoding/xml.(*Decoder).Token(0x18676c00, 0x0, 0x0, 0x0, 0x0)
        /usr/lib/go/src/pkg/encoding/xml/xml.go:246 +0x688
    github.com/agl/xmpp.nextStart(0x18676c00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp/xmpp.go:627 +0x6a
    github.com/agl/xmpp.next(0x1861bb90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp/xmpp.go:800 +0x89
    github.com/agl/xmpp.(*Conn).Next(0x1861bb90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp/xmpp.go:102 +0x6a
    main.(*Session).readMessages(0x18646d80, 0x187bbe60)
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp-client/ui.go:170 +0x4e
    created by main.main
        /home/amnesia/Persistent/go/src/github.com/agl/xmpp-client/ui.go:374 +0x16ca
    
  • Crash with trace with 2 OTR sessions

    Crash with trace with 2 OTR sessions

    Hi, I met a rather disturbing error (trace & crash):

    user_name_here> panic: otr: failed to generate sending keys: otr: internal error: no key slots
    
    goroutine 1 [running]:
    golang.org/x/crypto/otr.(*Conversation).generateData(0xc8200c8480, 0xc8201debd0, 0x2, 0x8, 0x0, 0x0, 0x0, 0x0)
        /home/user/.go/src/golang.org/x/crypto/otr/otr.go:960 +0x13b
    golang.org/x/crypto/otr.(*Conversation).Send(0xc8200c8480, 0xc8201debd0, 0x2, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/user/.go/src/golang.org/x/crypto/otr/otr.go:450 +0x170
    main.main()
        /home/user/.go/src/github.com/agl/xmpp-client/ui.go:577 +0x5f16
    
    goroutine 17 [syscall, 11 minutes, locked to thread]:
    runtime.goexit()
        /usr/lib/go/src/runtime/asm_amd64.s:1696 +0x1
    
    goroutine 5 [syscall, 11 minutes]:
    os/signal.loop()
        /usr/lib/go/src/os/signal/signal_unix.go:22 +0x18
    created by os/signal.init.1
        /usr/lib/go/src/os/signal/signal_unix.go:28 +0x37
    
    goroutine 6 [chan receive, 11 minutes]:
    main.main.func1(0xc82001a180, 0xc820084900)
        /home/user/.go/src/github.com/agl/xmpp-client/ui.go:204 +0x4d
    created by main.main
        /home/user/.go/src/github.com/agl/xmpp-client/ui.go:207 +0x36e
    
    goroutine 7 [select, 11 minutes, locked to thread]:
    runtime.gopark(0x7fc000, 0xc82002af28, 0x769270, 0x6, 0x44ea18, 0x2)
        /usr/lib/go/src/runtime/proc.go:185 +0x163
    runtime.selectgoImpl(0xc82002af28, 0x0, 0x18)
        /usr/lib/go/src/runtime/select.go:392 +0xa64
    runtime.selectgo(0xc82002af28)
        /usr/lib/go/src/runtime/select.go:212 +0x12
    runtime.ensureSigM.func1()
        /usr/lib/go/src/runtime/signal1_unix.go:227 +0x353
    runtime.goexit()
        /usr/lib/go/src/runtime/asm_amd64.s:1696 +0x1
    
    goroutine 19 [syscall]:
    syscall.Syscall(0x0, 0x0, 0xc8200849c0, 0x100, 0x58dfe8, 0x71da00, 0x0)
        /usr/lib/go/src/syscall/asm_linux_amd64.s:18 +0x5
    syscall.read(0x0, 0xc8200849c0, 0x100, 0x100, 0x42f3d5, 0x0, 0x0)
        /usr/lib/go/src/syscall/zsyscall_linux_amd64.go:783 +0x5f
    syscall.Read(0x0, 0xc8200849c0, 0x100, 0x100, 0xc82005db58, 0x0, 0x0)
        /usr/lib/go/src/syscall/syscall_unix.go:160 +0x4d
    os.(*File).read(0xc82002c008, 0xc8200849c0, 0x100, 0x100, 0xffffffff, 0x0, 0x0)
        /usr/lib/go/src/os/file_unix.go:211 +0x53
    os.(*File).Read(0xc82002c008, 0xc8200849c0, 0x100, 0x100, 0x0, 0x0, 0x0)
        /usr/lib/go/src/os/file.go:95 +0x8a
    golang.org/x/crypto/ssh/terminal.(*Terminal).readLine(0xc820084900, 0x0, 0x0, 0x0, 0x0)
        /home/user/.go/src/golang.org/x/crypto/ssh/terminal/terminal.go:734 +0x4a2
    golang.org/x/crypto/ssh/terminal.(*Terminal).ReadLine(0xc820084900, 0x0, 0x0, 0x0, 0x0)
        /home/user/.go/src/golang.org/x/crypto/ssh/terminal/terminal.go:664 +0xac
    main.(*Input).ProcessCommands(0xc82050c038, 0xc82001b500)
        /home/user/.go/src/github.com/agl/xmpp-client/input.go:370 +0x2a2
    created by main.main
        /home/user/.go/src/github.com/agl/xmpp-client/ui.go:408 +0x2382
    
    goroutine 20 [IO wait]:
    net.runtime_pollWait(0x7f1b5c378078, 0x72, 0xc82000a1d0)
        /usr/lib/go/src/runtime/netpoll.go:157 +0x60
    net.(*pollDesc).Wait(0xc8201961b0, 0x72, 0x0, 0x0)
        /usr/lib/go/src/net/fd_poll_runtime.go:73 +0x3a
    net.(*pollDesc).WaitRead(0xc8201961b0, 0x0, 0x0)
        /usr/lib/go/src/net/fd_poll_runtime.go:78 +0x36
    net.(*netFD).Read(0xc820196150, 0xc820198000, 0x4000, 0x4000, 0x0, 0x7f1b5cbb8050, 0xc82000a1d0)
        /usr/lib/go/src/net/fd_unix.go:232 +0x23a
    net.(*conn).Read(0xc820168020, 0xc820198000, 0x4000, 0x4000, 0x0, 0x0, 0x0)
        /usr/lib/go/src/net/net.go:172 +0xe4
    crypto/tls.(*block).readFromUntil(0xc820164db0, 0x7f1b5c3373a0, 0xc820168020, 0x5, 0x0, 0x0)
        /usr/lib/go/src/crypto/tls/conn.go:455 +0xcc
    crypto/tls.(*Conn).readRecord(0xc8201b0000, 0x7fc017, 0x0, 0x0)
        /usr/lib/go/src/crypto/tls/conn.go:540 +0x2d1
    crypto/tls.(*Conn).Read(0xc8201b0000, 0xc820178000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/lib/go/src/crypto/tls/conn.go:901 +0x167
    bufio.(*Reader).fill(0xc82001ac00)
        /usr/lib/go/src/bufio/bufio.go:97 +0x1e9
    bufio.(*Reader).ReadByte(0xc82001ac00, 0x0, 0x0, 0x0)
        /usr/lib/go/src/bufio/bufio.go:229 +0x7a
    encoding/xml.(*Decoder).getc(0xc82017ab00, 0x0)
        /usr/lib/go/src/encoding/xml/xml.go:861 +0xad
    encoding/xml.(*Decoder).rawToken(0xc82017ab00, 0x0, 0x0, 0x0, 0x0)
        /usr/lib/go/src/encoding/xml/xml.go:512 +0x148
    encoding/xml.(*Decoder).Token(0xc82017ab00, 0x0, 0x0, 0x0, 0x0)
        /usr/lib/go/src/encoding/xml/xml.go:247 +0xe83
    github.com/agl/xmpp-client/xmpp.nextStart(0xc82017ab00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/user/.go/src/github.com/agl/xmpp-client/xmpp/xmpp.go:701 +0x93
    github.com/agl/xmpp-client/xmpp.next(0xc82016e000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/user/.go/src/github.com/agl/xmpp-client/xmpp/xmpp.go:890 +0x7d
    github.com/agl/xmpp-client/xmpp.(*Conn).Next(0xc82016e000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/user/.go/src/github.com/agl/xmpp-client/xmpp/xmpp.go:103 +0xab
    main.(*Session).readMessages(0xc82050c000, 0xc82001b560)
        /home/user/.go/src/github.com/agl/xmpp-client/ui.go:172 +0x62
    created by main.main
        /home/user/.go/src/github.com/agl/xmpp-client/ui.go:411 +0x23da
    

    I encountered this while having 2 OTR sessions running. Installed on Archlinux with go get github.com/agl/xmpp-client. I'm sorry but I have no idea on how to reproduce this (or if I did something wrong for that matter).

  • Tails and unrecognized path errors

    Tails and unrecognized path errors

    Tails 1.3RC, go 1.3.3. Installation as in the readme give the following error messages

    ... amnesia@amnesia:~$ export GOPATH=/home/amnesia/Persistent/go/ amnesia@amnesia:~$ go get github.com/agl/xmpp-client package github.com/agl/xmpp-client imports github.com/agl/xmpp imports golang.org/x/crypto/otr: unrecognized import path "golang.org/x/crypto/otr" package github.com/agl/xmpp-client imports github.com/agl/xmpp imports golang.org/x/crypto/ssh/terminal: unrecognized import path "golang.org/x/crypto/ssh/terminal" package github.com/agl/xmpp-client imports github.com/agl/xmpp imports golang.org/x/net/html: unrecognized import path "golang.org/x/net/html" package github.com/agl/xmpp-client imports github.com/agl/xmpp imports golang.org/x/net/proxy: unrecognized import path "golang.org/x/net/proxy"

  • UTF-8 support.

    UTF-8 support.

    (This is again a go.crypto/ssh/terminal limitation, but I will put this here because I find it a problem only regarding xmpp-client.)

    Terminal input currently is ASCII only. My äöü and ß keys are just dead. This is not a big problem for german text, but certainly for most non-european languages.

  • OS X support

    OS X support

    I was about to create a homebrew for xmpp-client but then I noticed that I'm unable to use xmpp-client with either the golang builds in homebrew or with the official signed golang packages.

    Here is the error:

    go get -v github.com/agl/xmpp-client github.com/agl/xmpp-client (download) code.google.com/p/go.crypto (download) code.google.com/p/go.net (download) github.com/agl/xmpp (download) code.google.com/p/go.crypto/otr code.google.com/p/go.crypto/ssh/terminal code.google.com/p/go.net/proxy github.com/agl/xmpp

    code.google.com/p/go.crypto/ssh/terminal

    /usr/local/Cellar/go/1.0.3/src/pkg/code.google.com/p/go.crypto/ssh/terminal/util.go:27: undefined: syscall.Termios

  • Resetting keyIds for a new AKE

    Resetting keyIds for a new AKE

    In chat sessions with Gibberbot after ending one OTR session and starting a second one, I get the error:

    * (6:39PM) While processing message from xxx: otr: peer requested keyid 1 when I'm on 5
    

    All later OTR sessions produce a similar error (with bigger keyid on the xmpp-client side).

    The OTRv2 spec says:

    When starting a private conversation with a correspondent, generate two DH key pairs for yourself, and set our_keyid = 2.

    My interpretation would be that Gibberbot is right and we should start a second AKE with theirKeyId and myKeyId=2. On the other hand, I don't have any problems in sessions with the somewhat authoritative Pidgin-OTR and other clients, so I wonder if this is really the intended interpretation.

    I am not necessarily asking for a patch here; if somebody more knowledgeable about OTR could indicate how this should be fixed, I could probably do it myself.

  • connecting to wk3.org fails

    connecting to wk3.org fails

    66161b19c6906d6f3e5c8a5ff22ad2c45c1acac3 still works, current version gives an "EOF" on or directly after starting the TLS negotiation (more complete error message when I'm back on the upgraded/defunct machine).

  • Can't login when password has spaces

    Can't login when password has spaces

    I cannot login in accounts that have spaces in the password. I have tried to enclose the password in quotes but it doesn't work. Should I type them with some special character?

  • Xmpp-client not authenticating with Riseup

    Xmpp-client not authenticating with Riseup

    Hi,

    I think Riseup did some change in their server recently because xmpp-client stopped to work with it. It's failing to authenticate.

    Authentication log:

    • (10:22AM) Making connection to 4cjw6cwpeaeppfqz.onion:5269 via proxy
      • (10:22AM) Starting TLS handshake
      • (10:22AM) SSL/TLS version: TLS 1.2
      • (10:22AM) Cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
      • (10:22AM) certificate 0: OU=Domain Control Validated/OU=PositiveSSL Wildcard/CN=*.riseup.net/
      • (10:22AM) certificate 1: O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA/
      • (10:22AM) certificate 2: O=COMODO CA Limited/CN=COMODO RSA Certification Authority/
      • (10:22AM) Authenticating as tdruiva
      • (10:22AM) Failed to connect to XMPP server: xmpp: PLAIN authentication is not an option

    On getFeatures, this is the established stream: xml.StartElement{Name:xml.Name{Space:"http://etherx.jabber.org/streams", Local:"stream"}, Attr:[]xml.Attr{xml.Attr{Name:xml.Name{Space:"xmlns", Local:"db"}, Value:"jabber:server:dialback"}, xml.Attr{Name:xml.Name{Space:"xmlns", Local:"stream"}, Value:"http://etherx.jabber.org/streams"}, xml.Attr{Name:xml.Name{Space:"", Local:"version"}, Value:"1.0"}, xml.Attr{Name:xml.Name{Space:"", Local:"from"}, Value:"riseup.net"}, xml.Attr{Name:xml.Name{Space:"", Local:"id"}, Value:"b674106a-4f5f-46e1-a276-d5eefdc8d5e1"}, xml.Attr{Name:xml.Name{Space:"", Local:"to"}, Value:""}, xml.Attr{Name:xml.Name{Space:"http://www.w3.org/XML/1998/namespace", Local:"lang"}, Value:"en"}, xml.Attr{Name:xml.Name{Space:"", Local:"xmlns"}, Value:"jabber:server"}}}

    And it's returning empty features.

    I also use Gmail with xmpp-client (its working fine), looking their log the stream have a particular different Value. Their are returning "jabber:client" instead of "jabber:server" as Riseup did.

    I tried to force the authentication by plain skipping the if !havePlain but looks like their are not accepting it: Failed to connect to XMPP server: xmpp: authentication failure: invalid-mechanism

  • startup behaviour / passphrase entry

    startup behaviour / passphrase entry

    Hi,

    I'm pretty certain that in the past I was asked for the passphrase explicitly. Today I rebuild xmpp-client on two computers and on both the behaviour changed to "> " (and nothing more) after launching (which seems to translate to "please enter passphrase").

    Are there dependencies missing, did they change or what happened to "Please enter passphrase"?

    Sincerely,

    Malte

  • SSL/TLS certificate verification

    SSL/TLS certificate verification

    It appears that as an example, Pidgin will complain when connecting to jabber.ccc.de or jabber.calyxinstitute.org - their respective .onion is not a proper SAN for either service.

    Is this a reasonable thing to do? Should we assume that the name that matters is the name included in the user ID and that the .onion doesn't matter at all?

    How are we feeling about SSL/TLS cert verification in xmpp-client generally? What improvements might be useful?

  • XEP-0443: XMPP Compliance Suites 2021

    XEP-0443: XMPP Compliance Suites 2021

    Please add support of XEP-0443: XMPP Compliance Suites 2021: https://xmpp.org/extensions/xep-0443.html

    Which replaces:

    • XEP-0423: XMPP Compliance Suites 2020: https://xmpp.org/extensions/xep-0423.html
    • XEP-0412: XMPP Compliance Suites 2019: https://xmpp.org/extensions/xep-0412.html
    • XEP-0387: XMPP Compliance Suites 2018: https://xmpp.org/extensions/xep-0387.html
    • XEP-0375: XMPP Compliance Suites 2016: https://xmpp.org/extensions/xep-0375.html
    • XEP-0302: XMPP Compliance Suites 2012: https://xmpp.org/extensions/xep-0302.html
    • XEP-0270: XMPP Compliance Suites 2010: https://xmpp.org/extensions/xep-0270.html
    • XEP-0243: XMPP Server Compliance 2009: https://xmpp.org/extensions/xep-0243.html
    • XEP-0242: XMPP Client Compliance 2009: https://xmpp.org/extensions/xep-0242.html
    • XEP-0216: XMPP Intermediate Server 2008: https://xmpp.org/extensions/xep-0216.html
    • XEP-0212: XMPP Basic Server 2008: https://xmpp.org/extensions/xep-0212.html
    • XEP-0211: XMPP Basic Client 2008: https://xmpp.org/extensions/xep-0211.html
    • XEP-0073: Basic IM Protocol Suite: https://xmpp.org/extensions/xep-0073.html
  • XEPs and RFCs support page with version

    XEPs and RFCs support page with version

    It is possible to have a XEPs and RFCs support page with version (XEP-XXXX v1.2)?

    Examples:

    • https://github.com/UWPX/UWPX-Client/blob/master/README.md
    • https://github.com/telldus/xmppjs-client-plugins/blob/master/README.md
    • https://github.com/ortuman/jackal/blob/master/README.md
    • https://profanity-im.github.io/xeps.html
    • https://metronome.im/supported-xeps-list
    • https://dev.gajim.org/gajim/gajim/wikis/help/GajimXEPSupport
    • https://github.com/jappix/jappix/blob/master/PROTOCOL.md
  • add verbosity levels and debug() logging

    add verbosity levels and debug() logging

    Some messages should only be shown when the user explicitly wants to see them, for example XMPP-extensions the client doesn’t know about (e.g. ping). The user can now set his preferred verbosity in the config (for now only debug or info, debug being the default).

  • Make xmpp-client into a library

    Make xmpp-client into a library

    This is not perfect, but it is a IMHO reasonable split to get most of the code out of the way into xlib so that ui.go/input.go actually do what they need to do while xlib handles session management etc.

Event-based stateful IRC client framework for Go.

GoIRC Client Framework Acquiring and Building Pretty simple, really: go get github.com/fluffle/goirc/client There is some example code that demonstra

Nov 9, 2022
Fluux XMPP is a Go XMPP library, focusing on simplicity, simple automation, and IoT.

Fluux XMPP is a Go XMPP library, focusing on simplicity, simple automation, and IoT. The goal is to make simple to write simple XMPP client

Dec 14, 2022
An XMPP server written in Go (Golang).

jackal An XMPP server written in Go. About jackal is a free, open-source, high performance XMPP server which aims to be known for its stability, simpl

Dec 29, 2022
A golang package to communicate with HipChat over XMPP

hipchat This is a abstraction in golang to Hipchat's implementation of XMPP. It communicates over TLS and requires zero knowledge of XML or the XMPP p

Jan 3, 2023
Instant messaging server for the Extensible Messaging and Presence Protocol (XMPP).
Instant messaging server for the Extensible Messaging and Presence Protocol (XMPP).

Instant messaging server for the Extensible Messaging and Presence Protocol (XMPP).

Dec 31, 2022
Bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API
Bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API

bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API (mattermost not required!)

Jan 4, 2023
Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.
Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.

Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.

Dec 27, 2022
A golang package to communicate with HipChat over XMPP

hipchat This is a abstraction in golang to Hipchat's implementation of XMPP. It communicates over TLS and requires zero knowledge of XML or the XMPP p

Jan 3, 2023
Gofra - Gofra, an XMPP bot engine written in Go

Gofra, an XMPP bot engine Gofra is a tiny XMPP bot engine written in Go. As of n

Dec 3, 2022
this is a funny client for jsonrpc-client. it can support timeout,breaker ...

this is a funny client for jsonrpc-client. it can support timeout,breaker ...

Sep 17, 2022
Database Abstraction Layer (dbal) for Go. Support SQL builder and get result easily (now only support mysql)

godbal Database Abstraction Layer (dbal) for go (now only support mysql) Motivation I wanted a DBAL that No ORM、No Reflect、Concurrency Save, support S

Nov 17, 2022
Replacement of ApacheBench(ab), support for transactional requests, support for command line and package references to HTTP stress testing tool.

stress stress is an HTTP stress testing tool. Through this tool, you can do a stress test on the HTTP service and get detailed test results. It is ins

Aug 23, 2022
🎨 Terminal color rendering library, support 8/16 colors, 256 colors, RGB color rendering output, support Print/Sprintf methods, compatible with Windows.
🎨 Terminal color rendering library, support 8/16 colors, 256 colors, RGB color rendering output, support Print/Sprintf methods, compatible with Windows.

?? Terminal color rendering library, support 8/16 colors, 256 colors, RGB color rendering output, support Print/Sprintf methods, compatible with Windows. GO CLI 控制台颜色渲染工具库,支持16色,256色,RGB色彩渲染输出,使用类似于 Print/Sprintf,兼容并支持 Windows 环境的色彩渲染

Dec 30, 2022
A Go client implementing a client-side distributed consumer group client for Amazon Kinesis.
A Go client implementing a client-side distributed consumer group client for Amazon Kinesis.

Kinesumer is a Go client implementing a client-side distributed consumer group client for Amazon Kinesis.

Jan 5, 2023
Clusterpedia-client - clusterpedia-client supports the use of native client-go mode to call the clusterpedia API

clusterpedia-client supports the use of native client-go mode to call the cluste

Jan 7, 2022
Client-go - Clusterpedia-client supports the use of native client-go mode to call the clusterpedia API

clusterpedia-client supports the use of native client-go mode to call the cluste

Dec 5, 2022
Golang client for redislabs' ReJSON module with support for multilple redis clients (redigo, go-redis)

Go-ReJSON - a golang client for ReJSON (a JSON data type for Redis) Go-ReJSON is a Go client for ReJSON Redis Module. ReJSON is a Redis module that im

Dec 25, 2022
Golang client library for adding support for interacting and monitoring Celery workers, tasks and events.

Celeriac Golang client library for adding support for interacting and monitoring Celery workers and tasks. It provides functionality to place tasks on

Oct 28, 2022
Scalable game server framework with clustering support and client libraries for iOS, Android, Unity and others through the C SDK.

pitaya Pitaya is an simple, fast and lightweight game server framework with clustering support and client libraries for iOS, Android, Unity and others

Jan 2, 2023