Vollständiger 1:1-Port des cloudflare-worker/ (dogfather-universe-postfach) auf server-internal/: Bewerbungs-Postfach mit Rollen/Rechten, Team- Zugangsverwaltung (verschlüsselte Owner-only-Codes), DogiCrew-Supporter-Abo (PayPal Subscriptions, Google-Login, Resend-E-Mail, 30-Monats-Prämienzyklus) und automatische TikTok-Live-Erkennung. D1 -> better-sqlite3, Cloudflare- Cron -> node-cron. Läuft ohne gesetzte Secrets weiter (PayPal/Google/Resend/ Ticketanizer/Discord bleiben "nicht konfiguriert" statt kaputt), bis die echten Zugangsdaten eingetragen werden.
69 lines
2.7 KiB
JavaScript
69 lines
2.7 KiB
JavaScript
/* =====================================================================
|
|
lib/discord-webhooks.js — Bewerbungen als Discord-Nachricht posten.
|
|
1:1 portiert aus cloudflare-worker/src/lib/discord-webhooks.js
|
|
(reines fetch(), env.X → process.env.X).
|
|
===================================================================== */
|
|
|
|
const WEBHOOK_ENV_KEYS = {
|
|
modi: "DISCORD_WEBHOOK_MODI",
|
|
kooperation: "DISCORD_WEBHOOK_KOOPERATION",
|
|
scout: "DISCORD_WEBHOOK_SCOUT_MANAGER",
|
|
creator: "DISCORD_WEBHOOK_SCOUT_MANAGER",
|
|
};
|
|
|
|
const TYPE_LABELS = {
|
|
modi: "🩵 Neue Bewerbung — Modi (Team Dogi)",
|
|
kooperation: "🤝 Neue Kooperationsanfrage",
|
|
scout: "🔎 Neue Bewerbung — Scout (Spicy Media)",
|
|
creator: "🎬 Neue Bewerbung — Creator / Manager-Bewerbung (Spicy Media)",
|
|
};
|
|
|
|
const TYPE_COLORS = { modi: 0x8fd9ea, kooperation: 0x8b5cf6, scout: 0xd94a5c, creator: 0xd94a5c };
|
|
|
|
const FIELD_LABELS = {
|
|
name: "Name", email: "E-Mail", kontakt: "Kontakt (Discord/TikTok)", erfahrung: "Erfahrung",
|
|
verfuegbarkeit: "Verfügbarkeit", warum: "Warum möchtest du dabei sein?", platform: "Plattform",
|
|
content: "Content-Art", firma: "Firma / Projekt", idee: "Idee / Anliegen",
|
|
};
|
|
|
|
function feldWert(wert) {
|
|
const text = String(wert ?? "").trim();
|
|
if (!text) return "_(leer)_";
|
|
return text.length > 1000 ? text.slice(0, 1000) + "…" : text;
|
|
}
|
|
|
|
export async function bewerbungAlsDiscordNachrichtPosten(type, data) {
|
|
const envKey = WEBHOOK_ENV_KEYS[type];
|
|
const webhookUrl = envKey && process.env[envKey];
|
|
if (!webhookUrl) {
|
|
console.error(`[discord-webhook] Keine Webhook-URL für "${type}" hinterlegt (${envKey}) — übersprungen.`);
|
|
return;
|
|
}
|
|
|
|
const fields = Object.entries(data || {})
|
|
.filter(([, v]) => String(v ?? "").trim() !== "")
|
|
.map(([key, value]) => ({ name: FIELD_LABELS[key] || key, value: feldWert(value), inline: String(value).length < 40 }));
|
|
|
|
const embed = {
|
|
title: TYPE_LABELS[type] || "Neue Bewerbung",
|
|
color: TYPE_COLORS[type] ?? 0x8fd9ea,
|
|
fields: fields.length ? fields : [{ name: "Hinweis", value: "Keine Angaben übermittelt." }],
|
|
footer: { text: "DOGFATHER UNIVERSE — automatisch von der Homepage" },
|
|
timestamp: new Date().toISOString(),
|
|
};
|
|
|
|
try {
|
|
const antwort = await fetch(webhookUrl, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ embeds: [embed] }),
|
|
});
|
|
if (!antwort.ok) {
|
|
const antwortText = await antwort.text().catch(() => "");
|
|
console.error(`[discord-webhook] Fehler beim Posten (${type}): HTTP ${antwort.status} — ${antwortText}`);
|
|
}
|
|
} catch (fehler) {
|
|
console.error(`[discord-webhook] Ausnahme beim Posten (${type}):`, fehler && fehler.message);
|
|
}
|
|
}
|