use twilight_model::{ channel::message::MessageFlags, gateway::payload::incoming::InteractionCreate, http::interaction::{InteractionResponse, InteractionResponseType}, }; use twilight_util::builder::InteractionResponseDataBuilder; use crate::state::State; use std::error::Error; pub(crate) async fn stop( interaction: Box, state: State, ) -> Result<(), Box> { tracing::debug!( "stop command in guild {:?} in channel {:?} by {:?}", interaction.guild_id, interaction.channel, interaction.author(), ); let Some(guild_id) = interaction.guild_id else { return Ok(()); }; state.guild_settings.entry(guild_id).and_modify(|settings| { settings.loop_queue = false; }); if let Some(call_lock) = state.songbird.get(guild_id) { let call = call_lock.lock().await; call.queue().stop(); } let interaction_response_data = InteractionResponseDataBuilder::new() .content("Stopped the track and cleared the queue") .flags(MessageFlags::EPHEMERAL) .build(); let response = InteractionResponse { kind: InteractionResponseType::ChannelMessageWithSource, data: Some(interaction_response_data), }; state .http .interaction(interaction.application_id) .create_response(interaction.id, &interaction.token, &response) .await?; Ok(()) }