Respond to disco with conference identity and groups list

This commit is contained in:
Bohdan Horbeshko 2022-07-07 20:38:06 -04:00
parent afa21e10be
commit 6abb7ff9c2
2 changed files with 82 additions and 0 deletions

View file

@ -1065,6 +1065,30 @@ func (c *Client) GetChatDescription(chat *client.Chat) string {
return "" return ""
} }
// GetGroupChats obtains all group chats
func (c *Client) GetGroupChats() []*client.Chat {
var groupChats []*client.Chat
chats, err := c.client.GetChats(&client.GetChatsRequest{
Limit: chatsLimit,
})
if err == nil {
for _, id := range chats.ChatIds {
chat, _, _ := c.GetContactByID(id, nil)
if chat != nil {
typ := chat.Type.ChatTypeType()
if typ == client.TypeChatTypeBasicGroup {
groupChats = append(groupChats, chat)
}
}
}
} else {
log.Errorf("Could not retrieve chats: %v", err)
}
return groupChats
}
// subscribe to a Telegram ID // subscribe to a Telegram ID
func (c *Client) subscribeToID(id int64, chat *client.Chat) { func (c *Client) subscribeToID(id int64, chat *client.Chat) {
var args []args.V var args []args.V

View file

@ -55,6 +55,11 @@ func HandleIq(s xmpp.Sender, p stanza.Packet) {
go handleGetDiscoInfo(s, iq) go handleGetDiscoInfo(s, iq)
return return
} }
_, ok = iq.Payload.(*stanza.DiscoItems)
if ok {
go handleGetDiscoItems(s, iq)
return
}
} }
} }
@ -333,6 +338,59 @@ func handleGetDiscoInfo(s xmpp.Sender, iq *stanza.IQ) {
} else { } else {
disco.AddIdentity("Telegram Gateway", "gateway", "telegram") disco.AddIdentity("Telegram Gateway", "gateway", "telegram")
} }
bare, _, ok := splitFrom(iq.From)
if ok {
session, ok := sessions[bare]
if ok && session.Session.MUC {
disco.AddFeatures(stanza.NSDiscoItems)
disco.AddIdentity("Telegram group chats", "conference", "text")
}
}
answer.Payload = disco
log.Debugf("%#v", answer)
component, ok := s.(*xmpp.Component)
if !ok {
log.Error("Not a component")
return
}
_ = gateway.ResumableSend(component, answer)
}
func handleGetDiscoItems(s xmpp.Sender, iq *stanza.IQ) {
answer, err := stanza.NewIQ(stanza.Attrs{
Type: stanza.IQTypeResult,
From: iq.To,
To: iq.From,
Id: iq.Id,
Lang: "en",
})
if err != nil {
log.Errorf("Failed to create answer IQ: %v", err)
return
}
disco := answer.DiscoItems()
_, ok := toToID(iq.To)
if !ok {
bare, _, ok := splitFrom(iq.From)
if ok {
// raw access, no need to create a new instance if not connected
session, ok := sessions[bare]
if ok && session.Session.MUC {
bareJid := gateway.Jid.Bare()
disco.AddItem(bareJid, "", "Telegram group chats")
for _, chat := range session.GetGroupChats() {
jid := strconv.FormatInt(chat.Id, 10) + "@" + bareJid
disco.AddItem(jid, "", chat.Title)
}
}
}
}
answer.Payload = disco answer.Payload = disco
log.Debugf("%#v", answer) log.Debugf("%#v", answer)