Raid-Sperre von Hand setzen, aufheben oder nachsehen
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Der fehlende Befehl zum Raid-Schutz. Drei Unterbefehle:

  status  ist gerade gesperrt, und wie lange noch
  an      jetzt sperren — fuer die Welle, die man kommen sieht
  aus     sofort aufheben — fuer den Fehlalarm um drei Uhr nachts

Rechte: ManageGuild, weil die Sperre genau das anfasst — Verifizierung und
Invites. Antworten sind ephemeral.

Die Sperr-Massnahmen sind in dichtmachen() herausgezogen, damit automatisch
und von Hand denselben Weg nehmen und sich nicht auseinanderentwickeln. Die
Meldung sagt jeweils dazu, wodurch sie ausgeloest wurde und wer es war.

Ist der Raid-Schutz ausgeschaltet, verweist der Befehl aufs Panel statt
stillschweigend nichts zu tun.

Dazu: der Befehl steht auf der oeffentlichen Befehls-Seite, in beiden
Sprachen, und die Zahl auf der Produktseite geht von 16 auf 17.

Geprueft: 17 Befehle laden, keine doppelten Namen, Rechte-Bitmaske 32
(ManageGuild), alle neuen Exporte vorhanden, kein Sprachschluessel fehlt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-01 04:32:39 +02:00
co-authored by Claude Fable 5
parent aef708c405
commit 91397d8a44
7 changed files with 111 additions and 12 deletions
+60
View File
@@ -0,0 +1,60 @@
// /raid — Raid-Sperre von Hand setzen, aufheben oder nachsehen.
//
// Der Bot sperrt bei einer Beitritts-Welle selbst, aber zwei Fälle braucht
// man von Hand: der Fehlalarm um drei Uhr nachts, und die Welle, die man
// kommen sieht, bevor die Schwelle reißt.
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from 'discord.js';
import { sperrenVonHand, entsperren, sperrStand } from '../anti-raid.js';
import { moduleEnabled } from '../../modules.js';
import { tuning } from '../../tuning.js';
export const data = new SlashCommandBuilder()
.setName('raid')
.setDescription('Raid-Sperre setzen, aufheben oder Stand ansehen')
// ManageGuild, weil die Sperre genau das anfasst: Verifizierung und Invites
.setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild)
.addSubcommand((s) => s.setName('status').setDescription('Ist gerade gesperrt?'))
.addSubcommand((s) => s.setName('an').setDescription('Jetzt sperren'))
.addSubcommand((s) => s.setName('aus').setDescription('Sperre sofort aufheben'));
export async function execute(interaction) {
const was = interaction.options.getSubcommand();
await interaction.deferReply({ flags: MessageFlags.Ephemeral });
if (!moduleEnabled('anti_raid')) {
await interaction.editReply(
'⚠️ Der Raid-Schutz ist ausgeschaltet. Einschalten im Panel unter **Support → Raid-Schutz**.'
);
return;
}
const stand = sperrStand();
if (was === 'status') {
await interaction.editReply(stand.gesperrt
? `🔒 **Gesperrt** — läuft <t:${Math.floor(stand.bis / 1000)}:R> ab.`
: `🔓 **Offen.** Sperre greift ab **${tuning('raid_joins')} Beitritten** in `
+ `**${tuning('raid_window')} Sekunden**.`);
return;
}
if (was === 'an') {
if (stand.gesperrt) {
await interaction.editReply(`🔒 Ist schon gesperrt — läuft <t:${Math.floor(stand.bis / 1000)}:R> ab.`);
return;
}
const erg = await sperrenVonHand(interaction.client, interaction.guild, interaction.user.username);
await interaction.editReply(erg.getan.length
? `🔒 Gesperrt für **${erg.minuten} Minuten**:\n${erg.getan.map((g) => `${g}`).join('\n')}`
: '❌ Keine Maßnahme griff — fehlt dem Bot das Recht „Server verwalten"?');
return;
}
// aus
if (!stand.gesperrt) {
await interaction.editReply('🔓 Es ist gerade nichts gesperrt.');
return;
}
await entsperren(interaction.client, { durch: interaction.user.username });
await interaction.editReply('🔓 Sperre aufgehoben.');
}