diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index e674643a..bbd0eed0 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -60,7 +60,7 @@ func (tg *TelegramConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilit } func (tg *TelegramConnector) GetBridgeInfoVersion() (info, capabilities int) { - return 1, 7 + return 1, 8 } // TODO get these from getConfig instead of hardcoding? @@ -210,7 +210,7 @@ func makeTimerList() []jsontime.Milliseconds { var telegramTimers = makeTimerList() func (t *TelegramClient) GetCapabilities(ctx context.Context, portal *bridgev2.Portal) *event.RoomFeatures { - baseID := "fi.mau.telegram.capabilities.2025_11_12" + baseID := "fi.mau.telegram.capabilities.2025_11_24" feat := &event.RoomFeatures{ Formatting: formattingCaps, File: fileCaps, @@ -228,6 +228,9 @@ func (t *TelegramClient) GetCapabilities(ctx context.Context, portal *bridgev2.P Types: []event.DisappearingType{event.DisappearingTypeAfterSend}, Timers: telegramTimers, }, + State: event.StateFeatureMap{ + event.StateRoomName.Type: {Level: event.CapLevelFullySupported}, + }, } // TODO non-admins can only edit messages within 48 hours @@ -261,6 +264,7 @@ func (t *TelegramClient) GetCapabilities(ctx context.Context, portal *bridgev2.P baseID += "+dm" feat.DeleteChat = true feat.DeleteChatForEveryone = true + feat.State = nil default: // Group creators can delete the chat for everyone, unless it's a large channel if peerType == ids.PeerTypeChat || portalMetadata.ParticipantsCount < 1000 { diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 19d91c09..6f4ec4bf 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -68,6 +68,7 @@ var ( _ bridgev2.TagHandlingNetworkAPI = (*TelegramClient)(nil) _ bridgev2.ChatViewingNetworkAPI = (*TelegramClient)(nil) _ bridgev2.DeleteChatHandlingNetworkAPI = (*TelegramClient)(nil) + _ bridgev2.RoomNameHandlingNetworkAPI = (*TelegramClient)(nil) ) func getMediaFilename(content *event.MessageEventContent) (filename string) { @@ -856,3 +857,40 @@ func (t *TelegramClient) HandleMatrixDeleteChat(ctx context.Context, chat *bridg } return nil } + +func (t *TelegramClient) HandleMatrixRoomName(ctx context.Context, msg *bridgev2.MatrixRoomName) (bool, error) { + peerType, id, err := ids.ParsePortalID(msg.Portal.ID) + if err != nil { + return false, err + } + + switch peerType { + case ids.PeerTypeChat: + _, err = t.client.API().MessagesEditChatTitle(ctx, &tg.MessagesEditChatTitleRequest{ + ChatID: id, + Title: msg.Content.Name, + }) + 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().ChannelsEditTitle(ctx, &tg.ChannelsEditTitleRequest{ + Channel: &tg.InputChannel{ + ChannelID: id, + AccessHash: accessHash, + }, + Title: msg.Content.Name, + }) + if err != nil { + return false, err + } + return true, nil + default: + return false, fmt.Errorf("unsupported peer type %s for changing room name", peerType) + } +}