diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 798f3249..fb661561 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -6,6 +6,7 @@ import ( "time" "github.com/gotd/td/tg" + "github.com/rs/zerolog" "go.mau.fi/util/ptr" "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/database" @@ -285,7 +286,7 @@ func (t *TelegramClient) GetChatInfo(ctx context.Context, portal *bridgev2.Porta // TODO save emojiset? chatInfo.Members.IsFull = false - chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(fullChat.GetChats()[0]) + chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(ctx, fullChat.GetChats()[0]) if !portal.Metadata.(*PortalMetadata).IsSuperGroup { // Add the channel user sender := ids.MakeChannelUserID(id) @@ -387,22 +388,30 @@ func (t *TelegramClient) getDMPowerLevels(ghost *bridgev2.Ghost) *bridgev2.Power return &plo } -func (t *TelegramClient) getGroupChatPowerLevels(entity tg.ChatClass) *bridgev2.PowerLevelOverrides { +func (t *TelegramClient) getGroupChatPowerLevels(ctx context.Context, entity tg.ChatClass) *bridgev2.PowerLevelOverrides { + log := zerolog.Ctx(ctx).With(). + Str("action", "get_group_chat_power_levels"). + Logger() + dbrAble, ok := entity.(interface { GetDefaultBannedRights() (tg.ChatBannedRights, bool) }) - if !ok { - panic(fmt.Sprintf("unsupported chat type %T", entity)) - } - dbr, ok := dbrAble.GetDefaultBannedRights() - if !ok { - dbr = tg.ChatBannedRights{ - InviteUsers: true, - ChangeInfo: true, - PinMessages: true, - SendStickers: false, - SendMessages: false, + var dbr tg.ChatBannedRights + if ok { + dbr, ok = dbrAble.GetDefaultBannedRights() + if !ok { + dbr = tg.ChatBannedRights{ + InviteUsers: true, + ChangeInfo: true, + PinMessages: true, + SendStickers: false, + SendMessages: false, + } } + } else { + log.Error(). + Type("entity_type", entity). + Msg("couldn't get default banned rights from entity, assuming you don't have any rights") } return t.getPowerLevelOverridesFromBannedRights(entity, dbr) } diff --git a/pkg/connector/sync.go b/pkg/connector/sync.go index 13afe2b9..c6fa48aa 100644 --- a/pkg/connector/sync.go +++ b/pkg/connector/sync.go @@ -110,7 +110,7 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM UserLocal: &bridgev2.UserLocalPortalInfo{}, Members: &bridgev2.ChatMemberList{ MemberMap: map[networkid.UserID]bridgev2.ChatMember{ - t.userID: bridgev2.ChatMember{ + t.userID: { EventSender: t.mySender(), Membership: event.MembershipJoin, }, @@ -122,7 +122,7 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM case *tg.PeerUser: userID := ids.MakeUserID(peer.UserID) if users[userID].(*tg.User).GetDeleted() { - log.Debug().Msg("Not syncing portal because user is deleted") + log.Debug().Int64("user_id", peer.UserID).Msg("Not syncing portal because user is deleted") continue } chatInfo.Members.MemberMap[userID] = bridgev2.ChatMember{ @@ -130,31 +130,52 @@ func (t *TelegramClient) handleDialogs(ctx context.Context, dialogs tg.ModifiedM Membership: event.MembershipJoin, } case *tg.PeerChat: - chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(chats[peer.ChatID]) - chatInfo.Name = &chats[peer.ChatID].(*tg.Chat).Title - case *tg.PeerChannel: - channel, ok := chats[peer.ChannelID].(*tg.Channel) - if !ok { - log.Error().Type("channel", chats[peer.ChannelID]).Msg("Failed to cast chat to channel") + chat := chats[peer.ChatID] + if chat.TypeID() == tg.ChatForbiddenTypeID { + log.Debug(). + Int64("chat_id", peer.ChatID). + Msg("Not syncing portal because chat is forbidden") + continue + } else if chat.TypeID() != tg.ChatTypeID { + log.Debug(). + Int64("chat_id", peer.ChatID). + Type("chat_type", chat). + Msg("Not syncing portal because chat type is unsupported") continue } - chatInfo.Name = &channel.Title - chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(channel) + chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(ctx, chat) + chatInfo.Name = &chat.(*tg.Chat).Title + case *tg.PeerChannel: + channel := chats[peer.ChannelID] + if channel.TypeID() == tg.ChannelForbiddenTypeID { + log.Debug(). + Int64("channel_id", peer.ChannelID). + Msg("Not syncing portal because channel is forbidden") + continue + } else if channel.TypeID() != tg.ChannelTypeID { + log.Debug(). + Int64("channel_id", peer.ChannelID). + Type("channel_type", channel). + Msg("Not syncing portal because channel type is unsupported") + continue + } + chatInfo.Name = &channel.(*tg.Channel).Title + chatInfo.Members.PowerLevels = t.getGroupChatPowerLevels(ctx, channel) if !portal.Metadata.(*PortalMetadata).IsSuperGroup { // Add the channel user sender := ids.MakeChannelUserID(peer.ChannelID) chatInfo.Members.MemberMap = map[networkid.UserID]bridgev2.ChatMember{ - sender: bridgev2.ChatMember{ + sender: { EventSender: bridgev2.EventSender{Sender: sender}, Membership: event.MembershipJoin, PowerLevel: superadminPowerLevel, }, } chatInfo.Members.MemberMap = map[networkid.UserID]bridgev2.ChatMember{ - t.userID: bridgev2.ChatMember{ + t.userID: { EventSender: t.mySender(), Membership: event.MembershipJoin, - PowerLevel: adminRightsToPowerLevel(channel.AdminRights), + PowerLevel: adminRightsToPowerLevel(channel.(*tg.Channel).AdminRights), }, } }