diff options
author | bodqhrohro <bodqhrohro@gmail.com> | 2019-11-04 01:15:43 +0300 |
---|---|---|
committer | bodqhrohro <bodqhrohro@gmail.com> | 2019-11-04 01:15:43 +0300 |
commit | aaf7233c89af4dfbc2a8b9f5e11b4ff5e9713567 (patch) | |
tree | d449c7a41d1945e249cd066921c7a436f7614f84 /xmpp/handlers.go | |
parent | 7e036fd795cc0b5710d3b049dc98f4538c32da6a (diff) |
Presence/iq handling and rudimental telegram client
Diffstat (limited to 'xmpp/handlers.go')
-rw-r--r-- | xmpp/handlers.go | 95 |
1 files changed, 91 insertions, 4 deletions
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() + } +} |