connector: fix chat info for Saved Messages chat
Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
+16
-16
@@ -2,6 +2,7 @@ package connector
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/sha256"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
@@ -73,29 +74,28 @@ func adminRightsToPowerLevel(rights tg.ChatAdminRights) *int {
|
||||
return otherPowerLevel
|
||||
}
|
||||
|
||||
func (t *TelegramClient) getDMChatInfo(userID int64) (*bridgev2.ChatInfo, error) {
|
||||
networkUserID := ids.MakeUserID(userID)
|
||||
func (t *TelegramClient) getDMChatInfo(userID int64) *bridgev2.ChatInfo {
|
||||
chatInfo := bridgev2.ChatInfo{
|
||||
Type: ptr.Ptr(database.RoomTypeDM),
|
||||
Members: &bridgev2.ChatMemberList{
|
||||
IsFull: true,
|
||||
MemberMap: map[networkid.UserID]bridgev2.ChatMember{
|
||||
networkUserID: {
|
||||
EventSender: bridgev2.EventSender{
|
||||
SenderLogin: ids.MakeUserLoginID(userID),
|
||||
Sender: networkUserID,
|
||||
},
|
||||
},
|
||||
t.userID: {EventSender: t.mySender()},
|
||||
},
|
||||
IsFull: true,
|
||||
MemberMap: map[networkid.UserID]bridgev2.ChatMember{},
|
||||
},
|
||||
CanBackfill: true,
|
||||
}
|
||||
chatInfo.Members.MemberMap[ids.MakeUserID(userID)] = bridgev2.ChatMember{EventSender: t.senderForUserID(userID)}
|
||||
chatInfo.Members.MemberMap[t.userID] = bridgev2.ChatMember{EventSender: t.mySender()}
|
||||
if userID == t.telegramUserID {
|
||||
// TODO also hardcode the avatar used by telegram?
|
||||
chatInfo.Name = ptr.Ptr("Saved Messages")
|
||||
chatInfo.Avatar = &bridgev2.Avatar{
|
||||
ID: networkid.AvatarID(t.main.Config.SavedMessagesAvatar),
|
||||
Remove: len(t.main.Config.SavedMessagesAvatar) == 0,
|
||||
MXC: t.main.Config.SavedMessagesAvatar,
|
||||
Hash: sha256.Sum256([]byte(t.main.Config.SavedMessagesAvatar)),
|
||||
}
|
||||
chatInfo.Name = ptr.Ptr("Telegram Saved Messages")
|
||||
chatInfo.Topic = ptr.Ptr("Your Telegram cloud storage chat")
|
||||
}
|
||||
return &chatInfo, nil
|
||||
return &chatInfo
|
||||
}
|
||||
|
||||
func (t *TelegramClient) getGroupChatInfo(fullChat *tg.MessagesChatFull, chatID int64) (*bridgev2.ChatInfo, bool, error) {
|
||||
@@ -198,7 +198,7 @@ func (t *TelegramClient) GetChatInfo(ctx context.Context, portal *bridgev2.Porta
|
||||
|
||||
switch peerType {
|
||||
case ids.PeerTypeUser:
|
||||
return t.getDMChatInfo(id)
|
||||
return t.getDMChatInfo(id), nil
|
||||
case ids.PeerTypeChat:
|
||||
fullChat, err := APICallWithUpdates(ctx, t, func() (*tg.MessagesChatFull, error) {
|
||||
return t.client.API().MessagesGetFullChat(ctx, id)
|
||||
|
||||
@@ -465,6 +465,16 @@ func (t *TelegramClient) Connect(ctx context.Context) error {
|
||||
} else {
|
||||
t.userLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected})
|
||||
}
|
||||
|
||||
// Fix the "Telegram Saved Messages" chat
|
||||
t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{
|
||||
ChatInfo: t.getDMChatInfo(t.telegramUserID),
|
||||
EventMeta: simplevent.EventMeta{
|
||||
Type: bridgev2.RemoteEventChatResync,
|
||||
PortalKey: t.makePortalKeyFromID(ids.PeerTypeUser, t.telegramUserID),
|
||||
CreatePortal: false, // Do not create the portal if it doesn't already exist
|
||||
},
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,8 @@ type TelegramConfig struct {
|
||||
} `yaml:"sync"`
|
||||
|
||||
AlwaysCustomEmojiReaction bool `yaml:"always_custom_emoji_reaction"`
|
||||
|
||||
SavedMessagesAvatar id.ContentURIString `yaml:"saved_message_avatar"`
|
||||
}
|
||||
|
||||
func (c TelegramConfig) ShouldBridge(participantCount int) bool {
|
||||
@@ -104,6 +106,7 @@ func upgradeConfig(helper up.Helper) {
|
||||
helper.Copy(up.Int, "sync", "create_limit")
|
||||
helper.Copy(up.Bool, "sync", "direct_chats")
|
||||
helper.Copy(up.Bool, "always_custom_emoji_reaction")
|
||||
helper.Copy(up.Str, "saved_message_avatar")
|
||||
}
|
||||
|
||||
func (tg *TelegramConnector) GetConfig() (example string, data any, upgrader up.Upgrader) {
|
||||
|
||||
@@ -81,3 +81,6 @@ sync:
|
||||
# Telegram? By default, the bridge only uses custom emojis for unicode emojis
|
||||
# that aren't allowed in reactions.
|
||||
always_custom_emoji_reaction: false
|
||||
|
||||
# The avatar to use for the Telegram Saved Messages chat
|
||||
saved_message_avatar: mxc://nevarro.space/ZzzyOSDZfyGjKRRbyDPTweAA
|
||||
|
||||
+31
-24
@@ -105,19 +105,8 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM
|
||||
continue
|
||||
}
|
||||
}
|
||||
chatInfo := bridgev2.ChatInfo{
|
||||
CanBackfill: true,
|
||||
UserLocal: &bridgev2.UserLocalPortalInfo{},
|
||||
Members: &bridgev2.ChatMemberList{
|
||||
MemberMap: map[networkid.UserID]bridgev2.ChatMember{
|
||||
t.userID: {
|
||||
EventSender: t.mySender(),
|
||||
Membership: event.MembershipJoin,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var chatInfo *bridgev2.ChatInfo
|
||||
switch peer := dialog.Peer.(type) {
|
||||
case *tg.PeerUser:
|
||||
userID := ids.MakeUserID(peer.UserID)
|
||||
@@ -125,10 +114,7 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM
|
||||
log.Debug().Int64("user_id", peer.UserID).Msg("Not syncing portal because user is deleted")
|
||||
continue
|
||||
}
|
||||
chatInfo.Members.MemberMap[userID] = bridgev2.ChatMember{
|
||||
EventSender: t.senderForUserID(peer.UserID),
|
||||
Membership: event.MembershipJoin,
|
||||
}
|
||||
chatInfo = t.getDMChatInfo(peer.UserID)
|
||||
case *tg.PeerChat:
|
||||
chat := chats[peer.ChatID]
|
||||
if chat.TypeID() == tg.ChatForbiddenTypeID {
|
||||
@@ -143,8 +129,19 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM
|
||||
Msg("Not syncing portal because chat type is unsupported")
|
||||
continue
|
||||
}
|
||||
chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(ctx, chat)
|
||||
chatInfo.Name = &chat.(*tg.Chat).Title
|
||||
chatInfo = &bridgev2.ChatInfo{
|
||||
CanBackfill: true,
|
||||
Name: &chat.(*tg.Chat).Title,
|
||||
Members: &bridgev2.ChatMemberList{
|
||||
PowerLevels: t.getGroupChatPowerLevels(ctx, chat),
|
||||
MemberMap: map[networkid.UserID]bridgev2.ChatMember{
|
||||
t.userID: {
|
||||
EventSender: t.mySender(),
|
||||
Membership: event.MembershipJoin,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
case *tg.PeerChannel:
|
||||
channel := chats[peer.ChannelID]
|
||||
if channel.TypeID() == tg.ChannelForbiddenTypeID {
|
||||
@@ -159,8 +156,19 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM
|
||||
Msg("Not syncing portal because channel type is unsupported")
|
||||
continue
|
||||
}
|
||||
chatInfo.Name = &channel.(*tg.Channel).Title
|
||||
chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(ctx, channel)
|
||||
chatInfo = &bridgev2.ChatInfo{
|
||||
CanBackfill: true,
|
||||
Name: &channel.(*tg.Channel).Title,
|
||||
Members: &bridgev2.ChatMemberList{
|
||||
PowerLevels: t.getGroupChatPowerLevels(ctx, channel),
|
||||
MemberMap: map[networkid.UserID]bridgev2.ChatMember{
|
||||
t.userID: {
|
||||
EventSender: t.mySender(),
|
||||
Membership: event.MembershipJoin,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
if !portal.Metadata.(*PortalMetadata).IsSuperGroup {
|
||||
// Add the channel user
|
||||
sender := ids.MakeChannelUserID(peer.ChannelID)
|
||||
@@ -170,7 +178,6 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM
|
||||
PowerLevel: superadminPowerLevel,
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if portal == nil || portal.MXID == "" {
|
||||
@@ -191,16 +198,16 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM
|
||||
}
|
||||
|
||||
if mu, ok := dialog.NotifySettings.GetMuteUntil(); ok {
|
||||
chatInfo.UserLocal.MutedUntil = ptr.Ptr(time.Unix(int64(mu), 0))
|
||||
chatInfo.UserLocal = &bridgev2.UserLocalPortalInfo{MutedUntil: ptr.Ptr(time.Unix(int64(mu), 0))}
|
||||
} else {
|
||||
chatInfo.UserLocal.MutedUntil = &bridgev2.Unmuted
|
||||
chatInfo.UserLocal = &bridgev2.UserLocalPortalInfo{MutedUntil: &bridgev2.Unmuted}
|
||||
}
|
||||
if dialog.Pinned {
|
||||
chatInfo.UserLocal.Tag = ptr.Ptr(event.RoomTagFavourite)
|
||||
}
|
||||
|
||||
t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{
|
||||
ChatInfo: &chatInfo,
|
||||
ChatInfo: chatInfo,
|
||||
EventMeta: simplevent.EventMeta{
|
||||
Type: bridgev2.RemoteEventChatResync,
|
||||
LogContext: func(c zerolog.Context) zerolog.Context {
|
||||
|
||||
@@ -506,10 +506,7 @@ func (t *TelegramClient) getEventSender(msg interface {
|
||||
func (t *TelegramClient) getPeerSender(peer tg.PeerClass) bridgev2.EventSender {
|
||||
switch from := peer.(type) {
|
||||
case *tg.PeerUser:
|
||||
return bridgev2.EventSender{
|
||||
SenderLogin: ids.MakeUserLoginID(from.UserID),
|
||||
Sender: ids.MakeUserID(from.UserID),
|
||||
}
|
||||
return t.senderForUserID(from.UserID)
|
||||
case *tg.PeerChannel:
|
||||
return bridgev2.EventSender{
|
||||
Sender: ids.MakeChannelUserID(from.ChannelID),
|
||||
|
||||
Reference in New Issue
Block a user