Gateway: Fix serenity breaking changes (#173)

Fix issues caused by serenity-rs/serenity#2372 and serenity-rs/serenity#2380.

Additionally, this Boxes the TrySendError from Serenity at Clippy's behest (causing a ~330B Result type).

---------

Co-authored-by: Kyle Simpson <kyleandrew.simpson@gmail.com>
This commit is contained in:
0/0
2023-04-12 20:21:25 +00:00
committed by Kyle Simpson
parent 7f519d0503
commit 4d0c1c030d
3 changed files with 18 additions and 16 deletions

View File

@@ -5,7 +5,7 @@ use futures::channel::mpsc::TrySendError;
#[cfg(not(feature = "simd-json"))] #[cfg(not(feature = "simd-json"))]
pub use serde_json::Error as JsonError; pub use serde_json::Error as JsonError;
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
use serenity::gateway::InterMessage; use serenity::gateway::ShardRunnerMessage;
#[cfg(feature = "simd-json")] #[cfg(feature = "simd-json")]
pub use simd_json::Error as JsonError; pub use simd_json::Error as JsonError;
#[cfg(feature = "gateway")] #[cfg(feature = "gateway")]
@@ -48,7 +48,7 @@ pub enum JoinError {
Driver(ConnectionError), Driver(ConnectionError),
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
/// Serenity-specific WebSocket send error. /// Serenity-specific WebSocket send error.
Serenity(TrySendError<InterMessage>), Serenity(Box<TrySendError<ShardRunnerMessage>>),
#[cfg(feature = "twilight")] #[cfg(feature = "twilight")]
/// Twilight-specific WebSocket send error when a message fails to send over websocket. /// Twilight-specific WebSocket send error when a message fails to send over websocket.
Twilight(SendError), Twilight(SendError),
@@ -117,8 +117,8 @@ impl Error for JoinError {
} }
#[cfg(all(feature = "serenity", feature = "gateway"))] #[cfg(all(feature = "serenity", feature = "gateway"))]
impl From<TrySendError<InterMessage>> for JoinError { impl From<Box<TrySendError<ShardRunnerMessage>>> for JoinError {
fn from(e: TrySendError<InterMessage>) -> Self { fn from(e: Box<TrySendError<ShardRunnerMessage>>) -> Self {
JoinError::Serenity(e) JoinError::Serenity(e)
} }
} }

View File

@@ -17,8 +17,7 @@ use once_cell::sync::OnceCell;
use parking_lot::RwLock as PRwLock; use parking_lot::RwLock as PRwLock;
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
use serenity::{ use serenity::{
client::bridge::voice::VoiceGatewayManager, gateway::{ShardRunnerMessage, VoiceGatewayManager},
gateway::InterMessage,
model::{ model::{
id::{GuildId as SerenityGuild, UserId as SerenityUser}, id::{GuildId as SerenityGuild, UserId as SerenityUser},
voice::VoiceState, voice::VoiceState,
@@ -416,7 +415,7 @@ impl VoiceGatewayManager for Songbird {
debug!("Songbird ({:?}) Initialised!", user_id); debug!("Songbird ({:?}) Initialised!", user_id);
} }
async fn register_shard(&self, shard_id: u32, sender: Sender<InterMessage>) { async fn register_shard(&self, shard_id: u32, sender: Sender<ShardRunnerMessage>) {
debug!( debug!(
"Registering Serenity shard handle {} with Songbird", "Registering Serenity shard handle {} with Songbird",
shard_id shard_id

View File

@@ -12,7 +12,7 @@ use parking_lot::{lock_api::RwLockWriteGuard, Mutex as PMutex, RwLock as PRwLock
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
use serde_json::json; use serde_json::json;
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
use serenity::gateway::InterMessage; use serenity::gateway::ShardRunnerMessage;
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
use std::result::Result as StdResult; use std::result::Result as StdResult;
use std::sync::Arc; use std::sync::Arc;
@@ -96,7 +96,7 @@ impl Sharder {
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
impl Sharder { impl Sharder {
#[allow(unreachable_patterns)] #[allow(unreachable_patterns)]
pub(crate) fn register_shard_handle(&self, shard_id: u32, sender: Sender<InterMessage>) { pub(crate) fn register_shard_handle(&self, shard_id: u32, sender: Sender<ShardRunnerMessage>) {
if let Sharder::Serenity(s) = self { if let Sharder::Serenity(s) = self {
s.register_shard_handle(shard_id, sender); s.register_shard_handle(shard_id, sender);
} else { } else {
@@ -128,7 +128,7 @@ impl SerenitySharder {
self.0.entry(shard_id).or_default().clone() self.0.entry(shard_id).or_default().clone()
} }
fn register_shard_handle(&self, shard_id: u32, sender: Sender<InterMessage>) { fn register_shard_handle(&self, shard_id: u32, sender: Sender<ShardRunnerMessage>) {
// Write locks are only used to add new entries to the map. // Write locks are only used to add new entries to the map.
let handle = self.get_or_insert_shard_handle(shard_id); let handle = self.get_or_insert_shard_handle(shard_id);
@@ -180,7 +180,7 @@ impl VoiceUpdate for Shard {
} }
}); });
handle.send(InterMessage::json(map.to_string()))?; handle.send(ShardRunnerMessage::Message(map.to_string().into()))?;
Ok(()) Ok(())
}, },
#[cfg(feature = "twilight")] #[cfg(feature = "twilight")]
@@ -228,13 +228,13 @@ pub trait VoiceUpdate {
/// a reconnect/rebalance is ongoing. /// a reconnect/rebalance is ongoing.
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct SerenityShardHandle { pub struct SerenityShardHandle {
sender: PRwLock<Option<Sender<InterMessage>>>, sender: PRwLock<Option<Sender<ShardRunnerMessage>>>,
queue: PMutex<Vec<InterMessage>>, queue: PMutex<Vec<ShardRunnerMessage>>,
} }
#[cfg(feature = "serenity")] #[cfg(feature = "serenity")]
impl SerenityShardHandle { impl SerenityShardHandle {
fn register(&self, sender: Sender<InterMessage>) { fn register(&self, sender: Sender<ShardRunnerMessage>) {
debug!("Adding shard handle send channel..."); debug!("Adding shard handle send channel...");
let mut sender_lock = self.sender.write(); let mut sender_lock = self.sender.write();
@@ -275,10 +275,13 @@ impl SerenityShardHandle {
debug!("Removed shard handle send channel."); debug!("Removed shard handle send channel.");
} }
fn send(&self, message: InterMessage) -> StdResult<(), TrySendError<InterMessage>> { fn send(
&self,
message: ShardRunnerMessage,
) -> StdResult<(), Box<TrySendError<ShardRunnerMessage>>> {
let sender_lock = self.sender.read(); let sender_lock = self.sender.read();
if let Some(sender) = &*sender_lock { if let Some(sender) = &*sender_lock {
sender.unbounded_send(message) sender.unbounded_send(message).map_err(Box::new)
} else { } else {
debug!("Serenity shard temporarily disconnected: buffering message..."); debug!("Serenity shard temporarily disconnected: buffering message...");
let mut messages_lock = self.queue.lock(); let mut messages_lock = self.queue.lock();