matrix: add support for changing disappearing message timer

This commit is contained in:
Tulir Asokan
2025-08-26 18:17:50 +03:00
parent 8341492c9f
commit 4f12f5103a
3 changed files with 72 additions and 16 deletions
+36 -2
View File
@@ -20,7 +20,9 @@ import (
"context"
"crypto/sha256"
"encoding/hex"
"time"
"go.mau.fi/util/jsontime"
"go.mau.fi/util/ptr"
"go.mau.fi/util/variationselector"
"maunium.net/go/mautrix/bridgev2"
@@ -34,7 +36,7 @@ func (tg *TelegramConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilit
}
func (tg *TelegramConnector) GetBridgeInfoVersion() (info, capabilities int) {
return 1, 2
return 1, 3
}
// TODO get these from getConfig instead of hardcoding?
@@ -156,8 +158,35 @@ func hashEmojiList(emojis []string) string {
return hex.EncodeToString(hasher.Sum(nil))[:8]
}
func makeTimerList() []jsontime.Milliseconds {
const day = 24 * time.Hour
const week = 7 * day
const month = 30 * day
const year = 365 * day
return []jsontime.Milliseconds{
jsontime.MS(1 * day),
jsontime.MS(2 * day),
jsontime.MS(3 * day),
jsontime.MS(4 * day),
jsontime.MS(5 * day),
jsontime.MS(6 * day),
jsontime.MS(1 * week),
jsontime.MS(2 * week),
jsontime.MS(3 * week),
jsontime.MS(1 * month),
jsontime.MS(2 * month),
jsontime.MS(3 * month),
jsontime.MS(4 * month),
jsontime.MS(5 * month),
jsontime.MS(6 * month),
jsontime.MS(1 * year),
}
}
var telegramTimers = makeTimerList()
func (t *TelegramClient) GetCapabilities(ctx context.Context, portal *bridgev2.Portal) *event.RoomFeatures {
baseID := "fi.mau.telegram.capabilities.2025_02_04"
baseID := "fi.mau.telegram.capabilities.2025_08_26"
feat := &event.RoomFeatures{
Formatting: formattingCaps,
File: fileCaps,
@@ -170,6 +199,11 @@ func (t *TelegramClient) GetCapabilities(ctx context.Context, portal *bridgev2.P
ReactionCount: 1,
ReadReceipts: true,
TypingNotifications: true,
DisappearingTimer: &event.DisappearingTimerCapability{
Types: []event.DisappearingType{event.DisappearingTypeAfterRead},
Timers: telegramTimers,
},
}
// TODO non-admins can only edit messages within 48 hours
+15 -14
View File
@@ -110,20 +110,21 @@ type TelegramClient struct {
}
var (
_ bridgev2.NetworkAPI = (*TelegramClient)(nil)
_ bridgev2.EditHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.ReactionHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.RedactionHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.ReadReceiptHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.TypingHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.BackfillingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.BackfillingNetworkAPIWithLimits = (*TelegramClient)(nil)
_ bridgev2.IdentifierResolvingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.ContactListingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.UserSearchingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.GroupCreatingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.MuteHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.TagHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.NetworkAPI = (*TelegramClient)(nil)
_ bridgev2.EditHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.ReactionHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.RedactionHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.ReadReceiptHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.TypingHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.BackfillingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.BackfillingNetworkAPIWithLimits = (*TelegramClient)(nil)
_ bridgev2.IdentifierResolvingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.ContactListingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.UserSearchingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.GroupCreatingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.MuteHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.TagHandlingNetworkAPI = (*TelegramClient)(nil)
_ bridgev2.DisappearTimerChangingNetworkAPI = (*TelegramClient)(nil)
)
type UpdateDispatcher struct {
+21
View File
@@ -716,3 +716,24 @@ func (t *TelegramClient) HandleMatrixTyping(ctx context.Context, msg *bridgev2.M
})
return err
}
func (t *TelegramClient) HandleMatrixDisappearingTimer(ctx context.Context, msg *bridgev2.MatrixDisappearingTimer) (bool, error) {
inputPeer, err := t.inputPeerForPortalID(ctx, msg.Portal.ID)
if err != nil {
return false, err
}
_, err = t.client.API().MessagesSetHistoryTTL(ctx, &tg.MessagesSetHistoryTTLRequest{
Peer: inputPeer,
Period: int(msg.Content.Timer.Seconds()),
})
if err == nil {
msg.Portal.Disappear = database.DisappearingSetting{
Type: event.DisappearingTypeAfterRead,
Timer: msg.Content.Timer.Duration,
}
if msg.Portal.Disappear.Timer == 0 {
msg.Portal.Disappear.Type = event.DisappearingTypeNone
}
}
return err == nil, err
}