MythEclipseandClaude a2beda77c4 fix(db): surface PG error code/detail/cause in voice recording insert failures
Drizzle wraps PG errors — the previous log only showed the formatted query
text. Now extracts code, detail, schema, table, constraint, severity from
the error envelope and from .cause to make the actual Postgres error visible.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-14 04:40:22 +07:00
2026-06-02 19:04:49 +07:00
2026-06-02 18:55:48 +07:00

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:

# Ubuntu/Debian
sudo apt install ffmpeg

# Arch
sudo pacman -S ffmpeg

Install yt-dlp:

pnpm run install:yt-dlp

Script installer akan memakai package manager yang tersedia (pacman, apt-get, dnf, brew) atau fallback ke pipx/pip.

Setup

pnpm install
cp .env.example .env

Edit .env sesuai server yang dimonitor:

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

# 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:

pnpm run build:web

Command Development

# 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_*.

Jika aplikasi dijalankan di PostgreSQL production, migrasi dapat dijalankan otomatis saat startup dengan AUTO_MIGRATE_ON_STARTUP=true. Jalur ini memakai advisory lock supaya hanya satu instance yang memigrasi schema pada satu waktu.

# 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

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

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_TYPEsqlite 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:

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.

S
Description
Bete Discord moderation watcher
Readme
26 MiB
Languages
TypeScript 97.1%
Nix 1%
Shell 0.8%
CSS 0.7%
PLpgSQL 0.4%