Make vCard requests asynchronous
This commit is contained in:
parent
ab914b0ff7
commit
472d4b7bef
148
xmpp/handlers.go
148
xmpp/handlers.go
|
@ -34,78 +34,7 @@ func HandleIq(s xmpp.Sender, p stanza.Packet) {
|
||||||
if iq.Type == "get" {
|
if iq.Type == "get" {
|
||||||
_, ok := iq.Payload.(*extensions.IqVcardTemp)
|
_, ok := iq.Payload.(*extensions.IqVcardTemp)
|
||||||
if ok {
|
if ok {
|
||||||
log.WithFields(log.Fields{
|
go handleGetVcardTempIq(s, iq)
|
||||||
"from": iq.From,
|
|
||||||
"to": iq.To,
|
|
||||||
}).Warn("VCard request")
|
|
||||||
|
|
||||||
fromJid, err := xmpp.NewJid(iq.From)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Invalid from JID!")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
session, ok := sessions[fromJid.Bare()]
|
|
||||||
if !ok {
|
|
||||||
log.Error("IQ from stranger")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
toParts := strings.Split(iq.To, "@")
|
|
||||||
toID, err := strconv.ParseInt(toParts[0], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Invalid IQ to")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
chat, user, err := session.GetContactByID(toID, nil)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
vcard := extensions.IqVcardTemp{}
|
|
||||||
if chat != nil {
|
|
||||||
vcard.Fn.Text = chat.Title
|
|
||||||
|
|
||||||
if chat.Photo != nil {
|
|
||||||
path := chat.Photo.Small.Local.Path
|
|
||||||
file, err := os.Open(path)
|
|
||||||
if err == nil {
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
binval := base64.NewEncoder(base64.StdEncoding, buf)
|
|
||||||
_, err = io.Copy(binval, file)
|
|
||||||
if err == nil {
|
|
||||||
vcard.Photo.Type.Text = "image/jpeg"
|
|
||||||
vcard.Photo.Binval.Text = buf.String()
|
|
||||||
} else {
|
|
||||||
log.Errorf("Error calculating hash: %v", path)
|
|
||||||
}
|
|
||||||
} else if path != "" {
|
|
||||||
log.Errorf("Photo does not exist: %v", path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if user != nil {
|
|
||||||
vcard.Nickname.Text = user.Username
|
|
||||||
vcard.N.Given.Text = user.FirstName
|
|
||||||
vcard.N.Family.Text = user.LastName
|
|
||||||
vcard.Tel.Number.Text = user.PhoneNumber
|
|
||||||
}
|
|
||||||
|
|
||||||
answer := stanza.IQ{
|
|
||||||
Attrs: stanza.Attrs{
|
|
||||||
From: iq.To,
|
|
||||||
To: iq.From,
|
|
||||||
Id: iq.Id,
|
|
||||||
Type: "result",
|
|
||||||
},
|
|
||||||
Payload: vcard,
|
|
||||||
}
|
|
||||||
log.Debugf("%#v", answer)
|
|
||||||
|
|
||||||
_ = s.Send(answer)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -247,3 +176,78 @@ func handlePresence(s xmpp.Sender, p stanza.Presence) {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleGetVcardTempIq(s xmpp.Sender, iq stanza.IQ) {
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"from": iq.From,
|
||||||
|
"to": iq.To,
|
||||||
|
}).Warn("VCard request")
|
||||||
|
|
||||||
|
fromJid, err := xmpp.NewJid(iq.From)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Invalid from JID!")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
session, ok := sessions[fromJid.Bare()]
|
||||||
|
if !ok {
|
||||||
|
log.Error("IQ from stranger")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
toParts := strings.Split(iq.To, "@")
|
||||||
|
toID, err := strconv.ParseInt(toParts[0], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Invalid IQ to")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
chat, user, err := session.GetContactByID(toID, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
vcard := extensions.IqVcardTemp{}
|
||||||
|
if chat != nil {
|
||||||
|
vcard.Fn.Text = chat.Title
|
||||||
|
|
||||||
|
if chat.Photo != nil {
|
||||||
|
path := chat.Photo.Small.Local.Path
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err == nil {
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
binval := base64.NewEncoder(base64.StdEncoding, buf)
|
||||||
|
_, err = io.Copy(binval, file)
|
||||||
|
if err == nil {
|
||||||
|
vcard.Photo.Type.Text = "image/jpeg"
|
||||||
|
vcard.Photo.Binval.Text = buf.String()
|
||||||
|
} else {
|
||||||
|
log.Errorf("Error calculating hash: %v", path)
|
||||||
|
}
|
||||||
|
} else if path != "" {
|
||||||
|
log.Errorf("Photo does not exist: %v", path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if user != nil {
|
||||||
|
vcard.Nickname.Text = user.Username
|
||||||
|
vcard.N.Given.Text = user.FirstName
|
||||||
|
vcard.N.Family.Text = user.LastName
|
||||||
|
vcard.Tel.Number.Text = user.PhoneNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
answer := stanza.IQ{
|
||||||
|
Attrs: stanza.Attrs{
|
||||||
|
From: iq.To,
|
||||||
|
To: iq.From,
|
||||||
|
Id: iq.Id,
|
||||||
|
Type: "result",
|
||||||
|
},
|
||||||
|
Payload: vcard,
|
||||||
|
}
|
||||||
|
log.Debugf("%#v", answer)
|
||||||
|
|
||||||
|
_ = s.Send(answer)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue