aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* revert required permissionsmainsalmonik27 hours4-39/+58
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* tests: skip the piper smoke test when models are absentsalmonik4 days1-2/+8
|
* events: track voice channel movessalmonik4 days1-0/+16
|
* tts: initialize piper exactly oncesalmonik4 days1-42/+39
|
* music: keep preparation out of the guild lock and requeue failed connectssalmonik4 days1-99/+119
|
* docs: sync with current behaviorsalmonik4 days5-40/+57
|
* config: harden the shared temp directorysalmonik4 days3-8/+65
|
* docker: pin and verify a week-old yt-dlp releasesalmonik4 days2-6/+13
|
* leaderboard: use competition ranks consistentlysalmonik4 days1-1/+8
|
* web: percent-encode UTF-8 query bytessalmonik4 days1-7/+22
|
* autocomplete: key results by extension filter and reject the placeholdersalmonik4 days3-7/+27
|
* cron: validate expressions and allocate ids atomicallysalmonik4 days4-19/+19
|
* music: reject live streams on the yt-dlp pathsalmonik4 days2-0/+9
|
* music: decode compressed playback without a temp filesalmonik4 days2-12/+34
|
* tts: attach the generated WAV without a temp filesalmonik4 days1-11/+3
|
* qr: cap image dimensions and allocationsalmonik4 days1-2/+12
|
* downloads: cap yt-dlp media sizesalmonik4 days2-0/+27
|
* net: drop unused importsalmonik4 days1-1/+1
|
* config: make voice recording opt-insalmonik4 days1-4/+4
|
* net: block private and link-local URLssalmonik4 days8-1/+151
|
* docker: install ImageMagick for image compress/convertsalmonik4 days2-0/+2
|
* music: announce a directly started track oncesalmonik4 days1-8/+10
|
* cron: simplify the first-fire lookupsalmonik4 days1-8/+1
|
* recording: reject a zero-length windowsalmonik4 days2-2/+16
|
* cron/triggers: keep pre-scoping rows manageablesalmonik4 days2-8/+15
|
* tts: run piper loading and synthesis on blocking threadssalmonik4 days1-16/+28
|
* processes: add timeouts and keep decoding off the runtimesalmonik4 days4-29/+53
|
* http: add connect and request timeoutssalmonik4 days5-3/+21
|
* tts: bound the audio cache and request lengthsalmonik4 days1-5/+86
|
* autocomplete: bound the in-memory cachessalmonik4 days1-6/+24
|
* events: never join or move voice just to play TTSsalmonik4 days1-8/+16
|
* recording: keep one buffer per guildsalmonik4 days3-34/+41
|
* triggers: scope groups to the guild that created themsalmonik4 days4-24/+64
|
* cron: scope jobs to the guild that created themsalmonik4 days2-19/+47
|
* commands: gate admin, trigger, cron and recording behind permissionssalmonik4 days4-14/+18
|
* utilities: sanitize filenames and isolate temp operationssalmonik4 days1-48/+105
|
* yt-dlp: ignore configs and stop option injectionsalmonik4 days2-3/+16
|
* copyparty: never send the password to foreign hostssalmonik4 days4-28/+165
|
* say: do not abort if the ephemeral ack is already gonesalmonik5 days1-1/+3
|
* cron: keep scheduled audio silentsalmonik5 days3-3/+12
| | | | | | | Add a per-track silent flag. Cron already uses play_now (interrupt the current track), but play_next_locked still announced the track to the last known text channel; suppress playing and failure announcements for silent tracks, including when a cron track fails to prepare.
* say: post text as a normal message after an invisible acksalmonik5 days1-7/+15
| | | | | | Acknowledge the interaction with a zero-width ephemeral reply, delete it, then send the text through ChannelId::say so it lands as a normal channel message instead of an interaction reply.
* docker: bake espeak-ng data for Piper TTSsalmonik11 days5-9/+47
| | | | | | | | | | | espeak-rs-sys installs espeak-ng-data into the build tree and compiles that path in as the default, so the runtime image failed with 'phontab: No such file or directory'. Copy the data from the builder to /usr/share and point PIPER_ESPEAKNG_DATA_DIRECTORY there; compose overrides the host path from .env. Also trim trailing slashes from Copyparty base URLs, document that env_file changes need --force-recreate, and clean inline comments in .env.example.
* contextual play should add to the last in the queuesalmonik11 days1-8/+6
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* docker: build and run on Debian trixiesalmonik11 days4-0/+156
| | | | | | | | | | | Add a multi-stage image that compiles inside Debian trixie and runs on the same glibc/libssl/libopus, avoiding the Arch-built binary failing on Debian. The runtime image installs ffmpeg, qalc, the shared libraries, and the latest yt-dlp zipapp, and runs as uid 1000. compose.yaml mounts data/ and piper/, overrides TTS_MODEL_PATH for the container layout, and builds with host networking because the default Docker bridge DNS cannot resolve crates.io or deb.debian.org on this host.
* music: group playback commands under /musicsalmonik11 days5-31/+66
| | | | | | | | | Graduate grajcuj/skip/queue/stop/join into the /music parent and drop the top-level names. On startup, reconcile global slash commands and delete any that are no longer registered, since Discord otherwise keeps stale commands after a rename or move. Docs updated for the new command layout and queue semantics.
* music: add per-guild queue with now/next/last, skip and queuesalmonik11 days6-269/+790
| | | | | | | | | | Tracks are queued in memory per guild, defaulting to append (last). Playback auto-advances on TrackEvent::End/Error with a per-track token so manual stops and skips cannot double-advance. /music queue shows the current track followed by pending items. /stop clears the queue. Cron audio now goes through the same MusicState instead of poking the track-handle map directly.
* silence songbird udp_rx decode noisesalmonik2026-09-091-1/+6
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* record: 2x gain on mp3 encodesalmonik2026-09-091-0/+5
|
* test recorder ring semantics; extract mix_ticksalmonik2026-09-091-50/+187
|
* wire recording into voice manager, config, events, /record commandsalmonik2026-09-098-5/+158
|