aboutsummaryrefslogtreecommitdiff
path: root/xmpp/handlers.go
diff options
context:
space:
mode:
authorBohdan Horbeshko <bodqhrohro@gmail.com>2023-06-01 23:37:38 +0300
committerBohdan Horbeshko <bodqhrohro@gmail.com>2023-06-01 23:37:38 +0300
commit8663a29e157aae6e68cc880a86b3a666da37bfc9 (patch)
tree8071a4381276bf743ca21a5a5b8da4930054fd5d /xmpp/handlers.go
parent75f0532193440294f4bbf7cd687174b5e9a16249 (diff)
Add /vcard command
Diffstat (limited to 'xmpp/handlers.go')
-rw-r--r--xmpp/handlers.go106
1 files changed, 48 insertions, 58 deletions
diff --git a/xmpp/handlers.go b/xmpp/handlers.go
index db2b6ea..780478a 100644
--- a/xmpp/handlers.go
+++ b/xmpp/handlers.go
@@ -10,6 +10,7 @@ import (
"strings"
"dev.narayana.im/narayana/telegabber/persistence"
+ "dev.narayana.im/narayana/telegabber/telegram"
"dev.narayana.im/narayana/telegabber/xmpp/extensions"
"dev.narayana.im/narayana/telegabber/xmpp/gateway"
@@ -319,45 +320,12 @@ func handleGetVcardIq(s xmpp.Sender, iq *stanza.IQ, typ byte) {
log.Error("Invalid IQ to")
return
}
- chat, user, err := session.GetContactByID(toID, nil)
+ info, err := session.GetVcardInfo(toID)
if err != nil {
log.Error(err)
return
}
- var fn, photo, nickname, given, family, tel, info string
- if chat != nil {
- fn = chat.Title
-
- if chat.Photo != nil {
- file, path, err := session.OpenPhotoFile(chat.Photo.Small, 32)
- if err == nil {
- defer file.Close()
-
- buf := new(bytes.Buffer)
- binval := base64.NewEncoder(base64.StdEncoding, buf)
- _, err = io.Copy(binval, file)
- binval.Close()
- if err == nil {
- photo = buf.String()
- } else {
- log.Errorf("Error calculating base64: %v", path)
- }
- } else if path != "" {
- log.Errorf("Photo does not exist: %v", path)
- } else {
- log.Errorf("PHOTO: %#v", err.Error())
- }
- }
- info = session.GetChatDescription(chat)
- }
- if user != nil {
- nickname = user.Username
- given = user.FirstName
- family = user.LastName
- tel = user.PhoneNumber
- }
-
answer := stanza.IQ{
Attrs: stanza.Attrs{
From: iq.To,
@@ -365,7 +333,7 @@ func handleGetVcardIq(s xmpp.Sender, iq *stanza.IQ, typ byte) {
Id: iq.Id,
Type: "result",
},
- Payload: makeVCardPayload(typ, iq.To, fn, photo, nickname, given, family, tel, info),
+ Payload: makeVCardPayload(typ, iq.To, info, session),
}
log.Debugf("%#v", answer)
@@ -426,53 +394,75 @@ func toToID(to string) (int64, bool) {
return toID, true
}
-func makeVCardPayload(typ byte, id, fn, photo, nickname, given, family, tel, info string) stanza.IQPayload {
+func makeVCardPayload(typ byte, id string, info telegram.VCardInfo, session *telegram.Client) stanza.IQPayload {
+ var base64Photo string
+ if info.Photo != nil {
+ file, path, err := session.ForceOpenFile(info.Photo, 32)
+ if err == nil {
+ defer file.Close()
+
+ buf := new(bytes.Buffer)
+ binval := base64.NewEncoder(base64.StdEncoding, buf)
+ _, err = io.Copy(binval, file)
+ binval.Close()
+ if err == nil {
+ base64Photo = buf.String()
+ } else {
+ log.Errorf("Error calculating base64: %v", path)
+ }
+ } else if path != "" {
+ log.Errorf("Photo does not exist: %v", path)
+ } else {
+ log.Errorf("PHOTO: %#v", err.Error())
+ }
+ }
+
if typ == TypeVCardTemp {
vcard := &extensions.IqVcardTemp{}
- vcard.Fn.Text = fn
- if photo != "" {
+ vcard.Fn.Text = info.Fn
+ if base64Photo != "" {
vcard.Photo.Type.Text = "image/jpeg"
- vcard.Photo.Binval.Text = photo
+ vcard.Photo.Binval.Text = base64Photo
}
- vcard.Nickname.Text = nickname
- vcard.N.Given.Text = given
- vcard.N.Family.Text = family
- vcard.Tel.Number.Text = tel
- vcard.Desc.Text = info
+ vcard.Nickname.Text = info.Nickname
+ vcard.N.Given.Text = info.Given
+ vcard.N.Family.Text = info.Family
+ vcard.Tel.Number.Text = info.Tel
+ vcard.Desc.Text = info.Info
return vcard
} else if typ == TypeVCard4 {
nodes := []stanza.Node{}
- if fn != "" {
+ if info.Fn != "" {
nodes = append(nodes, stanza.Node{
XMLName: xml.Name{Local: "fn"},
Nodes: []stanza.Node{
stanza.Node{
XMLName: xml.Name{Local: "text"},
- Content: fn,
+ Content: info.Fn,
},
},
})
}
- if photo != "" {
+ if base64Photo != "" {
nodes = append(nodes, stanza.Node{
XMLName: xml.Name{Local: "photo"},
Nodes: []stanza.Node{
stanza.Node{
XMLName: xml.Name{Local: "uri"},
- Content: "data:image/jpeg;base64," + photo,
+ Content: "data:image/jpeg;base64," + base64Photo,
},
},
})
}
- if nickname != "" {
+ if info.Nickname != "" {
nodes = append(nodes, stanza.Node{
XMLName: xml.Name{Local: "nickname"},
Nodes: []stanza.Node{
stanza.Node{
XMLName: xml.Name{Local: "text"},
- Content: nickname,
+ Content: info.Nickname,
},
},
}, stanza.Node{
@@ -480,44 +470,44 @@ func makeVCardPayload(typ byte, id, fn, photo, nickname, given, family, tel, inf
Nodes: []stanza.Node{
stanza.Node{
XMLName: xml.Name{Local: "uri"},
- Content: "https://t.me/" + nickname,
+ Content: "https://t.me/" + info.Nickname,
},
},
})
}
- if family != "" || given != "" {
+ if info.Family != "" || info.Given != "" {
nodes = append(nodes, stanza.Node{
XMLName: xml.Name{Local: "n"},
Nodes: []stanza.Node{
stanza.Node{
XMLName: xml.Name{Local: "surname"},
- Content: family,
+ Content: info.Family,
},
stanza.Node{
XMLName: xml.Name{Local: "given"},
- Content: given,
+ Content: info.Given,
},
},
})
}
- if tel != "" {
+ if info.Tel != "" {
nodes = append(nodes, stanza.Node{
XMLName: xml.Name{Local: "tel"},
Nodes: []stanza.Node{
stanza.Node{
XMLName: xml.Name{Local: "uri"},
- Content: "tel:" + tel,
+ Content: "tel:" + info.Tel,
},
},
})
}
- if info != "" {
+ if info.Info != "" {
nodes = append(nodes, stanza.Node{
XMLName: xml.Name{Local: "note"},
Nodes: []stanza.Node{
stanza.Node{
XMLName: xml.Name{Local: "text"},
- Content: info,
+ Content: info.Info,
},
},
})