Enhance ESLint configuration and update component destructuring for improved code quality
- Added a rule to allow unused variables prefixed with an underscore in ESLint configuration. - Updated destructuring in leveling-form, logging-form, moderation-form, and welcome-form components to prefix unused variables with an underscore, improving clarity and adherence to ESLint rules. - Expanded German and English localization files with new moderation, auto-moderation, logging, welcome, verification, leveling, economy, and fun module settings for better user experience.
This commit is contained in:
@@ -20,6 +20,16 @@ const eslintConfig = [
|
||||
"next-env.d.ts",
|
||||
],
|
||||
},
|
||||
{
|
||||
rules: {
|
||||
// Allow intentionally unused variables (e.g. destructuring to strip fields)
|
||||
// when prefixed with an underscore.
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
"warn",
|
||||
{ varsIgnorePattern: "^_", argsIgnorePattern: "^_" },
|
||||
],
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
export default eslintConfig;
|
||||
|
||||
@@ -77,7 +77,7 @@ async function saveLeveling(guildId: string, value: LocalLevelingValue): Promise
|
||||
return { ok: false, error: channelMultipliers.error };
|
||||
}
|
||||
|
||||
const { noXpChannelIdsText, noXpRoleIdsText, roleMultipliersText, channelMultipliersText, ...rest } = value;
|
||||
const { noXpChannelIdsText, noXpRoleIdsText, roleMultipliersText: _roleMultipliersText, channelMultipliersText: _channelMultipliersText, ...rest } = value;
|
||||
|
||||
const payload: LevelingConfigDashboard = {
|
||||
...rest,
|
||||
|
||||
@@ -82,7 +82,7 @@ function toRemote(value: LocalLoggingValue): LoggingConfigDashboard {
|
||||
ignoreBots: value.ignoreBots,
|
||||
ignoredChannelIds: fromCsv(value.ignoredChannelIdsText),
|
||||
ignoredRoleIds: fromCsv(value.ignoredRoleIdsText),
|
||||
logChannels: value.logChannels.map(({ clientKey, ...rest }) => rest)
|
||||
logChannels: value.logChannels.map(({ clientKey: _clientKey, ...rest }) => rest)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ function toLocal(rules: EscalationRuleDashboard[]): LocalEscalation[] {
|
||||
}
|
||||
|
||||
function toRemote(rules: LocalEscalation[]): EscalationRuleDashboard[] {
|
||||
return rules.map(({ clientKey, ...rest }) => rest);
|
||||
return rules.map(({ clientKey: _clientKey, ...rest }) => rest);
|
||||
}
|
||||
|
||||
async function saveModeration(guildId: string, value: ModerationDashboard): Promise<SettingsSaveResult> {
|
||||
|
||||
@@ -70,7 +70,7 @@ async function saveWelcome(guildId: string, value: LocalWelcomeValue): Promise<S
|
||||
return { ok: false, error: leaveEmbed.error };
|
||||
}
|
||||
|
||||
const { userAutoroleIdsText, botAutoroleIdsText, welcomeEmbedText, leaveEmbedText, ...rest } = value;
|
||||
const { userAutoroleIdsText, botAutoroleIdsText, welcomeEmbedText: _welcomeEmbedText, leaveEmbedText: _leaveEmbedText, ...rest } = value;
|
||||
|
||||
const payload: WelcomeConfigDashboard = {
|
||||
...rest,
|
||||
|
||||
@@ -119,9 +119,159 @@
|
||||
},
|
||||
"modulePlaceholder": {
|
||||
"title": "{module}-Einstellungen",
|
||||
"message": "Modul-Einstellungen kommen in Phase 7.",
|
||||
"message": "Modul-Einstellungen kommen in einer späteren Phase.",
|
||||
"backToModules": "Zurück zu den Modulen"
|
||||
},
|
||||
"modulePages": {
|
||||
"moderation": {
|
||||
"title": "Moderation",
|
||||
"description": "Aktiviere das Moderations-Modul und konfiguriere automatische Eskalationsregeln.",
|
||||
"enabledLabel": "Moderations-Modul aktiviert",
|
||||
"enabledHint": "Aktiviert Ban, Kick, Warn, Purge und das Fall-System auf diesem Server.",
|
||||
"escalationsTitle": "Eskalationsregeln",
|
||||
"escalationsDescription": "Automatische Strafen ab einer bestimmten Anzahl an Verwarnungen.",
|
||||
"noEscalations": "Keine Eskalationsregeln konfiguriert.",
|
||||
"addEscalation": "Regel hinzufügen",
|
||||
"warnCount": "Anzahl Verwarnungen",
|
||||
"action": "Aktion",
|
||||
"actions": { "TIMEOUT": "Timeout", "KICK": "Kick", "BAN": "Ban" },
|
||||
"durationMs": "Dauer (ms)",
|
||||
"reason": "Grund",
|
||||
"reasonPlaceholder": "Optionaler Standardgrund",
|
||||
"casesTitle": "Fälle",
|
||||
"casesDescription": "Liste der zuletzt erstellten Moderations-Fälle (nur Lesezugriff).",
|
||||
"searchPlaceholder": "Suche nach User- oder Moderator-ID / Grund",
|
||||
"actionPlaceholder": "Aktion filtern, z. B. BAN",
|
||||
"casesEmpty": "Keine Fälle gefunden.",
|
||||
"target": "Ziel",
|
||||
"moderator": "Moderator",
|
||||
"createdAt": "Erstellt am",
|
||||
"noReason": "Kein Grund angegeben"
|
||||
},
|
||||
"automod": {
|
||||
"title": "Auto-Moderation",
|
||||
"description": "Grundeinstellungen sowie Anti-Raid- und Anti-Nuke-Schutz.",
|
||||
"enabledLabel": "Auto-Moderation aktiviert",
|
||||
"enabledHint": "Aktiviert alle Auto-Moderations-Regeln (Spam, Wortfilter, Links, …) auf diesem Server.",
|
||||
"antiRaidTitle": "Anti-Raid",
|
||||
"antiRaidDescription": "Erkennt ungewöhnlich schnelle Join-Wellen und aktiviert automatisch einen Lockdown.",
|
||||
"antiRaidEnabled": "Anti-Raid aktiviert",
|
||||
"antiRaidJoinThreshold": "Schwellenwert (Joins)",
|
||||
"antiRaidWindowSeconds": "Zeitfenster (Sekunden)",
|
||||
"antiRaidActionHint": "Aktuell implementierte Reaktion: Server-Lockdown.",
|
||||
"antiNukeTitle": "Anti-Nuke",
|
||||
"antiNukeDescription": "Schützt vor Massen-Bans oder Massen-Kanal-Löschungen durch kompromittierte Accounts.",
|
||||
"antiNukeEnabled": "Anti-Nuke aktiviert",
|
||||
"antiNukeBanThreshold": "Schwellenwert (Bans)",
|
||||
"antiNukeChannelThreshold": "Schwellenwert (Kanal-Löschungen)",
|
||||
"antiNukeWindowSeconds": "Zeitfenster (Sekunden)",
|
||||
"lockdownActive": "Lockdown aktiv",
|
||||
"lockdownActiveHint": "Wird automatisch bei einem erkannten Raid gesetzt. Manuell zurücksetzen, um den Lockdown zu beenden."
|
||||
},
|
||||
"logging": {
|
||||
"title": "Logging",
|
||||
"description": "Log-Kanäle, Ignore-Listen und die Event-zu-Kanal-Zuordnung.",
|
||||
"enabledLabel": "Logging aktiviert",
|
||||
"ignoreBotsLabel": "Bot-Nachrichten/-Aktionen ignorieren",
|
||||
"ignoredChannelsLabel": "Ignorierte Kanäle",
|
||||
"ignoredRolesLabel": "Ignorierte Rollen",
|
||||
"idsPlaceholder": "Kommagetrennte IDs, z. B. 123456789012345678, 234567890123456789",
|
||||
"idsHint": "Discord-IDs kommagetrennt eintragen. Entwicklermodus aktivieren, um IDs zu kopieren.",
|
||||
"channelsTitle": "Event-Kanal-Zuordnung",
|
||||
"channelsDescription": "Lege für jeden Event-Typ einen eigenen Log-Kanal fest.",
|
||||
"channelsEmpty": "Keine Event-Kanal-Zuordnungen konfiguriert.",
|
||||
"eventType": "Event-Typ",
|
||||
"channelId": "Kanal-ID",
|
||||
"addMapping": "Zuordnung hinzufügen"
|
||||
},
|
||||
"welcome": {
|
||||
"welcomeTitle": "Willkommen",
|
||||
"welcomeDescription": "Nachricht, Kanal und Autoroles für neue Mitglieder.",
|
||||
"welcomeEnabledLabel": "Willkommensnachricht aktiviert",
|
||||
"welcomeChannelId": "Willkommens-Kanal-ID",
|
||||
"welcomeType": "Nachrichtentyp",
|
||||
"type": { "TEXT": "Text", "EMBED": "Embed", "IMAGE": "Bild-Karte" },
|
||||
"welcomeContent": "Nachrichtentext",
|
||||
"contentPlaceholder": "Willkommen {user} auf {server}!",
|
||||
"placeholdersHint": "Verfügbare Platzhalter: {user}, {user.name}, {user.tag}, {user.id}, {server}, {memberCount}",
|
||||
"welcomeEmbed": "Embed (JSON, optional)",
|
||||
"welcomeDmEnabled": "Willkommens-DM aktiviert",
|
||||
"dmContentPlaceholder": "Optionale private Nachricht an neue Mitglieder",
|
||||
"userAutoroles": "Autoroles für Nutzer",
|
||||
"botAutoroles": "Autoroles für Bots",
|
||||
"imageTitle": "Bild-Karte: Titel",
|
||||
"imageSubtitle": "Bild-Karte: Untertitel",
|
||||
"leaveTitle": "Abschied",
|
||||
"leaveDescription": "Nachricht und Kanal, wenn ein Mitglied den Server verlässt.",
|
||||
"leaveEnabledLabel": "Abschiedsnachricht aktiviert",
|
||||
"leaveChannelId": "Abschieds-Kanal-ID",
|
||||
"leaveContent": "Nachrichtentext",
|
||||
"leaveEmbed": "Embed (JSON, optional)"
|
||||
},
|
||||
"verification": {
|
||||
"title": "Verifizierung",
|
||||
"description": "Modus, Rollen und Anforderungen für die Mitglieder-Verifizierung.",
|
||||
"enabledLabel": "Verifizierung aktiviert",
|
||||
"mode": "Modus",
|
||||
"mode.BUTTON": "Button",
|
||||
"mode.CAPTCHA": "Captcha (WebUI)",
|
||||
"failAction": "Aktion bei Fehlschlag",
|
||||
"failAction.KICK": "Kick",
|
||||
"failAction.BAN": "Ban",
|
||||
"failAction.NONE": "Keine",
|
||||
"channelId": "Verifizierungs-Kanal-ID",
|
||||
"verifiedRoleId": "Rolle nach Verifizierung",
|
||||
"unverifiedRoleId": "Rolle vor Verifizierung",
|
||||
"minAccountAgeDays": "Mindest-Accountalter (Tage)"
|
||||
},
|
||||
"leveling": {
|
||||
"title": "Leveling & XP",
|
||||
"description": "Text- und Voice-XP-Raten, Cooldowns und No-XP-Listen.",
|
||||
"enabledLabel": "Leveling aktiviert",
|
||||
"textXpMin": "Text-XP (Minimum)",
|
||||
"textXpMax": "Text-XP (Maximum)",
|
||||
"textCooldownSeconds": "Text-XP-Cooldown (Sekunden)",
|
||||
"voiceXpPerMinute": "Voice-XP pro Minute",
|
||||
"noXpChannels": "No-XP-Kanäle",
|
||||
"noXpRoles": "No-XP-Rollen",
|
||||
"roleMultipliers": "Rollen-Multiplikatoren",
|
||||
"channelMultipliers": "Kanal-Multiplikatoren",
|
||||
"multiplierHint": "Ein Eintrag pro Zeile im Format ID:Multiplikator, z. B. 123456789012345678:1.5",
|
||||
"levelUpTitle": "Level-Up-Nachricht",
|
||||
"levelUpMode": "Modus",
|
||||
"mode.CHANNEL": "Kanal",
|
||||
"mode.DM": "Direktnachricht",
|
||||
"mode.OFF": "Aus",
|
||||
"levelUpChannelId": "Level-Up-Kanal-ID",
|
||||
"levelUpMessage": "Nachrichtentext",
|
||||
"stackRewards": "Rollen-Belohnungen stapeln",
|
||||
"rankCardTitle": "Rang-Karte",
|
||||
"cardAccentColor": "Akzentfarbe",
|
||||
"cardBackgroundColor": "Hintergrundfarbe"
|
||||
},
|
||||
"economy": {
|
||||
"title": "Economy",
|
||||
"description": "Währung und Beträge der Einkommens-Commands.",
|
||||
"enabledLabel": "Economy aktiviert",
|
||||
"currencyName": "Währungsname",
|
||||
"currencySymbol": "Währungssymbol",
|
||||
"amountsTitle": "Beträge",
|
||||
"dailyAmount": "Tägliche Belohnung",
|
||||
"weeklyAmount": "Wöchentliche Belohnung",
|
||||
"workMin": "Work: Minimum",
|
||||
"workMax": "Work: Maximum",
|
||||
"workCooldownSeconds": "Work-Cooldown (Sekunden)",
|
||||
"startingBalance": "Startguthaben"
|
||||
},
|
||||
"fun": {
|
||||
"title": "Fun & Spiele",
|
||||
"description": "Minispiele und Medien-Commands für diesen Server.",
|
||||
"enabledLabel": "Fun-Modul aktiviert",
|
||||
"enabledHint": "Aktiviert Minispiele wie Trivia, Tic-Tac-Toe und 8-Ball.",
|
||||
"mediaEnabledLabel": "Medien-Commands aktiviert",
|
||||
"mediaEnabledHint": "Aktiviert API-basierte Commands wie /cat und /dog."
|
||||
}
|
||||
},
|
||||
"userMenu": {
|
||||
"theme": "Design",
|
||||
"themeDark": "Dunkel",
|
||||
|
||||
@@ -119,9 +119,159 @@
|
||||
},
|
||||
"modulePlaceholder": {
|
||||
"title": "{module} settings",
|
||||
"message": "Module settings arrive in Phase 7.",
|
||||
"message": "Module settings arrive in a later phase.",
|
||||
"backToModules": "Back to modules"
|
||||
},
|
||||
"modulePages": {
|
||||
"moderation": {
|
||||
"title": "Moderation",
|
||||
"description": "Enable the moderation module and configure automatic escalation rules.",
|
||||
"enabledLabel": "Moderation module enabled",
|
||||
"enabledHint": "Enables ban, kick, warn, purge and the case system on this server.",
|
||||
"escalationsTitle": "Escalation rules",
|
||||
"escalationsDescription": "Automatic penalties once a member reaches a certain number of warnings.",
|
||||
"noEscalations": "No escalation rules configured.",
|
||||
"addEscalation": "Add rule",
|
||||
"warnCount": "Warning count",
|
||||
"action": "Action",
|
||||
"actions": { "TIMEOUT": "Timeout", "KICK": "Kick", "BAN": "Ban" },
|
||||
"durationMs": "Duration (ms)",
|
||||
"reason": "Reason",
|
||||
"reasonPlaceholder": "Optional default reason",
|
||||
"casesTitle": "Cases",
|
||||
"casesDescription": "List of the most recent moderation cases (read-only).",
|
||||
"searchPlaceholder": "Search by user/moderator ID or reason",
|
||||
"actionPlaceholder": "Filter by action, e.g. BAN",
|
||||
"casesEmpty": "No cases found.",
|
||||
"target": "Target",
|
||||
"moderator": "Moderator",
|
||||
"createdAt": "Created at",
|
||||
"noReason": "No reason provided"
|
||||
},
|
||||
"automod": {
|
||||
"title": "Auto-Moderation",
|
||||
"description": "Base settings plus anti-raid and anti-nuke protection.",
|
||||
"enabledLabel": "Auto-moderation enabled",
|
||||
"enabledHint": "Enables all auto-moderation rules (spam, word filter, links, …) on this server.",
|
||||
"antiRaidTitle": "Anti-Raid",
|
||||
"antiRaidDescription": "Detects unusually fast join waves and automatically activates a lockdown.",
|
||||
"antiRaidEnabled": "Anti-raid enabled",
|
||||
"antiRaidJoinThreshold": "Join threshold",
|
||||
"antiRaidWindowSeconds": "Time window (seconds)",
|
||||
"antiRaidActionHint": "Currently implemented response: server lockdown.",
|
||||
"antiNukeTitle": "Anti-Nuke",
|
||||
"antiNukeDescription": "Protects against mass bans or mass channel deletions by compromised accounts.",
|
||||
"antiNukeEnabled": "Anti-nuke enabled",
|
||||
"antiNukeBanThreshold": "Ban threshold",
|
||||
"antiNukeChannelThreshold": "Channel deletion threshold",
|
||||
"antiNukeWindowSeconds": "Time window (seconds)",
|
||||
"lockdownActive": "Lockdown active",
|
||||
"lockdownActiveHint": "Automatically set when a raid is detected. Toggle off manually to end the lockdown."
|
||||
},
|
||||
"logging": {
|
||||
"title": "Logging",
|
||||
"description": "Log channels, ignore lists and the event-to-channel mapping.",
|
||||
"enabledLabel": "Logging enabled",
|
||||
"ignoreBotsLabel": "Ignore bot messages/actions",
|
||||
"ignoredChannelsLabel": "Ignored channels",
|
||||
"ignoredRolesLabel": "Ignored roles",
|
||||
"idsPlaceholder": "Comma-separated IDs, e.g. 123456789012345678, 234567890123456789",
|
||||
"idsHint": "Enter Discord IDs, comma-separated. Enable Developer Mode to copy IDs.",
|
||||
"channelsTitle": "Event-channel mapping",
|
||||
"channelsDescription": "Assign a dedicated log channel for each event type.",
|
||||
"channelsEmpty": "No event-channel mappings configured.",
|
||||
"eventType": "Event type",
|
||||
"channelId": "Channel ID",
|
||||
"addMapping": "Add mapping"
|
||||
},
|
||||
"welcome": {
|
||||
"welcomeTitle": "Welcome",
|
||||
"welcomeDescription": "Message, channel and autoroles for new members.",
|
||||
"welcomeEnabledLabel": "Welcome message enabled",
|
||||
"welcomeChannelId": "Welcome channel ID",
|
||||
"welcomeType": "Message type",
|
||||
"type": { "TEXT": "Text", "EMBED": "Embed", "IMAGE": "Image card" },
|
||||
"welcomeContent": "Message content",
|
||||
"contentPlaceholder": "Welcome {user} to {server}!",
|
||||
"placeholdersHint": "Available placeholders: {user}, {user.name}, {user.tag}, {user.id}, {server}, {memberCount}",
|
||||
"welcomeEmbed": "Embed (JSON, optional)",
|
||||
"welcomeDmEnabled": "Welcome DM enabled",
|
||||
"dmContentPlaceholder": "Optional private message to new members",
|
||||
"userAutoroles": "Autoroles for users",
|
||||
"botAutoroles": "Autoroles for bots",
|
||||
"imageTitle": "Image card: title",
|
||||
"imageSubtitle": "Image card: subtitle",
|
||||
"leaveTitle": "Leave",
|
||||
"leaveDescription": "Message and channel when a member leaves the server.",
|
||||
"leaveEnabledLabel": "Leave message enabled",
|
||||
"leaveChannelId": "Leave channel ID",
|
||||
"leaveContent": "Message content",
|
||||
"leaveEmbed": "Embed (JSON, optional)"
|
||||
},
|
||||
"verification": {
|
||||
"title": "Verification",
|
||||
"description": "Mode, roles and requirements for member verification.",
|
||||
"enabledLabel": "Verification enabled",
|
||||
"mode": "Mode",
|
||||
"mode.BUTTON": "Button",
|
||||
"mode.CAPTCHA": "Captcha (WebUI)",
|
||||
"failAction": "Action on failure",
|
||||
"failAction.KICK": "Kick",
|
||||
"failAction.BAN": "Ban",
|
||||
"failAction.NONE": "None",
|
||||
"channelId": "Verification channel ID",
|
||||
"verifiedRoleId": "Role after verification",
|
||||
"unverifiedRoleId": "Role before verification",
|
||||
"minAccountAgeDays": "Minimum account age (days)"
|
||||
},
|
||||
"leveling": {
|
||||
"title": "Leveling & XP",
|
||||
"description": "Text and voice XP rates, cooldowns and no-XP lists.",
|
||||
"enabledLabel": "Leveling enabled",
|
||||
"textXpMin": "Text XP (minimum)",
|
||||
"textXpMax": "Text XP (maximum)",
|
||||
"textCooldownSeconds": "Text XP cooldown (seconds)",
|
||||
"voiceXpPerMinute": "Voice XP per minute",
|
||||
"noXpChannels": "No-XP channels",
|
||||
"noXpRoles": "No-XP roles",
|
||||
"roleMultipliers": "Role multipliers",
|
||||
"channelMultipliers": "Channel multipliers",
|
||||
"multiplierHint": "One entry per line in the format id:multiplier, e.g. 123456789012345678:1.5",
|
||||
"levelUpTitle": "Level-up message",
|
||||
"levelUpMode": "Mode",
|
||||
"mode.CHANNEL": "Channel",
|
||||
"mode.DM": "Direct message",
|
||||
"mode.OFF": "Off",
|
||||
"levelUpChannelId": "Level-up channel ID",
|
||||
"levelUpMessage": "Message content",
|
||||
"stackRewards": "Stack role rewards",
|
||||
"rankCardTitle": "Rank card",
|
||||
"cardAccentColor": "Accent color",
|
||||
"cardBackgroundColor": "Background color"
|
||||
},
|
||||
"economy": {
|
||||
"title": "Economy",
|
||||
"description": "Currency and amounts for the income commands.",
|
||||
"enabledLabel": "Economy enabled",
|
||||
"currencyName": "Currency name",
|
||||
"currencySymbol": "Currency symbol",
|
||||
"amountsTitle": "Amounts",
|
||||
"dailyAmount": "Daily reward",
|
||||
"weeklyAmount": "Weekly reward",
|
||||
"workMin": "Work: minimum",
|
||||
"workMax": "Work: maximum",
|
||||
"workCooldownSeconds": "Work cooldown (seconds)",
|
||||
"startingBalance": "Starting balance"
|
||||
},
|
||||
"fun": {
|
||||
"title": "Fun & Games",
|
||||
"description": "Mini games and media commands for this server.",
|
||||
"enabledLabel": "Fun module enabled",
|
||||
"enabledHint": "Enables mini games like trivia, tic-tac-toe and 8-ball.",
|
||||
"mediaEnabledLabel": "Media commands enabled",
|
||||
"mediaEnabledHint": "Enables API-based commands like /cat and /dog."
|
||||
}
|
||||
},
|
||||
"userMenu": {
|
||||
"theme": "Theme",
|
||||
"themeDark": "Dark",
|
||||
|
||||
Reference in New Issue
Block a user