Extracts the accent-card toggle from Automod into a shared ModuleActiveToggle component and applies it to every module's "aktiv" switch (Statuspage, Dynamic Voice, Server Stats, Birthday, Welcome) so they all match instead of the plain switch some pages had. Also regroups the sidebar: Reaction Roles moves to Community (it's member self-service, not moderation), and a new "Statistiken" group splits Statuspage/Server Stats/Wachstum out of the catch-all "Funktionen" section. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
🚀 Papo Discord Bot
A modern, feature-rich Discord bot built with discord.js v14, TypeScript, Prisma, and PostgreSQL, featuring a powerful web dashboard and modular architecture.
✨ Features
🎫 Ticket System
- Interactive ticket panels
- Ticket claiming
- Ticket transcripts
- Support login sessions
- Slash commands (
/ticket,/claim,/close, ...)
🛡️ Moderation
- Link whitelist
- Anti-Spam
- Anti-Caps
- Bad word filtering
- Comprehensive server logging
🎵 Music
- Play music from multiple sources
- Queue support
- Pause / Resume
- Skip
- Stop
- Loop
- Enable/Disable per server
👋 Community Features
- Welcome messages
- Leveling system
- Birthday reminders
- Reaction Roles
- Dynamic Voice Channels
- Event system with reminders
📊 Dashboard
- Discord OAuth2 Login
- Guild management
- Modular settings
- Status Page integration
- Rich Presence management
- Modern responsive interface
🛠️ Tech Stack
| Technology | Version |
|---|---|
| Node.js | 20+ |
| TypeScript | Latest |
| discord.js | v14 |
| Express | Latest |
| Prisma ORM | Latest |
| PostgreSQL | 15+ |
| Docker | Supported |
📦 Installation
Local Development
Clone the repository
git clone https://github.com/yourname/papo-discord-bot.git
cd papo-discord-bot
Create your environment file
cp .env.example .env
Install dependencies
npm install
Generate Prisma Client
npx prisma generate --schema=src/database/schema.prisma
Run database migrations
npx prisma migrate dev --name init
Start the development server
npm run dev
The bot and dashboard will start on the configured PORT (default: 3000).
Slash commands are automatically registered for the guilds defined in:
DISCORD_GUILD_IDS- or
DISCORD_GUILD_ID
🐳 Docker
Start the complete development stack
docker-compose up --build
Build the Docker image manually
docker build -t papo-discord-bot .
The Docker image automatically generates the Prisma Client during the build process.
⚙️ Environment Variables
| Variable | Description |
|---|---|
DISCORD_TOKEN |
Discord Bot Token |
DISCORD_CLIENT_ID |
Discord OAuth Client ID |
DISCORD_CLIENT_SECRET |
Discord OAuth Secret |
DATABASE_URL |
PostgreSQL Connection String |
PORT |
Dashboard Port (default: 3000) |
SESSION_SECRET |
Express Session Secret |
DASHBOARD_BASE_URL |
Public Dashboard URL |
WEB_BASE_PATH |
Base path (default: /ucp) |
OWNER_IDS |
Comma-separated Bot Owners |
SUPPORT_ROLE_ID |
Support Role ID |
DISCORD_GUILD_ID(S) |
Guild(s) for command registration |
🗄️ Database
Main Prisma schema
src/database/schema.prisma
Generate Prisma Client
npx prisma generate --schema=src/database/schema.prisma
Create a migration
npx prisma migrate dev --name your-migration
Core Models
- GuildSettings
- Ticket
- TicketSupportSession
- Event
- EventSignup
- RegisterForm
- RegisterApplication
- Birthday
- ReactionRoleSet
- Level
📜 Available Scripts
| Command | Description |
|---|---|
npm run dev |
Development Mode |
npm run build |
Compile TypeScript |
npm start |
Run Production Build |
npx prisma ... |
Prisma CLI |
🌐 Dashboard API
Authentication
/auth/discord
/auth/callback
/auth/logout
Protected API
/api/*
Main Endpoints
/api/guilds/api/settings/api/modules/api/tickets/api/events/api/reactionroles/api/birthday/api/statuspage
Only guilds where the authenticated user has Manage Server permissions and where the bot is present are accessible.
🚀 Deployment
Production build
npm run build
npm start
or simply use Docker.
Ticket transcripts are stored in
./transcripts
When running inside Docker, mount this directory as a volume to persist transcripts.
❤️ Contributing
Contributions, feature requests, and bug reports are always welcome!
Feel free to open an Issue or submit a Pull Request.
📄 License
No license has been specified yet.
Please add an appropriate open-source license before publishing this project.
Built with ❤️ using TypeScript, Discord.js, Prisma & PostgreSQL