| Commit message (Collapse) | Author | Age | Files | Lines |
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| |
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| |
|
|
|
|
| |
/grajcuj'ing
Signed-off-by: salmonik <salmonik@tuta.io>
|
| | |
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| | |
|
| | |
|
| |
|
|
| |
this lets stale records from abrupt stopping be deleted
|
| |
|
|
|
| |
Not saving full URL
Not using autocompletion content, just label
|
| |
|
|
|
|
|
|
|
|
|
| |
- New src/tts.rs: centralize TTS in synthesize(config, http_client, text)
Piper subprocess primary, Google Translate fallback on error/missing
- TTS_MODEL_PATH/TTS_VOICE env config (defaults to pl_PL-bass-high)
- Fix Unknown interaction errors: spawn play_tts_in_channel in background
so voice-state TTS no longer blocks the shard event loop (3s Discord limit)
- Best-effort confirmation replies in /tts to prevent error cascade
- Custom on_error handler: graceful interaction-expired error handling
- Comprehensive tracing logging (engine, model, duration, stderr)
|
| | |
|
| | |
|
| |
|
|
| |
Signed-off-by: salmonik <salmonik@tuta.io>
|
| |
|
|
| |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| |
|
|
| |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| |
|
|
| |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| |
|
|
| |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| |
|
|
| |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| |\
| |
| |
| | |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| | |\
| | |
| | |
| | |
| | |
| | | |
(#6) from dev into main
Reviewed-on: https://codeberg.org/salmonik/senator-sperma/pulls/6
|
| | | |
| | |
| | |
| | | |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| |/ /
| |
| |
| | |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| |\|
| |
| |
| |
| |
| | |
(#5) from dev into main
Reviewed-on: https://codeberg.org/salmonik/senator-sperma/pulls/5
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The stale-connection path was calling _remove_voice_client() then
creating a brand-new VoiceClient via channel.connect(). This created a
race: VOICE_SERVER_UPDATE (triggered by Discord when the user joins
voice) arrives between the destroy and the fresh-connect, gets consumed
by the old client, and the new client never receives it — causing a
10s timeout waiting for got_both_voice_updates.
Fix: after disconnect(), call vc.connect() on the same VoiceClient
instance. The disconnect resets the state machine to 'disconnected'
but the same VoiceConnectionState processes any events that arrive
between disconnect and reconnect, so the state machine correctly
reaches got_both_voice_updates.
|
| | |
| |
| |
| | |
Signed-off-by: salmonik <raisersoft@proton.me>
|
| | |
| |
| |
| | |
Signed-off-by: salmonik <raisersoft@proton.me>
|