Respond to disco with conference identity and groups list
This commit is contained in:
parent
afa21e10be
commit
6abb7ff9c2
|
@ -1065,6 +1065,30 @@ func (c *Client) GetChatDescription(chat *client.Chat) string {
|
|||
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
|
||||
func (c *Client) subscribeToID(id int64, chat *client.Chat) {
|
||||
var args []args.V
|
||||
|
|
|
@ -55,6 +55,11 @@ func HandleIq(s xmpp.Sender, p stanza.Packet) {
|
|||
go handleGetDiscoInfo(s, iq)
|
||||
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 {
|
||||
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
|
||||
|
||||
log.Debugf("%#v", answer)
|
||||
|
|
Loading…
Reference in a new issue