From 3fc54fd05b742807addbdb18b30977de4adf65e8 Mon Sep 17 00:00:00 2001 From: kageru Date: Wed, 30 Oct 2019 21:05:48 +0100 Subject: [PATCH] finish pacman queries --- src/commands/pacman.rs | 88 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 16 deletions(-) diff --git a/src/commands/pacman.rs b/src/commands/pacman.rs index 9377202..5ae55bd 100644 --- a/src/commands/pacman.rs +++ b/src/commands/pacman.rs @@ -1,6 +1,8 @@ +use serde::{Deserialize, Serialize}; use serenity::model::channel::Message; +use serenity::model::id::ChannelId; use serenity::prelude::*; -use serde::{Serialize, Deserialize}; +use std::fmt; extern crate reqwest; pub fn query_pacman(ctx: Context, msg: Message) { @@ -8,30 +10,74 @@ pub fn query_pacman(ctx: Context, msg: Message) { // the !pacman args.remove(0); if args.len() == 0 { - if let Err(cause) = msg.channel_id .say(ctx.http, "Error: expected at least 1 additional argument") { - println!("Could not send message: {:?}", cause); - } + send( + msg.channel_id, + "Error: expected at least 1 additional argument", + &ctx, + ); return; } - let query = args.join(" "); - match make_call(&query) { - Err(err) => println!("{:?}", err), - Ok(result) => { - if let Err(_cause) = msg.channel_id.say(ctx.http, format!("{}: version {}", result.results[0].pkgname, result.results[0].pkgver)) { - println!("asd"); - } + if args.len() == 1 { + // try by full package name + let response = search(&format!( + "https://www.archlinux.org/packages/search/json/?name={}", + &args[0] + )); + // this is 1 for most packages and 2 if there’s a second version in testing + if response.results.len() != 0 { + respond_with_results(msg.channel_id, &response.results, &ctx); + return; } } + let query = args.join(" "); + let response = search(&format!( + "https://www.archlinux.org/packages/search/json/?q={}", + &query + )); + if response.results.len() == 0 { + send(msg.channel_id, "No results", &ctx); + return; + } + respond_with_results(msg.channel_id, &response.results, &ctx); +} + +fn respond_with_results(target: ChannelId, results: &Vec, ctx: &Context) { + send( + target, + &format!( + "```{}```", + results + .into_iter() + .take(5) + .map(|p| format!("{}\n", p)) + .collect::() + ), + ctx, + ); +} + +fn send(target: ChannelId, message: &str, ctx: &Context) { + if let Err(cause) = target.say(&ctx.http, message) { + println!("Could not send message: {}", cause); + } } -fn make_call(query: &str) -> Result { - let mut url = "https://www.archlinux.org/packages/search/json/?q=".to_owned(); - url.push_str(&query); - let resp = reqwest::get(&url)?.json::()?; - println!("{:?}", &resp); +fn search(url: &str) -> Response { + return search_inner(url).unwrap_or(EMPTY_RESULT); +} + +fn search_inner(url: &str) -> Result { + let resp = reqwest::get(url)?.json::()?; Ok(resp) } +const EMPTY_RESULT: Response = Response { + version: 0, + limit: 0, + valid: false, + results: Vec::new(), +}; + #[derive(Serialize, Deserialize, Debug)] struct Response { version: i8, @@ -54,3 +100,13 @@ struct Package { last_update: String, flag_date: Option, } + +impl fmt::Display for Package { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}/{} {}\n {}", + self.repo, self.pkgname, self.pkgver, self.pkgdesc + ) + } +}