From aaf7233c89af4dfbc2a8b9f5e11b4ff5e9713567 Mon Sep 17 00:00:00 2001 From: bodqhrohro Date: Mon, 4 Nov 2019 00:15:43 +0200 Subject: Presence/iq handling and rudimental telegram client --- xmpp/handlers.go | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 91 insertions(+), 4 deletions(-) (limited to 'xmpp/handlers.go') diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 874af49..c7acdce 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -1,22 +1,109 @@ package xmpp import ( - "fmt" - "os" + "dev.narayana.im/narayana/telegabber/telegram" + log "github.com/sirupsen/logrus" "gosrc.io/xmpp" "gosrc.io/xmpp/stanza" ) +var sessions map[string]telegram.TelegramClient + +func logPacketType(p stanza.Packet) { + log.Warn("Ignoring packet: %T\n", p) +} + +// HandleIq processes an incoming XMPP iq +func HandleIq(s xmpp.Sender, p stanza.Packet) { + iq, ok := p.(stanza.IQ) + if !ok { + logPacketType(p) + return + } + + log.Printf("Iq: %#v\n", iq) +} + // HandleMessage processes an incoming XMPP message func HandleMessage(s xmpp.Sender, p stanza.Packet) { msg, ok := p.(stanza.Message) if !ok { - _, _ = fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", p) + logPacketType(p) return } - _, _ = fmt.Fprintf(os.Stdout, "Body = %s - from = %s\n", msg.Body, msg.From) + log.Printf("Message: %#v\n", msg) reply := stanza.Message{Attrs: stanza.Attrs{To: msg.From}, Body: msg.Body} _ = s.Send(reply) } + +// HandlePresence processes an incoming XMPP presence +func HandlePresence(s xmpp.Sender, p stanza.Packet) { + prs, ok := p.(stanza.Presence) + if !ok { + logPacketType(p) + return + } + + if prs.Type == "subscribe" { + handleSubscription(s, prs) + } else if prs.To == jid.Bare() { + handlePresence(s, prs) + } +} + +func handleSubscription(s xmpp.Sender, p stanza.Presence) { + log.WithFields(log.Fields{ + "from": p.From, + "to": p.To, + }).Warn("Subscription request") + log.Debugf("%#v", p) + + reply := stanza.Presence{Attrs: stanza.Attrs{ + From: p.To, + To: p.From, + Id: p.Id, + Type: "subscribed", + }} + + _ = s.Send(reply) +} + +func handlePresence(s xmpp.Sender, p stanza.Presence) { + presenceType := p.Type + if presenceType == "" { + presenceType = "online" + } + + log.WithFields(log.Fields{ + "type": presenceType, + "from": p.From, + "to": p.To, + }).Warn("Presence") + log.Debugf("%#v", p) + + fromJid, err := xmpp.NewJid(p.From) + if err != nil { + log.Error("Invalid from JID!") + return + } + bareFromJid := fromJid.Bare() + session, ok := sessions[bareFromJid] + if !ok { + client, err := telegram.NewClient(tgConf, bareFromJid) + if err != nil { + log.Error("Invalid from JID!") + } + sessions[bareFromJid] = client + } + + switch p.Type { + case "unsubscribed": + delete(sessions, bareFromJid) + case "unavailable", "error": + session.Disconnect() + case "": + session.Connect() + } +} -- cgit v1.2.3