Add stats, feeds, scheduler, and guild backup features to the bot

- Introduced new models in the Prisma schema for statistics, social feeds, scheduled messages, and guild backups, enhancing the bot's functionality.
- Implemented command modules for managing stats channels, feeds, scheduling messages, and creating/restoring backups, improving user engagement and server management.
- Updated job handling to include dedicated workers for stats updates, feed polling, scheduling, and backup restoration, enhancing automation.
- Enhanced command localization for new features in both German and English.
- Documented the new features and their setup processes in PHASE-TRACKING.md for clarity on implementation steps.
This commit is contained in:
smueller
2026-07-22 13:36:39 +02:00
parent 52b10c9536
commit 12066befa8
36 changed files with 4032 additions and 42 deletions

View File

@@ -963,6 +963,58 @@ export const commandLocales = {
de: 'Nachrichtenvorlage ({user}, {age})',
en: 'Message template ({user}, {age})'
},
'stats.description': {
de: 'Server-Statistik-Kanäle verwalten',
en: 'Manage server statistics channels'
},
'stats.setup.description': {
de: 'Statistik-Kanäle einrichten',
en: 'Configure statistics channels'
},
'stats.setup.options.members_channel': {
de: 'Kanal für Mitgliederzahl',
en: 'Channel for member count'
},
'stats.setup.options.online_channel': {
de: 'Kanal für Online-Anzahl',
en: 'Channel for online count'
},
'stats.setup.options.boosts_channel': {
de: 'Kanal für Boost-Anzahl',
en: 'Channel for boost count'
},
'stats.setup.options.members_template': {
de: 'Vorlage Mitglieder ({count})',
en: 'Members template ({count})'
},
'stats.setup.options.online_template': {
de: 'Vorlage Online ({count})',
en: 'Online template ({count})'
},
'stats.setup.options.boosts_template': {
de: 'Vorlage Boosts ({count})',
en: 'Boosts template ({count})'
},
'stats.refresh.description': {
de: 'Statistik-Kanäle jetzt aktualisieren',
en: 'Refresh statistics channels now'
},
'invites.description': {
de: 'Invite-Statistiken anzeigen',
en: 'Show invite statistics'
},
'invites.view.description': {
de: 'Invite-Statistik eines Nutzers anzeigen',
en: 'Show invite stats for a user'
},
'invites.view.options.user': {
de: 'Nutzer (Standard: du)',
en: 'User (defaults to you)'
},
'invites.leaderboard.description': {
de: 'Top-Einlader anzeigen',
en: 'Show top inviters'
},
'tempvoice.description': {
de: 'Temp-Voice (Join to Create) steuern',
en: 'Control temp voice (join to create)'
@@ -1194,6 +1246,158 @@ export const commandLocales = {
'tag.choice.response_type.embed': {
de: 'Embed',
en: 'Embed'
},
'feeds.description': {
de: 'Social-Feeds verwalten',
en: 'Manage social feeds'
},
'feeds.add.description': {
de: 'Feed hinzufügen',
en: 'Add feed'
},
'feeds.add.options.type': {
de: 'Feed-Typ',
en: 'Feed type'
},
'feeds.add.options.source': {
de: 'Quelle (Kanal, URL oder Subreddit)',
en: 'Source (channel, URL, or subreddit)'
},
'feeds.add.options.channel': {
de: 'Ziel-Kanal',
en: 'Target channel'
},
'feeds.add.options.role': {
de: 'Rolle zum Pingen',
en: 'Role to ping'
},
'feeds.add.options.template': {
de: 'Nachrichtenvorlage ({title}, {url})',
en: 'Message template ({title}, {url})'
},
'feeds.remove.description': {
de: 'Feed entfernen',
en: 'Remove feed'
},
'feeds.remove.options.id': {
de: 'Feed-ID',
en: 'Feed ID'
},
'feeds.list.description': {
de: 'Feeds auflisten',
en: 'List feeds'
},
'feeds.test.description': {
de: 'Feed einmal abrufen und posten',
en: 'Fetch once and post'
},
'feeds.test.options.id': {
de: 'Feed-ID',
en: 'Feed ID'
},
'feeds.choice.type.twitch': {
de: 'Twitch',
en: 'Twitch'
},
'feeds.choice.type.youtube': {
de: 'YouTube',
en: 'YouTube'
},
'feeds.choice.type.rss': {
de: 'RSS',
en: 'RSS'
},
'feeds.choice.type.reddit': {
de: 'Reddit',
en: 'Reddit'
},
'schedule.description': {
de: 'Geplante Nachrichten verwalten',
en: 'Manage scheduled messages'
},
'schedule.create.description': {
de: 'Nachricht planen',
en: 'Schedule a message'
},
'schedule.list.description': {
de: 'Geplante Nachrichten anzeigen',
en: 'List scheduled messages'
},
'schedule.delete.description': {
de: 'Geplante Nachricht löschen',
en: 'Delete a scheduled message'
},
'schedule.create.options.when': {
de: 'Einmalig: Dauer (z. B. 1h) oder ISO-Datum',
en: 'One-shot: duration (e.g. 1h) or ISO date'
},
'schedule.create.options.cron': {
de: 'Wiederkehrend: Cron-Ausdruck',
en: 'Recurring: cron expression'
},
'schedule.common.options.channel': {
de: 'Zielkanal',
en: 'Target channel'
},
'schedule.common.options.content': {
de: 'Nachrichtentext',
en: 'Message text'
},
'schedule.common.options.embed_title': {
de: 'Embed-Titel',
en: 'Embed title'
},
'schedule.common.options.embed_description': {
de: 'Embed-Beschreibung',
en: 'Embed description'
},
'schedule.common.options.embed_color': {
de: 'Embed-Farbe (Dezimal)',
en: 'Embed color (decimal)'
},
'schedule.common.options.role': {
de: 'Zu pingende Rolle',
en: 'Role to ping'
},
'schedule.common.options.id': {
de: 'ID der geplanten Nachricht',
en: 'Scheduled message ID'
},
'announce.description': {
de: 'Sofortige Ankündigung senden',
en: 'Send an immediate announcement'
},
'guildbackup.description': {
de: 'Server-Backups erstellen und wiederherstellen',
en: 'Create and restore server backups'
},
'guildbackup.create.description': {
de: 'Snapshot von Rollen, Kanälen und Einstellungen erstellen',
en: 'Create a snapshot of roles, channels, and settings'
},
'guildbackup.create.options.name': {
de: 'Name des Backups',
en: 'Backup name'
},
'guildbackup.list.description': {
de: 'Backups dieses Servers auflisten',
en: 'List backups for this server'
},
'guildbackup.info.description': {
de: 'Details zu einem Backup anzeigen',
en: 'Show backup details'
},
'guildbackup.delete.description': {
de: 'Backup löschen',
en: 'Delete a backup'
},
'guildbackup.restore.description': {
de: 'Backup wiederherstellen (nur Owner)',
en: 'Restore a backup (owner only)'
},
'guildbackup.common.options.id': {
de: 'Backup-ID',
en: 'Backup ID'
}
} as const;