aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* web: percent-encode UTF-8 query bytessalmonik5 days1-7/+22
|
* autocomplete: key results by extension filter and reject the placeholdersalmonik5 days3-7/+27
|
* cron: validate expressions and allocate ids atomicallysalmonik5 days4-19/+19
|
* music: reject live streams on the yt-dlp pathsalmonik5 days2-0/+9
|
* music: decode compressed playback without a temp filesalmonik5 days2-12/+34
|
* tts: attach the generated WAV without a temp filesalmonik5 days1-11/+3
|
* qr: cap image dimensions and allocationsalmonik5 days1-2/+12
|
* downloads: cap yt-dlp media sizesalmonik5 days2-0/+27
|
* net: drop unused importsalmonik5 days1-1/+1
|
* config: make voice recording opt-insalmonik5 days1-4/+4
|
* net: block private and link-local URLssalmonik5 days8-1/+151
|
* docker: install ImageMagick for image compress/convertsalmonik5 days2-0/+2
|
* music: announce a directly started track oncesalmonik5 days1-8/+10
|
* cron: simplify the first-fire lookupsalmonik5 days1-8/+1
|
* recording: reject a zero-length windowsalmonik5 days2-2/+16
|
* cron/triggers: keep pre-scoping rows manageablesalmonik5 days2-8/+15
|
* tts: run piper loading and synthesis on blocking threadssalmonik5 days1-16/+28
|
* processes: add timeouts and keep decoding off the runtimesalmonik5 days4-29/+53
|
* http: add connect and request timeoutssalmonik5 days5-3/+21
|
* tts: bound the audio cache and request lengthsalmonik5 days1-5/+86
|
* autocomplete: bound the in-memory cachessalmonik5 days1-6/+24
|
* events: never join or move voice just to play TTSsalmonik5 days1-8/+16
|
* recording: keep one buffer per guildsalmonik5 days3-34/+41
|
* triggers: scope groups to the guild that created themsalmonik5 days4-24/+64
|
* cron: scope jobs to the guild that created themsalmonik5 days2-19/+47
|
* commands: gate admin, trigger, cron and recording behind permissionssalmonik5 days4-14/+18
|
* utilities: sanitize filenames and isolate temp operationssalmonik5 days1-48/+105
|
* yt-dlp: ignore configs and stop option injectionsalmonik5 days2-3/+16
|
* copyparty: never send the password to foreign hostssalmonik5 days4-28/+165
|
* say: do not abort if the ephemeral ack is already gonesalmonik6 days1-1/+3
|
* cron: keep scheduled audio silentsalmonik6 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 acksalmonik6 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 queuesalmonik12 days1-8/+6
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* docker: build and run on Debian trixiesalmonik12 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 /musicsalmonik12 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 queuesalmonik12 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
|
* first draftsalmonik2026-09-092-0/+410
|
* /grajcuj plays video-like extensions toosalmonik2026-09-092-9/+9
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* message-contextual /grajcujsalmonik2026-09-093-13/+58
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* assistant replies to the messagesalmonik2026-09-093-4/+4
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* make /grajcuj w\ compress finally work as compressing a file and thensalmonik2026-09-094-48/+132
| | | | | | /grajcuj'ing Signed-off-by: salmonik <salmonik@tuta.io>
* feat: piper now not a subprocess, cache system for TTSsalmonik2026-09-0512-175/+762
|
* remove ` from TTS and make events use lang.rssalmonik2026-09-032-31/+108
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* fix: cosmetic changessalmonik2026-09-021-50/+47
| | | | Signed-off-by: salmonik <salmonik@tuta.io>
* fix: enable wav supportsalmonik2026-08-192-7/+38
|