|
|
|
@ -27,13 +27,13 @@ import (
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type VCardInfo struct {
|
|
|
|
|
Fn string
|
|
|
|
|
Photo *client.File
|
|
|
|
|
Nickname string
|
|
|
|
|
Given string
|
|
|
|
|
Family string
|
|
|
|
|
Tel string
|
|
|
|
|
Info string
|
|
|
|
|
Fn string
|
|
|
|
|
Photo *client.File
|
|
|
|
|
Nicknames []string
|
|
|
|
|
Given string
|
|
|
|
|
Family string
|
|
|
|
|
Tel string
|
|
|
|
|
Info string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var errOffline = errors.New("TDlib instance is offline")
|
|
|
|
@ -286,12 +286,15 @@ func (c *Client) formatContact(chatID int64) string {
|
|
|
|
|
if chat != nil {
|
|
|
|
|
str = fmt.Sprintf("%s (%v)", chat.Title, chat.Id)
|
|
|
|
|
} else if user != nil {
|
|
|
|
|
username := user.Username
|
|
|
|
|
if username == "" {
|
|
|
|
|
username = strconv.FormatInt(user.Id, 10)
|
|
|
|
|
var usernames string
|
|
|
|
|
if user.Usernames != nil {
|
|
|
|
|
usernames = c.usernamesToString(user.Usernames.ActiveUsernames)
|
|
|
|
|
}
|
|
|
|
|
if usernames == "" {
|
|
|
|
|
usernames = strconv.FormatInt(user.Id, 10)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
str = fmt.Sprintf("%s %s (%v)", user.FirstName, user.LastName, username)
|
|
|
|
|
str = fmt.Sprintf("%s %s (%v)", user.FirstName, user.LastName, usernames)
|
|
|
|
|
} else {
|
|
|
|
|
str = strconv.FormatInt(chatID, 10)
|
|
|
|
|
}
|
|
|
|
@ -566,7 +569,7 @@ func (c *Client) messageToText(message *client.Message, preview bool) string {
|
|
|
|
|
return "<empty message>"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
markupFunction := formatter.EntityToXEP0393
|
|
|
|
|
markupFunction := c.getFormatter()
|
|
|
|
|
switch message.Content.MessageContentType() {
|
|
|
|
|
case client.TypeMessageSticker:
|
|
|
|
|
sticker, _ := message.Content.(*client.MessageSticker)
|
|
|
|
@ -737,6 +740,22 @@ func (c *Client) messageToText(message *client.Message, preview bool) string {
|
|
|
|
|
|
|
|
|
|
return strings.Join(rows, "\n")
|
|
|
|
|
}
|
|
|
|
|
case client.TypeMessageChatSetMessageAutoDeleteTime:
|
|
|
|
|
ttl, _ := message.Content.(*client.MessageChatSetMessageAutoDeleteTime)
|
|
|
|
|
name := c.formatContact(ttl.FromUserId)
|
|
|
|
|
if name == "" {
|
|
|
|
|
if ttl.MessageAutoDeleteTime == 0 {
|
|
|
|
|
return "The self-destruct timer was disabled"
|
|
|
|
|
} else {
|
|
|
|
|
return fmt.Sprintf("The self-destruct timer was set to %v seconds", ttl.MessageAutoDeleteTime)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if ttl.MessageAutoDeleteTime == 0 {
|
|
|
|
|
return fmt.Sprintf("%s disabled the self-destruct timer", name)
|
|
|
|
|
} else {
|
|
|
|
|
return fmt.Sprintf("%s set the self-destruct timer to %v seconds", name, ttl.MessageAutoDeleteTime)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return fmt.Sprintf("unknown message (%s)", message.Content.MessageContentType())
|
|
|
|
@ -751,7 +770,7 @@ func (c *Client) contentToFile(content client.MessageContent) (*client.File, *cl
|
|
|
|
|
case client.TypeMessageSticker:
|
|
|
|
|
sticker, _ := content.(*client.MessageSticker)
|
|
|
|
|
file := sticker.Sticker.Sticker
|
|
|
|
|
if sticker.Sticker.IsAnimated && sticker.Sticker.Thumbnail != nil && sticker.Sticker.Thumbnail.File != nil {
|
|
|
|
|
if sticker.Sticker.Format.StickerFormatType() != client.TypeStickerTypeRegular && sticker.Sticker.Thumbnail != nil && sticker.Sticker.Thumbnail.File != nil {
|
|
|
|
|
file = sticker.Sticker.Thumbnail.File
|
|
|
|
|
}
|
|
|
|
|
return file, nil
|
|
|
|
@ -1192,7 +1211,7 @@ func (c *Client) roster(resource string) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// get last messages from specified chat
|
|
|
|
|
func (c *Client) getLastMessages(id int64, query string, from int64, count int32) (*client.Messages, error) {
|
|
|
|
|
func (c *Client) getLastMessages(id int64, query string, from int64, count int32) (*client.FoundChatMessages, error) {
|
|
|
|
|
return c.client.SearchChatMessages(&client.SearchChatMessagesRequest{
|
|
|
|
|
ChatId: id,
|
|
|
|
|
Query: query,
|
|
|
|
@ -1245,10 +1264,18 @@ func (c *Client) GetChatDescription(chat *client.Chat) string {
|
|
|
|
|
UserId: privateType.UserId,
|
|
|
|
|
})
|
|
|
|
|
if err == nil {
|
|
|
|
|
if fullInfo.Bio != "" {
|
|
|
|
|
return fullInfo.Bio
|
|
|
|
|
} else if fullInfo.Description != "" {
|
|
|
|
|
return fullInfo.Description
|
|
|
|
|
if fullInfo.Bio != nil && fullInfo.Bio.Text != "" {
|
|
|
|
|
return formatter.Format(
|
|
|
|
|
fullInfo.Bio.Text,
|
|
|
|
|
fullInfo.Bio.Entities,
|
|
|
|
|
c.getFormatter(),
|
|
|
|
|
)
|
|
|
|
|
} else if fullInfo.BotInfo != nil {
|
|
|
|
|
if fullInfo.BotInfo.ShortDescription != "" {
|
|
|
|
|
return fullInfo.BotInfo.ShortDescription
|
|
|
|
|
} else {
|
|
|
|
|
return fullInfo.BotInfo.Description
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.Warnf("Coudln't retrieve private chat info: %v", err.Error())
|
|
|
|
@ -1328,7 +1355,10 @@ func (c *Client) GetVcardInfo(toID int64) (VCardInfo, error) {
|
|
|
|
|
info.Info = c.GetChatDescription(chat)
|
|
|
|
|
}
|
|
|
|
|
if user != nil {
|
|
|
|
|
info.Nickname = user.Username
|
|
|
|
|
if user.Usernames != nil {
|
|
|
|
|
info.Nicknames = make([]string, len(user.Usernames.ActiveUsernames))
|
|
|
|
|
copy(info.Nicknames, user.Usernames.ActiveUsernames)
|
|
|
|
|
}
|
|
|
|
|
info.Given = user.FirstName
|
|
|
|
|
info.Family = user.LastName
|
|
|
|
|
info.Tel = user.PhoneNumber
|
|
|
|
@ -1441,3 +1471,15 @@ func (c *Client) hasLastMessageHashChanged(chatId, messageId int64, content clie
|
|
|
|
|
|
|
|
|
|
return !ok || oldHash != newHash
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Client) getFormatter() func(*client.TextEntity) (*formatter.Insertion, *formatter.Insertion) {
|
|
|
|
|
return formatter.EntityToXEP0393
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Client) usernamesToString(usernames []string) string {
|
|
|
|
|
var atUsernames []string
|
|
|
|
|
for _, username := range usernames {
|
|
|
|
|
atUsernames = append(atUsernames, "@"+username)
|
|
|
|
|
}
|
|
|
|
|
return strings.Join(atUsernames, ", ")
|
|
|
|
|
}
|
|
|
|
|