Commit Graph

136 Commits

Author SHA1 Message Date
Gnome!
0beb0f0d76 Input: lazy_static -> once_cell::sync::Lazy (#136) 2023-11-19 23:58:34 +00:00
Victoria Casasampere Fernandez
cb0a74f511 Support simd_json (#105)
This PR adds support for the simd-json library whenever decoding or encoding JSON responses. This may be enabled independently of serenity and twilight support for SIMD acceleration.

Co-authored-by: Kyle Simpson <kyleandrew.simpson@gmail.com>
2023-11-19 23:58:34 +00:00
Kyle Simpson
8cc7a22b0b Driver/Input: Migrate audio backend to Symphonia (#89)
This extensive PR rewrites the internal mixing logic of the driver to use symphonia for parsing and decoding audio data, and rubato to resample audio. Existing logic to decode DCA and Opus formats/data have been reworked as plugins for symphonia. The main benefit is that we no longer need to keep yt-dlp and ffmpeg processes alive, saving a lot of memory and CPU: all decoding can be done in Rust! In exchange, we now need to do a lot of the HTTP handling and resumption ourselves, but this is still a huge net positive.

`Input`s have been completely reworked such that all default (non-cached) sources are lazy by default, and are no longer covered by a special-case `Restartable`. These now span a gamut from a `Compose` (lazy), to a live source, to a fully `Parsed` source. As mixing is still sync, this includes adapters for `AsyncRead`/`AsyncSeek`, and HTTP streams.

`Track`s have been reworked so that they only contain initialisation state for each track. `TrackHandles` are only created once a `Track`/`Input` has been handed over to the driver, replacing `create_player` and related functions. `TrackHandle::action` now acts on a `View` of (im)mutable state, and can request seeks/readying via `Action`.

Per-track event handling has also been improved -- we can now determine and propagate the reason behind individual track errors due to the new backend. Some `TrackHandle` commands (seek etc.) benefit from this, and now use internal callbacks to signal completion.

Due to associated PRs on felixmcfelix/songbird from avid testers, this includes general clippy tweaks, API additions, and other repo-wide cleanup. Thanks go out to the below co-authors.

Co-authored-by: Gnome! <45660393+GnomedDev@users.noreply.github.com>
Co-authored-by: Alakh <36898190+alakhpc@users.noreply.github.com>
2023-11-19 23:58:34 +00:00
Erk
69339e8d45 Update twilight support to twilight 0.11 (#132)
* update twilight support to twilight 0.11

* rustfmt
2022-07-22 15:41:18 +01:00
Kyle Simpson
4eb95d4b59 Deps: Update to Audiopus v0.3.0-rc.0 (#125)
Tested using `cargo make ready`.

Co-authored-by: André Vennberg <andre.vennberg@gmail.com>
2022-07-22 15:41:18 +01:00
Gnome!
e3476e7965 Driver: Remove spin_sleep in Mixer::march_deadline (#124)
* Remove spin_sleep

* Remove comment
2022-07-22 15:41:18 +01:00
Gnome!
f2cd8a0b6a Driver, Gateway: Remove tokio 0.2 support (#118)
* Remove tokio 0.2 compat
* Remove tokio 0.2 test
* Remove tokio 0.2 CI
2022-07-22 15:41:18 +01:00
Jan
bacf681465 driver, queue: return track handle when adding an Input to the queue (#116) 2022-07-22 15:41:18 +01:00
Kyle Simpson
ac20764157 Events: Remove deprecated events. (#115)
This removes the `ClientConnect`, `DriverConnectFailed`, `DriverReconnectFailed` and `SsrcKnown` events.

Tested using `cargo make ready`.
2022-07-22 15:41:18 +01:00
Kyle Simpson
0730a00dc7 Gateway: Twilight v0.9 support (#110)
This handles twilight's migration to a unified `Id` type, which is the only design change needing any handling on our part. All our `From`/`Into`s are covered now, and deprecated type aliases are no longer used.

This was tested using `cargo make ready` and by manually running "examples/twilight".
2022-07-22 15:41:18 +01:00
Kyle Simpson
b4ce84546b Gateway: Generic Shard and Twilight v0.8 Support (#109)
This PR adds support for twilight v0.8, mainly adapting to significant API changes introduced by v0.7. As a result of these, twilight no longer accepts arbitrary JSON input, so it seemed sensible to adapt our `Shard` design to no longer require the same.

Adding to this, I've added in a trait to allow an arbitrary `Shard` to be installed, given only an implementation of a method to send a `VoiceStateUpdate`. Together, `Sharder::Generic` (songbird::shards::VoiceUpdate) and `Shard::Generic` (songbird::shards::GenericSharder) should allow any library to be hooked in to Songbird.

This PR was tested using `cargo make ready` and by manually testing `examples/twilight`.
2022-07-22 15:41:18 +01:00
Kyle Simpson
12c76a9046 Gateway: Remove lifetime from Serenity setup trait (#103)
This matches a recent serenity change where `ClientBuilder` no longer has an explicit lifetime parameter.

This was tested using `cargo make ready`.
2022-07-22 15:41:18 +01:00
Kyle Simpson
8dedf3bf01 Gateway: Add generics to Call methods. (#102)
Adds generics to any `Id` types on `Call`. Also includes the overlooked `Songbird::get_or_insert`.

Closes #94. Tested using `cargo make ready`.
2022-07-22 15:41:18 +01:00
Kyle Simpson
8791805804 Driver: Prevent panic when decrypting undersized RTP packets (#122)
Decrypt logic had two locations where the nonce would be separated from the payload without verifying the buffer size first, causing a panic for small packets.

Nonce and header removal now return an error if there are insufficient bytes.

Tested using `cargo make ready`, with some new tests to check that small packets simply return an `Err(...)`, and that encryption/decryption still function.
2022-04-19 11:16:47 +01:00
Kyle Simpson
806a422a2e Events: Document format of VoiceData. (#114)
Closes #100.
2022-02-14 15:00:57 +00:00
Kyle Simpson
652ec1f293 Docs: fix ClientConnect to recommend SpeakingStateUpdate 2022-02-13 18:53:33 +00:00
Kyle Simpson
c464fcc38d Events: Deprecate ClientConnect (#112)
Discord no longer send these websocket payloads, users should instead rely on the main part of their bot for determining actual connection events, or `SpeakingUpdate`s for SSRC mapping.

Closes #104.
2022-02-13 12:06:50 +00:00
Miles Frankel
ecc47d588a Input: add ChildContainer::new (#108) 2022-01-12 10:58:59 +00:00
Lunarmagpie
73323e58dd Docs: added documentation for yt-dlp feature (#106)
* Docs: added documentation for yt-dlp feature
* Docs: remove trailing whitespace
2022-01-04 13:45:39 +00:00
Miezhiko
6fcb196e34 Input: Allows yt-dlp usage as another youtube-dl fork (#90)
Signed-off-by: Miezhiko <Miezhiko@gmail.com>
2021-10-10 20:56:32 +01:00
Kyle Simpson
e25cc140b8 Events: fix handling of multiple timed events on a single track (#96)
Fixes an issue where the `EventData` were not stored in reverse order, meaning that only the last added TimedEvent would be serviced.

This reverses the `Ord` for `EventData`, which should only be internally compared, allowing all timed events to be processed correctly in order.

Fixes #95.
2021-09-29 09:51:39 +01:00
Kyle Simpson
dad48ca835 Driver: Fix incorrect leave behaviour in Drop handler
Sending poison messages should suffice to kill the voice session: attempting to `.leave()`. Fixes #88.

This was tested using `cargo make ready` and the modified `serenity/voice/` example.
2021-08-17 12:14:50 +01:00
Kyle Simpson
3efe756ca5 Chore: Update Lavalink URLs
Author's GitHub page had changed. Closes #86.
2021-08-17 11:41:52 +01:00
Vilgot Fredenberg
1b0bcbb5f6 Deps: Bump twilight versions -> [0.5, 0.7) (#87)
Includes two more small changes too small to warrant PRs.
1. Removes the `shard_count` parameter from `Songbird::twilight` & `Songbird::twilight_from_config` since the cluster contains it.
2. Drops the `Arc` wrapper around `Songbird` to match against an upcoming twilight 0.7 change
2021-08-16 20:31:27 +01:00
Vilgot Fredenberg
91d7542593 Tracks: Remove box around TrackState (#84)
Boxing is unnecessary since `TrackState` implements copy.

Tested using `cargo make ready`.
2021-07-01 11:55:35 +01:00
Kyle Simpson
210e3ae584 Driver: Automate (re)connection logic (#81)
This PR adds several enhancements to Driver connection logic:
* Driver (re)connection attempts now have a default timeout of around 10s.
* The driver will now attempt to retry full connection attempts using a user-provided strategy: currently, this defaults to 5 attempts under an exponential backoff strategy.
* The driver will now fire `DriverDisconnect` events at the end of any session -- this unifies (re)connection failure events with session expiry as seen in #76, which should provide users with enough detail to know *which* voice channel to reconnect to. Users still need to be careful to read the session/channel IDs to ensure that they aren't overwriting another join.

This has been tested using `cargo make ready`, and by setting low timeouts to force failures in the voice receive example (with some additional error handlers).

Closes #68.
2021-07-01 11:55:31 +01:00
Kyle Simpson
be3030932e Chore: Clippy fixes for new lints 2021-07-01 11:34:30 +01:00
Vilgot Fredenberg
00c8bc915a Input: Add separate YouTube title and channel to Metadata (#75) 2021-07-01 11:34:30 +01:00
Vilgot Fredenberg
55e1567b90 Input, Driver: Make error messages more idiomatic (#74) 2021-07-01 11:33:51 +01:00
Vilgot Fredenberg
7045e2ec5a Input: Implement StdError for DcaError, input::Error (#73) 2021-07-01 11:33:51 +01:00
Kyle Simpson
0f54d18455 Gateway: Add debug logging around shard handling
Adds some additional logging around some critical sections, rarely hit (i.e., during shard reconnections) in pursuit of issue #69. It's strongly suspected to lie here, at any rate...
2021-07-01 11:33:12 +01:00
Kyle Simpson
fea204366b Chore: Repair formatting. 2021-07-01 11:30:02 +01:00
Kyle Simpson
91be0df5d5 Chore: Fix clippy warnings (useless clones). 2021-07-01 11:30:02 +01:00
Kyle Simpson
94c57f4ab5 Deps: Bump xsalsa20poly1305 version -> 0.7
This dependency upgrade (at last) resolves the duplicated rand_core versions present in builds. This was tested using `cargo make ready`.
2021-07-01 11:30:02 +01:00
Clarity
3c9b421fb4 Input: Change all Youtube-dl functions to take AsRef<str> (#70)
Unifies the API on all ytdl functions to remove some friction in passing in Strings, Cows, strs, and so on.

Closes #57.
2021-07-01 11:30:02 +01:00
James Liu
bc9a78e050 Use symphonia::io::MediaSource for Reader extensions (#61)
This PR does the following:

 * Changes both `Reader::Extension` and `Reader::ExtensionSeek`  to use `symphonia::io::MediaSource`.
 * Removes the `File` and `Vec` variants of readers, instead opting to provide a `from_file` and `from_memory` associated function to create readers from the `File` and `Cursor<Vec<u8>>` implementations of `MediaSource`. 
 * Removes the ReadSeek trait.
 * Added a dependency on `symphonia_core`. This crate has no additional dependencies.
2021-07-01 11:30:02 +01:00
Kyle Simpson
0bb2572deb Chore: Adapt #60, #64 in line with other breaking changes.
This commit undoes #64 (and bumps the library MSRV accordingly), and modifies #60 to match the new `Call` connection handling.

This was tested using `cargo make ready`, and rustc v1.49.0 on `examples/serenity/voice`.
2021-07-01 11:30:01 +01:00
Kyle Simpson
af2347c128 Input: Rename YTDL error variants for Clippy (#55)
This silences a clippy lint around incorrect capitalisation of acronyms, but sis a breaking API change.

This was tested using `cargo make ready`.
2021-07-01 11:30:01 +01:00
Kyle Simpson
27f26ade99 Events: Break out and non-exhaust context body structs (#54)
This PR makes many of the types under `EventContext` separate `#[non_exhaustive]` structs. This makes it more feasible to add further information to connection and packet events as required in future. On this note, driver (re)connection events now include the SSRC supplied by Discord and the domain name which was connected to.

In addition, this fixes global timed events to return a list of all live tracks, and extensively details/documents events at a high level.

This was tested using `cargo make ready`.
2021-07-01 11:30:01 +01:00
Kyle Simpson
1bfee1b989 Driver: Move Bitrate import out of crate root. (#53)
This is a simple organisational change which moves `crate::Bitrate` to `crate::driver::Bitrate` to slightly clean up the crate root.

This has been tested using `cargo make ready`.
2021-07-01 11:30:01 +01:00
Kyle Simpson
1fc3dc2259 Gateway: Add connection timeout, add Config to gateway. (#51)
This change fixes tasks hanging due to rare cases of messages being lost between full Discord reconnections by placing a configurable timeout on the `ConnectionInfo` responses. This is a companion fix to [serenity#1255](https://github.com/serenity-rs/serenity/pull/1255). To make this doable, `Config`s are now used by all versions of `Songbird`/`Call`, and relevant functions are  added to simplify setup with configuration. These are now non-exhaustive, correcting an earlier oversight. For future extensibility, this PR moves the return type of `join`/`join_gateway` into a custom future (no longer leaking flume's `RecvFut` type).

Additionally, this fixes the Makefile's feature sets for driver/gateway-only compilation.

This is a breaking change in:
* the return types of `join`/`join_gateway`
* moving `crate::driver::Config` -> `crate::Config`,
* `Config` and `JoinError` becoming `#[non_breaking]`.

This was tested via `cargo make ready`, and by testing `examples/serenity/voice_receive` with various timeout settings.
2021-07-01 11:30:01 +01:00
Kyle Simpson
e59c546503 Gateway: Fix repeat joins on same channel from stalling (#47)
Joining a channel returns a future which fires on receipt of two messages from discord (by locally storing a channel). However, joining this same channel again after a success returns only *one* such message, causing the command to hang until another join fires or the channel is left. This alters internal behaviour to correctly cancel an in-progress connection attempt, or return success with known data if such a connection is present.

This introduces a breaking change on `Call::update_state` to include the target `ChannelId`. The reason for this is that although the `ChannelId` of a target channel was being stored, server admins may move or kick a bot from its voice channel. This changes the true channel, and may accidentally trigger a "double join" elsewhere.

This fix was tested by using an example to have a bot join its channel twice, to do so in a channel it had been moved to, and to move from a channel it had been moved to.
2021-07-01 11:30:01 +01:00
Jude Southworth
e58cadb2a4 Input: Fix Duration underflow on negative start time (#83) 2021-06-24 17:57:40 +01:00
Kyle Simpson
b925309778 Driver: Fix for busy-wait in WS thread. (#78)
Debugging work put forth by JellyWx and jtscuba suggests that this WS thread receive is ending up in a permanent failure loop. This adapts the timeout-less receive such that receive failures are properly propagated.

This was tested using `cargo make ready` and using the `voice_storage` example (although I cannot repro the locking behaviour myself).

Comments in #69 suggest this is fixed -- closes #69.
2021-06-14 12:15:23 +01:00
Vilgot Fredenberg
c97f23ee27 Tracks: Simplify track end event handler (#77) 2021-06-14 11:42:37 +01:00
Kyle Simpson
24d8da69c0 Driver: Fix crash on .leave() (#63)
Leaving (rather than removing) a call would cause the driver to crash as it would try to use a non-existent connection immediately after it had been invalidated.

This has been tested using a modified `examples/serenity/voice_storage`, felyne, and via `cargo make ready`.
2021-04-10 22:44:17 +01:00
Douman
22214a0f89 Gateway: Introduce Call::current_channel (#60)
* Introduce Call::current_channel

* Add note on channel id
2021-04-10 13:19:59 +01:00
Kyle Simpson
db7994087a Gateway: Allow connection info to be retrieved (#49)
This is a simple addition to allow current connection state to be retrieved *after* establishment, even when using the voice driver.

This has been tested using `cargo make ready`, as it is fairly simple functionality.
2021-03-22 20:50:35 +00:00
Kyle Simpson
a3f86ad34d Driver: Reduce logging level in general (#48)
This change reduces many log levels to debug, particularly where errors are likely to be triggered by undocumented Discord messages or by threads exiting in an unpredictable way. This also reduces the task entry/exit messages to `trace`.

This PR has been tested via `cargo make ready`, and by manually inspecting logs at `debug` and `info` levels running `examples/serenity/voice`.
2021-03-22 19:00:19 +00:00
Kyle Simpson
a9b4cb7715 Prevent mixer thread from waking while inactive (#46)
This change prevents mixer threads from waking every 20ms without an active voice connection. This was leading to unacceptably high CPU usage in cases where users needed to preserve this state between many active connections. Additionally, this modifies the documentation of `Songbird::leave` to emphasise why users would prefer to `remove` their calls.

This was tested by examining the CPU usage in task manager before and after the change was made, using a control of 10k manually created `Driver` instances. After creation is finished, the Drivers no longer saturate a 6-core laptop Intel i7 (while they very much did so before).

Closes #42.
2021-03-14 17:18:24 +00:00