feat: add linkshell scraping
This commit is contained in:
parent
165e6d48ab
commit
1c75806b2e
|
@ -1,5 +1,9 @@
|
||||||
pub mod character_search;
|
pub mod character_search;
|
||||||
pub mod free_company_search;
|
pub mod free_company_search;
|
||||||
|
pub mod linkshell_search;
|
||||||
|
pub mod linkshell;
|
||||||
|
|
||||||
pub use self::character_search::CharacterSearchBuilder;
|
pub use self::character_search::CharacterSearchBuilder;
|
||||||
pub use self::free_company_search::FreeCompanySearchBuilder;
|
pub use self::free_company_search::FreeCompanySearchBuilder;
|
||||||
|
pub use self::linkshell_search::LinkshellSearchBuilder;
|
||||||
|
pub use self::linkshell::LinkshellBuilder;
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
use crate::{
|
||||||
|
LodestoneScraper,
|
||||||
|
error::*,
|
||||||
|
};
|
||||||
|
|
||||||
|
use ffxiv_types::{World, DataCenter};
|
||||||
|
|
||||||
|
use lodestone_parser::models::linkshell::Linkshell;
|
||||||
|
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct LinkshellBuilder<'a> {
|
||||||
|
scraper: &'a LodestoneScraper,
|
||||||
|
id: u64,
|
||||||
|
// page
|
||||||
|
page: Option<u64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> LinkshellBuilder<'a> {
|
||||||
|
pub fn new(scraper: &'a LodestoneScraper, id: u64) -> Self {
|
||||||
|
LinkshellBuilder {
|
||||||
|
scraper,
|
||||||
|
id,
|
||||||
|
page: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn page(&mut self, p: u64) -> &mut Self {
|
||||||
|
self.page = Some(p);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn send(&self) -> Result<Linkshell> {
|
||||||
|
let text = self.scraper.text(self.as_url())?;
|
||||||
|
lodestone_parser::parse_linkshell(self.id, &text).map_err(Error::Parse)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_url(&self) -> Url {
|
||||||
|
let mut url = LodestoneScraper::route(&format!("linkshell/{}", self.id)).unwrap();
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut pairs = url.query_pairs_mut();
|
||||||
|
|
||||||
|
if let Some(page) = self.page {
|
||||||
|
pairs.append_pair("page", &page.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
use crate::{
|
||||||
|
LodestoneScraper,
|
||||||
|
error::*,
|
||||||
|
util::{Either, AsLodestone},
|
||||||
|
};
|
||||||
|
|
||||||
|
use ffxiv_types::{World, DataCenter};
|
||||||
|
|
||||||
|
use lodestone_parser::models::search::{
|
||||||
|
Paginated,
|
||||||
|
linkshell::LinkshellSearchItem,
|
||||||
|
};
|
||||||
|
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct LinkshellSearchBuilder<'a> {
|
||||||
|
scraper: &'a LodestoneScraper,
|
||||||
|
// q
|
||||||
|
name: Option<&'a str>,
|
||||||
|
// worldname
|
||||||
|
world: Option<Either<World, DataCenter>>,
|
||||||
|
// FIXME: add active members
|
||||||
|
// page
|
||||||
|
page: Option<u64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> LinkshellSearchBuilder<'a> {
|
||||||
|
pub fn new(scraper: &'a LodestoneScraper) -> Self {
|
||||||
|
LinkshellSearchBuilder {
|
||||||
|
scraper,
|
||||||
|
name: None,
|
||||||
|
world: None,
|
||||||
|
page: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn name(&mut self, n: &'a str) -> &mut Self {
|
||||||
|
self.name = Some(n);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn world(&mut self, w: World) -> &mut Self {
|
||||||
|
self.world = Some(Either::Left(w));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn data_center(&mut self, dc: DataCenter) -> &mut Self {
|
||||||
|
self.world = Some(Either::Right(dc));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn page(&mut self, p: u64) -> &mut Self {
|
||||||
|
self.page = Some(p);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn send(&self) -> Result<Paginated<LinkshellSearchItem>> {
|
||||||
|
let text = self.scraper.text(self.as_url())?;
|
||||||
|
lodestone_parser::parse_linkshell_search(&text).map_err(Error::Parse)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_url(&self) -> Url {
|
||||||
|
let mut url = crate::LODESTONE_URL.join("linkshell/").unwrap();
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut pairs = url.query_pairs_mut();
|
||||||
|
|
||||||
|
if let Some(page) = self.page {
|
||||||
|
pairs.append_pair("page", &page.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(ref name) = self.name {
|
||||||
|
pairs.append_pair("q", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
match self.world {
|
||||||
|
Some(Either::Left(w)) => { pairs.append_pair("worldname", w.as_str()); },
|
||||||
|
Some(Either::Right(dc)) => { pairs.append_pair("worldname", &dc.as_lodestone()); },
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ use lazy_static::lazy_static;
|
||||||
use lodestone_parser::models::{
|
use lodestone_parser::models::{
|
||||||
character::Character,
|
character::Character,
|
||||||
free_company::FreeCompany,
|
free_company::FreeCompany,
|
||||||
|
linkshell::Linkshell,
|
||||||
};
|
};
|
||||||
|
|
||||||
use reqwest::{Client, StatusCode};
|
use reqwest::{Client, StatusCode};
|
||||||
|
@ -77,4 +78,12 @@ impl LodestoneScraper {
|
||||||
pub fn free_company_search(&self) -> builder::FreeCompanySearchBuilder {
|
pub fn free_company_search(&self) -> builder::FreeCompanySearchBuilder {
|
||||||
builder::FreeCompanySearchBuilder::new(self)
|
builder::FreeCompanySearchBuilder::new(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn linkshell(&self, id: u64) -> builder::LinkshellBuilder {
|
||||||
|
builder::LinkshellBuilder::new(self, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn linkshell_search(&self) -> builder::LinkshellSearchBuilder {
|
||||||
|
builder::LinkshellSearchBuilder::new(self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue