openclaw/extensions/discord-status/README.md
Johnathon Selstad 93757f92e3 feat(hooks): Wire up message_sent hook with usage statistics
- Extended PluginHookMessageSentEvent to include usage stats (tokens, model, provider, duration)
- Extended PluginHookMessageContext to include sessionKey and agentId
- Wired up runMessageSent hook call in dispatch-from-config.ts after final replies
- Added discord-status example plugin demonstrating how to use the hook

The message_sent hook now fires after each reply is delivered, enabling plugins to:
- Track token usage across sessions
- Update external status indicators (e.g., Discord bot presence)
- Log message delivery for analytics/monitoring

Note: Full Discord presence support requires exposing setPresence via PluginRuntime.
The example plugin currently logs the status it would set.
2026-01-26 14:20:50 -08:00

83 lines
2.1 KiB
Markdown

# Discord Status Plugin
Updates Discord bot presence/status with session information after each message.
## Current Status: Partial Implementation
This plugin demonstrates the `message_sent` hook usage. It currently **logs** what status it would set, rather than actually updating Discord presence.
### What Works
- ✅ Hook triggers after each message is sent
- ✅ Session tracking via sessionKey
- ✅ Channel filtering (only fires for Discord)
- ✅ Custom status format strings
### What's Pending
- ⏳ Usage statistics (tokens, model, etc.) - requires wiring usage data through the reply pipeline
- ⏳ Actual Discord presence updates - requires exposing `setPresence` via PluginRuntime
## Configuration
```json5
{
plugins: {
entries: {
"discord-status": {
enabled: true,
config: {
format: "📊 {tokens} tokens",
activityType: "Custom" // Playing, Watching, Listening, Competing, Custom
}
}
}
}
}
```
### Format Placeholders
- `{tokens}` - Total tokens used in session
- `{input}` - Input tokens (when usage tracking is implemented)
- `{output}` - Output tokens (when usage tracking is implemented)
- `{model}` - Model name
- `{provider}` - Provider name
- `{session}` - Session key
## Contributing
To complete this plugin, the following changes are needed:
### 1. Usage Statistics (in `src/auto-reply/reply/dispatch-from-config.ts`)
The `getReplyFromConfig` return type needs to include usage metadata:
```typescript
type ReplyWithMeta = {
payload: ReplyPayload | ReplyPayload[];
meta?: {
usage?: {
inputTokens?: number;
outputTokens?: number;
totalTokens?: number;
model?: string;
provider?: string;
};
durationMs?: number;
};
};
```
### 2. Discord Presence API (in Discord channel runtime)
Expose `setPresence` method via `PluginRuntime.channel.discord`:
```typescript
// In src/discord/monitor/provider.ts
const gateway = client.getPlugin<GatewayPlugin>("gateway");
// Add: api.setPresence = (options) => gateway.setPresence(options);
```
## License
MIT - Clawdbot Contributors