Some checks failed
Music: - #random URL fragment shuffles playlist tracks before enqueuing - Lazy playlist resolution: first 10 tracks resolve immediately, remaining are fetched in a background task - !kept repair re-downloads kept tracks with missing local files - !kept shows [MISSING] marker for tracks without local files - TTS ducking: music ducks when merlin speaks via voice peer, smooth restore after TTS finishes Performance (from profiling): - Connection pool: preload_content=True for SOCKS connection reuse - Pool tuning: 30 pools / 8 connections (up from 20/4) - _PooledResponse wrapper for stdlib-compatible read interface - Iterative _extract_videos (replace 51K-deep recursion with stack) - proxy=False for local SearXNG Voice + multi-bot: - Per-bot voice config lookup ([<username>.voice] in TOML) - Mute detection: skip duck silence when all users muted - Autoplay shuffle deck (no repeats until full cycle) - Seek clamp to track duration (prevent seek-past-end stall) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
9.4 KiB
9.4 KiB
derp - Roadmap
v0.1.0 -- Foundation (done)
- IRC protocol: connect, parse, send
- TLS support with optional verification
- Plugin system with
@commandand@event - TOML configuration with defaults merging
- Built-in plugins: ping, help, version
- Auto PING/PONG, nick recovery, reconnect
- CLI entry point with argparse
v0.2.0 -- Operational Toolkit (done)
- Plugin hot-reload (!load, !reload, !unload, !plugins)
- Command shorthand (unambiguous prefix matching)
- Plugin help (!help )
- Container support (Containerfile, podman-compose)
- DNS plugin (raw UDP resolver, all record types)
- Encode/decode plugin (b64, hex, url, rot13)
- Hash plugin (generation + type identification)
- Defang/refang plugin (IOC sanitization)
- Reverse shell generator (11 languages)
- CIDR calculator plugin
- Bot uptime command
- SASL PLAIN authentication
- Rate limiting (anti-flood, token bucket)
- CTCP VERSION/TIME/PING responses
v0.3.0 -- Wave 2 + Admin (done)
- WHOIS plugin (raw socket, port 43)
- Port scanner plugin (async TCP connect)
- HTTP check plugin (status, redirects, timing)
- TLS check plugin (cipher, cert chain, expiry)
- DNSBL/blacklist check plugin
- Random generator plugin (passwords, UUIDs, hex)
- Timer plugin (countdown for time-boxed ops)
- Admin/owner permission system (hostmask + IRCOP)
- !whoami and !admins commands
v0.4.0 -- Wave 3 Plugins (Local Databases) (done)
- GeoIP plugin (MaxMind GeoLite2-City mmdb)
- ASN plugin (GeoLite2-ASN mmdb)
- Tor exit node check (local list, daily refresh)
- IP reputation plugin (Firehol blocklist feeds)
- CVE lookup plugin (local NVD JSON feed)
- Data update script (cron-friendly, all local DBs)
v0.5.0 -- Wave 4 Plugins (Advanced) (done)
- Operational logging plugin (SQLite per-channel)
- Persistent notes plugin (per-channel key-value)
- Subdomain enumeration (crt.sh + wordlist DNS brute)
- HTTP header fingerprinting (local signature db)
- ExploitDB search (local CSV clone)
- Payload template library (SQLi, XSS, SSTI, LFI, CMDi, XXE)
v1.0.0 -- Stable (done)
- IRCv3 capability negotiation (CAP LS 302)
- Message tags support (IRCv3 @tags parsing)
- Channel management commands (kick, ban, unban, topic, mode)
- Plugin state persistence (SQLite key-value store)
v1.1.0 -- Hardening + Wave 5 Plugins (done)
- Message truncation for IRC 512-byte limit
- Configurable reconnect backoff (exponential)
- Bot orchestrator + config merge tests
waybackplugin (Wayback Machine snapshot lookup)dorkplugin (Google dork query builder)- Per-channel plugin enable/disable
- Structured logging (JSON output option)
- Integration tests with mock IRC server
usernameplugin (cross-platform username enumeration)
v1.2.0 -- Subscriptions + Proxy (done)
rssplugin (RSS/Atom feed subscriptions with polling)ytplugin (YouTube channel follow via Atom feeds)twitchplugin (livestream notifications via public GQL)alertplugin (keyword alerts across 27 platforms)searxplugin (SearXNG web search)tdnsplugin (TCP DNS via SOCKS5 proxy)remindplugin (one-shot, repeating, calendar-based reminders)- SOCKS5 proxy transport layer (HTTP, TCP, async connections)
- Alert backends: YouTube, Twitch, SearXNG, Reddit, Mastodon, DuckDuckGo, Google News, Kick, Dailymotion, PeerTube, Bluesky, Lemmy, Odysee, Archive.org, Hacker News, GitHub, Wikipedia, Stack Exchange, GitLab, npm, PyPI, Docker Hub, arXiv, Lobsters, DEV.to, Medium, Hugging Face
- Alert result history (SQLite) with short IDs and
!alert info - OG tag fetching for keyword matching and date enrichment
- Invite auto-join with persistence
- Graceful SIGTERM shutdown
- InnerTube-based YouTube channel resolution for video URLs
v1.2.1 -- Performance + Polish (done)
- HTTP opener caching at module level (eliminates per-request construction)
--tracemallocCLI flag for memory profiling (dumps todata/derp.malloc)- Background seeding on
!alert add(instant reply, seeds asynchronously) - Per-backend error tracking with exponential backoff
- Concurrent fetches for multi-instance backends (PeerTube, Mastodon, Lemmy, SearXNG)
retriesparameter forderp.http.urlopen- Alert output: ACTION line (metadata/URL) + PRIVMSG (full uncropped title)
- tracemalloc writes to file instead of logger (survives podman log buffer)
v2.0.0 -- Multi-Server + Integrations
- Multi-server support (per-server config, shared plugins)
- Stable plugin API (versioned, breaking change policy)
- Paste overflow (auto-paste long output to FlaskPaste, return link)
- URL shortener integration (shorten URLs in subscription announcements)
- Webhook listener (HTTP endpoint for push events to channels)
- Granular ACLs (per-command permission tiers: trusted, operator, admin)
pastecommand (manual paste to FlaskPaste)shortencommand (manual URL shortening)emailcheckplugin (SMTP VRFY/RCPT TO)canaryplugin (canary token generator/tracker)virustotalplugin (hash/URL/IP/domain lookup, free API)abuseipdbplugin (IP abuse confidence scoring, free tier)jwtplugin (decode tokens, show claims/expiry, flag weaknesses)macplugin (OUI vendor lookup, local IEEE database)pastemoniplugin (monitor paste sites for keywords)cronplugin (scheduled bot commands on a timer)- Plugin command unit tests (encode, hash, dns, cidr, defang)
- CI pipeline (Gitea Actions, Python 3.11-3.13, ruff + pytest)
v2.1.0 -- Teams + Telegram Integration
- Microsoft Teams adapter via outgoing webhooks (no SDK)
TeamsBotclass with same plugin API as IRCBotTeamsMessagedataclass duck-typed with IRCMessage- HMAC-SHA256 webhook signature validation
- Permission tiers via AAD object IDs
- IRC-only methods as no-ops (join, part, kick, mode, set_topic)
- Incoming webhook support for
send()(proactive messages) - Paste overflow via FlaskPaste (same as IRC)
- Teams
send()routed through SOCKS5 proxy (bug fix) - Telegram adapter via long-polling (
getUpdates, no SDK) TelegramBotclass with same plugin API as IRCBotTelegramMessagedataclass duck-typed with IRCMessage- All Telegram HTTP through SOCKS5 proxy
- Message splitting at 4096-char limit
@botusernamesuffix stripping in groups- Adaptive Cards for richer formatting (Teams)
- Graph API integration for DMs and richer channel access (Teams)
- Teams event handlers (member join/leave)
v2.2.0 -- Protocol Expansion
- Mumble adapter via TCP/TLS protobuf control channel (text chat only)
- Discord adapter via WebSocket gateway + REST API
- Matrix adapter via long-poll
/syncendpoint - XMPP adapter via persistent TCP + XML stanzas (MUC support)
- Slack adapter via Socket Mode WebSocket
- Mattermost adapter via WebSocket API
- Bluesky adapter via AT Protocol firehose + REST API
v2.3.0 -- Mumble Voice + Multi-Bot (done)
- pymumble transport rewrite (voice + text)
- Music playback: play/stop/skip/prev/queue/np/volume/seek/resume
- Voice ducking (auto-lower music on voice activity)
- Kept track library with metadata (!keep, !kept, !play #N)
- Smooth fade-out on skip/stop/prev, fade-in on resume
- In-stream seek with pipeline swap (no task cancellation)
- Multi-bot Mumble: extra bots via
[[mumble.extra]] - Per-bot plugin filtering (only_plugins / except_plugins)
- Voice STT (Whisper) + TTS (Piper) plugin
- Configurable voice profiles (voice, FX, piper params)
- Rubberband pitch-shifting via CLI (Alpine ffmpeg lacks librubberband)
- Bot audio ignored in sound callback (no self-ducking, no STT of bots)
- Self-mute support (mute on connect, unmute for audio, re-mute after)
- Autoplay shuffled kept tracks on reconnect (silence detection)
- Alias plugin (!alias add/del/list)
- Container management tools (tools/build, start, stop, restart, nuke, logs, status)
v2.4.0 -- Music Discovery + Performance
- Last.fm integration (artist.getSimilar, artist.getTopTags, track.getSimilar)
!similarcommand (find similar artists, optionally queue via YouTube)!tagscommand (genre/style tags for current track)- Pause/unpause (
!pausetoggle, position tracking, stale re-download) - Autoplay continuous radio (random kept, silence-aware, cooldown between tracks)
- Periodic resume persistence (10s interval, survives hard kills)
- Track duration in
!np(elapsed/total via ffprobe) !announcetoggle (optional track announcements)- Direct bot addressing (
merlin: say <text>, TTS via voice peer) - Self-deafen on connect
- Fade-out click fix (conditional buffer clear, post-fade drain)
- cProfile analysis tool (
tools/profile) - Mute detection: skip duck silence when all users muted
- Autoplay shuffle deck (no repeats until full cycle)
- Seek clamp to track duration (prevent seek-past-end stall)
- Iterative
_extract_videos(replace 51K-deep recursion with stack) - Bypass SOCKS5 for local SearXNG (
proxy=False) - Connection pool:
preload_content=Truefor SOCKS connection reuse - Pool tuning: 30 pools / 8 connections (up from 20/4)