|
|
|
@ -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,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|