telegabber/xmpp/handlers.go

115 lines
2.2 KiB
Go
Raw Normal View History

2019-10-22 16:36:54 +00:00
package xmpp
import (
"github.com/pkg/errors"
2019-11-19 20:25:14 +00:00
"dev.narayana.im/narayana/telegabber/persistence"
log "github.com/sirupsen/logrus"
2019-10-22 16:36:54 +00:00
"gosrc.io/xmpp"
"gosrc.io/xmpp/stanza"
)
func logPacketType(p stanza.Packet) {
2019-11-14 20:11:38 +00:00
log.Warnf("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)
}
2019-10-29 01:23:57 +00:00
// HandleMessage processes an incoming XMPP message
2019-10-22 16:36:54 +00:00
func HandleMessage(s xmpp.Sender, p stanza.Packet) {
msg, ok := p.(stanza.Message)
if !ok {
logPacketType(p)
2019-10-22 16:36:54 +00:00
return
}
log.Printf("Message: %#v\n", msg)
2019-10-22 16:36:54 +00:00
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)
}
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()
2019-11-19 20:25:14 +00:00
session, ok := getTelegramInstance(bareFromJid, &persistence.Session{})
if !ok {
return
}
switch p.Type {
case "unsubscribed":
session.Disconnect()
delete(sessions, bareFromJid)
case "unavailable", "error":
session.Disconnect()
case "":
// due to the weird implentation of go-tdlib wrapper, it won't
// return the client instance until successful authorization
go func() {
session.Connect()
if err != nil {
log.Error(errors.Wrap(err, "TDlib connection failure"))
}
}()
}
}