fix(push): preview forwarded message content (#2979)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-27 13:33:22 +02:00
1 parent 931327d1dc
commit 6a6119ed1e
1 file changed
+70 -4
@@ -33,7 +33,7 @@ build_content_preview(MessageData, MarkdownContext) ->
Preview = push_markdown_plaintext:render_push_preview(Content, MarkdownContext), Preview = push_markdown_plaintext:render_push_preview(Content, MarkdownContext),
case Preview of case Preview of
<<>> -> <<>> ->
truncate_preview(build_content_fallback_preview(MessageData)); truncate_preview(build_content_fallback_preview(MessageData, MarkdownContext));
_ -> _ ->
truncate_preview(Preview) truncate_preview(Preview)
end. end.
@@ -372,13 +372,37 @@ valid_utf8_prefix(Content) ->
{error, Valid, _Rest} -> Valid {error, Valid, _Rest} -> Valid
end. end.
-spec build_content_fallback_preview(map()) -> binary(). -spec build_content_fallback_preview(map(), map()) -> binary().
build_content_fallback_preview(MessageData) -> build_content_fallback_preview(MessageData, MarkdownContext) ->
case case
first_nonempty_binary([ first_nonempty_binary([
build_sticker_preview(maps:get(<<"stickers">>, MessageData, [])), build_sticker_preview(maps:get(<<"stickers">>, MessageData, [])),
build_attachment_preview(maps:get(<<"attachments">>, MessageData, [])), build_attachment_preview(maps:get(<<"attachments">>, MessageData, [])),
build_embed_preview(maps:get(<<"embeds">>, MessageData, [])) build_embed_preview(maps:get(<<"embeds">>, MessageData, [])),
build_snapshot_preview(
maps:get(<<"message_snapshots">>, MessageData, []), MarkdownContext
)
])
of
Preview when is_binary(Preview) -> Preview;
undefined -> <<>>
end.
-spec build_snapshot_preview(term(), map()) -> binary().
build_snapshot_preview([Snapshot | _Rest], MarkdownContext) when is_map(Snapshot) ->
snapshot_preview(Snapshot, MarkdownContext);
build_snapshot_preview(_Snapshots, _MarkdownContext) ->
<<>>.
-spec snapshot_preview(map(), map()) -> binary().
snapshot_preview(Snapshot, MarkdownContext) ->
Content = push_utils:normalize_binary(maps:get(<<"content">>, Snapshot, <<>>), <<>>),
case
first_nonempty_binary([
push_markdown_plaintext:render_push_preview(Content, MarkdownContext),
build_sticker_preview(maps:get(<<"stickers">>, Snapshot, [])),
build_attachment_preview(maps:get(<<"attachments">>, Snapshot, [])),
build_embed_preview(maps:get(<<"embeds">>, Snapshot, []))
]) ])
of of
Preview when is_binary(Preview) -> Preview; Preview when is_binary(Preview) -> Preview;
@@ -639,6 +663,48 @@ truncate_preview_keeps_short_valid_content_identical_test() ->
Content = <<"hello \xC3\xA9 world">>, Content = <<"hello \xC3\xA9 world">>,
?assertEqual(Content, truncate_preview(Content)). ?assertEqual(Content, truncate_preview(Content)).
a_forwarded_message_previews_its_snapshot_content_test() ->
MessageData = #{
<<"content">> => <<>>,
<<"message_snapshots">> => [#{<<"content">> => <<"forwarded text">>}]
},
?assertEqual(<<"forwarded text">>, build_content_preview(MessageData)).
a_forwarded_attachment_previews_its_filename_test() ->
MessageData = #{
<<"content">> => <<>>,
<<"message_snapshots">> => [
#{<<"content">> => null, <<"attachments">> => [#{<<"filename">> => <<"cat.png">>}]}
]
},
?assertEqual(<<"Attachment: cat.png">>, build_content_preview(MessageData)).
a_forwarded_sticker_previews_its_name_test() ->
MessageData = #{
<<"content">> => <<>>,
<<"message_snapshots">> => [
#{<<"content">> => null, <<"stickers">> => [#{<<"name">> => <<"Wave">>}]}
]
},
?assertEqual(<<"Sticker: Wave">>, build_content_preview(MessageData)).
own_content_wins_over_a_snapshot_test() ->
MessageData = #{
<<"content">> => <<"my words">>,
<<"message_snapshots">> => [#{<<"content">> => <<"forwarded text">>}]
},
?assertEqual(<<"my words">>, build_content_preview(MessageData)).
an_empty_snapshot_list_previews_nothing_test() ->
?assertEqual(
<<>>, build_content_preview(#{<<"content">> => <<>>, <<"message_snapshots">> => []})
).
a_null_snapshot_field_previews_nothing_test() ->
?assertEqual(
<<>>, build_content_preview(#{<<"content">> => <<>>, <<"message_snapshots">> => null})
).
build_url_dm_test() -> build_url_dm_test() ->
?assertEqual(<<"/channels/@me/456/789">>, build_url(0, 456, 789)). ?assertEqual(<<"/channels/@me/456/789">>, build_url(0, 456, 789)).