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

@@ -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,