From 06f8af6051464bc8e9b42626c7a4ca2d4cbe71cd Mon Sep 17 00:00:00 2001 From: Benjamin Sherriff Date: Wed, 4 Oct 2023 16:52:09 -0400 Subject: [PATCH] Refactored into service directory --- .dockerignore => service/.dockerignore | 0 .env.TEMPLATE => service/.env.TEMPLATE | 1 + .version => service/.version | 0 Cargo.toml => service/Cargo.toml | 0 Dockerfile => service/Dockerfile | 0 Makefile => service/Makefile | 0 build.rs => service/build.rs | 0 {data => service/data}/spells/cantrips.json | 0 {data => service/data}/spells/level_1.json | 0 .../docker-compose.yml | 11 +- .../000000_create_messages/down.sql | 0 .../migrations}/000000_create_messages/up.sql | 0 .../migrations}/000001_create_races/down.sql | 0 .../migrations}/000001_create_races/up.sql | 0 .../000002_create_classes/down.sql | 0 .../migrations}/000002_create_classes/up.sql | 0 .../migrations}/000003_create_feats/down.sql | 0 .../migrations}/000003_create_feats/up.sql | 0 .../000004_create_options_features/down.sql | 0 .../000004_create_options_features/up.sql | 0 .../000005_create_backgrounds/down.sql | 0 .../000005_create_backgrounds/up.sql | 0 .../migrations}/000006_create_items/down.sql | 0 .../migrations}/000006_create_items/up.sql | 0 .../migrations}/000007_create_spells/down.sql | 0 .../migrations}/000007_create_spells/up.sql | 0 .../000008_create_conditions/down.sql | 0 .../000008_create_conditions/up.sql | 0 .../000009_create_bestiary/down.sql | 0 .../migrations}/000009_create_bestiary/up.sql | 0 {src => service/src}/commands/help.rs | 0 {src => service/src}/commands/mod.rs | 0 {src => service/src}/commands/oai.rs | 0 {src => service/src}/commands/ping.rs | 0 {src => service/src}/commands/schedule.rs | 0 {src => service/src}/db/backgrounds/mod.rs | 0 {src => service/src}/db/bestiary/mod.rs | 0 {src => service/src}/db/classes/mod.rs | 0 {src => service/src}/db/classes/model.rs | 0 {src => service/src}/db/conditions/mod.rs | 0 {src => service/src}/db/feats/mod.rs | 0 {src => service/src}/db/items/mod.rs | 0 {src => service/src}/db/messages/mod.rs | 0 {src => service/src}/db/messages/model.rs | 0 {src => service/src}/db/mod.rs | 0 {src => service/src}/db/options/mod.rs | 0 {src => service/src}/db/races/mod.rs | 0 {src => service/src}/db/schema.rs | 0 {src => service/src}/db/spells/mod.rs | 0 {src => service/src}/db/spells/model.rs | 0 {src => service/src}/db/spells/routes.rs | 0 {src => service/src}/db/spells/types.rs | 0 {src => service/src}/db/users/mod.rs | 0 {src => service/src}/db/users/model.rs | 0 {src => service/src}/error_handler.rs | 0 {src => service/src}/main.rs | 0 src/commands/audio/mod.rs | 190 ------------------ src/commands/audio/pause.rs | 43 ---- src/commands/audio/play.rs | 134 ------------ src/commands/audio/resume.rs | 43 ---- src/commands/audio/skip.rs | 43 ---- src/commands/audio/stop.rs | 38 ---- src/commands/audio/volume.rs | 85 -------- 63 files changed, 11 insertions(+), 577 deletions(-) rename .dockerignore => service/.dockerignore (100%) rename .env.TEMPLATE => service/.env.TEMPLATE (88%) rename .version => service/.version (100%) rename Cargo.toml => service/Cargo.toml (100%) rename Dockerfile => service/Dockerfile (100%) rename Makefile => service/Makefile (100%) rename build.rs => service/build.rs (100%) rename {data => service/data}/spells/cantrips.json (100%) rename {data => service/data}/spells/level_1.json (100%) rename docker-compose.yml => service/docker-compose.yml (86%) rename {migrations => service/migrations}/000000_create_messages/down.sql (100%) rename {migrations => service/migrations}/000000_create_messages/up.sql (100%) rename {migrations => service/migrations}/000001_create_races/down.sql (100%) rename {migrations => service/migrations}/000001_create_races/up.sql (100%) rename {migrations => service/migrations}/000002_create_classes/down.sql (100%) rename {migrations => service/migrations}/000002_create_classes/up.sql (100%) rename {migrations => service/migrations}/000003_create_feats/down.sql (100%) rename {migrations => service/migrations}/000003_create_feats/up.sql (100%) rename {migrations => service/migrations}/000004_create_options_features/down.sql (100%) rename {migrations => service/migrations}/000004_create_options_features/up.sql (100%) rename {migrations => service/migrations}/000005_create_backgrounds/down.sql (100%) rename {migrations => service/migrations}/000005_create_backgrounds/up.sql (100%) rename {migrations => service/migrations}/000006_create_items/down.sql (100%) rename {migrations => service/migrations}/000006_create_items/up.sql (100%) rename {migrations => service/migrations}/000007_create_spells/down.sql (100%) rename {migrations => service/migrations}/000007_create_spells/up.sql (100%) rename {migrations => service/migrations}/000008_create_conditions/down.sql (100%) rename {migrations => service/migrations}/000008_create_conditions/up.sql (100%) rename {migrations => service/migrations}/000009_create_bestiary/down.sql (100%) rename {migrations => service/migrations}/000009_create_bestiary/up.sql (100%) rename {src => service/src}/commands/help.rs (100%) rename {src => service/src}/commands/mod.rs (100%) rename {src => service/src}/commands/oai.rs (100%) rename {src => service/src}/commands/ping.rs (100%) rename {src => service/src}/commands/schedule.rs (100%) rename {src => service/src}/db/backgrounds/mod.rs (100%) rename {src => service/src}/db/bestiary/mod.rs (100%) rename {src => service/src}/db/classes/mod.rs (100%) rename {src => service/src}/db/classes/model.rs (100%) rename {src => service/src}/db/conditions/mod.rs (100%) rename {src => service/src}/db/feats/mod.rs (100%) rename {src => service/src}/db/items/mod.rs (100%) rename {src => service/src}/db/messages/mod.rs (100%) rename {src => service/src}/db/messages/model.rs (100%) rename {src => service/src}/db/mod.rs (100%) rename {src => service/src}/db/options/mod.rs (100%) rename {src => service/src}/db/races/mod.rs (100%) rename {src => service/src}/db/schema.rs (100%) rename {src => service/src}/db/spells/mod.rs (100%) rename {src => service/src}/db/spells/model.rs (100%) rename {src => service/src}/db/spells/routes.rs (100%) rename {src => service/src}/db/spells/types.rs (100%) rename {src => service/src}/db/users/mod.rs (100%) rename {src => service/src}/db/users/model.rs (100%) rename {src => service/src}/error_handler.rs (100%) rename {src => service/src}/main.rs (100%) delete mode 100644 src/commands/audio/mod.rs delete mode 100644 src/commands/audio/pause.rs delete mode 100644 src/commands/audio/play.rs delete mode 100644 src/commands/audio/resume.rs delete mode 100644 src/commands/audio/skip.rs delete mode 100644 src/commands/audio/stop.rs delete mode 100644 src/commands/audio/volume.rs diff --git a/.dockerignore b/service/.dockerignore similarity index 100% rename from .dockerignore rename to service/.dockerignore diff --git a/.env.TEMPLATE b/service/.env.TEMPLATE similarity index 88% rename from .env.TEMPLATE rename to service/.env.TEMPLATE index c933137..d8e2748 100644 --- a/.env.TEMPLATE +++ b/service/.env.TEMPLATE @@ -1,4 +1,5 @@ RUST_LOG=warn,siren=info +COMPOSE_PROJECT_NAME=siren DATABASE_USER=siren DATABASE_PASSWORD= diff --git a/.version b/service/.version similarity index 100% rename from .version rename to service/.version diff --git a/Cargo.toml b/service/Cargo.toml similarity index 100% rename from Cargo.toml rename to service/Cargo.toml diff --git a/Dockerfile b/service/Dockerfile similarity index 100% rename from Dockerfile rename to service/Dockerfile diff --git a/Makefile b/service/Makefile similarity index 100% rename from Makefile rename to service/Makefile diff --git a/build.rs b/service/build.rs similarity index 100% rename from build.rs rename to service/build.rs diff --git a/data/spells/cantrips.json b/service/data/spells/cantrips.json similarity index 100% rename from data/spells/cantrips.json rename to service/data/spells/cantrips.json diff --git a/data/spells/level_1.json b/service/data/spells/level_1.json similarity index 100% rename from data/spells/level_1.json rename to service/data/spells/level_1.json diff --git a/docker-compose.yml b/service/docker-compose.yml similarity index 86% rename from docker-compose.yml rename to service/docker-compose.yml index efc5f2e..286a197 100644 --- a/docker-compose.yml +++ b/service/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3' +version: '3.8' services: siren: @@ -18,6 +18,9 @@ services: SERVICE_PORT: 5000 depends_on: - db + networks: + - frontend + - backend restart: unless-stopped db: image: postgres:latest @@ -33,8 +36,14 @@ services: - db_logs:/var/log ports: - ${DATABASE_PORT:-5432}:5432 + networks: + - backend restart: unless-stopped volumes: db: db_logs: + +networks: + frontend: + backend: diff --git a/migrations/000000_create_messages/down.sql b/service/migrations/000000_create_messages/down.sql similarity index 100% rename from migrations/000000_create_messages/down.sql rename to service/migrations/000000_create_messages/down.sql diff --git a/migrations/000000_create_messages/up.sql b/service/migrations/000000_create_messages/up.sql similarity index 100% rename from migrations/000000_create_messages/up.sql rename to service/migrations/000000_create_messages/up.sql diff --git a/migrations/000001_create_races/down.sql b/service/migrations/000001_create_races/down.sql similarity index 100% rename from migrations/000001_create_races/down.sql rename to service/migrations/000001_create_races/down.sql diff --git a/migrations/000001_create_races/up.sql b/service/migrations/000001_create_races/up.sql similarity index 100% rename from migrations/000001_create_races/up.sql rename to service/migrations/000001_create_races/up.sql diff --git a/migrations/000002_create_classes/down.sql b/service/migrations/000002_create_classes/down.sql similarity index 100% rename from migrations/000002_create_classes/down.sql rename to service/migrations/000002_create_classes/down.sql diff --git a/migrations/000002_create_classes/up.sql b/service/migrations/000002_create_classes/up.sql similarity index 100% rename from migrations/000002_create_classes/up.sql rename to service/migrations/000002_create_classes/up.sql diff --git a/migrations/000003_create_feats/down.sql b/service/migrations/000003_create_feats/down.sql similarity index 100% rename from migrations/000003_create_feats/down.sql rename to service/migrations/000003_create_feats/down.sql diff --git a/migrations/000003_create_feats/up.sql b/service/migrations/000003_create_feats/up.sql similarity index 100% rename from migrations/000003_create_feats/up.sql rename to service/migrations/000003_create_feats/up.sql diff --git a/migrations/000004_create_options_features/down.sql b/service/migrations/000004_create_options_features/down.sql similarity index 100% rename from migrations/000004_create_options_features/down.sql rename to service/migrations/000004_create_options_features/down.sql diff --git a/migrations/000004_create_options_features/up.sql b/service/migrations/000004_create_options_features/up.sql similarity index 100% rename from migrations/000004_create_options_features/up.sql rename to service/migrations/000004_create_options_features/up.sql diff --git a/migrations/000005_create_backgrounds/down.sql b/service/migrations/000005_create_backgrounds/down.sql similarity index 100% rename from migrations/000005_create_backgrounds/down.sql rename to service/migrations/000005_create_backgrounds/down.sql diff --git a/migrations/000005_create_backgrounds/up.sql b/service/migrations/000005_create_backgrounds/up.sql similarity index 100% rename from migrations/000005_create_backgrounds/up.sql rename to service/migrations/000005_create_backgrounds/up.sql diff --git a/migrations/000006_create_items/down.sql b/service/migrations/000006_create_items/down.sql similarity index 100% rename from migrations/000006_create_items/down.sql rename to service/migrations/000006_create_items/down.sql diff --git a/migrations/000006_create_items/up.sql b/service/migrations/000006_create_items/up.sql similarity index 100% rename from migrations/000006_create_items/up.sql rename to service/migrations/000006_create_items/up.sql diff --git a/migrations/000007_create_spells/down.sql b/service/migrations/000007_create_spells/down.sql similarity index 100% rename from migrations/000007_create_spells/down.sql rename to service/migrations/000007_create_spells/down.sql diff --git a/migrations/000007_create_spells/up.sql b/service/migrations/000007_create_spells/up.sql similarity index 100% rename from migrations/000007_create_spells/up.sql rename to service/migrations/000007_create_spells/up.sql diff --git a/migrations/000008_create_conditions/down.sql b/service/migrations/000008_create_conditions/down.sql similarity index 100% rename from migrations/000008_create_conditions/down.sql rename to service/migrations/000008_create_conditions/down.sql diff --git a/migrations/000008_create_conditions/up.sql b/service/migrations/000008_create_conditions/up.sql similarity index 100% rename from migrations/000008_create_conditions/up.sql rename to service/migrations/000008_create_conditions/up.sql diff --git a/migrations/000009_create_bestiary/down.sql b/service/migrations/000009_create_bestiary/down.sql similarity index 100% rename from migrations/000009_create_bestiary/down.sql rename to service/migrations/000009_create_bestiary/down.sql diff --git a/migrations/000009_create_bestiary/up.sql b/service/migrations/000009_create_bestiary/up.sql similarity index 100% rename from migrations/000009_create_bestiary/up.sql rename to service/migrations/000009_create_bestiary/up.sql diff --git a/src/commands/help.rs b/service/src/commands/help.rs similarity index 100% rename from src/commands/help.rs rename to service/src/commands/help.rs diff --git a/src/commands/mod.rs b/service/src/commands/mod.rs similarity index 100% rename from src/commands/mod.rs rename to service/src/commands/mod.rs diff --git a/src/commands/oai.rs b/service/src/commands/oai.rs similarity index 100% rename from src/commands/oai.rs rename to service/src/commands/oai.rs diff --git a/src/commands/ping.rs b/service/src/commands/ping.rs similarity index 100% rename from src/commands/ping.rs rename to service/src/commands/ping.rs diff --git a/src/commands/schedule.rs b/service/src/commands/schedule.rs similarity index 100% rename from src/commands/schedule.rs rename to service/src/commands/schedule.rs diff --git a/src/db/backgrounds/mod.rs b/service/src/db/backgrounds/mod.rs similarity index 100% rename from src/db/backgrounds/mod.rs rename to service/src/db/backgrounds/mod.rs diff --git a/src/db/bestiary/mod.rs b/service/src/db/bestiary/mod.rs similarity index 100% rename from src/db/bestiary/mod.rs rename to service/src/db/bestiary/mod.rs diff --git a/src/db/classes/mod.rs b/service/src/db/classes/mod.rs similarity index 100% rename from src/db/classes/mod.rs rename to service/src/db/classes/mod.rs diff --git a/src/db/classes/model.rs b/service/src/db/classes/model.rs similarity index 100% rename from src/db/classes/model.rs rename to service/src/db/classes/model.rs diff --git a/src/db/conditions/mod.rs b/service/src/db/conditions/mod.rs similarity index 100% rename from src/db/conditions/mod.rs rename to service/src/db/conditions/mod.rs diff --git a/src/db/feats/mod.rs b/service/src/db/feats/mod.rs similarity index 100% rename from src/db/feats/mod.rs rename to service/src/db/feats/mod.rs diff --git a/src/db/items/mod.rs b/service/src/db/items/mod.rs similarity index 100% rename from src/db/items/mod.rs rename to service/src/db/items/mod.rs diff --git a/src/db/messages/mod.rs b/service/src/db/messages/mod.rs similarity index 100% rename from src/db/messages/mod.rs rename to service/src/db/messages/mod.rs diff --git a/src/db/messages/model.rs b/service/src/db/messages/model.rs similarity index 100% rename from src/db/messages/model.rs rename to service/src/db/messages/model.rs diff --git a/src/db/mod.rs b/service/src/db/mod.rs similarity index 100% rename from src/db/mod.rs rename to service/src/db/mod.rs diff --git a/src/db/options/mod.rs b/service/src/db/options/mod.rs similarity index 100% rename from src/db/options/mod.rs rename to service/src/db/options/mod.rs diff --git a/src/db/races/mod.rs b/service/src/db/races/mod.rs similarity index 100% rename from src/db/races/mod.rs rename to service/src/db/races/mod.rs diff --git a/src/db/schema.rs b/service/src/db/schema.rs similarity index 100% rename from src/db/schema.rs rename to service/src/db/schema.rs diff --git a/src/db/spells/mod.rs b/service/src/db/spells/mod.rs similarity index 100% rename from src/db/spells/mod.rs rename to service/src/db/spells/mod.rs diff --git a/src/db/spells/model.rs b/service/src/db/spells/model.rs similarity index 100% rename from src/db/spells/model.rs rename to service/src/db/spells/model.rs diff --git a/src/db/spells/routes.rs b/service/src/db/spells/routes.rs similarity index 100% rename from src/db/spells/routes.rs rename to service/src/db/spells/routes.rs diff --git a/src/db/spells/types.rs b/service/src/db/spells/types.rs similarity index 100% rename from src/db/spells/types.rs rename to service/src/db/spells/types.rs diff --git a/src/db/users/mod.rs b/service/src/db/users/mod.rs similarity index 100% rename from src/db/users/mod.rs rename to service/src/db/users/mod.rs diff --git a/src/db/users/model.rs b/service/src/db/users/model.rs similarity index 100% rename from src/db/users/model.rs rename to service/src/db/users/model.rs diff --git a/src/error_handler.rs b/service/src/error_handler.rs similarity index 100% rename from src/error_handler.rs rename to service/src/error_handler.rs diff --git a/src/main.rs b/service/src/main.rs similarity index 100% rename from src/main.rs rename to service/src/main.rs diff --git a/src/commands/audio/mod.rs b/src/commands/audio/mod.rs deleted file mode 100644 index cd60d28..0000000 --- a/src/commands/audio/mod.rs +++ /dev/null @@ -1,190 +0,0 @@ -use std::collections::HashMap; -use std::sync::Arc; - -use log::debug; - -use serenity::model::application::interaction::{InteractionResponseType, application_command::ApplicationCommandInteraction}; -use serenity::model::prelude::{GuildId, ChannelId}; -use serenity::model::user::User; -use serenity::prelude::*; -use songbird::{Call, Songbird}; -use songbird::input::{Restartable, Input, Metadata, error::Error as SongbirdError}; - -pub mod pause; -pub mod play; -pub mod resume; -pub mod skip; -pub mod stop; -pub mod volume; - -#[derive(Clone, Debug)] -pub struct AudioConfigs; - -impl TypeMapKey for AudioConfigs { - type Value = Arc>>; -} - -#[derive(Clone, Debug)] -pub struct AudioConfig { - pub volume: f32 -} - -/// Joins a Discord voice channel. -/// -/// # Arguments -/// - ctx - The context of the command. -/// - guild_id_option - The guild ID of the guild to join. -/// - user - The user that is requesting to join the voice channel. -/// -/// # Returns -/// Result<(), String> - Ok if the bot successfully joined the voice channel, Err if there was an error. -pub async fn join(ctx: &Context, guild_id_option: &Option, user: &User) -> Result<(), String> { - let guild_id = match guild_id_option { - Some(g) => g, - None => { - return Err(format!("{}", "No guild ID set")); - } - }; - - let channel_id = match find_voice_channel(&ctx, &guild_id, &user) { - Ok(channel) => channel, - Err(err) => return Err(format!("{}", err)) - }; - - debug!("<{}> Joining channel {}", guild_id.0, channel_id); - let manager = get_songbird(ctx).await; - let (_handle_lock, success) = manager.join(guild_id.to_owned(), channel_id.to_owned()).await; - match success { - Ok(s) => Ok(s), - Err(err) => Err(format!("{}", err)) - } -} - -/// Leaves a Discord voice channel. -/// -/// # Arguments -/// - ctx - The context of the command. -/// - guild_id_option - The guild ID of the guild to leave. -/// -/// # Returns -/// Result<(), String> - Ok if the bot successfully left the voice channel, Err if there was an error. -pub async fn leave(ctx: &Context, guild_id_option: &Option) -> Result<(), String> { - let guild_id = match guild_id_option { - Some(g) => g, - None => { - return Err(format!("{}", "No guild ID set")); - } - }; - - let manager = get_songbird(ctx).await; - if manager.get(*guild_id).is_some() { - debug!("<{}> Disconnecting from channel", guild_id.0); - if let Err(e) = manager.remove(*guild_id).await { - return Err(format!("{}", e)) - } - } - Ok(()) -} - -/// Finds the voice channel that the user is in. -/// -/// # Arguments -/// - ctx - The context of the command. -/// - guild_id - The guild ID of the guild to search. -/// - user - The user to search for. -/// -/// # Returns -/// Result - Ok if the user is in a voice channel, Err if the user is not in a voice channel. -fn find_voice_channel(ctx: &Context, guild_id: &GuildId, user: &User) -> Result { - let guild = match guild_id.to_guild_cached(ctx.cache.to_owned()) { - Some(g) => g, - None => return Err(format!("Guild not found")) - }; - - match guild.voice_states.get(&user.id).and_then(|voice_state| voice_state.channel_id) { - Some(channel) => Ok(channel), - None => return Err(format!("User is not in a voice channel")) - } -} - -/// Creates a response to an interaction. -/// -/// # Arguments -/// - ctx - The context of the command. -/// - command - The command that was sent. -/// - content - The content of the response. -/// -/// # Returns -/// Result<(), SerenityError> - Ok if the response was created successfully, Err if there was an error. -pub async fn create_response(ctx: &Context, command: &ApplicationCommandInteraction, content: String) -> Result<(), SerenityError> { - command.create_interaction_response(&ctx.http, |response: &mut serenity::builder::CreateInteractionResponse<'_>| { - response - .kind(InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|message: &mut serenity::builder::CreateInteractionResponseData<'_>| message.content(content)) - }).await -} - -/// Edits a response to an interaction. -/// -/// # Arguments -/// - ctx - The context of the command. -/// - command - The command that was sent. -/// - content - The content of the response. -/// -/// # Returns -/// Result - Ok if the response was edited successfully, Err if there was an error. -pub async fn edit_response(ctx: &Context, command: &ApplicationCommandInteraction, content: String) -> Result { - command.edit_original_interaction_response(&ctx.http, |response: &mut serenity::builder::EditInteractionResponse| { - response.content(content) - }).await -} - -/// Adds a song to the queue. -/// -/// # Arguments -/// - call - The call to add the song to. -/// - url - The URL of the song to add. -/// - lazy - Whether or not to lazy load the song. -/// -/// # Returns -/// Result - Ok if the song was added successfully, Err if there was an error. -pub async fn add_song(call: Arc>, url: &str, lazy: bool, audio_config: Option<&AudioConfig>) -> Result { - let source = if is_valid_url(url) { - Restartable::ytdl(url.to_owned(), lazy).await? - } else { - Restartable::ytdl_search(url, lazy).await? - }; - let mut handler = call.lock().await; - let track: Input = source.into(); - let metadata = *track.metadata.clone(); - let track_handle = handler.enqueue_source(track); - if let Some(ac) = audio_config { - let _ = track_handle.set_volume(ac.volume); - } - Ok(metadata) -} - -/// Checks if a string is a valid URL. -/// -/// # Arguments -/// - url - The string to check. -/// -/// # Returns -/// bool - True if the string is a valid URL, false if it is not. -fn is_valid_url(url: &str) -> bool { - match url.parse::() { - Ok(_) => return true, - Err(_) => return false - } -} - -/// Gets the Songbird voice client. -/// -/// # Arguments -/// - ctx - The context of the command. -/// -/// # Returns -/// Arc - The Songbird voice client. -pub async fn get_songbird(ctx: &Context) -> Arc { - songbird::get(ctx).await.expect("Songbird Voice client placed in at initialization") -} diff --git a/src/commands/audio/pause.rs b/src/commands/audio/pause.rs deleted file mode 100644 index 4423f67..0000000 --- a/src/commands/audio/pause.rs +++ /dev/null @@ -1,43 +0,0 @@ -use log::{debug, error}; - -use serenity::prelude::*; -use serenity::builder::CreateApplicationCommand; -use serenity::model::application::interaction::application_command::ApplicationCommandInteraction; - -use super::{get_songbird, create_response, edit_response}; - -pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) { - // Create the initial response - if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await { - error!("Failed to create response message: {}", why); - return; - } - - let guild_id = match command.guild_id { - Some(g) => g, - None => { - if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await { - error!("Failed to edit response message: {}", why); - } - return; - } - }; - let manager = get_songbird(ctx).await; - if let Some(handler_lock) = manager.get(guild_id) { - let handler = handler_lock.lock().await; - if let Err(err) = handler.queue().pause() { - if let Err(why) = edit_response(&ctx, &command, format!("Failed to pause: {}", err)).await { - error!("Failed to edit response message: {}", why); - } - } else { - debug!("Paused the track"); - if let Err(why) = edit_response(&ctx, &command, format!("Pausing the track")).await { - error!("Failed to edit response message: {}", why); - } - } - } -} - -pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand { - command.name("pause").description("Pause the current track") -} \ No newline at end of file diff --git a/src/commands/audio/play.rs b/src/commands/audio/play.rs deleted file mode 100644 index 386e6a2..0000000 --- a/src/commands/audio/play.rs +++ /dev/null @@ -1,134 +0,0 @@ -use log::{debug, warn, error}; - -use serenity::{prelude::*, async_trait}; -use serenity::builder::CreateApplicationCommand; -use serenity::model::application::interaction::application_command::ApplicationCommandInteraction; -use songbird::EventHandler; - -use crate::commands::audio::{join, leave, add_song, get_songbird, AudioConfigs}; - -use super::{create_response, edit_response}; - -pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) { - // Get the track url - let track_url = match command.data.options.get(0) { - Some(t) => match &t.value { - Some(v) => match v.as_str() { - Some(s) => s.to_owned(), - None => { - warn!("Missing track option"); - if let Err(why) = create_response(&ctx, &command, format!("Track option is missing")).await { - error!("Failed to create response message: {}", why); - } - return; - } - } - None => { - warn!("Missing track option"); - if let Err(why) = create_response(&ctx, &command, format!("Track option is missing")).await { - error!("Failed to create response message: {}", why); - } - return; - } - } - None => { - warn!("Missing track option"); - if let Err(why) = create_response(&ctx, &command, format!("Track option is missing")).await { - error!("Failed to create response message: {}", why); - } - return; - } - }; - - // Create the initial response - if let Err(why) = create_response(&ctx, &command, format!("Processing command...")).await { - error!("Failed to create response message: {}", why); - return; - } - - match join(&ctx, &command.guild_id, &command.user).await { - Ok(_) => { - let guild_id = match command.guild_id { - Some(g) => g, - None => { - if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await { - error!("Failed to edit response message: {}", why); - } - return; - } - }; - debug!("Play command executed with track: {:?}", track_url); - - let manager = get_songbird(ctx).await; - if let Some(handler_lock) = manager.get(guild_id) { - let is_queue_empty = { - let call_handler = handler_lock.lock().await; - call_handler.queue().is_empty() - }; - let audio_config = { - let data_read = ctx.data.read().await; - data_read.get::().expect("Expected AudioConfigs in TypeMap.").clone() - }; - let ac = audio_config.read().await; - match add_song(handler_lock.clone(), &track_url, is_queue_empty, ac.get(&guild_id)).await { - Ok(added_song) => { - let track_title = added_song.title.unwrap(); - debug!("Added track: {}", track_title); - if let Err(why) = edit_response(&ctx, &command, format!("Added track to queue: {}", track_title)).await { - error!("Failed to edit response message: {}", why); - } - let mut handler = handler_lock.lock().await; - handler.remove_all_global_events(); - handler.add_global_event(songbird::Event::Track(songbird::TrackEvent::End), TrackEndNotifier { guild_id, call: manager }) - } - Err(why) => { - warn!("Failed to add song: {}", why); - if let Err(why) = edit_response(&ctx, &command, format!("Failed to add song: {}", why)).await { - error!("Failed to edit response message: {}", why); - } - if let Err(why) = leave(&ctx, &command.guild_id).await { - error!("Failed to leave voice channel: {}", why); - } - return; - } - }; - } - }, - Err(err) => { - warn!("{}", err); - if let Err(why) = edit_response(&ctx, &command, format!("{}", err)).await { - error!("Failed to edit response message: {}", why); - } - } - } -} - -pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand { - command.name("play").description("Plays the given track").create_option(|option| { option - .name("track") - .description("The track to be played") - .kind(serenity::model::prelude::command::CommandOptionType::String) - .required(true) - }) -} - -struct TrackEndNotifier { - pub call: std::sync::Arc, - pub guild_id: serenity::model::id::GuildId -} - -#[async_trait] -impl EventHandler for TrackEndNotifier { - async fn act(&self, ctx: &songbird::events::EventContext<'_>) -> Option { - if let songbird::EventContext::Track(_track_list) = ctx { - if let Some(call) = self.call.get(self.guild_id) { - let mut handler = call.lock().await; - if handler.queue().is_empty() { - debug!("Queue is empty, leaving voice channel"); - handler.leave().await.unwrap(); - } - } - } - None - } -} diff --git a/src/commands/audio/resume.rs b/src/commands/audio/resume.rs deleted file mode 100644 index d97a592..0000000 --- a/src/commands/audio/resume.rs +++ /dev/null @@ -1,43 +0,0 @@ -use log::{debug, error}; - -use serenity::prelude::*; -use serenity::builder::CreateApplicationCommand; -use serenity::model::application::interaction::application_command::ApplicationCommandInteraction; - -use super::{get_songbird, create_response, edit_response}; - -pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) { - // Create the initial response - if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await { - error!("Failed to create response message: {}", why); - return; - } - - let guild_id = match command.guild_id { - Some(g) => g, - None => { - if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await { - error!("Failed to edit response message: {}", why); - } - return; - } - }; - let manager = get_songbird(ctx).await; - if let Some(handler_lock) = manager.get(guild_id) { - let handler = handler_lock.lock().await; - if let Err(err) = handler.queue().resume() { - if let Err(why) = edit_response(&ctx, &command, format!("Failed to resume: {}", err)).await { - error!("Failed to edit response message: {}", why); - } - } else { - debug!("Resumed the track"); - if let Err(why) = edit_response(&ctx, &command, format!("Resuming the track")).await { - error!("Failed to edit response message: {}", why); - } - } - } -} - -pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand { - command.name("resume").description("Resume the current track") -} \ No newline at end of file diff --git a/src/commands/audio/skip.rs b/src/commands/audio/skip.rs deleted file mode 100644 index cd95d91..0000000 --- a/src/commands/audio/skip.rs +++ /dev/null @@ -1,43 +0,0 @@ -use log::{debug, error}; - -use serenity::prelude::*; -use serenity::builder::CreateApplicationCommand; -use serenity::model::application::interaction::application_command::ApplicationCommandInteraction; - -use super::{get_songbird, create_response, edit_response}; - -pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) { - // Create the initial response - if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await { - error!("Failed to create response message: {}", why); - return; - } - - let guild_id = match command.guild_id { - Some(g) => g, - None => { - if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await { - error!("Failed to edit response message: {}", why); - } - return; - } - }; - let manager = get_songbird(ctx).await; - if let Some(handler_lock) = manager.get(guild_id) { - let handler = handler_lock.lock().await; - if let Err(err) = handler.queue().skip() { - if let Err(why) = edit_response(&ctx, &command, format!("Failed to skip: {}", err)).await { - error!("Failed to edit response message: {}", why); - } - } else { - debug!("Skipped the track"); - if let Err(why) = edit_response(&ctx, &command, format!("Skipping the track")).await { - error!("Failed to edit response message: {}", why); - } - } - } -} - -pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand { - command.name("skip").description("Skip the current track") -} \ No newline at end of file diff --git a/src/commands/audio/stop.rs b/src/commands/audio/stop.rs deleted file mode 100644 index 32dec6f..0000000 --- a/src/commands/audio/stop.rs +++ /dev/null @@ -1,38 +0,0 @@ -use log::{debug, error}; - -use serenity::prelude::*; -use serenity::builder::CreateApplicationCommand; -use serenity::model::application::interaction::application_command::ApplicationCommandInteraction; - -use super::{get_songbird, create_response, edit_response}; - -pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) { - // Create the initial response - if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await { - error!("Failed to create response message: {}", why); - return; - } - - let guild_id = match command.guild_id { - Some(g) => g, - None => { - if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await { - error!("Failed to edit response message: {}", why); - } - return; - } - }; - let manager = get_songbird(ctx).await; - if let Some(handler_lock) = manager.get(guild_id) { - let handler = handler_lock.lock().await; - handler.queue().stop(); - debug!("Stopped the track"); - if let Err(why) = edit_response(&ctx, &command, format!("Stopping the tracks")).await { - error!("Failed to edit response message: {}", why); - } - } -} - -pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand { - command.name("stop").description("Stop the current track and clear the queue") -} \ No newline at end of file diff --git a/src/commands/audio/volume.rs b/src/commands/audio/volume.rs deleted file mode 100644 index 4ef8501..0000000 --- a/src/commands/audio/volume.rs +++ /dev/null @@ -1,85 +0,0 @@ -use log::{error, warn}; - -use serenity::prelude::*; -use serenity::builder::CreateApplicationCommand; -use serenity::model::application::interaction::application_command::ApplicationCommandInteraction; - -use super::{get_songbird, create_response, edit_response, AudioConfigs, AudioConfig}; - -pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) { - // Get the volume - let volume = match command.data.options.get(0) { - Some(t) => match &t.value { - Some(v) => match v.as_i64() { - Some(p) => std::cmp::min(100, std::cmp::max(0, p)), - None => { - warn!("Unable to get volume option as a string"); - if let Err(why) = create_response(&ctx, &command, format!("Volume option is missing")).await { - error!("Failed to create response message: {}", why); - } - return; - } - } - None => { - warn!("Missing volume option value"); - if let Err(why) = create_response(&ctx, &command, format!("Volume option is missing")).await { - error!("Failed to create response message: {}", why); - } - return; - } - } - None => { - warn!("Missing volume option"); - if let Err(why) = create_response(&ctx, &command, format!("Volume option is missing")).await { - error!("Failed to create response message: {}", why); - } - return; - } - }; - - // Format volume to f32 bound between 0.0 and 1.0 - let bound_volume = volume as f32 / 100.0; - - // Create the initial response - if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await { - error!("Failed to create response message: {}", why); - return; - } - - let guild_id = match command.guild_id { - Some(g) => g, - None => { - if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await { - error!("Failed to edit response message: {}", why); - } - return; - } - }; - let audio_config_lock = { - let data_read = ctx.data.read().await; - data_read.get::().expect("Expected AudioConfigs in TypeMap.").clone() - }; - { - let mut audio_configs = audio_config_lock.write().await; - *audio_configs.entry(guild_id).or_insert(AudioConfig { volume: 1.0 }) = AudioConfig { volume: bound_volume }; - } - let manager = get_songbird(ctx).await; - if let Some(handler_lock) = manager.get(guild_id) { - let handler = handler_lock.lock().await; - for (_, track_handle) in handler.queue().current_queue().iter().enumerate() { - let _ = track_handle.set_volume(bound_volume); - } - } - if let Err(why) = edit_response(&ctx, &command, format!("Setting the volume to {}", volume)).await { - error!("Failed to set the volume: {}", why); - } -} - -pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand { - command.name("volume").description("Set the audio player volume").create_option(|option| { option - .name("volume") - .description("Volume between 0 and 100") - .kind(serenity::model::prelude::command::CommandOptionType::Integer) - .required(true) - }) -} \ No newline at end of file