diff --git a/.gitignore b/.gitignore index bda8001..772ab8b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ config.yml telegabber +sessions/ diff --git a/telegram/connect.go b/telegram/connect.go index 72cd417..400c706 100644 --- a/telegram/connect.go +++ b/telegram/connect.go @@ -13,6 +13,20 @@ func (c *Client) Connect() error { } authorizer := client.ClientAuthorizer() + go func() { + for { + state, ok := <-authorizer.State + if !ok { + return + } + + ok = authorizationStateHandler(state) + if !ok { + return + } + } + }() + authorizer.TdlibParameters <- c.parameters tdlibClient, err := client.NewClient(authorizer, c.logVerbosity) @@ -33,4 +47,15 @@ func (c *Client) Disconnect() { if !c.online { return } + + c.client.Stop() + c.online = false +} + +func authorizationStateHandler(state client.AuthorizationState) bool { + switch state.AuthorizationStateType() { + // TODO + } + + return true } diff --git a/xmpp/component.go b/xmpp/component.go index 1562224..036bc3c 100644 --- a/xmpp/component.go +++ b/xmpp/component.go @@ -2,12 +2,14 @@ package xmpp import ( "dev.narayana.im/narayana/telegabber/config" + "dev.narayana.im/narayana/telegabber/telegram" "gosrc.io/xmpp" ) var jid *xmpp.Jid var tgConf config.TelegramConfig +var sessions map[string]telegram.Client // NewComponent starts a new component and wraps it in // a stream manager that you should start yourself @@ -19,6 +21,7 @@ func NewComponent(conf config.XMPPConfig, tc config.TelegramConfig) (*xmpp.Strea } tgConf = tc + sessions = make(map[string]telegram.Client) options := xmpp.ComponentOptions{ Address: conf.Host + ":" + conf.Port, diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 4a6c999..ad6e3ba 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -1,6 +1,8 @@ package xmpp import ( + "github.com/pkg/errors" + "dev.narayana.im/narayana/telegabber/telegram" log "github.com/sirupsen/logrus" @@ -8,8 +10,6 @@ import ( "gosrc.io/xmpp/stanza" ) -var sessions map[string]telegram.Client - func logPacketType(p stanza.Packet) { log.Warn("Ignoring packet: %T\n", p) } @@ -48,7 +48,8 @@ func HandlePresence(s xmpp.Sender, p stanza.Packet) { if prs.Type == "subscribe" { handleSubscription(s, prs) - } else if prs.To == jid.Bare() { + } + if prs.To == jid.Bare() { handlePresence(s, prs) } } @@ -93,17 +94,26 @@ func handlePresence(s xmpp.Sender, p stanza.Presence) { if !ok { client, err := telegram.NewClient(tgConf, bareFromJid) if err != nil { - log.Error("Invalid from JID!") + log.Error(errors.Wrap(err, "TDlib initialization failure")) + return } sessions[bareFromJid] = client } switch p.Type { case "unsubscribed": + session.Disconnect() delete(sessions, bareFromJid) case "unavailable", "error": session.Disconnect() 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")) + } + }() } }