New servers get it with the starter list. Existing servers get it once on
update; an entry the admin already has for it (allowed or blocked) is left as
it is, and removing it afterwards sticks.
Promotion bots (CouchBot and friends) type the ping line and put the stream link, title, and thumbnail in a rich embed. Ferry only read the embed when the Discord message had no text, so Haven got "X is live" with nothing to click or look at. Rich embeds are now read alongside the typed text, the promoted link is policy-checked on its own so an allowlist server drops the link and keeps the announcement, and Discord's own unfurls of typed links stay ignored.
The previous commit cited #5540 for the Discord-to-Haven image bug. #5540 is
about dynamic bot voice audio and has nothing to do with it; the bug was
reported directly rather than through an issue. The comments no longer point
anywhere misleading.
Images posted on Discord never arrived in Haven, and neither did the message
they came with. Haven to Discord was fine, which is what made it look like one
direction of the bridge was simply not wired up.
Ferry relays an attachment as a link to Discord's CDN, built from Discord's own
API response. Haven's link filter is set to an allowlist by default and that
list does not carry cdn.discordapp.com or media.discordapp.net, so the check
failed and Ferry threw the whole relayed message away, the author's text along
with the picture.
The filter now sees only what the Discord author actually typed. Attachment and
sticker URLs are added after it runs, since nobody typed them and they are not
a link anyone chose to post. Somebody pasting a blocked domain on Discord is
still filtered exactly as before, image attached or not.
Adding Discord's CDN to the seeded allowlist would also have cleared the symptom,
but it would open that domain to every member of the server rather than to the
bridge, and it would not have helped any server already past the one-time seed.
The existing ferry tests run without a database, so automod short-circuits to
"allowed" and never exercised this path, which is how it got through. The new
test file loads Ferry against a stubbed automod that is switched on and carrying
the real seeded allowlist, and it fails against the previous code.