summaryrefslogtreecommitdiff
path: root/crates/bot-commands
diff options
context:
space:
mode:
Diffstat (limited to 'crates/bot-commands')
-rw-r--r--crates/bot-commands/Cargo.toml34
-rw-r--r--crates/bot-commands/src/about.rs44
-rw-r--r--crates/bot-commands/src/lib.rs17
-rw-r--r--crates/bot-commands/src/ping.rs21
-rw-r--r--crates/bot-commands/src/track.rs121
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),
- )
-}