mirror of
https://github.com/arthur-pbty/flint.git
synced 2026-08-01 20:29:03 +02:00
4.0 KiB
4.0 KiB
Discord.js v14 Framework Template
Professional command framework template for Discord.js 14.26.2 with:
- Single command object schema
- Minimal command authoring (
name,category,execute) - Optional per-user command cooldown (
cooldownin seconds) - Shared execution logic for prefix and slash
- External JSON i18n
- Automatic prefix and slash localizations from locale files
- One localized
nameper language drives both prefix and slash triggers - Typed argument schema
- User permission checks
- Auto-generated help from command metadata
Presence Storage
- The
presencecommand is persisted in PostgreSQL. - Storage is keyed by
bot_id(Discord user id), so one PostgreSQL instance can serve multiple bots. - Presence survives bot restarts and container restarts.
Setup
- Install dependencies: npm install
- Create environment file: cp .env.example .env
- Fill required values in
.env:DISCORD_TOKENDISCORD_CLIENT_IDDATABASE_URL
- Optional values:
DATABASE_SSL(truefor managed cloud DB,falsefor local Docker)PRESENCE_STREAM_URL(used when activity type isSTREAMING)AUTO_DEPLOY_SLASH(trueto sync slash commands on startup)DEV_GUILD_ID(optional guild scope for faster slash sync)
- Start in development: npm run dev
- Validate code quality:
- npm run typecheck
- npm run test
- npm run check
Docker Deployment (Bot + PostgreSQL)
- Configure
.envwith at least:DISCORD_TOKENDISCORD_CLIENT_IDPOSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD
- Start stack: docker compose up -d --build
- Stop stack: docker compose down
By default, docker-compose.yml provisions:
bot: the Discord bot containerpostgres: PostgreSQL 16 with persistent volumepostgres_data
The bot container uses:
DATABASE_URL=postgresql://<POSTGRES_USER>:<POSTGRES_PASSWORD>@postgres:5432/<POSTGRES_DB>
Security defaults:
- PostgreSQL is bound to
127.0.0.1by default in Compose. - Keep strong values for
POSTGRES_PASSWORDand rotate credentials if exposed.
Multi-Bot With One DB
You can run several bot services against the same PostgreSQL instance.
- Keep one shared
postgresservice. - Add additional bot services with different
DISCORD_TOKEN/DISCORD_CLIENT_ID. - Keep
DATABASE_URLpointing to the same PostgreSQL service.
Because rows are keyed by bot_id, each bot keeps its own independent presence configuration.
An example with two bot services is available in docker-compose.multi-bot.example.yml.
Architecture
src/app/bootstrap.ts: runtime bootstrap, dependency wiring, graceful shutdownsrc/commands/*: thin command wrappers (defineCommand+ delegated execute)src/features/presence/*: presence runtime, panel orchestration, repository contractsrc/features/memberMessages/*: member-message dispatch, panel orchestration, image rendering, repository contractsrc/core/commands/*: registry, parsing, slash payload, usage helperssrc/core/execution/CommandExecutor.ts: unified execution pipeline (permissions/cooldown/error handling)src/core/discord/*: shared Discord helpers (reply message resolver, panel session registry)src/database/stores/*: PostgreSQL store implementationssrc/database/dbLifecycle.ts: centralized DB init/shutdown lifecyclesrc/validators/*: business validation/sanitizationsrc/types/*: pure shared types and contractssrc/i18n/*.json: external i18n dictionaries
Included Commands
kiss(fun) with requireduserargping(utility)welcome(utility) interactive welcome-message panelgoodbye(utility) interactive goodbye-message panelpresence(utility) with interactive status/activity/text panelhelp(core) with auto category and usage generation
Adding A Command
- Create a command object in
src/commands/... - Follow the schema in
src/types/command.ts - Add command to
src/commands/index.ts - If
AUTO_DEPLOY_SLASH=true, restart the bot to sync slash commands automatically