diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index bbd0eed0..1a1da104 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -229,7 +229,8 @@ func (t *TelegramClient) GetCapabilities(ctx context.Context, portal *bridgev2.P Timers: telegramTimers, }, State: event.StateFeatureMap{ - event.StateRoomName.Type: {Level: event.CapLevelFullySupported}, + event.StateRoomName.Type: {Level: event.CapLevelFullySupported}, + event.StateRoomAvatar.Type: {Level: event.CapLevelFullySupported}, }, } // TODO non-admins can only edit messages within 48 hours diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 6f4ec4bf..9d369830 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -69,6 +69,7 @@ var ( _ bridgev2.ChatViewingNetworkAPI = (*TelegramClient)(nil) _ bridgev2.DeleteChatHandlingNetworkAPI = (*TelegramClient)(nil) _ bridgev2.RoomNameHandlingNetworkAPI = (*TelegramClient)(nil) + _ bridgev2.RoomAvatarHandlingNetworkAPI = (*TelegramClient)(nil) ) func getMediaFilename(content *event.MessageEventContent) (filename string) { @@ -894,3 +895,59 @@ func (t *TelegramClient) HandleMatrixRoomName(ctx context.Context, msg *bridgev2 return false, fmt.Errorf("unsupported peer type %s for changing room name", peerType) } } + +func (t *TelegramClient) HandleMatrixRoomAvatar(ctx context.Context, msg *bridgev2.MatrixRoomAvatar) (bool, error) { + peerType, id, err := ids.ParsePortalID(msg.Portal.ID) + if err != nil { + return false, err + } + + if peerType == ids.PeerTypeUser { + return false, fmt.Errorf("changing user avatar is not supported") + } + + var photo tg.InputChatPhotoClass + if msg.Content.URL == "" && msg.Content.MSC3414File == nil { + photo = &tg.InputChatPhotoEmpty{} + } else { + data, err := t.main.Bridge.Bot.DownloadMedia(ctx, msg.Content.URL, msg.Content.MSC3414File) + if err != nil { + return false, fmt.Errorf("failed to download avatar: %w", err) + } + upload, err := uploader.NewUploader(t.client.API()).FromBytes(ctx, "avatar.jpg", data) + if err != nil { + return false, fmt.Errorf("failed to upload avatar: %w", err) + } + photo = &tg.InputChatUploadedPhoto{File: upload} + } + + switch peerType { + case ids.PeerTypeChat: + _, err = t.client.API().MessagesEditChatPhoto(ctx, &tg.MessagesEditChatPhotoRequest{ + ChatID: id, + Photo: photo, + }) + if err != nil { + return false, err + } + return true, nil + case ids.PeerTypeChannel: + accessHash, err := t.ScopedStore.GetAccessHash(ctx, peerType, id) + if err != nil { + return false, err + } + _, err = t.client.API().ChannelsEditPhoto(ctx, &tg.ChannelsEditPhotoRequest{ + Channel: &tg.InputChannel{ + ChannelID: id, + AccessHash: accessHash, + }, + Photo: photo, + }) + if err != nil { + return false, err + } + return true, nil + default: + return false, fmt.Errorf("unsupported peer type %s for changing room avatar", peerType) + } +}