Release-Ankündigungen + öffentliche Changelog-Seite
- Gitea-Release-Webhook: Releases werden archiviert (releases-Tabelle) und neue 'published'-Releases als oranges 🚀-Embed mit Buttons angekündigt - Release-Kanal auf der Setup-Seite wählbar (leer = Feature aus) + Test-Button - /changelog: öffentliche Seite mit Tag-Chips, Pre-Release-Badge, Release-Notes - /api/releases öffentlich; Updates/Redeliveries posten nicht doppelt Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
// Release-Ankündigungen: großes Embed in den konfigurierten Kanal (Setup-Seite)
|
||||
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from 'discord.js';
|
||||
import { releaseChannelId } from '../runtime-settings.js';
|
||||
import { config } from '../config.js';
|
||||
|
||||
const BRAND_ORANGE = 0xff4d00;
|
||||
|
||||
/**
|
||||
* 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<boolean>} true, wenn gepostet
|
||||
*/
|
||||
export async function postReleaseEmbed(client, release) {
|
||||
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(BRAND_ORANGE)
|
||||
.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: 'D4RKST3R // RELEASE' })
|
||||
.setTimestamp();
|
||||
|
||||
const buttons = new ActionRowBuilder().addComponents(
|
||||
new ButtonBuilder().setStyle(ButtonStyle.Link).setLabel('Changelog').setEmoji('📋')
|
||||
.setURL(`${config.publicUrl}/changelog`)
|
||||
);
|
||||
if (release.url) {
|
||||
buttons.addComponents(
|
||||
new ButtonBuilder().setStyle(ButtonStyle.Link).setLabel('Release ansehen').setEmoji('🔗')
|
||||
.setURL(release.url)
|
||||
);
|
||||
}
|
||||
|
||||
await channel.send({ embeds: [embed], components: [buttons] });
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user