handletelegram: adjust some message handling code

This commit is contained in:
Tulir Asokan
2025-12-06 01:01:33 +02:00
parent 16a57d78ac
commit 14b3b1fed7
2 changed files with 56 additions and 106 deletions
+56 -103
View File
@@ -126,6 +126,7 @@ func (t *TelegramClient) onUpdateChannel(ctx context.Context, e tg.Entities, upd
func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Entities, update IGetMessage) error { func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Entities, update IGetMessage) error {
log := *zerolog.Ctx(ctx) log := *zerolog.Ctx(ctx)
log.Trace().Any("message_content", update).Msg("Raw message content")
switch msg := update.GetMessage().(type) { switch msg := update.GetMessage().(type) {
case *tg.Message: case *tg.Message:
var isBroadcastChannel bool var isBroadcastChannel bool
@@ -223,16 +224,20 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
switch peer := msg.PeerID.(type) { switch peer := msg.PeerID.(type) {
case *tg.PeerChat: case *tg.PeerChat:
res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{
EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange),
ChatInfoChange: &bridgev2.ChatInfoChange{ChatInfo: &bridgev2.ChatInfo{Avatar: t.avatarFromPhoto(ctx, ids.PeerTypeChat, peer.ChatID, action.Photo)}}, ChatInfoChange: &bridgev2.ChatInfoChange{ChatInfo: &bridgev2.ChatInfo{
Avatar: t.avatarFromPhoto(ctx, ids.PeerTypeChat, peer.ChatID, action.Photo),
}},
}) })
if err := resultToError(res); err != nil { if err := resultToError(res); err != nil {
return err return err
} }
case *tg.PeerChannel: case *tg.PeerChannel:
res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{
EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange),
ChatInfoChange: &bridgev2.ChatInfoChange{ChatInfo: &bridgev2.ChatInfo{Avatar: t.avatarFromPhoto(ctx, ids.PeerTypeChannel, peer.ChannelID, action.Photo)}}, ChatInfoChange: &bridgev2.ChatInfoChange{ChatInfo: &bridgev2.ChatInfo{
Avatar: t.avatarFromPhoto(ctx, ids.PeerTypeChannel, peer.ChannelID, action.Photo),
}},
}) })
if err := resultToError(res); err != nil { if err := resultToError(res); err != nil {
return err return err
@@ -252,10 +257,10 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
MemberMap: map[networkid.UserID]bridgev2.ChatMember{}, MemberMap: map[networkid.UserID]bridgev2.ChatMember{},
} }
for _, userID := range action.Users { for _, userID := range action.Users {
memberChanges.MemberMap[ids.MakeUserID(userID)] = bridgev2.ChatMember{ memberChanges.MemberMap.Set(bridgev2.ChatMember{
EventSender: t.senderForUserID(userID), EventSender: t.senderForUserID(userID),
Membership: event.MembershipJoin, Membership: event.MembershipJoin,
} })
} }
res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{ res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatInfoChange{
EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange),
@@ -269,9 +274,10 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange),
ChatInfoChange: &bridgev2.ChatInfoChange{ ChatInfoChange: &bridgev2.ChatInfoChange{
MemberChanges: &bridgev2.ChatMemberList{ MemberChanges: &bridgev2.ChatMemberList{
MemberMap: map[networkid.UserID]bridgev2.ChatMember{ MemberMap: bridgev2.ChatMemberMap{}.Set(bridgev2.ChatMember{
sender.Sender: {EventSender: sender, Membership: event.MembershipJoin}, EventSender: sender,
}, Membership: event.MembershipJoin,
}),
}, },
}, },
}) })
@@ -286,12 +292,10 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange), EventMeta: eventMeta.WithType(bridgev2.RemoteEventChatInfoChange),
ChatInfoChange: &bridgev2.ChatInfoChange{ ChatInfoChange: &bridgev2.ChatInfoChange{
MemberChanges: &bridgev2.ChatMemberList{ MemberChanges: &bridgev2.ChatMemberList{
MemberMap: map[networkid.UserID]bridgev2.ChatMember{ MemberMap: bridgev2.ChatMemberMap{}.Set(bridgev2.ChatMember{
ids.MakeUserID(action.UserID): { EventSender: t.senderForUserID(action.UserID),
EventSender: t.senderForUserID(action.UserID), Membership: event.MembershipLeave,
Membership: event.MembershipLeave, }),
},
},
}, },
}, },
}) })
@@ -299,42 +303,18 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
return err return err
} }
case *tg.MessageActionChatCreate: case *tg.MessageActionChatCreate:
memberMap := map[networkid.UserID]bridgev2.ChatMember{} res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{
for _, userID := range action.Users { EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage).WithCreatePortal(true),
memberMap[ids.MakeUserID(userID)] = bridgev2.ChatMember{
EventSender: t.senderForUserID(userID),
Membership: event.MembershipJoin,
}
}
res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{
EventMeta: eventMeta.
WithType(bridgev2.RemoteEventChatResync).
WithCreatePortal(true),
ChatInfo: &bridgev2.ChatInfo{
Name: &action.Title,
Members: &bridgev2.ChatMemberList{
IsFull: true,
TotalMemberCount: len(action.Users),
MemberMap: memberMap,
},
CanBackfill: true,
},
})
if err := resultToError(res); err != nil {
return err
}
res = t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{
EventMeta: eventMeta.WithType(bridgev2.RemoteEventMessage),
ID: ids.GetMessageIDFromMessage(msg), ID: ids.GetMessageIDFromMessage(msg),
ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) {
return &bridgev2.ConvertedMessage{ return &bridgev2.ConvertedMessage{
Parts: []*bridgev2.ConvertedMessagePart{ Parts: []*bridgev2.ConvertedMessagePart{{
{ Type: event.EventMessage,
Type: event.EventMessage, Content: &event.MessageEventContent{
Content: &event.MessageEventContent{MsgType: event.MsgNotice, Body: "Created the group"}, MsgType: event.MsgNotice,
Body: "Created the group",
}, },
}, }},
}, nil }, nil
}, },
}) })
@@ -343,27 +323,11 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
} }
case *tg.MessageActionChannelCreate: case *tg.MessageActionChannelCreate:
modLevel := 50
res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{ res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{
EventMeta: eventMeta. EventMeta: eventMeta.
WithType(bridgev2.RemoteEventChatResync). WithType(bridgev2.RemoteEventChatResync).
WithCreatePortal(true), WithCreatePortal(true),
ChatInfo: &bridgev2.ChatInfo{ GetChatInfoFunc: t.GetChatInfo,
Name: &action.Title,
Members: &bridgev2.ChatMemberList{
MemberMap: map[networkid.UserID]bridgev2.ChatMember{
t.userID: {
EventSender: t.mySender(),
Membership: event.MembershipJoin,
PowerLevel: &modLevel,
},
},
PowerLevels: &bridgev2.PowerLevelOverrides{
EventsDefault: &modLevel,
},
},
CanBackfill: true,
},
}) })
if err := resultToError(res); err != nil { if err := resultToError(res); err != nil {
return err return err
@@ -446,14 +410,11 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
return err return err
} }
case *tg.MessageActionGroupCall: case *tg.MessageActionGroupCall:
var body strings.Builder var body string
if action.Duration == 0 { if action.Duration == 0 {
body.WriteString("Started a video chat") body = "Started a video chat"
} else { } else {
body.WriteString("Ended the video chat") body = fmt.Sprintf("Ended the video chat (%s)", exfmt.Duration(time.Duration(action.Duration)*time.Second))
body.WriteString(" (")
body.WriteString(exfmt.Duration(time.Duration(action.Duration) * time.Second))
body.WriteString(")")
} }
res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{ res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.Message[any]{
@@ -461,12 +422,10 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
ID: ids.GetMessageIDFromMessage(msg), ID: ids.GetMessageIDFromMessage(msg),
ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) {
return &bridgev2.ConvertedMessage{ return &bridgev2.ConvertedMessage{
Parts: []*bridgev2.ConvertedMessagePart{ Parts: []*bridgev2.ConvertedMessagePart{{
{ Type: event.EventMessage,
Type: event.EventMessage, Content: &event.MessageEventContent{MsgType: event.MsgNotice, Body: body},
Content: &event.MessageEventContent{MsgType: event.MsgNotice, Body: body.String()}, }},
},
},
}, nil }, nil
}, },
}) })
@@ -505,18 +464,16 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
ID: ids.GetMessageIDFromMessage(msg), ID: ids.GetMessageIDFromMessage(msg),
ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) {
return &bridgev2.ConvertedMessage{ return &bridgev2.ConvertedMessage{
Parts: []*bridgev2.ConvertedMessagePart{ Parts: []*bridgev2.ConvertedMessagePart{{
{ Type: event.EventMessage,
Type: event.EventMessage, Content: &event.MessageEventContent{
Content: &event.MessageEventContent{ MsgType: event.MsgNotice,
MsgType: event.MsgNotice, Body: body.String(),
Body: body.String(), Format: event.FormatHTML,
Format: event.FormatHTML, FormattedBody: html.String(),
FormattedBody: html.String(), Mentions: &mentions,
Mentions: &mentions,
},
}, },
}, }},
}, nil }, nil
}, },
}) })
@@ -532,15 +489,13 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
ID: ids.GetMessageIDFromMessage(msg), ID: ids.GetMessageIDFromMessage(msg),
ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) {
return &bridgev2.ConvertedMessage{ return &bridgev2.ConvertedMessage{
Parts: []*bridgev2.ConvertedMessagePart{ Parts: []*bridgev2.ConvertedMessagePart{{
{ Type: event.EventMessage,
Type: event.EventMessage, Content: &event.MessageEventContent{
Content: &event.MessageEventContent{ MsgType: event.MsgNotice,
MsgType: event.MsgNotice, Body: fmt.Sprintf("Video chat scheduled for %s", start.Format("Jan 2, 15:04")),
Body: fmt.Sprintf("Video chat scheduled for %s", start.Format("Jan 2, 15:04")),
},
}, },
}, }},
}, nil }, nil
}, },
}) })
@@ -563,15 +518,13 @@ func (t *TelegramClient) handleServiceMessage(ctx context.Context, msg *tg.Messa
ID: ids.GetMessageIDFromMessage(msg), ID: ids.GetMessageIDFromMessage(msg),
ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) { ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data any) (*bridgev2.ConvertedMessage, error) {
return &bridgev2.ConvertedMessage{ return &bridgev2.ConvertedMessage{
Parts: []*bridgev2.ConvertedMessagePart{ Parts: []*bridgev2.ConvertedMessagePart{{
{ Type: event.EventMessage,
Type: event.EventMessage, Content: &event.MessageEventContent{
Content: &event.MessageEventContent{ MsgType: event.MsgNotice,
MsgType: event.MsgNotice, Body: "Upgraded this group to a supergroup",
Body: "Upgraded this group to a supergroup",
},
}, },
}, }},
}, nil }, nil
}, },
}) })
-3
View File
@@ -56,9 +56,6 @@ func (m *Manager) Handle(ctx context.Context, u tg.UpdatesClass) error {
ctx, span := m.tracer.Start(ctx, "updates.Manager.Handle") ctx, span := m.tracer.Start(ctx, "updates.Manager.Handle")
defer span.End() defer span.End()
m.lg.Debug("Handle")
defer m.lg.Debug("Handled")
m.mux.Lock() m.mux.Lock()
state := m.state state := m.state
m.mux.Unlock() m.mux.Unlock()