Fix presence handling and lockup on TDlib instance creation

This commit is contained in:
bodqhrohro 2019-11-07 23:09:53 +02:00
parent 29da6ac0a0
commit 7185d4ac9b
4 changed files with 44 additions and 5 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
config.yml config.yml
telegabber telegabber
sessions/

View file

@ -13,6 +13,20 @@ func (c *Client) Connect() error {
} }
authorizer := client.ClientAuthorizer() authorizer := client.ClientAuthorizer()
go func() {
for {
state, ok := <-authorizer.State
if !ok {
return
}
ok = authorizationStateHandler(state)
if !ok {
return
}
}
}()
authorizer.TdlibParameters <- c.parameters authorizer.TdlibParameters <- c.parameters
tdlibClient, err := client.NewClient(authorizer, c.logVerbosity) tdlibClient, err := client.NewClient(authorizer, c.logVerbosity)
@ -33,4 +47,15 @@ func (c *Client) Disconnect() {
if !c.online { if !c.online {
return return
} }
c.client.Stop()
c.online = false
}
func authorizationStateHandler(state client.AuthorizationState) bool {
switch state.AuthorizationStateType() {
// TODO
}
return true
} }

View file

@ -2,12 +2,14 @@ package xmpp
import ( import (
"dev.narayana.im/narayana/telegabber/config" "dev.narayana.im/narayana/telegabber/config"
"dev.narayana.im/narayana/telegabber/telegram"
"gosrc.io/xmpp" "gosrc.io/xmpp"
) )
var jid *xmpp.Jid var jid *xmpp.Jid
var tgConf config.TelegramConfig var tgConf config.TelegramConfig
var sessions map[string]telegram.Client
// NewComponent starts a new component and wraps it in // NewComponent starts a new component and wraps it in
// a stream manager that you should start yourself // a stream manager that you should start yourself
@ -19,6 +21,7 @@ func NewComponent(conf config.XMPPConfig, tc config.TelegramConfig) (*xmpp.Strea
} }
tgConf = tc tgConf = tc
sessions = make(map[string]telegram.Client)
options := xmpp.ComponentOptions{ options := xmpp.ComponentOptions{
Address: conf.Host + ":" + conf.Port, Address: conf.Host + ":" + conf.Port,

View file

@ -1,6 +1,8 @@
package xmpp package xmpp
import ( import (
"github.com/pkg/errors"
"dev.narayana.im/narayana/telegabber/telegram" "dev.narayana.im/narayana/telegabber/telegram"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -8,8 +10,6 @@ import (
"gosrc.io/xmpp/stanza" "gosrc.io/xmpp/stanza"
) )
var sessions map[string]telegram.Client
func logPacketType(p stanza.Packet) { func logPacketType(p stanza.Packet) {
log.Warn("Ignoring packet: %T\n", p) log.Warn("Ignoring packet: %T\n", p)
} }
@ -48,7 +48,8 @@ func HandlePresence(s xmpp.Sender, p stanza.Packet) {
if prs.Type == "subscribe" { if prs.Type == "subscribe" {
handleSubscription(s, prs) handleSubscription(s, prs)
} else if prs.To == jid.Bare() { }
if prs.To == jid.Bare() {
handlePresence(s, prs) handlePresence(s, prs)
} }
} }
@ -93,17 +94,26 @@ func handlePresence(s xmpp.Sender, p stanza.Presence) {
if !ok { if !ok {
client, err := telegram.NewClient(tgConf, bareFromJid) client, err := telegram.NewClient(tgConf, bareFromJid)
if err != nil { if err != nil {
log.Error("Invalid from JID!") log.Error(errors.Wrap(err, "TDlib initialization failure"))
return
} }
sessions[bareFromJid] = client sessions[bareFromJid] = client
} }
switch p.Type { switch p.Type {
case "unsubscribed": case "unsubscribed":
session.Disconnect()
delete(sessions, bareFromJid) delete(sessions, bareFromJid)
case "unavailable", "error": case "unavailable", "error":
session.Disconnect() session.Disconnect()
case "": case "":
session.Connect() // 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"))
}
}()
} }
} }