aboutsummaryrefslogtreecommitdiff
path: root/xmpp/handlers.go
diff options
context:
space:
mode:
authorbodqhrohro <bodqhrohro@gmail.com>2019-11-04 01:15:43 +0300
committerbodqhrohro <bodqhrohro@gmail.com>2019-11-04 01:15:43 +0300
commitaaf7233c89af4dfbc2a8b9f5e11b4ff5e9713567 (patch)
treed449c7a41d1945e249cd066921c7a436f7614f84 /xmpp/handlers.go
parent7e036fd795cc0b5710d3b049dc98f4538c32da6a (diff)
Presence/iq handling and rudimental telegram client
Diffstat (limited to 'xmpp/handlers.go')
-rw-r--r--xmpp/handlers.go95
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()
+ }
+}