|
|
|
@ -183,8 +183,10 @@ func (c *Client) updateChatLastMessage(update *client.UpdateChatLastMessage) {
|
|
|
|
|
// message received
|
|
|
|
|
func (c *Client) updateNewMessage(update *client.UpdateNewMessage) {
|
|
|
|
|
go func() {
|
|
|
|
|
chatId := update.Message.ChatId
|
|
|
|
|
|
|
|
|
|
// guarantee sequential message delivering per chat
|
|
|
|
|
lock := c.getChatMessageLock(update.Message.ChatId)
|
|
|
|
|
lock := c.getChatMessageLock(chatId)
|
|
|
|
|
lock.Lock()
|
|
|
|
|
defer lock.Unlock()
|
|
|
|
|
|
|
|
|
@ -196,45 +198,58 @@ func (c *Client) updateNewMessage(update *client.UpdateNewMessage) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.WithFields(log.Fields{
|
|
|
|
|
"chat_id": update.Message.ChatId,
|
|
|
|
|
"chat_id": chatId,
|
|
|
|
|
}).Warn("New message from chat")
|
|
|
|
|
|
|
|
|
|
text := c.messageToText(update.Message, false)
|
|
|
|
|
file, filename := c.contentToFilename(update.Message.Content)
|
|
|
|
|
|
|
|
|
|
// download file(s)
|
|
|
|
|
if file != nil && !file.Local.IsDownloadingCompleted {
|
|
|
|
|
newFile, err := c.DownloadFile(file.Id, 1, true)
|
|
|
|
|
var text string
|
|
|
|
|
content := update.Message.Content
|
|
|
|
|
if content != nil && content.MessageContentType() == client.TypeMessageChatChangePhoto {
|
|
|
|
|
chat, err := c.client.GetChat(&client.GetChatRequest{
|
|
|
|
|
ChatId: chatId,
|
|
|
|
|
})
|
|
|
|
|
if err == nil {
|
|
|
|
|
file = newFile
|
|
|
|
|
c.cache.SetChat(chatId, chat)
|
|
|
|
|
go c.ProcessStatusUpdate(chatId, "", "", gateway.SPImmed(true))
|
|
|
|
|
text = "<Chat photo has changed>"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// OTR support (I do not know why would you need it, seriously)
|
|
|
|
|
if !(strings.HasPrefix(text, "?OTR") || c.Session.RawMessages) {
|
|
|
|
|
var prefix strings.Builder
|
|
|
|
|
prefix.WriteString(c.messageToPrefix(update.Message, c.formatContent(file, filename)))
|
|
|
|
|
if text != "" {
|
|
|
|
|
// \n if it is groupchat and message is not empty
|
|
|
|
|
if update.Message.ChatId < 0 {
|
|
|
|
|
prefix.WriteString("\n")
|
|
|
|
|
} else if update.Message.ChatId > 0 {
|
|
|
|
|
prefix.WriteString(" | ")
|
|
|
|
|
} else {
|
|
|
|
|
text = c.messageToText(update.Message, false)
|
|
|
|
|
file, filename := c.contentToFilename(content)
|
|
|
|
|
|
|
|
|
|
// download file(s)
|
|
|
|
|
if file != nil && !file.Local.IsDownloadingCompleted {
|
|
|
|
|
newFile, err := c.DownloadFile(file.Id, 1, true)
|
|
|
|
|
if err == nil {
|
|
|
|
|
file = newFile
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
prefix.WriteString(text)
|
|
|
|
|
}
|
|
|
|
|
// OTR support (I do not know why would you need it, seriously)
|
|
|
|
|
if !(strings.HasPrefix(text, "?OTR") || c.Session.RawMessages) {
|
|
|
|
|
var prefix strings.Builder
|
|
|
|
|
prefix.WriteString(c.messageToPrefix(update.Message, c.formatContent(file, filename)))
|
|
|
|
|
if text != "" {
|
|
|
|
|
// \n if it is groupchat and message is not empty
|
|
|
|
|
if chatId < 0 {
|
|
|
|
|
prefix.WriteString("\n")
|
|
|
|
|
} else if chatId > 0 {
|
|
|
|
|
prefix.WriteString(" | ")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
prefix.WriteString(text)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
text = prefix.String()
|
|
|
|
|
text = prefix.String()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// mark message as read
|
|
|
|
|
c.client.ViewMessages(&client.ViewMessagesRequest{
|
|
|
|
|
ChatId: update.Message.ChatId,
|
|
|
|
|
ChatId: chatId,
|
|
|
|
|
MessageIds: []int64{update.Message.Id},
|
|
|
|
|
ForceRead: true,
|
|
|
|
|
})
|
|
|
|
|
// forward message to XMPP
|
|
|
|
|
gateway.SendMessage(c.jid, strconv.FormatInt(update.Message.ChatId, 10), text, c.xmpp)
|
|
|
|
|
gateway.SendMessage(c.jid, strconv.FormatInt(chatId, 10), text, c.xmpp)
|
|
|
|
|
}()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|