Preserve reaction timestamps if possible
This commit is contained in:
+14
-10
@@ -3221,17 +3221,18 @@ class Portal(DBPortal, BasePortal):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _reactions_filter(lst: list[TypeReaction], existing: DBReaction) -> bool:
|
def _reactions_filter(lst: list[MessagePeerReaction], existing: DBReaction) -> bool:
|
||||||
if not lst:
|
if not lst:
|
||||||
return False
|
return False
|
||||||
for reaction in lst:
|
for wrapped_reaction in lst:
|
||||||
|
reaction = wrapped_reaction.reaction
|
||||||
if isinstance(reaction, ReactionCustomEmoji) and existing.reaction == str(
|
if isinstance(reaction, ReactionCustomEmoji) and existing.reaction == str(
|
||||||
reaction.document_id
|
reaction.document_id
|
||||||
):
|
):
|
||||||
lst.remove(reaction)
|
lst.remove(wrapped_reaction)
|
||||||
return True
|
return True
|
||||||
elif isinstance(reaction, ReactionEmoji) and existing.reaction == reaction.emoticon:
|
elif isinstance(reaction, ReactionEmoji) and existing.reaction == reaction.emoticon:
|
||||||
lst.remove(reaction)
|
lst.remove(wrapped_reaction)
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -3251,15 +3252,14 @@ class Portal(DBPortal, BasePortal):
|
|||||||
total_count: int,
|
total_count: int,
|
||||||
timestamp: datetime | None = None,
|
timestamp: datetime | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
reactions: dict[TelegramID, list[TypeReaction]] = {}
|
reactions: dict[TelegramID, list[MessagePeerReaction]] = {}
|
||||||
custom_emoji_ids: list[int] = []
|
custom_emoji_ids: list[int] = []
|
||||||
for reaction in reaction_list:
|
for reaction in reaction_list:
|
||||||
if isinstance(reaction.peer_id, (PeerUser, PeerChannel)) and isinstance(
|
if isinstance(reaction.peer_id, (PeerUser, PeerChannel)) and isinstance(
|
||||||
reaction.reaction, (ReactionEmoji, ReactionCustomEmoji)
|
reaction.reaction, (ReactionEmoji, ReactionCustomEmoji)
|
||||||
):
|
):
|
||||||
reactions.setdefault(p.Puppet.get_id_from_peer(reaction.peer_id), []).append(
|
sender_user_id = p.Puppet.get_id_from_peer(reaction.peer_id)
|
||||||
reaction.reaction
|
reactions.setdefault(sender_user_id, []).append(reaction)
|
||||||
)
|
|
||||||
if isinstance(reaction.reaction, ReactionCustomEmoji):
|
if isinstance(reaction.reaction, ReactionCustomEmoji):
|
||||||
custom_emoji_ids.append(reaction.reaction.document_id)
|
custom_emoji_ids.append(reaction.reaction.document_id)
|
||||||
is_full = len(reaction_list) == total_count
|
is_full = len(reaction_list) == total_count
|
||||||
@@ -3284,7 +3284,8 @@ class Portal(DBPortal, BasePortal):
|
|||||||
|
|
||||||
new_reaction: TypeReaction
|
new_reaction: TypeReaction
|
||||||
for sender, new_reactions in reactions.items():
|
for sender, new_reactions in reactions.items():
|
||||||
for new_reaction in new_reactions:
|
for new_wrapped_reaction in new_reactions:
|
||||||
|
new_reaction = new_wrapped_reaction.reaction
|
||||||
if isinstance(new_reaction, ReactionEmoji):
|
if isinstance(new_reaction, ReactionEmoji):
|
||||||
emoji_id = new_reaction.emoticon
|
emoji_id = new_reaction.emoticon
|
||||||
matrix_reaction = variation_selector.add(new_reaction.emoticon)
|
matrix_reaction = variation_selector.add(new_reaction.emoticon)
|
||||||
@@ -3301,7 +3302,10 @@ class Portal(DBPortal, BasePortal):
|
|||||||
self.log.debug(f"Bridging reaction {emoji_id} by {sender} to {msg.tgid}")
|
self.log.debug(f"Bridging reaction {emoji_id} by {sender} to {msg.tgid}")
|
||||||
puppet: p.Puppet = await p.Puppet.get_by_tgid(sender)
|
puppet: p.Puppet = await p.Puppet.get_by_tgid(sender)
|
||||||
mxid = await puppet.intent_for(self).react(
|
mxid = await puppet.intent_for(self).react(
|
||||||
msg.mx_room, msg.mxid, matrix_reaction, timestamp=timestamp
|
msg.mx_room,
|
||||||
|
msg.mxid,
|
||||||
|
matrix_reaction,
|
||||||
|
timestamp=new_wrapped_reaction.date or timestamp,
|
||||||
)
|
)
|
||||||
await DBReaction(
|
await DBReaction(
|
||||||
mxid=mxid,
|
mxid=mxid,
|
||||||
|
|||||||
Reference in New Issue
Block a user