sum7
/
yaja
Archived
1
0
Fork 0
This repository has been archived on 2020-09-27. You can view files and clone it, but cannot push or open issues or pull requests.
yaja/server/extension/iq_roster.go

75 lines
1.4 KiB
Go
Raw Normal View History

package extension
import (
"encoding/xml"
"github.com/genofire/yaja/database"
"github.com/genofire/yaja/messages"
"github.com/genofire/yaja/server/utils"
)
2017-12-17 15:39:36 +01:00
type IQRoster struct {
IQExtension
Database *database.State
}
2017-12-17 15:39:36 +01:00
func (ex *IQRoster) Spaces() []string { return []string{"jabber:iq:roster"} }
2017-12-17 15:39:36 +01:00
func (ex *IQRoster) Get(msg *messages.IQ, client *utils.Client) bool {
log := client.Log.WithField("extension", "roster").WithField("id", msg.ID)
// query encode
type query struct {
XMLName xml.Name `xml:"jabber:iq:roster query"`
Version string `xml:"ver,attr"`
Body []byte `xml:",innerxml"`
}
q := &query{}
err := xml.Unmarshal(msg.Body, q)
if err != nil {
return false
}
// answer query
q.Body = []byte{}
q.Version = "1"
// build answer body
type item struct {
XMLName xml.Name `xml:"item"`
JID string `xml:"jid,attr"`
}
2017-12-17 15:39:36 +01:00
if acc := ex.Database.GetAccount(client.JID); acc != nil {
for jid, _ := range acc.Roster {
itemByte, err := xml.Marshal(&item{
JID: jid,
})
if err != nil {
log.Warn(err)
continue
}
q.Body = append(q.Body, itemByte...)
}
}
// decode query
queryByte, err := xml.Marshal(q)
if err != nil {
log.Warn(err)
return false
}
// reply
2017-12-17 15:39:36 +01:00
client.Messages <- &messages.IQ{
Type: messages.IQTypeResult,
To: client.JID.String(),
From: client.JID.Domain,
ID: msg.ID,
Body: queryByte,
2017-12-17 15:39:36 +01:00
}
log.Debug("send")
return true
}