connector: always use channel sender in broadcast rooms and add per-message profile
Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
@@ -268,7 +268,7 @@ func (t *TelegramClient) FetchMessages(ctx context.Context, fetchParams bridgev2
|
||||
continue
|
||||
}
|
||||
|
||||
sender := t.getEventSender(message)
|
||||
sender := t.getEventSender(message, !portal.Metadata.(*PortalMetadata).IsSuperGroup)
|
||||
intent := portal.GetIntentFor(ctx, sender, t.userLogin, bridgev2.RemoteEventBackfill)
|
||||
converted, err := t.convertToMatrix(ctx, portal, intent, message)
|
||||
if err != nil {
|
||||
|
||||
@@ -92,8 +92,7 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Ent
|
||||
log := zerolog.Ctx(ctx)
|
||||
switch msg := update.GetMessage().(type) {
|
||||
case *tg.Message:
|
||||
sender := t.getEventSender(msg)
|
||||
|
||||
var isBroadcastChannel bool
|
||||
switch peer := msg.PeerID.(type) {
|
||||
case *tg.PeerChannel:
|
||||
log := log.With().Int64("channel_id", peer.ChannelID).Logger()
|
||||
@@ -103,6 +102,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Ent
|
||||
} else if c, ok := entities.Channels[peer.ChannelID]; ok && c.Left {
|
||||
log.Debug().Msg("Received message in left channel, ignoring")
|
||||
return nil
|
||||
} else if ok && !c.GetMegagroup() {
|
||||
isBroadcastChannel = true
|
||||
}
|
||||
case *tg.PeerChat:
|
||||
log := log.With().Int64("chat_id", peer.ChatID).Logger()
|
||||
@@ -115,6 +116,8 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Ent
|
||||
}
|
||||
}
|
||||
|
||||
sender := t.getEventSender(msg, isBroadcastChannel)
|
||||
|
||||
go t.handleTelegramReactions(ctx, msg)
|
||||
|
||||
if media, ok := msg.GetMedia(); ok && media.TypeID() == tg.MessageMediaContactTypeID {
|
||||
@@ -145,7 +148,7 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Ent
|
||||
ConvertMessageFunc: t.convertToMatrix,
|
||||
})
|
||||
case *tg.MessageService:
|
||||
sender := t.getEventSender(msg)
|
||||
sender := t.getEventSender(msg, false)
|
||||
|
||||
eventMeta := simplevent.EventMeta{
|
||||
PortalKey: t.makePortalKeyFromPeer(msg.PeerID),
|
||||
@@ -498,7 +501,13 @@ func (t *TelegramClient) getEventSender(msg interface {
|
||||
GetOut() bool
|
||||
GetFromID() (tg.PeerClass, bool)
|
||||
GetPeerID() tg.PeerClass
|
||||
}) bridgev2.EventSender {
|
||||
}, isBroadcastChannel bool) bridgev2.EventSender {
|
||||
if isBroadcastChannel && msg.GetPeerID().TypeID() == tg.PeerChannelTypeID {
|
||||
// Always send as the channel in broadcast channels. We set a
|
||||
// per-message profile to indicate the actual user it was from.
|
||||
return t.getPeerSender(msg.GetPeerID())
|
||||
}
|
||||
|
||||
if msg.GetOut() {
|
||||
return t.mySender()
|
||||
}
|
||||
@@ -721,7 +730,12 @@ func (t *TelegramClient) onMessageEdit(ctx context.Context, update IGetMessage)
|
||||
|
||||
t.handleTelegramReactions(ctx, msg)
|
||||
|
||||
sender := t.getEventSender(msg)
|
||||
portalKey := t.makePortalKeyFromPeer(msg.PeerID)
|
||||
portal, err := t.main.Bridge.GetPortalByKey(ctx, portalKey)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sender := t.getEventSender(msg, !portal.Metadata.(*PortalMetadata).IsSuperGroup)
|
||||
|
||||
// Check if this edit was a data export request acceptance message
|
||||
if sender.Sender == networkid.UserID("777000") {
|
||||
@@ -743,7 +757,7 @@ func (t *TelegramClient) onMessageEdit(ctx context.Context, update IGetMessage)
|
||||
Int("message_id", msg.ID)
|
||||
},
|
||||
Sender: sender,
|
||||
PortalKey: t.makePortalKeyFromPeer(msg.PeerID),
|
||||
PortalKey: portalKey,
|
||||
Timestamp: time.Unix(int64(msg.EditDate), 0),
|
||||
},
|
||||
ID: ids.GetMessageIDFromMessage(msg),
|
||||
|
||||
@@ -109,6 +109,22 @@ func (c *TelegramClient) convertToMatrix(ctx context.Context, portal *bridgev2.P
|
||||
return nil, fmt.Errorf("telegram client is nil, we are likely logged out")
|
||||
}
|
||||
|
||||
var perMessageProfile *event.BeeperPerMessageProfile
|
||||
if peerType, _, err := ids.ParsePortalID(portal.ID); err != nil {
|
||||
return nil, err
|
||||
} else if peerType == ids.PeerTypeChannel && !portal.Metadata.(*PortalMetadata).IsSuperGroup {
|
||||
var profile event.BeeperPerMessageProfile
|
||||
if msg.Out {
|
||||
profile, err = portal.PerMessageProfileForSender(ctx, c.userID)
|
||||
} else {
|
||||
profile, err = portal.PerMessageProfileForSender(ctx, c.getPeerSender(msg.FromID).Sender)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
perMessageProfile = &profile
|
||||
}
|
||||
|
||||
cm = &bridgev2.ConvertedMessage{}
|
||||
hasher := sha256.New()
|
||||
if len(msg.Message) > 0 {
|
||||
@@ -153,6 +169,7 @@ func (c *TelegramClient) convertToMatrix(ctx context.Context, portal *bridgev2.P
|
||||
cm.Disappear = *disappearingSetting
|
||||
}
|
||||
}
|
||||
cm.Parts[0].Content.BeeperPerMessageProfile = perMessageProfile
|
||||
cm.Parts[0].DBMetadata = &MessageMetadata{
|
||||
ContentHash: hasher.Sum(nil),
|
||||
ContentURI: contentURI,
|
||||
|
||||
Reference in New Issue
Block a user