diff options
Diffstat (limited to 'crates/bot-commands')
| -rw-r--r-- | crates/bot-commands/Cargo.toml | 34 | ||||
| -rw-r--r-- | crates/bot-commands/src/about.rs | 44 | ||||
| -rw-r--r-- | crates/bot-commands/src/lib.rs | 17 | ||||
| -rw-r--r-- | crates/bot-commands/src/ping.rs | 21 | ||||
| -rw-r--r-- | crates/bot-commands/src/track.rs | 121 |
5 files changed, 0 insertions, 237 deletions
diff --git a/crates/bot-commands/Cargo.toml b/crates/bot-commands/Cargo.toml deleted file mode 100644 index 3594c70..0000000 --- a/crates/bot-commands/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "bot-commands" -version = "0.2.0" -edition = "2021" - -authors = ["seth <getchoo at tuta dot io>"] -description = "Discord application commands for nixpkgs-tracker-bot" -repository = "https://github.com/getchoo/nixpkgs-tracker-bot" - -publish = false - -[dependencies] -bot-config = { workspace = true } -bot-consts = { workspace = true } -bot-error = { workspace = true } -bot-http = { workspace = true } -git-tracker = { workspace = true } -log = { workspace = true } -serenity = { workspace = true } - -[lints.rust] -unsafe_code = "forbid" - -[lints.clippy] -complexity = "warn" -correctness = "deny" -pedantic = "warn" -perf = "warn" -style = "warn" -suspicious = "deny" -# NOTE: THIS ISN'T IN OTHER CRATES BUT IS HERE -# this is because we don't really care about error docs here -# and it could mess with poise's comment system in the future :p -missing-errors-doc = "allow" diff --git a/crates/bot-commands/src/about.rs b/crates/bot-commands/src/about.rs deleted file mode 100644 index 2e5efae..0000000 --- a/crates/bot-commands/src/about.rs +++ /dev/null @@ -1,44 +0,0 @@ -use bot_error::Error; -use bot_http::TeawieClientExt; - -use serenity::builder::{ - CreateCommand, CreateEmbed, CreateEmbedFooter, CreateInteractionResponse, - CreateInteractionResponseMessage, -}; -use serenity::model::application::{CommandInteraction, InstallationContext}; -use serenity::prelude::Context; - -const VERSION: &str = env!("CARGO_PKG_VERSION"); -const REPOSITORY: &str = env!("CARGO_PKG_REPOSITORY"); - -pub async fn respond( - ctx: &Context, - http: &bot_http::Client, - command: &CommandInteraction, -) -> Result<(), Error> { - let mut embed = CreateEmbed::new() - .title("About nixpkgs-tracker-bot") - .description("I help track what branches PRs to nixpkgs have reached. If you've used [Nixpkgs Pull Request Tracker](https://nixpk.gs/pr-tracker.html), you probably know what this is about.") - .fields([ - ("Version", VERSION, true), - ("Source code", &format!("[getchoo/nixpkgs-tracker-bot]({REPOSITORY})"), true), - ("Issues/Feature Requests", &format!("[getchoo/nixpkgs-tracker-bot/issues]({REPOSITORY}/issues)"), true) - ]); - - if let Some(teawie_url) = http.random_teawie().await? { - let footer = CreateEmbedFooter::new("Images courtesy of @sympathytea"); - embed = embed.image(teawie_url).footer(footer); - }; - - let message = CreateInteractionResponseMessage::new().embed(embed); - let response = CreateInteractionResponse::Message(message); - command.create_response(&ctx, response).await?; - - Ok(()) -} - -pub fn register() -> CreateCommand { - CreateCommand::new("about") - .description("Learn more about me") - .add_integration_type(InstallationContext::User) -} diff --git a/crates/bot-commands/src/lib.rs b/crates/bot-commands/src/lib.rs deleted file mode 100644 index 79fce17..0000000 --- a/crates/bot-commands/src/lib.rs +++ /dev/null @@ -1,17 +0,0 @@ -use serenity::builder::CreateCommand; - -pub mod about; -pub mod ping; -pub mod track; - -macro_rules! cmd { - ($module: ident) => { - $module::register() - }; -} - -/// Return a list of all our [`CreateCommand`]s -#[must_use] -pub fn to_vec() -> Vec<CreateCommand> { - vec![cmd!(about), cmd!(ping), cmd!(track)] -} diff --git a/crates/bot-commands/src/ping.rs b/crates/bot-commands/src/ping.rs deleted file mode 100644 index b18a0b6..0000000 --- a/crates/bot-commands/src/ping.rs +++ /dev/null @@ -1,21 +0,0 @@ -use bot_error::Error; - -use serenity::builder::{ - CreateCommand, CreateInteractionResponse, CreateInteractionResponseMessage, -}; -use serenity::model::application::{CommandInteraction, InstallationContext}; -use serenity::prelude::Context; - -pub async fn respond(ctx: &Context, command: &CommandInteraction) -> Result<(), Error> { - let message = CreateInteractionResponseMessage::new().content("Pong!"); - let response = CreateInteractionResponse::Message(message); - command.create_response(&ctx, response).await?; - - Ok(()) -} - -pub fn register() -> CreateCommand { - CreateCommand::new("ping") - .description("Check if the bot is up") - .add_integration_type(InstallationContext::User) -} diff --git a/crates/bot-commands/src/track.rs b/crates/bot-commands/src/track.rs deleted file mode 100644 index 1f22d0e..0000000 --- a/crates/bot-commands/src/track.rs +++ /dev/null @@ -1,121 +0,0 @@ -use bot_config::Config; -use bot_consts::{NIXPKGS_REMOTE, NIXPKGS_URL}; -use bot_error::Error; -use bot_http::{self as http, GithubClientExt}; -use git_tracker::Tracker; - -use log::trace; -use serenity::all::CreateEmbed; -use serenity::builder::{CreateCommand, CreateCommandOption, CreateInteractionResponseFollowup}; -use serenity::model::application::{ - CommandInteraction, CommandOptionType, InstallationContext, ResolvedOption, ResolvedValue, -}; -use serenity::prelude::Context; - -const REPO_OWNER: &str = "NixOS"; -const REPO_NAME: &str = "nixpkgs"; - -/// Collect the status of the commit SHA [`commit_sha`] in each of the nixpkgs -/// branches in [`branches`], using the repository at path [`repository_path`] -/// -/// # Errors -/// -/// Will return [`Err`] if we can't start tracking a repository at the given path, -/// or if we can't determine if the branch has given commit -fn collect_statuses_in<'a>( - repository_path: &str, - commit_sha: &str, - branches: impl IntoIterator<Item = &'a String>, -) -> Result<Vec<String>, Error> { - // start tracking nixpkgs - let tracker = Tracker::from_path(repository_path)?; - - // check to see what branches it's in - let mut status_results = vec![]; - for branch_name in branches { - trace!("Checking for commit in {branch_name}"); - let full_branch_name = format!("{NIXPKGS_REMOTE}/{branch_name}"); - let has_pr = tracker.branch_contains_sha(&full_branch_name, commit_sha)?; - - if has_pr { - status_results.push(format!("`{branch_name}` ✅")); - } - } - - Ok(status_results) -} - -pub async fn respond( - ctx: &Context, - http: &http::Client, - config: &Config, - command: &CommandInteraction, -) -> Result<(), Error> { - // this will probably take a while - command.defer(&ctx).await?; - - let options = command.data.options(); - let Some(ResolvedOption { - value: ResolvedValue::Integer(pr), - .. - }) = options.first() - else { - let resp = CreateInteractionResponseFollowup::new() - .content("Please provide a valid pull request!"); - command.create_followup(&ctx, resp).await?; - - return Ok(()); - }; - - let Ok(pr_id) = u64::try_from(*pr) else { - let resp = - CreateInteractionResponseFollowup::new().content("PR numbers aren't negative..."); - command.create_followup(&ctx, resp).await?; - - return Ok(()); - }; - - // find out what commit our PR was merged in - let Some(commit_sha) = http.merge_commit_for(REPO_OWNER, REPO_NAME, pr_id).await? else { - let response = CreateInteractionResponseFollowup::new() - .content("It seems this pull request is very old. I can't track it"); - command.create_followup(&ctx, response).await?; - - return Ok(()); - }; - - let status_results = collect_statuses_in( - &config.nixpkgs_path, - &commit_sha, - config.nixpkgs_branches.iter(), - )?; - - // if we don't find the commit in any branches from above, we can pretty safely assume - // it's an unmerged PR - let embed_description: String = if status_results.is_empty() { - "It doesn't look like this PR has been merged yet! (or maybe I just haven't updated)" - .to_string() - } else { - status_results.join("\n") - }; - - let embed = CreateEmbed::new() - .title(format!("Nixpkgs PR #{} Status", *pr)) - .url(format!("{NIXPKGS_URL}/pull/{pr}")) - .description(embed_description); - - let resp = CreateInteractionResponseFollowup::new().embed(embed); - command.create_followup(&ctx, resp).await?; - - Ok(()) -} - -pub fn register() -> CreateCommand { - CreateCommand::new("track") - .description("Track a nixpkgs PR") - .add_integration_type(InstallationContext::User) - .add_option( - CreateCommandOption::new(CommandOptionType::Integer, "pull_request", "PR to track") - .required(true), - ) -} |
