# Papo Discord Bot Discord-Bot (discord.js 14, TypeScript) mit Web-Dashboard, Prisma/PostgreSQL und Docker-Support. ## Was drin ist - Ticketsystem: Slash-Commands (/ticket, /claim, /close, /ticketpriority, /ticketstatus, /transcript, /ticketpanel), Panels, Transcripts unter `./transcripts`, Support-Login-Panel mit Rollen-Vergabe/On-Duty-Logging. - Automod: Link-Filter (Whitelist), Spam/Caps-Erkennung, Bad-Word-Listen (Custom), Timeouts, Logging. - Musik: play/skip/stop/pause/resume/loop, Queue, aktivierbar/deaktivierbar pro Guild. - Welcome: konfigurierbare Embeds (Channel, Farbe, Texte, Bilder/Uploads), Preview im Dashboard, Text-Fallback. - Logging: Join/Leave, Message Edit/Delete, Automod/Ticket/Musik-Events mit konfigurierbarem Log-Channel/Kategorien. - Leveling: XP/Level pro Nachricht, /rank, toggelbar. - Dynamische Voice: Lobby erzeugt private Voice-Channels mit Template/Userlimit. - Birthday: /birthday + geplante Glueckwuensche mit Template/Channel. - Reaction Roles: Verwaltung im Dashboard, Sync/Loeschen/Erstellen. - Events: Einmalig/recurring, Reminder, Signups, Buttons. - Statuspage-Modul vorhanden (Config/API), plus Modul-Toggles im Dashboard. - Dashboard: OAuth2 (Scopes identify, guilds), zeigt nur Guilds, die der Nutzer besitzt oder mit Manage Guild/Admin-Rechten verwalten darf **und** in denen der Bot ist. Modulabhaengige Navigation. - Rich Presence: rotiert mit `/help`, Dashboard-URL und Guild-Zaehler. ## Tech-Stack - Node.js 20 (Docker-Basis), TypeScript (CommonJS) - discord.js 14, play-dl, @discordjs/voice - Express + OAuth2-Login, Prisma ORM (PostgreSQL) - Dockerfile + docker-compose (App + Postgres) ## Setup (lokal, Entwicklung) 1. Repo klonen, in das Verzeichnis wechseln. 2. `cp .env.example .env` und Variablen setzen (siehe unten). 3. Dependencies installieren: `npm ci` (oder `npm install`). 4. Prisma: `npx prisma generate --schema=src/database/schema.prisma` und `npx prisma migrate dev --name init`. 5. Start Dev: `npm run dev` (ts-node-dev). Dashboard und Bot laufen auf `PORT` (default 3000). 6. Slash-Commands werden beim Start fuer die IDs in `DISCORD_GUILD_IDS` (oder `DISCORD_GUILD_ID`) registriert. ## Setup mit Docker - `.dockerignore` blendet lokale node_modules/.env aus. - Dev-Stack: `docker-compose up --build` (nutzt `Dockerfile`, Postgres 15, env aus `.env`, `npm run dev` im Container). - Eigenes Image: `docker build .` (Prisma-Generate laeuft im Build). ## Environment-Variablen - `DISCORD_TOKEN` (Pflicht, Bot Token) - `DISCORD_CLIENT_ID` / `DISCORD_CLIENT_SECRET` (Pflicht fuer Dashboard-OAuth) - `DISCORD_GUILD_ID` (optional Einzel-Guild fuer Commands) - `DISCORD_GUILD_IDS` (kommagetrennt, mehrere Guilds) - `DATABASE_URL` (Pflicht, Postgres) - `PORT` (Webserver/Dashboard, default 3000) - `SESSION_SECRET` (Express Session Secret, default `papo_dev_secret`) - `DASHBOARD_BASE_URL` (Public Base URL, fuer OAuth Redirect) - `WEB_BASE_PATH` (Default `/ucp`, ohne Slash am Ende) - `OWNER_IDS` (kommagetrennte Owner fuer Admin-UI) - `SUPPORT_ROLE_ID` (optional Ticket/Support-Login Rolle) ## Datenbank / Prisma - Schema: `src/database/schema.prisma` (zweites Schema in `prisma/schema.prisma` fuer Binary Targets). - Migrationen: `npx prisma migrate dev --name `; danach `npx prisma generate --schema=src/database/schema.prisma`. - Kern-Tabellen: GuildSettings (Module/Config), Ticket, TicketSupportSession, Event/EventSignup, Birthday, ReactionRoleSet, Level. ## Kommandos & Scripts - `npm run dev` – Entwicklung (ts-node-dev) - `npm run build` – TypeScript build - `npm start` – Start aus `dist` - Prisma-CLI: `npx prisma ...` (nutzt Schema aus `src/database/schema.prisma`) ## Dashboard / API Kurzinfo - Auth-Gate (`/api/*`), Login `/auth/discord`, Callback `/auth/callback`, Logout `/auth/logout`. - `/api/guilds` filtert auf Guilds, die der eingeloggte User besitzt oder managen darf und in denen der Bot ist. - Module/Settings ueber `/api/settings`, `/api/modules`, Tickets unter `/api/tickets*`, weitere Endpoints fuer Events, Reaction Roles, Birthday, Statuspage. ## Deployment-Hinweise - Produktion: `npm run build` + `npm start` oder Docker-Image nutzen. - Transcripts werden unter `./transcripts` abgelegt (Volume mounten, falls Container). ## Credits/Lizenz - Autoren/Lizenz nicht hinterlegt. Bitte vor Nutzung pruefen.