summaryrefslogtreecommitdiff
path: root/xmpp.go
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp.go')
-rw-r--r--xmpp.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/xmpp.go b/xmpp.go
new file mode 100644
index 0000000..8078c1a
--- /dev/null
+++ b/xmpp.go
@@ -0,0 +1,73 @@
+package main
+
+import (
+ "log"
+ "net"
+)
+
+type XmppEvent uint8
+
+const (
+ XmppDisconnect XmppEvent = iota
+ XmppConnect
+)
+
+func (l *Limox) xmpp(jid string, pwd string) {
+ log.Printf("JID: '%s' PWD: '%s'\n", jid, pwd)
+
+ domain := domainpart(jid)
+ log.Printf("Domain: '%s'\n", domain)
+
+ tcpServer, err := net.ResolveTCPAddr("tcp", domain+":"+"5222")
+ if err != nil {
+ l.XmppEvents <- err
+ return
+ }
+ log.Printf("Server: %s\n", tcpServer)
+
+ conn, err := net.DialTCP("tcp", nil, tcpServer)
+ if err != nil {
+ l.XmppEvents <- err
+ return
+ }
+ l.XmppEvents <- XmppConnect
+
+ var closing bool = false
+ for {
+ ev := <-l.GuiEvents
+ switch ev {
+ case Disconnect:
+ closing = true
+ default:
+ log.Fatalf("Unknown GuiEvent '%d'!\n", ev)
+ }
+ if closing {
+ break
+ }
+ }
+
+ conn.Close()
+ l.XmppEvents <- XmppDisconnect
+}
+
+// domainpart extracts the domain name from a JID / XMPP address. See
+// https://datatracker.ietf.org/doc/html/rfc7622#section-3.2 for details.
+func domainpart(jid string) string {
+ list := []rune(jid)
+
+ for i, v := range list {
+ if v == '/' {
+ list = list[:i]
+ break
+ }
+ }
+
+ for i, v := range list {
+ if v == '@' {
+ list = list[i+1:]
+ break
+ }
+ }
+
+ return string(list)
+}