Implement leveling and economy features with associated models and commands

- Added new models for leveling and economy functionalities in the Prisma schema, including LevelingConfig, MemberLevel, LevelReward, EconomyConfig, MemberEconomy, ShopItem, and InventoryItem.
- Introduced commands for managing XP, economy transactions, and shop interactions, enhancing user engagement.
- Updated job handling to include reminders and poll closing functionalities.
- Enhanced localization support for new commands and features in both German and English.
- Improved the bot's job processing capabilities with a dedicated reminder worker for scheduled tasks.
This commit is contained in:
smueller
2026-07-22 12:49:17 +02:00
parent 2518119257
commit fa5910ec43
38 changed files with 6759 additions and 144 deletions

View File

@@ -274,6 +274,414 @@ export const commandLocales = {
'verify.panel.options.channel': {
de: 'Optionaler Kanal für das Panel',
en: 'Optional channel for the panel'
},
'leveling.rank.description': {
de: 'Rangkarte eines Mitglieds anzeigen',
en: 'Show a member rank card'
},
'leveling.rank.options.user': {
de: 'Mitglied (Standard: du)',
en: 'Member (defaults to you)'
},
'leveling.leaderboard.description': {
de: 'Top 10 Mitglieder nach XP',
en: 'Top 10 members by XP'
},
'leveling.xp.description': {
de: 'XP verwalten (Admin)',
en: 'Manage XP (admin)'
},
'leveling.xp.give.description': {
de: 'XP vergeben',
en: 'Give XP'
},
'leveling.xp.remove.description': {
de: 'XP entfernen',
en: 'Remove XP'
},
'leveling.xp.reset.description': {
de: 'XP zurücksetzen',
en: 'Reset XP'
},
'leveling.xp.options.user': {
de: 'Zielmitglied',
en: 'Target member'
},
'leveling.xp.options.amount': {
de: 'XP-Betrag',
en: 'XP amount'
},
'economy.balance.description': {
de: 'Kontostand anzeigen',
en: 'Show balance'
},
'economy.daily.description': {
de: 'Tägliche Belohnung abholen',
en: 'Claim daily reward'
},
'economy.weekly.description': {
de: 'Wöchentliche Belohnung abholen',
en: 'Claim weekly reward'
},
'economy.work.description': {
de: 'Arbeiten und Geld verdienen',
en: 'Work to earn money'
},
'economy.pay.description': {
de: 'Geld an einen Nutzer senden',
en: 'Send money to a user'
},
'economy.gamble.description': {
de: '50/50 um deinen Einsatz spielen',
en: '50/50 gamble your bet'
},
'economy.slots.description': {
de: 'Spielautomaten spielen',
en: 'Play the slot machine'
},
'economy.blackjack.description': {
de: 'Blackjack spielen',
en: 'Play blackjack'
},
'economy.coinflip.description': {
de: 'Kopf oder Zahl um Geld wetten',
en: 'Bet on heads or tails'
},
'economy.shop.description': {
de: 'Server-Shop',
en: 'Server shop'
},
'economy.shop.view.description': {
de: 'Shop-Artikel anzeigen',
en: 'View shop items'
},
'economy.shop.buy.description': {
de: 'Artikel kaufen',
en: 'Buy an item'
},
'economy.shop.options.item_id': {
de: 'Artikel-ID aus /shop view',
en: 'Item ID from /shop view'
},
'economy.inventory.description': {
de: 'Dein Inventar anzeigen',
en: 'Show your inventory'
},
'economy.eco.description': {
de: 'Economy-Verwaltung',
en: 'Economy management'
},
'economy.eco.leaderboard.description': {
de: 'Reichsten Nutzer anzeigen',
en: 'Show richest users'
},
'economy.eco.give.description': {
de: 'Geld vergeben (Admin)',
en: 'Give money (admin)'
},
'economy.eco.remove.description': {
de: 'Geld entfernen (Admin)',
en: 'Remove money (admin)'
},
'economy.eco.reset.description': {
de: 'Nutzer-Economy zurücksetzen (Admin)',
en: 'Reset user economy (admin)'
},
'economy.common.options.amount': {
de: 'Betrag',
en: 'Amount'
},
'economy.common.options.user': {
de: 'Nutzer',
en: 'User'
},
'economy.common.options.userOptional': {
de: 'Optionaler Nutzer (Standard: du)',
en: 'Optional user (defaults to you)'
},
'economy.common.options.target': {
de: 'Zielnutzer',
en: 'Target user'
},
'economy.coinflip.options.choice': {
de: 'Kopf oder Zahl',
en: 'Heads or tails'
},
'economy.choice.heads': {
de: 'Kopf',
en: 'Heads'
},
'economy.choice.tails': {
de: 'Zahl',
en: 'Tails'
},
'utility.userinfo.description': {
de: 'Nutzerinformationen anzeigen',
en: 'Show user information'
},
'utility.serverinfo.description': {
de: 'Serverinformationen anzeigen',
en: 'Show server information'
},
'utility.roleinfo.description': {
de: 'Rolleninformationen anzeigen',
en: 'Show role information'
},
'utility.roleinfo.options.role': {
de: 'Rolle',
en: 'Role'
},
'utility.channelinfo.description': {
de: 'Kanalinformationen anzeigen',
en: 'Show channel information'
},
'utility.avatar.description': {
de: 'Avatar anzeigen',
en: 'Show avatar'
},
'utility.banner.description': {
de: 'Banner anzeigen',
en: 'Show banner'
},
'utility.common.options.userOptional': {
de: 'Optionaler Nutzer (Standard: du)',
en: 'Optional user (defaults to you)'
},
'utility.common.options.channelOptional': {
de: 'Optionaler Kanal (Standard: aktueller Kanal)',
en: 'Optional channel (defaults to current)'
},
'utility.common.options.attachment': {
de: 'Bild-Anhang',
en: 'Image attachment'
},
'utility.common.options.url': {
de: 'Bild-URL',
en: 'Image URL'
},
'utility.common.options.name': {
de: 'Name',
en: 'Name'
},
'utility.poll.description': {
de: 'Umfragen erstellen',
en: 'Create polls'
},
'utility.poll.create.description': {
de: 'Neue Umfrage erstellen',
en: 'Create a new poll'
},
'utility.poll.options.question': {
de: 'Frage',
en: 'Question'
},
'utility.poll.options.options': {
de: 'Optionen (kommagetrennt, 25)',
en: 'Options (comma-separated, 25)'
},
'utility.poll.options.multiselect': {
de: 'Mehrfachauswahl erlauben',
en: 'Allow multi-select'
},
'utility.poll.options.anonymous': {
de: 'Anonyme Abstimmung',
en: 'Anonymous voting'
},
'utility.poll.options.duration': {
de: 'Optionale Dauer (z. B. 1h)',
en: 'Optional duration (e.g. 1h)'
},
'utility.remindme.description': {
de: 'Erinnerung setzen',
en: 'Set a reminder'
},
'utility.remindme.options.when': {
de: 'Wann (z. B. 30m oder ISO-Datum)',
en: 'When (e.g. 30m or ISO datetime)'
},
'utility.remindme.options.content': {
de: 'Erinnerungstext',
en: 'Reminder content'
},
'utility.remindme.options.recurring_cron': {
de: 'Optional: Cron für wiederkehrende Erinnerung',
en: 'Optional cron for recurring reminder'
},
'utility.reminders.description': {
de: 'Erinnerungen verwalten',
en: 'Manage reminders'
},
'utility.reminders.list.description': {
de: 'Erinnerungen auflisten',
en: 'List reminders'
},
'utility.reminders.delete.description': {
de: 'Erinnerung löschen',
en: 'Delete a reminder'
},
'utility.reminders.options.id': {
de: 'Erinnerungs-ID (Präfix reicht)',
en: 'Reminder ID (prefix is enough)'
},
'utility.afk.description': {
de: 'AFK-Status setzen',
en: 'Set AFK status'
},
'utility.afk.set.description': {
de: 'Als AFK markieren',
en: 'Mark as AFK'
},
'utility.afk.options.reason': {
de: 'Optionaler AFK-Grund',
en: 'Optional AFK reason'
},
'utility.emoji.description': {
de: 'Emojis verwalten',
en: 'Manage emojis'
},
'utility.emoji.add.description': {
de: 'Emoji hinzufügen',
en: 'Add emoji'
},
'utility.emoji.remove.description': {
de: 'Emoji entfernen',
en: 'Remove emoji'
},
'utility.emoji.steal.description': {
de: 'Emoji aus Nachricht übernehmen',
en: 'Steal emoji from message'
},
'utility.emoji.options.emoji': {
de: 'Emoji',
en: 'Emoji'
},
'utility.emoji.options.message_id': {
de: 'Nachrichten-ID',
en: 'Message ID'
},
'utility.emoji.options.url': {
de: 'Emoji-URL',
en: 'Emoji URL'
},
'utility.sticker.description': {
de: 'Sticker verwalten',
en: 'Manage stickers'
},
'utility.sticker.add.description': {
de: 'Sticker hinzufügen',
en: 'Add sticker'
},
'utility.sticker.options.url': {
de: 'Sticker-URL',
en: 'Sticker URL'
},
'utility.timestamp.description': {
de: 'Discord-Timestamp-Formate generieren',
en: 'Generate Discord timestamp formats'
},
'utility.timestamp.options.datetime': {
de: 'Datum/Uhrzeit (ISO oder relative Dauer)',
en: 'Datetime (ISO or relative duration)'
},
'utility.snipe.description': {
de: 'Zuletzt gelöschte Nachricht anzeigen',
en: 'Show last deleted message'
},
'utility.editsnipe.description': {
de: 'Zuletzt bearbeitete Nachricht anzeigen',
en: 'Show last edited message'
},
'utility.embed.description': {
de: 'Embeds erstellen',
en: 'Create embeds'
},
'utility.embed.builder.description': {
de: 'Embed per Modal bauen und senden',
en: 'Build and send an embed via modal'
},
'fun.8ball.description': {
de: 'Magische 8-Ball-Antwort auf deine Frage',
en: 'Magic 8-ball answer to your question'
},
'fun.8ball.options.question': {
de: 'Deine Frage',
en: 'Your question'
},
'fun.dice.description': {
de: 'Würfel werfen',
en: 'Roll dice'
},
'fun.dice.options.sides': {
de: 'Anzahl Seiten (Standard: 6)',
en: 'Number of sides (default: 6)'
},
'fun.dice.options.count': {
de: 'Anzahl Würfe (Standard: 1, max. 10)',
en: 'Number of rolls (default: 1, max 10)'
},
'fun.flip.description': {
de: 'Kostenloser Münzwurf (Kopf oder Zahl)',
en: 'Free coin flip (heads or tails)'
},
'fun.rps.description': {
de: 'Schere, Stein, Papier gegen den Bot',
en: 'Rock, paper, scissors against the bot'
},
'fun.rps.options.choice': {
de: 'Deine Wahl',
en: 'Your choice'
},
'fun.rps.choice.rock': {
de: 'Stein',
en: 'Rock'
},
'fun.rps.choice.paper': {
de: 'Papier',
en: 'Paper'
},
'fun.rps.choice.scissors': {
de: 'Schere',
en: 'Scissors'
},
'fun.choose.description': {
de: 'Zufällige Auswahl aus Optionen',
en: 'Random choice from options'
},
'fun.choose.options.options': {
de: 'Optionen (kommagetrennt)',
en: 'Options (comma-separated)'
},
'fun.trivia.description': {
de: 'Trivia-Frage mit Multiple Choice',
en: 'Trivia question with multiple choice'
},
'fun.tictactoe.description': {
de: 'Tic-Tac-Toe gegen einen anderen Nutzer',
en: 'Play Tic-Tac-Toe against another user'
},
'fun.connect4.description': {
de: 'Connect 4 gegen einen anderen Nutzer',
en: 'Play Connect 4 against another user'
},
'fun.hangman.description': {
de: 'Hangman mit Buchstaben-Buttons',
en: 'Hangman with letter buttons'
},
'fun.meme.description': {
de: 'Zufälliges Meme laden',
en: 'Fetch a random meme'
},
'fun.cat.description': {
de: 'Zufälliges Katzenbild laden',
en: 'Fetch a random cat image'
},
'fun.dog.description': {
de: 'Zufälliges Hundebild laden',
en: 'Fetch a random dog image'
},
'fun.common.options.opponent': {
de: 'Gegner',
en: 'Opponent'
}
} as const;