diff --git a/go.mod b/go.mod index b352f23f..3789e053 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c golang.org/x/net v0.30.0 - maunium.net/go/mautrix v0.21.2-0.20241023204042-6fd4b8a2132d + maunium.net/go/mautrix v0.21.2-0.20241028194614-48aa04889cd6 ) require ( diff --git a/go.sum b/go.sum index 5881b718..d7e170ea 100644 --- a/go.sum +++ b/go.sum @@ -117,8 +117,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.21.2-0.20241023204042-6fd4b8a2132d h1:pW2F/uX9eqziumLBDiFAx2XwfiwPuKI6XyKqOkRDNCk= -maunium.net/go/mautrix v0.21.2-0.20241023204042-6fd4b8a2132d/go.mod h1:sjCZR1R/3NET/WjkcXPL6WpAHlWKku9HjRsdOkbM8Qw= +maunium.net/go/mautrix v0.21.2-0.20241028194614-48aa04889cd6 h1:cen1eiJxheWzF2PSR6rK+wDpX7H56CvQa4tqoypoOM8= +maunium.net/go/mautrix v0.21.2-0.20241028194614-48aa04889cd6/go.mod h1:sjCZR1R/3NET/WjkcXPL6WpAHlWKku9HjRsdOkbM8Qw= nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= diff --git a/pkg/connector/telegram.go b/pkg/connector/telegram.go index 255ed31f..d5d90992 100644 --- a/pkg/connector/telegram.go +++ b/pkg/connector/telegram.go @@ -133,7 +133,6 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in sender := t.getEventSender(msg) eventMeta := simplevent.EventMeta{ - Type: bridgev2.RemoteEventChatInfoChange, PortalKey: t.makePortalKeyFromPeer(msg.PeerID), Sender: sender, Timestamp: time.Unix(int64(msg.Date), 0), @@ -146,59 +145,69 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in Stringer("peer_id", msg.PeerID) }, } - chatInfoChange := simplevent.ChatInfoChange{ - EventMeta: eventMeta, - ChatInfoChange: &bridgev2.ChatInfoChange{}, - } switch action := msg.Action.(type) { case *tg.MessageActionChatEditTitle: - chatInfoChange.ChatInfoChange.ChatInfo = &bridgev2.ChatInfo{Name: &action.Title} + t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), + ChatInfoChange: &bridgev2.ChatInfoChange{ChatInfo: &bridgev2.ChatInfo{Name: &action.Title}}, + }) case *tg.MessageActionChatEditPhoto: - chatInfoChange.ChatInfoChange.ChatInfo = &bridgev2.ChatInfo{Avatar: t.avatarFromPhoto(action.Photo)} + t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), + ChatInfoChange: &bridgev2.ChatInfoChange{ChatInfo: &bridgev2.ChatInfo{Avatar: t.avatarFromPhoto(action.Photo)}}, + }) case *tg.MessageActionChatDeletePhoto: - chatInfoChange.ChatInfoChange.ChatInfo = &bridgev2.ChatInfo{Avatar: &bridgev2.Avatar{Remove: true}} + t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), + ChatInfoChange: &bridgev2.ChatInfoChange{ChatInfo: &bridgev2.ChatInfo{Avatar: &bridgev2.Avatar{Remove: true}}}, + }) case *tg.MessageActionChatAddUser: - chatInfoChange.ChatInfoChange.MemberChanges = &bridgev2.ChatMemberList{ + memberChanges := &bridgev2.ChatMemberList{ MemberMap: map[networkid.UserID]bridgev2.ChatMember{}, } for _, userID := range action.Users { - sender := ids.MakeUserID(userID) - chatInfoChange.ChatInfoChange.MemberChanges.MemberMap[sender] = bridgev2.ChatMember{ - EventSender: bridgev2.EventSender{ - SenderLogin: ids.MakeUserLoginID(userID), - Sender: sender, - }, - Membership: event.MembershipJoin, + memberChanges.MemberMap[ids.MakeUserID(userID)] = bridgev2.ChatMember{ + EventSender: t.senderForUserID(userID), + Membership: event.MembershipJoin, } } + t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), + ChatInfoChange: &bridgev2.ChatInfoChange{MemberChanges: memberChanges}, + }) case *tg.MessageActionChatJoinedByLink: - chatInfoChange.ChatInfoChange.MemberChanges = &bridgev2.ChatMemberList{ - MemberMap: map[networkid.UserID]bridgev2.ChatMember{ - sender.Sender: {EventSender: sender, Membership: event.MembershipJoin}, + t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), + ChatInfoChange: &bridgev2.ChatInfoChange{ + MemberChanges: &bridgev2.ChatMemberList{ + MemberMap: map[networkid.UserID]bridgev2.ChatMember{ + sender.Sender: {EventSender: sender, Membership: event.MembershipJoin}, + }, + }, }, - } + }) case *tg.MessageActionChatDeleteUser: - sender := ids.MakeUserID(action.UserID) if action.UserID == t.telegramUserID { - eventMeta.Type = bridgev2.RemoteEventChatDelete t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatDelete{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatDelete), OnlyForMe: true, }) return nil } - chatInfoChange.ChatInfoChange.MemberChanges = &bridgev2.ChatMemberList{ - MemberMap: map[networkid.UserID]bridgev2.ChatMember{ - sender: { - EventSender: bridgev2.EventSender{ - SenderLogin: ids.MakeUserLoginID(action.UserID), - Sender: sender, + t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), + ChatInfoChange: &bridgev2.ChatInfoChange{ + MemberChanges: &bridgev2.ChatMemberList{ + MemberMap: map[networkid.UserID]bridgev2.ChatMember{ + ids.MakeUserID(action.UserID): { + EventSender: t.senderForUserID(action.UserID), + Membership: event.MembershipLeave, + }, }, - Membership: event.MembershipLeave, }, }, - } + }) case *tg.MessageActionChatCreate: memberMap := map[networkid.UserID]bridgev2.ChatMember{} for _, userID := range action.Users { @@ -208,10 +217,10 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in } } - eventMeta.Type = bridgev2.RemoteEventChatResync - eventMeta.CreatePortal = true t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{ - EventMeta: eventMeta, + EventMeta: eventMeta. + WithType(bridgev2.RemoteEventChatResync). + WithCreatePortal(true), ChatInfo: &bridgev2.ChatInfo{ Name: &action.Title, Members: &bridgev2.ChatMemberList{ @@ -222,9 +231,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in CanBackfill: true, }, }) - eventMeta.Type = bridgev2.RemoteEventMessage t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage), ID: ids.GetMessageIDFromMessage(msg), ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { return &bridgev2.ConvertedMessage{ @@ -240,11 +248,11 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in }) case *tg.MessageActionChannelCreate: - eventMeta.Type = bridgev2.RemoteEventChatResync - eventMeta.CreatePortal = true modLevel := 50 t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{ - EventMeta: eventMeta, + EventMeta: eventMeta. + WithType(bridgev2.RemoteEventChatResync). + WithCreatePortal(true), ChatInfo: &bridgev2.ChatInfo{ Name: &action.Title, Members: &bridgev2.ChatMemberList{ @@ -262,9 +270,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in CanBackfill: true, }, }) - eventMeta.Type = bridgev2.RemoteEventMessage t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage), ID: ids.GetMessageIDFromMessage(msg), ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { return &bridgev2.ConvertedMessage{ @@ -279,9 +286,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in }, }) case *tg.MessageActionSetMessagesTTL: - eventMeta.Type = bridgev2.RemoteEventChatResync t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatResync), ChatInfo: &bridgev2.ChatInfo{ ExtraUpdates: func(ctx context.Context, p *bridgev2.Portal) bool { updated := p.Portal.Metadata.(*PortalMetadata).MessagesTTL != action.Period @@ -293,9 +299,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in // Send a notice about the TTL change content := bridgev2.DisappearingMessageNotice(time.Duration(action.Period)*time.Second, false) - eventMeta.Type = bridgev2.RemoteEventMessage t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage), ID: ids.GetMessageIDFromMessage(msg), ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { return &bridgev2.ConvertedMessage{ @@ -331,9 +336,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in body.WriteString(")") } - eventMeta.Type = bridgev2.RemoteEventMessage t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage), ID: ids.GetMessageIDFromMessage(msg), ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { return &bridgev2.ConvertedMessage{ @@ -358,9 +362,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in body.WriteString(")") } - eventMeta.Type = bridgev2.RemoteEventMessage t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage), ID: ids.GetMessageIDFromMessage(msg), ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { return &bridgev2.ConvertedMessage{ @@ -401,9 +404,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in } body.WriteString(" to the video chat") html.WriteString(" to the video chat") - eventMeta.Type = bridgev2.RemoteEventMessage t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ - EventMeta: eventMeta, + EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage), ID: ids.GetMessageIDFromMessage(msg), ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { return &bridgev2.ConvertedMessage{ @@ -425,11 +427,11 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in }) case *tg.MessageActionGroupCallScheduled: start := time.Unix(int64(action.ScheduleDate), 0) - eventMeta.Type = bridgev2.RemoteEventMessage - eventMeta.Sender = bridgev2.EventSender{} // Telegram shows it as not coming from a specific user t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ - EventMeta: eventMeta, - ID: ids.GetMessageIDFromMessage(msg), + EventMeta: eventMeta. + WithType(bridgev2.RemoteEventMessage). + WithSender(bridgev2.EventSender{}), // Telegram shows it as not coming from a specific user + ID: ids.GetMessageIDFromMessage(msg), ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { return &bridgev2.ConvertedMessage{ Parts: []*bridgev2.ConvertedMessagePart{ @@ -478,7 +480,6 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, channels map[in default: return fmt.Errorf("unknown action type %T", action) } - t.main.Bridge.QueueRemoteEvent(t.userLogin, &chatInfoChange) default: return fmt.Errorf("unknown message type %T", msg)