// Release-Ankündigungen: großes Embed in den konfigurierten Kanal (Config-Seite) import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from 'discord.js'; import { releaseChannelId, publicUrl, brandColor2, brandFooter } from '../runtime-settings.js'; import { config } from '../config.js'; import { moduleEnabled } from '../modules.js'; /** * Release ankündigen (falls ein Kanal konfiguriert ist). * @param {import('discord.js').Client} client * @param {{ repo: string, tag: string, name: string|null, body: string|null, * url: string|null, prerelease: boolean }} release * @returns {Promise} true, wenn gepostet */ export async function postReleaseEmbed(client, release) { if (!moduleEnabled('releases')) return false; const channelId = releaseChannelId(); if (!channelId) return false; const channel = await client.channels.fetch(channelId); if (!channel?.isTextBased()) { throw new Error(`Release-Kanal ${channelId} nicht gefunden oder kein Textkanal`); } let body = (release.body ?? '').trim(); if (body.length > 3500) body = `${body.slice(0, 3500)}\n… (gekürzt)`; const title = release.name?.trim() || release.tag; const embed = new EmbedBuilder() .setColor(brandColor2()) .setTitle(`🚀 ${title}${release.prerelease ? ' (Pre-Release)' : ''}`) .setDescription(body || '*Keine Release-Notes.*') .addFields({ name: 'Version', value: `\`${release.tag}\``, inline: true }, { name: 'Projekt', value: release.repo, inline: true }) .setFooter({ text: brandFooter('RELEASE'), iconURL: client?.user?.displayAvatarURL?.({ size: 64 }) }) .setTimestamp(); const buttons = new ActionRowBuilder().addComponents( new ButtonBuilder().setStyle(ButtonStyle.Link).setLabel('Changelog').setEmoji('📋') .setURL(`${publicUrl()}/changelog`) ); if (release.url) { buttons.addComponents( new ButtonBuilder().setStyle(ButtonStyle.Link).setLabel('Release ansehen').setEmoji('🔗') .setURL(release.url) ); } const message = await channel.send({ embeds: [embed], components: [buttons] }); const { maybeCrosspost } = await import('../embeds.js'); await maybeCrosspost(message); return true; }