# TentacleBot - Agent Instructions ## Quick Commands ```bash dotnet restore && dotnet run # Run the bot locally docker compose up --build -d # Run with Docker docker compose logs -f # View Docker logs ``` ## Setup 1. Set `DISCORD_BOT_TOKEN` env var — secrets must not be stored in `appsettings.json` 2. Copy `.env.example` to `.env` for Docker: `cp .env.example .env` 3. `appsettings.json` is gitignored — never commit it ## Architecture - **`Program.cs`** — Entry point, DI setup, registers command modules from the assembly - **`Services/BotService.cs`** — Core bot lifecycle (login, ready handler, interaction routing) - **`Commands/GeneralCommands.cs`** — Slash commands (`/general ping`, `/general hello`, `/botinfo`) Add new commands by creating a class in `Commands/` that extends `InteractionModuleBase`. Commands are auto-discovered via `AddModulesAsync(typeof(Program).Assembly)`. ## Secrets All secrets (API keys, passwords, tokens) must be read from environment variables — never from `appsettings.json`. Use `Environment.GetEnvironmentVariable()` directly in service constructors. | Secret | Env Var | |---|---| | Discord bot token | `DISCORD_BOT_TOKEN` | | LLM API key | `LLM_API_KEY` | | Palworld server password | `PALWORLD_PASSWORD` | Non-secret configuration (URLs, model names, numeric settings) may stay in `appsettings.json` via `IConfiguration`. ## Gotchas - **Two `DiscordSocketClient` instances** are created in `Program.cs` — one for the bot client and one passed into `InteractionService`. They are separate instances sharing the same config. - **Token priority**: `DISCORD_BOT_TOKEN` env var is checked first, then `appsettings.json` → `Discord:BotToken`. ## No tests, no lint config This project has no test framework, no linting, and no CI. `dotnet build` is the only verification step.