Merge branch 'dev'
commit
8e1d6b5385
|
@ -242,6 +242,18 @@ pub fn run(ctx: Context, command: ApplicationCommandInteraction) -> CommandOutpu
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else if let SessionCreateError::NoLongerSpotifyError = why {
|
||||||
|
update_message(
|
||||||
|
&ctx,
|
||||||
|
&command,
|
||||||
|
EmbedBuilder::new()
|
||||||
|
.title("Cannot join voice channel")
|
||||||
|
.description("Spoticord no longer has access to your Spotify account. Use </link:1036714850367320136> or go to [the accounts website](https://account.spoticord.com/) to relink your Spotify account.")
|
||||||
|
.status(Status::Error)
|
||||||
|
.build(),
|
||||||
|
).await;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,6 +296,18 @@ pub fn run(ctx: Context, command: ApplicationCommandInteraction) -> CommandOutpu
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else if let SessionCreateError::NoLongerSpotifyError = why {
|
||||||
|
update_message(
|
||||||
|
&ctx,
|
||||||
|
&command,
|
||||||
|
EmbedBuilder::new()
|
||||||
|
.title("Cannot join voice channel")
|
||||||
|
.description("Spoticord no longer has access to your Spotify account. Use </link:1036714850367320136> or go to [the accounts website](https://account.spoticord.com/) to relink your Spotify account.")
|
||||||
|
.status(Status::Error)
|
||||||
|
.build(),
|
||||||
|
).await;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,9 @@ pub enum SessionCreateError {
|
||||||
#[error("The user has not linked their Spotify account")]
|
#[error("The user has not linked their Spotify account")]
|
||||||
NoSpotifyError,
|
NoSpotifyError,
|
||||||
|
|
||||||
|
#[error("The application no longer has access to the user's Spotify account")]
|
||||||
|
NoLongerSpotifyError,
|
||||||
|
|
||||||
#[error("An error has occured while communicating with the database")]
|
#[error("An error has occured while communicating with the database")]
|
||||||
DatabaseError,
|
DatabaseError,
|
||||||
|
|
||||||
|
@ -66,11 +69,10 @@ impl InnerSessionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove a session
|
/// Remove a session
|
||||||
pub async fn remove_session(&mut self, guild_id: GuildId) {
|
pub async fn remove_session(&mut self, guild_id: GuildId, owner: Option<UserId>) {
|
||||||
if let Some(session) = self.sessions.get(&guild_id) {
|
// Remove the owner from the owner map (if it exists)
|
||||||
if let Some(owner) = session.owner().await {
|
if let Some(owner) = owner {
|
||||||
self.owner_map.remove(&owner);
|
self.owner_map.remove(&owner);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.sessions.remove(&guild_id);
|
self.sessions.remove(&guild_id);
|
||||||
|
@ -146,8 +148,8 @@ impl SessionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove a session
|
/// Remove a session
|
||||||
pub async fn remove_session(&self, guild_id: GuildId) {
|
pub async fn remove_session(&self, guild_id: GuildId, owner: Option<UserId>) {
|
||||||
self.0.write().await.remove_session(guild_id).await;
|
self.0.write().await.remove_session(guild_id, owner).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove owner from owner map.
|
/// Remove owner from owner map.
|
||||||
|
|
|
@ -54,6 +54,10 @@ struct InnerSpoticordSession {
|
||||||
disconnect_handle: Option<tokio::task::JoinHandle<()>>,
|
disconnect_handle: Option<tokio::task::JoinHandle<()>>,
|
||||||
|
|
||||||
client: Option<Client>,
|
client: Option<Client>,
|
||||||
|
|
||||||
|
/// Whether the session has been disconnected
|
||||||
|
/// If this is true then this instance should no longer be used and dropped
|
||||||
|
disconnected: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SpoticordSession {
|
impl SpoticordSession {
|
||||||
|
@ -90,6 +94,7 @@ impl SpoticordSession {
|
||||||
playback_info: None,
|
playback_info: None,
|
||||||
disconnect_handle: None,
|
disconnect_handle: None,
|
||||||
client: None,
|
client: None,
|
||||||
|
disconnected: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut instance = Self(Arc::new(RwLock::new(inner)));
|
let mut instance = Self(Arc::new(RwLock::new(inner)));
|
||||||
|
@ -153,6 +158,8 @@ impl SpoticordSession {
|
||||||
if let DatabaseError::InvalidStatusCode(code) = why {
|
if let DatabaseError::InvalidStatusCode(code) = why {
|
||||||
if code == 404 {
|
if code == 404 {
|
||||||
return Err(SessionCreateError::NoSpotifyError);
|
return Err(SessionCreateError::NoSpotifyError);
|
||||||
|
} else if code == 400 {
|
||||||
|
return Err(SessionCreateError::NoLongerSpotifyError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,6 +283,7 @@ impl SpoticordSession {
|
||||||
message.embed(|embed| {
|
message.embed(|embed| {
|
||||||
embed.title("Failed to connect to Spotify");
|
embed.title("Failed to connect to Spotify");
|
||||||
embed.description(why);
|
embed.description(why);
|
||||||
|
embed.footer(|footer| footer.text("Please try again"));
|
||||||
embed.color(Status::Error as u64);
|
embed.color(Status::Error as u64);
|
||||||
|
|
||||||
embed
|
embed
|
||||||
|
@ -288,9 +296,6 @@ impl SpoticordSession {
|
||||||
error!("Failed to send error message: {:?}", why);
|
error!("Failed to send error message: {:?}", why);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up session
|
|
||||||
instance.player_stopped().await;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,6 +385,11 @@ impl SpoticordSession {
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clean up session
|
||||||
|
if !inner.read().await.disconnected {
|
||||||
|
instance.player_stopped().await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -513,7 +523,7 @@ impl SpoticordSession {
|
||||||
// read lock to read the current owner.
|
// read lock to read the current owner.
|
||||||
// This would deadlock if we have an active write lock
|
// This would deadlock if we have an active write lock
|
||||||
{
|
{
|
||||||
let inner = self.0.read().await;
|
let mut inner = self.0.write().await;
|
||||||
inner.disconnect_no_abort().await;
|
inner.disconnect_no_abort().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,7 +607,7 @@ impl SpoticordSession {
|
||||||
|
|
||||||
pub async fn disconnect_with_message(&self, content: &str) {
|
pub async fn disconnect_with_message(&self, content: &str) {
|
||||||
{
|
{
|
||||||
let inner = self.0.read().await;
|
let mut inner = self.0.write().await;
|
||||||
|
|
||||||
// Firstly we disconnect
|
// Firstly we disconnect
|
||||||
inner.disconnect_no_abort().await;
|
inner.disconnect_no_abort().await;
|
||||||
|
@ -672,8 +682,12 @@ impl SpoticordSession {
|
||||||
|
|
||||||
impl InnerSpoticordSession {
|
impl InnerSpoticordSession {
|
||||||
/// Internal version of disconnect, which does not abort the disconnect timer
|
/// Internal version of disconnect, which does not abort the disconnect timer
|
||||||
async fn disconnect_no_abort(&self) {
|
async fn disconnect_no_abort(&mut self) {
|
||||||
self.session_manager.remove_session(self.guild_id).await;
|
self.disconnected = true;
|
||||||
|
self
|
||||||
|
.session_manager
|
||||||
|
.remove_session(self.guild_id, self.owner)
|
||||||
|
.await;
|
||||||
|
|
||||||
let mut call = self.call.lock().await;
|
let mut call = self.call.lock().await;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue