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`.
This commit is contained in:
Kyle Simpson
2022-01-13 12:17:41 +00:00
parent 12c76a9046
commit b4ce84546b
9 changed files with 187 additions and 54 deletions

View File

@@ -9,10 +9,10 @@ futures = "0.3"
tracing = "0.1"
tracing-subscriber = "0.2"
tokio = { features = ["macros", "rt-multi-thread", "sync"], version = "1" }
twilight-gateway = "0.6"
twilight-http = "0.6"
twilight-model = "0.6"
twilight-standby = "0.6"
twilight-gateway = "0.8"
twilight-http = "0.8"
twilight-model = "0.8"
twilight-standby = "0.8"
[dependencies.songbird]
default-features = false

View File

@@ -30,14 +30,13 @@ use std::{collections::HashMap, env, error::Error, future::Future, sync::Arc};
use tokio::sync::RwLock;
use twilight_gateway::{Cluster, Event, Intents};
use twilight_http::Client as HttpClient;
use twilight_model::{channel::Message, gateway::payload::MessageCreate, id::GuildId};
use twilight_model::{channel::Message, gateway::payload::incoming::MessageCreate, id::GuildId};
use twilight_standby::Standby;
type State = Arc<StateRef>;
#[derive(Debug)]
struct StateRef {
cluster: Cluster,
http: HttpClient,
trackdata: RwLock<HashMap<GuildId, TrackHandle>>,
songbird: Songbird,
@@ -69,12 +68,11 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
let (cluster, events) = Cluster::new(token, intents).await?;
cluster.up().await;
let songbird = Songbird::twilight(cluster.clone(), user_id);
let songbird = Songbird::twilight(Arc::new(cluster), user_id);
(
events,
Arc::new(StateRef {
cluster,
http,
trackdata: Default::default(),
songbird,