Rollen-Ping beim Devlog: Erwähnung + Abo-Button

- Setting devlog_ping_role_id (Rollen-Dropdown auf der Setup-Seite, leer = aus)
- Devlog-Post erwähnt die Rolle (allowedMentions gescoped) und trägt einen
  🔔-Button, über den Member die Rolle selbst an-/abmelden (ephemere Bestätigung)
- API liefert vergebbare Rollen (ohne @everyone/managed), PUT validiert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 10:39:06 +02:00
co-authored by Claude Opus 4.8
parent be1fc227d0
commit 247e8c805c
5 changed files with 107 additions and 6 deletions
+34 -2
View File
@@ -1,7 +1,7 @@
// Discord-Client: Commands laden, registrieren und Interactions verarbeiten
import { Client, Collection, Events, GatewayIntentBits, Partials, REST, Routes } from 'discord.js';
import { Client, Collection, Events, GatewayIntentBits, MessageFlags, Partials, REST, Routes } from 'discord.js';
import { config } from '../config.js';
import { devlogChannelId } from '../runtime-settings.js';
import { devlogChannelId, devlogPingRoleId } from '../runtime-settings.js';
import { archiveDevlogMessage, removeDevlog } from './devlog-archive.js';
import * as ping from './commands/ping.js';
import * as devlogBackfill from './commands/devlog-backfill.js';
@@ -58,6 +58,38 @@ export async function startBot() {
});
client.on(Events.InteractionCreate, async (interaction) => {
// 🔔-Button unterm Devlog: Ping-Rolle selbst an-/abmelden
if (interaction.isButton() && interaction.customId === 'devlog_ping_toggle') {
const roleId = devlogPingRoleId();
try {
if (!roleId || !interaction.inGuild()) {
throw new Error('Keine Ping-Rolle konfiguriert');
}
const member = interaction.member;
const hasRole = member.roles.cache.has(roleId);
if (hasRole) {
await member.roles.remove(roleId);
} else {
await member.roles.add(roleId);
}
await interaction.reply({
content: hasRole
? '🔕 Devlog-Benachrichtigungen **abbestellt**.'
: '🔔 Devlog-Benachrichtigungen **abonniert** — du wirst ab jetzt gepingt.',
flags: MessageFlags.Ephemeral,
});
} catch (error) {
console.error('[ping-rolle] Toggle fehlgeschlagen:', error);
await interaction
.reply({
content: '❌ Konnte die Rolle nicht ändern — dem Bot fehlt vermutlich „Rollen verwalten" oder die Rolle steht über seiner.',
flags: MessageFlags.Ephemeral,
})
.catch(() => {});
}
return;
}
if (!interaction.isChatInputCommand()) return;
const command = client.commands.get(interaction.commandName);