finish pacman queries

This commit is contained in:
kageru 2019-10-30 21:05:48 +01:00
parent 953c33a70f
commit 3fc54fd05b
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2

View File

@ -1,6 +1,8 @@
use serde::{Deserialize, Serialize};
use serenity::model::channel::Message; use serenity::model::channel::Message;
use serenity::model::id::ChannelId;
use serenity::prelude::*; use serenity::prelude::*;
use serde::{Serialize, Deserialize}; use std::fmt;
extern crate reqwest; extern crate reqwest;
pub fn query_pacman(ctx: Context, msg: Message) { pub fn query_pacman(ctx: Context, msg: Message) {
@ -8,30 +10,74 @@ pub fn query_pacman(ctx: Context, msg: Message) {
// the !pacman // the !pacman
args.remove(0); args.remove(0);
if args.len() == 0 { if args.len() == 0 {
if let Err(cause) = msg.channel_id .say(ctx.http, "Error: expected at least 1 additional argument") { send(
println!("Could not send message: {:?}", cause); msg.channel_id,
} "Error: expected at least 1 additional argument",
&ctx,
);
return; return;
} }
let query = args.join(" "); if args.len() == 1 {
match make_call(&query) { // try by full package name
Err(err) => println!("{:?}", err), let response = search(&format!(
Ok(result) => { "https://www.archlinux.org/packages/search/json/?name={}",
if let Err(_cause) = msg.channel_id.say(ctx.http, format!("{}: version {}", result.results[0].pkgname, result.results[0].pkgver)) { &args[0]
println!("asd"); ));
} // 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<Package>, ctx: &Context) {
send(
target,
&format!(
"```{}```",
results
.into_iter()
.take(5)
.map(|p| format!("{}\n", p))
.collect::<String>()
),
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<Response, reqwest::Error> { fn search(url: &str) -> Response {
let mut url = "https://www.archlinux.org/packages/search/json/?q=".to_owned(); return search_inner(url).unwrap_or(EMPTY_RESULT);
url.push_str(&query); }
let resp = reqwest::get(&url)?.json::<Response>()?;
println!("{:?}", &resp); fn search_inner(url: &str) -> Result<Response, reqwest::Error> {
let resp = reqwest::get(url)?.json::<Response>()?;
Ok(resp) Ok(resp)
} }
const EMPTY_RESULT: Response = Response {
version: 0,
limit: 0,
valid: false,
results: Vec::new(),
};
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
struct Response { struct Response {
version: i8, version: i8,
@ -54,3 +100,13 @@ struct Package {
last_update: String, last_update: String,
flag_date: Option<String>, flag_date: Option<String>,
} }
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
)
}
}