Files
meshexplorer/scripts/README.md

206 lines
5.7 KiB
Markdown

# MeshCore Discord Bot
This directory contains scripts for running long-running background processes alongside the Next.js server.
## Discord Bot
The Discord bot (`discord-bot.ts`) subscribes to the ClickHouse message stream with decryption enabled for the Seattle region and posts new messages to Discord via webhook.
### Features
- **Real-time streaming**: Subscribes to ClickHouse chat message stream
- **Message decryption**: Automatically decrypts messages using known keys
- **Discord integration**: Posts messages to Discord via webhook
- **Message updates**: Messages with the same ID update existing Discord messages instead of posting new ones
- **Error handling**: Graceful error handling with Discord error notifications
- **Skip initial messages**: Only processes new messages, not historical ones
### Configuration
The bot is configured via environment variables:
| Variable | Description | Default | Required |
|----------|-------------|---------|----------|
| `DISCORD_WEBHOOK_URL` | Discord webhook URL | - | Yes |
| `MESH_REGION` | Mesh region to monitor | `seattle` | No |
| `POLL_INTERVAL` | Polling interval in milliseconds | `1000` | No |
| `MAX_ROWS_PER_POLL` | Maximum rows to fetch per poll | `50` | No |
| `PRIVATE_KEYS` | Comma-separated list of private keys | - | No |
### Usage
#### Development
```bash
# Install dependencies
npm install
# Run with hot reload
npm run discord-bot:dev
```
#### Production
```bash
# Run the bot
npm run discord-bot
```
#### Environment Setup
Create a `.env.local` file in the project root:
```bash
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_WEBHOOK_URL
MESH_REGION=seattle
POLL_INTERVAL=1000
MAX_ROWS_PER_POLL=50
PRIVATE_KEYS=key1,key2,key3
```
### Discord Webhook Setup
1. Go to your Discord server settings
2. Navigate to Integrations > Webhooks
3. Create a new webhook
4. Copy the webhook URL
5. Set it as the `DISCORD_WEBHOOK_URL` environment variable
### Message Format
Messages are posted to Discord with the following format:
- **Username**: MeshCore Chat
- **Avatar**: Meshtastic logo
- **Embed**: Rich embed with message details including:
- Sender and message text
- Channel hash
- Message ID
- Region
- Timestamps
### Error Handling
- Decryption failures are logged and skipped
- Network errors are retried automatically
- Critical errors are posted to Discord
- Graceful shutdown on SIGINT/SIGTERM
### Architecture
The bot consists of several components:
- **`discord-bot.ts`**: Main bot script with message processing logic
- **`lib/discord.ts`**: Discord webhook client and message formatting utilities
- **ClickHouse streaming**: Uses existing streaming infrastructure from the main app
- **Message decryption**: Leverages existing meshcore decryption utilities
### Docker Deployment
The project includes Docker support for easy deployment with both the Next.js server and Discord bot.
#### Prerequisites
- Docker and Docker Compose installed
- ClickHouse running on the Docker host (default port 8123)
- External Docker network `shared-network` must exist
#### Setup
1. **Create the required external network:**
```bash
docker network create shared-network
```
2. **Set up environment variables:**
```bash
# Copy the example file
cp scripts/docker.env.example .env
# Edit .env with your configuration
nano .env
```
3. **Build and start services:**
```bash
# Start both Next.js server and Discord bot
docker-compose up --build
# Or run in background
docker-compose up -d --build
```
4. **Access the application:**
- Next.js server: http://localhost:3001
- Discord bot: Runs in background, check logs with `docker-compose logs discord-bot`
#### Docker Services
- **meshexplorer**: Next.js web application (uses `Dockerfile`)
- **discord-bot**: Discord bot for chat message streaming (uses `Dockerfile.bot`)
#### Docker Images
The project uses two separate Dockerfiles for optimal image sizes:
- **`Dockerfile`**: Optimized for Next.js standalone output (smaller, faster)
- **`Dockerfile.bot`**: Optimized for TypeScript execution with tsx (includes source files)
#### Environment Variables
All configuration is loaded from environment variables:
| Variable | Description | Default | Required |
|----------|-------------|---------|----------|
| `CLICKHOUSE_HOST` | ClickHouse server hostname | `clickhouse` | No |
| `CLICKHOUSE_PORT` | ClickHouse server port | `8123` | No |
| `CLICKHOUSE_USER` | ClickHouse username | `default` | No |
| `CLICKHOUSE_PASSWORD` | ClickHouse password | `password` | No |
| `NEXT_PUBLIC_API_URL` | Override API base URL | - | No |
| `DISCORD_WEBHOOK_URL` | Discord webhook URL | - | Yes |
| `MESH_REGION` | Mesh region to monitor | `seattle` | No |
| `POLL_INTERVAL` | Polling interval in milliseconds | `1000` | No |
| `MAX_ROWS_PER_POLL` | Maximum rows to fetch per poll | `50` | No |
| `PRIVATE_KEYS` | Comma-separated private keys | - | No |
#### Docker Commands
```bash
# View logs
docker-compose logs -f discord-bot
docker-compose logs -f meshexplorer
# Restart services
docker-compose restart discord-bot
docker-compose restart meshexplorer
# Stop services
docker-compose down
# Rebuild and restart
docker-compose up --build --force-recreate
# Build individual services
docker-compose build meshexplorer
docker-compose build discord-bot
# Run only specific service
docker-compose up meshexplorer
docker-compose up discord-bot
# Build and run Discord bot only
docker build -f Dockerfile.bot -t meshexplorer-bot .
docker run --env-file .env meshexplorer-bot
```
### Monitoring
The bot logs important events:
- Message processing status
- Decryption success/failure
- Discord API calls
- Error conditions
Check the console output for real-time monitoring of bot activity.