Commit Graph

10 Commits

Author SHA1 Message Date
user
e9d17e8b00 feat: voice profiles, rubberband FX, per-bot plugin filtering
- Add rubberband package to container for pitch-shifting FX
- Split FX chain: rubberband CLI for pitch, ffmpeg for filters
- Configurable voice profile (voice, fx, piper params) in [voice]
- Extra bots inherit voice config (minus trigger) for own TTS
- Greeting is voice-only, spoken directly by the greeting bot
- Per-bot only_plugins/except_plugins filtering on Mumble
- Alias plugin, core plugin tests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 11:41:00 +01:00
user
d884d2bb55 refactor: switch Mumble voice to pymumble transport
asyncio's SSL memory-BIO transport silently drops voice packets even
though text works fine. pymumble uses blocking ssl.SSLSocket.send()
which reliably delivers voice data.

- Rewrite MumbleBot to use pymumble for connection, SSL, ping, and
  voice encoding/sending
- Bridge pymumble thread callbacks to asyncio via
  run_coroutine_threadsafe for text dispatch
- Voice via sound_output.add_sound(pcm) -- pymumble handles Opus
  encoding, packetization, and timing
- Remove custom protobuf codec, voice varint, and opus ctypes wrapper
- Add container patches for pymumble ssl.wrap_socket (Python 3.13) and
  opuslib find_library (musl/Alpine)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 23:15:42 +01:00
user
d756e7c020 fix: add opus, ffmpeg, yt-dlp to container image
Music playback requires system libraries that were missing from the
Alpine-based container.
2026-02-21 21:47:49 +01:00
user
94f563d55a feat: connection pooling via urllib3 + batch OG fetching
Replace per-request SOCKS5+TLS handshakes with urllib3 SOCKSProxyManager
connection pool (20 pools, 4 conns/host). Batch _fetch_og calls via
ThreadPoolExecutor to parallelize OG tag enrichment in alert polling.
Cache flaskpaste SSL context at module level.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 20:52:22 +01:00
user
33c6032329 fix: enable unbuffered Python output in container
Without PYTHONUNBUFFERED=1, Python buffers stdout causing
podman logs to show no output.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 19:25:21 +01:00
user
87b43e211a fix: install PySocks in container image
All plugins importing derp.http failed to load because PySocks
was missing from the container. Add it alongside maxminddb.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:37:51 +01:00
user
ee68e77157 refactor: mount source and plugins instead of baking into image
Containerfile now installs only dependencies (maxminddb). Source
code, plugins, and config are volume-mounted via docker-compose.
Code changes no longer require an image rebuild.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 03:49:09 +01:00
user
691c849109 feat: switch container base to python:3.13-alpine
Reduces image size from 157 MB to 61 MB. All dependencies
(maxminddb) have pre-built musl wheels, no build toolchain needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 03:42:30 +01:00
user
830add0797 refactor: mount plugins and config instead of baking into image
Image now contains only the derp package. Config and plugins are
bind-mounted at runtime, enabling live edits without rebuilds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:20:30 +01:00
user
7b9cde6192 feat: add container support with Containerfile and make targets
- Containerfile: python:3.13-slim base, pip install, copy plugins
- .containerignore: exclude dev artifacts from build context
- Makefile: add build, container-run, container-stop, container-logs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:16:05 +01:00