2.1 KiB
2.1 KiB
IRC Bot Plugins — Sopel + Limnoria
Date: 2026-03-12 Task: Design and implement two functionally-identical IRC bot plugins (Sopel and Limnoria) that query the NtR SoundCloud Fetcher API.
Changes Made
New files
plugins/sopel/ntr_playlist.py— Single-file Sopel pluginplugins/limnoria/NtrPlaylist/__init__.py— Limnoria plugin package initplugins/limnoria/NtrPlaylist/config.py— Limnoria registry configplugins/limnoria/NtrPlaylist/plugin.py— Limnoria command handlersplugins/limnoria/NtrPlaylist/test.py— Limnoria test stubtests/test_plugin_helpers.py— 13 tests for formatting and API helpersdocs/plans/2026-03-12-irc-plugins-design.md— Design documentdocs/plans/2026-03-12-irc-plugins-implementation.md— Implementation plan
Commands implemented (identical in both)
!1,!2, etc. — Track by position (regex catch-all)!song <episode> <position>— Track from specific episode!playlist [episode]— Full playlist (comma-separated, truncated for IRC)!status— API health info!refresh— Admin-only manual refresh
Design decisions
- Fully independent plugins (no shared code) for easy deployment
- stdlib
urllib.requestonly — zero external dependencies - Admin check via plugin-config nickname list (case-insensitive)
- No caching — always fetch fresh from API
- Playlist output truncated at 430 chars for IRC line limits
Commits
2a00cc2feat(sopel): add NtR playlist IRC plugin6dd7aeefeat(limnoria): add NtrPlaylist IRC plugin5c22776test: add tests for IRC plugin formatting and API helpersb63c851docs: add IRC bot plugins design and implementation plan05bcf18fix: playlist truncation overflow and align logging across plugins
Follow-up items
- Limnoria
test.pyis a stub — could add real PluginTestCase tests if Limnoria is a test dependency - Both plugins log API errors; Sopel uses
LOGGER(defined but previously unused) - The
!Nregex command uses!explicitly; named commands use the bot's configured prefix (Sopel default is., so configurecore.command_prefix = "!"for consistency)