Logo auf der Willkommens-Karte und in geteilten Links
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Zwei Stellen, an denen die Marke bisher fehlte.

Willkommens-Karte: Das Wasserzeichen war der Markenname als Text mit 5 %
Deckkraft — jetzt der Katzenkopf. Die Datei wird einmal beim Start gelesen
statt bei jedem Beitritt, und fehlt sie, rendert die Karte wie bisher ohne
Wasserzeichen. Der Schalter heisst entsprechend "Logo im Hintergrund".

Link-Vorschau: og:image war nur gesetzt, wenn ein Devlog einen Screenshot
hatte. Startseite, Roadmap, Funktionen und jedes Devlog ohne Bild kamen in
Discord als graue Textzeile. Jetzt faellt alles ohne eigenes Bild auf
og-default.png zurueck (1200x630, Lockup auf Schwarz mit Akzentstreifen),
und twitter:card ist durchgehend summary_large_image.

Die Laufzeit-Datei liegt unter src/bot/assets/, nicht in docs/ — das
Dockerfile kopiert nur src/ und frontend/dist/.

Geprueft: librsvg zeichnet das eingebettete <image> wirklich (42726 Pixel
unterscheiden sich gegen eine Fassung ohne), das OG-Bild landet im dist.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-01 03:55:28 +02:00
co-authored by Claude Fable 5
parent 6a47cb43ab
commit c0a56c1eb5
7 changed files with 77 additions and 8 deletions
+18 -4
View File
@@ -1,13 +1,27 @@
// Willkommens-Karte: gerendertes PNG (SVG → sharp). Aussehen kommt aus den
// Einstellungen (Config → Support → Willkommens-Karte), die Standardwerte sind
// der Marken-Look: Avatar mit Neon-Ring, großer Schriftzug, Member-Nummer.
import { readFileSync } from 'node:fs';
import sharp from 'sharp';
import { brandName, welcomeCard } from '../runtime-settings.js';
import { welcomeCard } from '../runtime-settings.js';
const W = 900;
const H = 300;
const MAX_IMAGE_BYTES = 8 * 1024 * 1024;
// Marke fürs Wasserzeichen: einmal beim Start lesen, nicht bei jedem Beitritt.
// Fehlt die Datei, bleibt die Karte einfach ohne — wie bei den anderen Bildern
// hier auch soll ein fehlendes Detail nicht die ganze Karte kosten.
// Erzeugt von docs/brand/build.py.
const MARK_URI = (() => {
try {
const pfad = new URL('./assets/mark-card.png', import.meta.url);
return `data:image/png;base64,${readFileSync(pfad).toString('base64')}`;
} catch {
return '';
}
})();
/** XML-Sonderzeichen im Usernamen entschärfen */
function esc(s) {
return String(s).replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;')
@@ -80,9 +94,9 @@ export async function buildWelcomeCard({ username, avatarUrl, memberNumber }, ov
? `<image href="${bgData}" x="0" y="0" width="${W}" height="${H}" clip-path="url(#card)" preserveAspectRatio="xMidYMid slice"/>`
: ''}
${veil}
${look.watermark
? `<text x="${W - 18}" y="${H - 24}" text-anchor="end" font-family="DejaVu Sans, sans-serif" font-weight="bold"
font-size="120" fill="${look.accent}" fill-opacity=".05">${esc(brandName())}</text>`
${look.watermark && MARK_URI
? `<image href="${MARK_URI}" x="${W - 300}" y="5" width="290" height="290" opacity=".08"
preserveAspectRatio="xMidYMid meet"/>`
: ''}
<rect x="0" y="0" width="${W}" height="3" fill="url(#line)"/>
<rect x="0" y="${H - 3}" width="${W}" height="3" fill="url(#line)"/>