# Discord Rich Presence Plugin (Rust)A Navidrome plugin that displays your currently playing track on Discord using Rich Presence. This is the Rust implementation demonstrating how to use the `nd-pdk` library.## ⚠️ WarningThis plugin is for **demonstration purposes only**. It requires storing your Discord token in the Navidrome configuration file, which:1. Is not secure (tokens should never be stored in plain text)2. May violate Discord's Terms of Service**Use at your own risk.**## Features- Shows currently playing track on Discord Rich Presence- Displays album artwork- Shows track progress with start/end timestamps- Automatically clears presence when track finishes- Supports multiple users## CapabilitiesThis plugin implements multiple capabilities to demonstrate the nd-pdk library:- **Scrobbler**: Receives now-playing events from Navidrome- **SchedulerCallback**: Handles heartbeat and activity clearing timers- **WebSocketCallback**: Communicates with Discord gateway (text, binary, error, and close handlers)## ConfigurationConfigure in the Navidrome UI (Settings → Plugins → discord-rich-presence-rs):| Key | Description | Example ||---------------|--------------------------------------|---------------------------|| `clientid` | Your Discord application ID | `123456789012345678` || `user.<name>` | Discord token for the specified user | `user.alice` = `token123` |Each user is configured as a separate key with the `user.` prefix.### Getting Configuration Values1. **Client ID**: Create a Discord Application at https://discord.com/developers/applications and copy the Application ID2. **Discord Token**: This requires extracting your user token from Discord (not recommended for security reasons)3. **Multiple Users**: Add multiple user keys:```propertiesuser.user1 = "token1"user.user2 = "token2"```## Building```bash# From the plugins/examples directorymake discord-rich-presence-rs.ndp# This creates discord-rich-presence-rs.ndp containing:# - manifest.json# - plugin.wasm```## Installation1. Build the plugin using the command above2. Copy the `.ndp` file to your Navidrome plugins directory3. Enable and configure the plugin in the Navidrome UI (Settings → Plugins)4. Restart Navidrome if needed## Using nd-pdk LibraryThis plugin demonstrates how to use the Rust plugin development kit:```rustuse nd_pdk::host::{artwork, cache, scheduler, websocket};use std::collections::HashMap;// Get artwork URLlet url = artwork::get_track_url(track_id, 300)?;// Cache operationscache::set_string("key", "value", 3600)?;if let Some(value) = cache::get_string("key")? {// Use the cached value}// Schedule tasksscheduler::schedule_one_time(60, "payload", "task-id")?;scheduler::schedule_recurring("@every 30s", "heartbeat", "heartbeat-task")?;// WebSocket operationslet conn_id = websocket::connect("wss://example.com/socket", HashMap::new(), "my-conn")?;websocket::send_text(&conn_id, "Hello")?;```## LicenseGPL-3.0