185 lines
5.0 KiB
Markdown
185 lines
5.0 KiB
Markdown
# Discord Moderation Watcher Bot
|
|
|
|
Bot monitoring Discord yang merekam voice channel, menangkap pesan teks, menyimpan attachment, menjalankan analisis opsional, dan menyediakan dashboard web real-time.
|
|
|
|
Stack utama: Node.js, pnpm, TypeScript, `discord.js-selfbot-v13`, `@discordjs/voice`, Express, WebSocket, Drizzle ORM, SQLite/PostgreSQL, React, Vite, Vitest, dan Biome.
|
|
|
|
## Prasyarat
|
|
|
|
- Node.js versi modern yang kompatibel dengan TypeScript dan Vite.
|
|
- pnpm 10.x. Repo ini dipin ke `pnpm@10.25.0`.
|
|
- FFmpeg tersedia di `PATH` untuk proses muxing audio dan playback media.
|
|
- `yt-dlp` tersedia di `PATH` untuk resolve audio YouTube, search result YouTube, dan Spotify track.
|
|
- Native audio dependencies dapat dibuild di mesin lokal (`@discordjs/opus`, `better-sqlite3`, `sodium-native`).
|
|
|
|
Install FFmpeg:
|
|
|
|
```bash
|
|
# Ubuntu/Debian
|
|
sudo apt install ffmpeg
|
|
|
|
# Arch
|
|
sudo pacman -S ffmpeg
|
|
```
|
|
|
|
Install `yt-dlp`:
|
|
|
|
```bash
|
|
pnpm run install:yt-dlp
|
|
```
|
|
|
|
Script installer akan memakai package manager yang tersedia (`pacman`, `apt-get`, `dnf`, `brew`) atau fallback ke `pipx`/`pip`.
|
|
|
|
## Setup
|
|
|
|
```bash
|
|
pnpm install
|
|
cp .env.example .env
|
|
```
|
|
|
|
Edit `.env` sesuai server yang dimonitor:
|
|
|
|
```env
|
|
DISCORD_TOKEN=your_token_here
|
|
MONITOR_GUILD_ID=your_guild_id_here
|
|
RECORDINGS_DIR=./recordings
|
|
WEBSERVER_PORT=3000
|
|
DATABASE_TYPE=sqlite
|
|
```
|
|
|
|
Catatan: project ini memakai selfbot library, bukan bot token Discord standar. Pastikan penggunaan sesuai risiko dan aturan platform yang berlaku.
|
|
|
|
## Menjalankan
|
|
|
|
```bash
|
|
# Bot/server utama dengan auto-restart
|
|
pnpm run dev
|
|
|
|
# Production-style start
|
|
pnpm run start
|
|
|
|
# Dashboard frontend dev server
|
|
pnpm run dev:web
|
|
```
|
|
|
|
Dashboard build production disajikan dari `public/app` setelah menjalankan:
|
|
|
|
```bash
|
|
pnpm run build:web
|
|
```
|
|
|
|
## Command Development
|
|
|
|
```bash
|
|
# Type checking
|
|
pnpm run typecheck
|
|
|
|
# Lint
|
|
pnpm run lint
|
|
|
|
# Format
|
|
pnpm run format
|
|
|
|
# Test
|
|
pnpm run test
|
|
|
|
# Build frontend + TypeScript
|
|
pnpm run build
|
|
|
|
# Install external yt-dlp CLI for YouTube/search/Spotify track playback
|
|
pnpm run install:yt-dlp
|
|
```
|
|
|
|
## Database
|
|
|
|
Default database adalah SQLite di `.muxer-queue.db`. PostgreSQL dapat dipakai dengan `DATABASE_TYPE=postgres` dan konfigurasi `DATABASE_URL` atau variabel `POSTGRES_*`.
|
|
|
|
```bash
|
|
# Generate migration Drizzle
|
|
pnpm run db:generate
|
|
|
|
# Jalankan migration via drizzle-kit
|
|
pnpm run db:migrate
|
|
|
|
# Jalankan migration programmatic
|
|
pnpm run db:migrate:programmatic
|
|
|
|
# Buka Drizzle Studio
|
|
pnpm run db:studio
|
|
```
|
|
|
|
## Fitur
|
|
|
|
- Voice recording ke segment `.ogg` per user.
|
|
- Metadata JSON per segment audio.
|
|
- Text message capture untuk pesan baru, edit, dan delete.
|
|
- Attachment capture dan upload ke endpoint Picser.
|
|
- SQLite/PostgreSQL via Drizzle ORM.
|
|
- REST API dan WebSocket untuk dashboard.
|
|
- Dashboard React untuk pesan, gambar, voice, media playback, dan moderation review.
|
|
- Media playback dari direct URL, file lokal, YouTube URL, search terms, dan Spotify track URL.
|
|
- Metrics Prometheus di endpoint server.
|
|
- Retry dengan backoff untuk operasi eksternal.
|
|
- AI moderation analysis opsional via konfigurasi `AI_*`.
|
|
|
|
## Struktur Rekaman
|
|
|
|
```text
|
|
recordings/
|
|
<user-id>/
|
|
<user-id>-<session-start>-0.ogg
|
|
<user-id>-<session-start>-0.json
|
|
<user-id>-<session-start>-1.ogg
|
|
<user-id>-<session-start>-1.json
|
|
```
|
|
|
|
Segment duration dikontrol oleh `RECORDING_SEGMENT_MS`.
|
|
|
|
## Struktur Proyek
|
|
|
|
```text
|
|
src/
|
|
index.ts Entry point Discord client dan server
|
|
recorder.ts Voice recording pipeline
|
|
recorder/ Audio stream, decoder, segment metadata
|
|
moderation/ Message capture, storage, uploads, AI review
|
|
database/ Drizzle setup, schema, migrations
|
|
routes/ Express route modules
|
|
webserver.ts Express + WebSocket server
|
|
retry.ts Retry helper berbasis p-retry
|
|
audio/ffmpegProcess.ts Direct ffmpeg process wrapper
|
|
frontend/ React dashboard source
|
|
public/app/ Dashboard build output
|
|
tests/ Vitest tests
|
|
drizzle/migrations/ Database migrations
|
|
```
|
|
|
|
## Konfigurasi Penting
|
|
|
|
Lihat `.env.example` untuk daftar lengkap. Variabel utama:
|
|
|
|
- `DISCORD_TOKEN` — token akun/client yang dipakai selfbot.
|
|
- `MONITOR_GUILD_ID` — guild yang dimonitor untuk moderation capture.
|
|
- `RECORDINGS_DIR` — direktori output audio.
|
|
- `WEBSERVER_PORT` — port HTTP/WebSocket.
|
|
- `DATABASE_TYPE` — `sqlite` atau `postgres`.
|
|
- `PICSER_UPLOAD_URL` — endpoint upload attachment.
|
|
- `AI_ANALYSIS_ENABLED` — aktifkan/nonaktifkan analisis AI.
|
|
- `AI_LLM_API_KEY`, `AI_LLM_BASE_URL`, `AI_LLM_MODEL` — konfigurasi provider LLM.
|
|
|
|
## Verifikasi Setelah Perubahan
|
|
|
|
Sebelum menjalankan lama atau deploy, jalankan:
|
|
|
|
```bash
|
|
pnpm install
|
|
pnpm run typecheck
|
|
pnpm run lint
|
|
pnpm run test
|
|
pnpm run build
|
|
```
|
|
|
|
## Catatan Library Modernization
|
|
|
|
Project memakai Zod untuk validasi runtime, Drizzle untuk database, dan wrapper `node:child_process` langsung untuk FFmpeg. Library lama `class-transformer`, `class-validator`, dan `fluent-ffmpeg` sudah tidak dipakai.
|