finish pacman queries
This commit is contained in:
parent
953c33a70f
commit
3fc54fd05b
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user