Fix presences sent with no resource

This commit is contained in:
Bohdan Horbeshko 2024-01-24 18:52:40 -05:00
parent 4532748c84
commit b40ccf4a4d
4 changed files with 31 additions and 36 deletions

View file

@ -185,12 +185,8 @@ func keyValueString(key, value string) string {
}
func (c *Client) unsubscribe(chatID int64) error {
return gateway.SendPresence(
c.xmpp,
c.jid,
gateway.SPFrom(strconv.FormatInt(chatID, 10)),
gateway.SPType("unsubscribed"),
)
args := gateway.SimplePresence(chatID, "unsubscribed")
return c.sendPresence(args...)
}
func (c *Client) sendMessagesReverse(chatID int64, messages []*client.Message) {

View file

@ -2,7 +2,6 @@ package telegram
import (
"github.com/pkg/errors"
"strconv"
"time"
"dev.narayana.im/narayana/telegabber/xmpp/gateway"
@ -159,7 +158,7 @@ func (c *Client) Connect(resource string) error {
}
gateway.SubscribeToTransport(c.xmpp, c.jid)
gateway.SendPresence(c.xmpp, c.jid, gateway.SPStatus("Logged in as: "+c.Session.Login))
c.sendPresence(gateway.SPStatus("Logged in as: "+c.Session.Login))
}()
return nil
@ -228,12 +227,8 @@ func (c *Client) Disconnect(resource string, quit bool) bool {
// we're offline (unsubscribe if logout)
for _, id := range c.cache.ChatsKeys() {
gateway.SendPresence(
c.xmpp,
c.jid,
gateway.SPFrom(strconv.FormatInt(id, 10)),
gateway.SPType("unavailable"),
)
args := gateway.SimplePresence(id, "unavailable")
c.sendPresence(args...)
}
c.close()

View file

@ -281,22 +281,17 @@ func (c *Client) ProcessStatusUpdate(chatID int64, status string, show string, o
c.cache.SetStatus(chatID, cacheShow, status)
newArgs := []args.V{
gateway.SPFrom(strconv.FormatInt(chatID, 10)),
gateway.SPShow(show),
gateway.SPStatus(status),
gateway.SPPhoto(photo),
gateway.SPResource(gateway.Jid.Resource),
gateway.SPImmed(gateway.SPImmed.Get(oldArgs)),
}
newArgs = gateway.SPAppendFrom(newArgs, chatID)
if presenceType != "" {
newArgs = append(newArgs, gateway.SPType(presenceType))
}
return gateway.SendPresence(
c.xmpp,
c.jid,
newArgs...,
)
return c.sendPresence(newArgs...)
}
func (c *Client) formatContact(chatID int64) string {
@ -1292,7 +1287,7 @@ func (c *Client) roster(resource string) {
c.ProcessStatusUpdate(chat, "", "")
}
gateway.SendPresence(c.xmpp, c.jid, gateway.SPStatus("Logged in as: "+c.Session.Login))
c.sendPresence(gateway.SPStatus("Logged in as: "+c.Session.Login))
c.addResource(resource)
}
@ -1393,9 +1388,7 @@ func (c *Client) GetChatDescription(chat *client.Chat) string {
// subscribe to a Telegram ID
func (c *Client) subscribeToID(id int64, chat *client.Chat) {
var args []args.V
args = append(args, gateway.SPFrom(strconv.FormatInt(id, 10)))
args = append(args, gateway.SPType("subscribe"))
args := gateway.SimplePresence(id, "subscribe")
if chat == nil {
chat, _, _ = c.GetContactByID(id, nil)
@ -1406,11 +1399,11 @@ func (c *Client) subscribeToID(id int64, chat *client.Chat) {
gateway.SetNickname(c.jid, strconv.FormatInt(id, 10), chat.Title, c.xmpp)
}
gateway.SendPresence(
c.xmpp,
c.jid,
args...,
)
c.sendPresence(args...)
}
func (c *Client) sendPresence(args ...args.V) error {
return gateway.SendPresence(c.xmpp, c.jid, args...)
}
func (c *Client) prepareDiskSpace(size uint64) {
@ -1459,9 +1452,9 @@ func (c *Client) UpdateChatNicknames() {
chat, ok := c.cache.GetChat(id)
if ok {
newArgs := []args.V{
gateway.SPFrom(strconv.FormatInt(id, 10)),
gateway.SPNickname(chat.Title),
}
newArgs = gateway.SPAppendFrom(newArgs, id)
cachedStatus, ok := c.cache.GetStatus(id)
if ok {
@ -1472,11 +1465,7 @@ func (c *Client) UpdateChatNicknames() {
}
}
gateway.SendPresence(
c.xmpp,
c.jid,
newArgs...,
)
c.sendPresence(newArgs...)
gateway.SetNickname(c.jid, strconv.FormatInt(id, 10), chat.Title, c.xmpp)
}

View file

@ -3,6 +3,7 @@ package gateway
import (
"encoding/xml"
"github.com/pkg/errors"
"strconv"
"strings"
"sync"
@ -343,6 +344,20 @@ func SendPresence(component *xmpp.Component, to string, args ...args.V) error {
return nil
}
// SPAppendFrom appends numeric from and resource to varargs
func SPAppendFrom(oldArgs []args.V, id int64) []args.V {
newArgs := append(oldArgs, SPFrom(strconv.FormatInt(id, 10)))
newArgs = append(newArgs, SPResource(Jid.Resource))
return newArgs
}
// SimplePresence crafts simple presence varargs
func SimplePresence(from int64, typ string) []args.V {
args := []args.V{SPType(typ)}
args = SPAppendFrom(args, from)
return args
}
// ResumableSend tries to resume the connection once and sends the packet again
func ResumableSend(component *xmpp.Component, packet stanza.Packet) error {
err := component.Send(packet)