2019-10-22 16:36:54 +00:00
|
|
|
package xmpp
|
|
|
|
|
|
|
|
import (
|
2019-11-07 21:09:53 +00:00
|
|
|
"github.com/pkg/errors"
|
|
|
|
|
2019-11-03 22:15:43 +00:00
|
|
|
log "github.com/sirupsen/logrus"
|
2019-10-22 16:36:54 +00:00
|
|
|
"gosrc.io/xmpp"
|
|
|
|
"gosrc.io/xmpp/stanza"
|
|
|
|
)
|
|
|
|
|
2019-11-03 22:15:43 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
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 {
|
2019-11-03 22:15:43 +00:00
|
|
|
logPacketType(p)
|
2019-10-22 16:36:54 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-11-03 22:15:43 +00:00
|
|
|
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)
|
|
|
|
}
|
2019-11-03 22:15:43 +00:00
|
|
|
|
|
|
|
// 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)
|
2019-11-07 21:09:53 +00:00
|
|
|
}
|
|
|
|
if prs.To == jid.Bare() {
|
2019-11-03 22:15:43 +00:00
|
|
|
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-12 15:50:25 +00:00
|
|
|
session, ok := getTelegramInstance(bareFromJid, nil)
|
2019-11-03 22:15:43 +00:00
|
|
|
if !ok {
|
2019-11-12 15:50:25 +00:00
|
|
|
return
|
2019-11-03 22:15:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
switch p.Type {
|
|
|
|
case "unsubscribed":
|
2019-11-07 21:09:53 +00:00
|
|
|
session.Disconnect()
|
2019-11-03 22:15:43 +00:00
|
|
|
delete(sessions, bareFromJid)
|
|
|
|
case "unavailable", "error":
|
|
|
|
session.Disconnect()
|
|
|
|
case "":
|
2019-11-07 21:09:53 +00:00
|
|
|
// 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"))
|
|
|
|
}
|
|
|
|
}()
|
2019-11-03 22:15:43 +00:00
|
|
|
}
|
|
|
|
}
|