4.9 KiB
🚀 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