diff --git a/VERSION b/VERSION index 1afbfdb8a..4d47d83fb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.92.2 +0.92.3 diff --git a/protocol/messenger_chats.go b/protocol/messenger_chats.go index ee5db1d98..fcd3902fb 100644 --- a/protocol/messenger_chats.go +++ b/protocol/messenger_chats.go @@ -356,9 +356,28 @@ func (m *Messenger) deactivateChat(chatID string, shouldBeSynced bool) (*Messeng return nil, ErrChatNotFound } + // Reset mailserver last request to allow re-fetching messages if joining a chat again + filters, err := m.filtersForChat(chatID) + if err != nil && err != ErrNoFiltersForChat { + return nil, err + } + + if m.mailserversDatabase != nil { + for _, filter := range filters { + if !filter.Listen || filter.Ephemeral { + continue + } + + err := m.mailserversDatabase.ResetLastRequest(filter.Topic.String()) + if err != nil { + return nil, err + } + } + } + clock, _ := chat.NextClockAndTimestamp(m.getTimesource()) - err := m.persistence.DeactivateChat(chat, clock) + err = m.persistence.DeactivateChat(chat, clock) if err != nil { return nil, err diff --git a/protocol/messenger_mailserver.go b/protocol/messenger_mailserver.go index 483443f8c..eb568f8ef 100644 --- a/protocol/messenger_mailserver.go +++ b/protocol/messenger_mailserver.go @@ -23,6 +23,8 @@ var tolerance uint32 = 60 var mailserverRequestTimeout = 45 * time.Second var oneMonthInSeconds uint32 = 31 * 24 * 60 * 60 +var ErrNoFiltersForChat = errors.New("no filter registered for given chat") + func (m *Messenger) shouldSync() (bool, error) { if m.mailserver == nil || !m.online() { return false, nil @@ -140,7 +142,7 @@ func (m *Messenger) filtersForChat(chatID string) ([]*transport.Filter, error) { } else { filter := m.transport.FilterByChatID(chatID) if filter == nil { - return nil, errors.New("no filter registered for given chat") + return nil, ErrNoFiltersForChat } filters = []*transport.Filter{filter} } @@ -277,6 +279,7 @@ func (m *Messenger) syncFilters(filters []*transport.Filter) (*MessengerResponse LastRequest: int(lastRequest), } } + batch, ok := batches[topicData.LastRequest] if !ok { from, err := m.capToDefaultSyncPeriod(uint32(topicData.LastRequest)) diff --git a/services/mailservers/database.go b/services/mailservers/database.go index 9c0cc3731..a6351e7ae 100644 --- a/services/mailservers/database.go +++ b/services/mailservers/database.go @@ -297,6 +297,11 @@ func (d *Database) Topics() ([]MailserverTopic, error) { return result, nil } +func (d *Database) ResetLastRequest(topic string) error { + _, err := d.db.Exec("UPDATE mailserver_topics SET last_request = 0 WHERE topic = ?", topic) + return err +} + func (d *Database) DeleteTopic(topic string) error { _, err := d.db.Exec(`DELETE FROM mailserver_topics WHERE topic = ?`, topic) return err