From db77f86b5ff22531ac96a8e62c95c21a266ceba5 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Sat, 16 Sep 2023 12:41:41 +0200 Subject: [PATCH] Improve installation process and add README --- .media/icon.png | Bin 0 -> 9626 bytes .media/screenshot-slash.png | Bin 0 -> 37327 bytes README.md | 55 +++++++++++++++++++++++++++++++++++ src/config.rs | 19 ++++++++++-- src/handler/commands/play.rs | 7 +---- src/main.rs | 12 +------- 6 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 .media/icon.png create mode 100644 .media/screenshot-slash.png create mode 100644 README.md diff --git a/.media/icon.png b/.media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8d19d575bebb5caa45ce86ecb1b8ee76d455726e GIT binary patch literal 9626 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 z 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 IQP(B*zt!9R?EnA( literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e5ec636 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# ![](.media/icon.png) Angy Bot + +Music player bot for Discord supporting unusual formats and features, intended for use in the [RYG community](https://www.ryg.one/). + +> **Warning** +> +> Very hastily developed with no regards to security or code quality, use it at your own risk! + +## Links + +*No links available right now.* + +## Screenshots + +![The bot being summoned, a Plex track being played, and playback being stopped in a Discord chat.](.media/screenshot-slash.png) + +## Features + +Currently supports playing from: + +- local filesystem +- yt-dlp +- local Plex instance + +> **Warning** +> +> The bot currently supports only the playback of a single track at a time. + +## Commands + +The bot registers the following Slash Commands: + +- `/summon channel:...` · Makes the bot connect to a channel +- `/play file what:...` · If you are the bot owner, plays the file at the given path. +- `/play ytdl what:...` · Tries to download and play the given string with yt-dlp, falling back to `ytsearch:` if it is not a valid URL. +- `/play plex what:...` · Queries a Plex Media Server for a track name, and plays the first result returned. +- `/stop` · Stops playback of any track. + +## Installation + +Use the provided Docker image: + +- [`ghcr.io/ryghub/angybot`](https://github.com/RYGhub/angybot/pkgs/container/angybot) + +The following environment variables must be set to configure the bot: + +- `ANGY_TOKEN` · The Discord bot token to use. +- `ANGY_APPID` · The Discord application id to use. +- `ANGY_PLEX_SERVER` · The Plex server to use. +- `ANGY_PLEX_TOKEN` · The Plex token to use. +- `ANGY_PLEX_LIBRARY` · The Plex library to use. +- `ANGY_PLEX_REPLACE_FROM` · The string to remove from the media file path for Plex files. +- `ANGY_PLEX_REPLACE_TO` · The string to add in the media file path for Plex files. +- `ANGY_DEV_GUILD_ID` · The guild id to register Slash Commands in. +- `ANGY_DEV_USER_ID` · The user id allowed to use `/play file`. diff --git a/src/config.rs b/src/config.rs index 750dc93..28dee45 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,5 +1,6 @@ use std::env; use lazy_static::lazy_static; +use serenity::model::id::{UserId, GuildId}; lazy_static! { @@ -25,11 +26,25 @@ lazy_static! { pub static ref PLEX_LIBRARY: String = env::var("ANGY_PLEX_LIBRARY") .expect("ANGY_PLEX_LIBRARY to be set"); - /// The string to remove from the media file path. + /// The string to remove from the media file path for Plex files. pub static ref PLEX_REPLACE_FROM: String = env::var("ANGY_PLEX_REPLACE_FROM") .expect("ANGY_PLEX_REPLACE_FROM to be set"); - /// The string to add in the media file path. + /// The string to add in the media file path for Plex files. pub static ref PLEX_REPLACE_TO: String = env::var("ANGY_PLEX_REPLACE_TO") .expect("ANGY_PLEX_REPLACE_TO to be set"); + + /// The guild id to register Slash Commands in. + pub static ref DEV_GUILD_ID: GuildId = env::var("ANGY_DEV_GUILD_ID") + .expect("ANGY_DEV_GUILD_ID to be set") + .parse::() + .expect("ANGY_DEV_GUILD_ID to be a valid u64") + .into(); + + /// The user id allowed to use `/play file`. + pub static ref DEV_USER_ID: UserId = env::var("ANGY_DEV_USER_ID") + .expect("ANGY_DEV_USER_ID to be set") + .parse::() + .expect("ANGY_DEV_USER_ID to be a valid u64") + .into(); } diff --git a/src/handler/commands/play.rs b/src/handler/commands/play.rs index 22ead2f..c025730 100644 --- a/src/handler/commands/play.rs +++ b/src/handler/commands/play.rs @@ -1,4 +1,3 @@ -use std::env; use std::ffi::OsString; use serenity::prelude::*; use serenity::model::prelude::*; @@ -27,11 +26,7 @@ pub async fn play(ctx: &Context, guild: &GuildId, member: &Member, opts: Options } // play file else if option_optional_string(&opts, "file").is_some() { - let dev_user_id: UserId = env::var("ANGY_DEV_USER_ID") - .map_err(|_| AngyError::Bot("`ANGY_DEV_USER_ID` is not set."))? - .parse::() - .map_err(|_| AngyError::Bot("`ANGY_DEV_USER_ID` is not a valid ID."))? - .into(); + let dev_user_id: UserId = crate::config::DEV_USER_ID.clone(); match member.user.id.eq(&dev_user_id) { false => Err(AngyError::User("This command can be used only by the bot's owner."))?, diff --git a/src/main.rs b/src/main.rs index 64204c6..c6ee812 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,4 @@ -//! # Angy Bot -//! -//! Music player bot for Discord supporting unusual formats and features, intended primarly for usage in the [RYG community](https://www.ryg.one/). -//! -//! ## Supported players -//! -//! Currently supports playing from: -//! - local filesystem -//! - yt-dlp -//! - local Plex instance - +//! Main function of Angy Bot. mod schema; mod error;