Implement Robocraft factory bot info get

This commit is contained in:
NGnius 2021-04-18 19:33:20 -04:00
parent ff09e3ffec
commit 0f85739955
6 changed files with 97 additions and 13 deletions

View file

@ -1,5 +1,2 @@
pub mod cardlife; pub mod cardlife;
pub mod robocraft; pub mod robocraft;
#[cfg(test)]
mod tests {}

View file

@ -1,7 +1,7 @@
use reqwest::{Client, Error}; use reqwest::{Client, Error};
use url::{Url}; use url::{Url};
use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FactoryInfo, FactorySearchBuilder}; use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FactoryInfo, FactorySearchBuilder, RoboShopItemsInfo, FactoryRobotGetInfo};
use crate::robocraft::factory_json::ListPayload; use crate::robocraft::factory_json::ListPayload;
const FACTORY_DOMAIN: &str = "https://factory.robocraftgame.com/"; const FACTORY_DOMAIN: &str = "https://factory.robocraftgame.com/";
@ -26,7 +26,7 @@ impl FactoryAPI {
} }
} }
pub async fn list(&self) -> Result<FactoryInfo, Error> { pub async fn list(&self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
let url = Url::parse(FACTORY_DOMAIN) let url = Url::parse(FACTORY_DOMAIN)
.unwrap() .unwrap()
.join("/api/roboShopItems/list") .join("/api/roboShopItems/list")
@ -39,7 +39,7 @@ impl FactoryAPI {
} }
let result = request_builder.send().await; let result = request_builder.send().await;
if let Ok(response) = result { if let Ok(response) = result {
return response.json::<FactoryInfo>().await; return response.json::<FactoryInfo<RoboShopItemsInfo>>().await;
} }
Err(result.err().unwrap()) Err(result.err().unwrap())
} }
@ -56,4 +56,20 @@ impl FactoryAPI {
let request_builder = self.client.post(url); let request_builder = self.client.post(url);
FactorySearchBuilder::new(request_builder, token_opt) FactorySearchBuilder::new(request_builder, token_opt)
} }
pub async fn get(&self, item_id: usize) -> Result<FactoryInfo<FactoryRobotGetInfo>, Error> {
let url = Url::parse(FACTORY_DOMAIN)
.unwrap()
.join(&format!("/api/roboShopItems/get/{}", item_id))
.unwrap();
let mut request_builder = self.client.get(url);
if let Ok(token) = self.token.token() {
request_builder = request_builder.header("Authorization", "Web ".to_owned() + &token);
}
let result = request_builder.send().await;
if let Ok(response) = result {
return response.json::<FactoryInfo<FactoryRobotGetInfo>>().await;
}
Err(result.err().unwrap())
}
} }

View file

@ -1,5 +1,7 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
// list endpoint
#[derive(Deserialize, Serialize, Clone)] #[derive(Deserialize, Serialize, Clone)]
pub(crate) struct ListPayload { pub(crate) struct ListPayload {
#[serde(rename = "page")] #[serde(rename = "page")]
@ -81,9 +83,9 @@ impl ListPayload {
} }
#[derive(Deserialize, Serialize, Clone)] #[derive(Deserialize, Serialize, Clone)]
pub struct FactoryInfo { pub struct FactoryInfo<T> {
#[serde(rename = "response")] #[serde(rename = "response")]
pub response: RoboShopItemsInfo, pub response: T,
#[serde(rename = "statusCode")] #[serde(rename = "statusCode")]
pub status_code: usize, pub status_code: usize,
} }
@ -143,3 +145,59 @@ impl std::string::ToString for FactoryRobotListInfo {
format!("{} by {} ({})", &self.item_name, &self.added_by_display_name, &self.item_id) format!("{} by {} ({})", &self.item_name, &self.added_by_display_name, &self.item_id)
} }
} }
// get/<item_id> endpoint
#[derive(Deserialize, Serialize, Clone)]
pub struct FactoryRobotGetInfo {
#[serde(rename = "id")]
pub item_id: usize,
#[serde(rename = "name")]
pub item_name: String,
#[serde(rename = "description")]
pub item_description: String,
#[serde(rename = "thumbnail")]
pub thumbnail: String, // url
#[serde(rename = "addedBy")]
pub added_by: String,
#[serde(rename = "addedByDisplayName")]
pub added_by_display_name: String,
#[serde(rename = "addedDate")]
pub added_date: String, // ISO date
#[serde(rename = "expiryDate")]
pub expiry_date: String, // ISO date
#[serde(rename = "cpu")]
pub cpu: usize,
#[serde(rename = "totalRobotRanking")]
pub total_robot_ranking: usize,
#[serde(rename = "rentCount")]
pub rent_count: usize,
#[serde(rename = "buyCount")]
pub buy_count: usize,
#[serde(rename = "buyable")]
pub buyable: bool,
#[serde(rename = "removedDate")]
pub removed_date: Option<String>,
#[serde(rename = "banDate")]
pub ban_date: Option<String>,
#[serde(rename = "featured")]
pub featured: bool,
#[serde(rename = "bannerMessage")]
pub banner_message: Option<String>,
#[serde(rename = "combatRating")]
pub combat_rating: f32,
#[serde(rename = "cosmeticRating")]
pub cosmetic_rating: f32,
#[serde(rename = "cubeData")]
pub cube_data: String,
#[serde(rename = "colourData")]
pub colour_data: String,
#[serde(rename = "cubeAmounts")]
pub cube_amounts: String, // JSON as str
}
impl std::string::ToString for FactoryRobotGetInfo {
fn to_string(&self) -> String {
format!("{} by {} ({})", &self.item_name, &self.added_by_display_name, &self.item_id)
}
}

View file

@ -1,6 +1,6 @@
use reqwest::{RequestBuilder, Error}; use reqwest::{RequestBuilder, Error};
use crate::robocraft::{FactoryInfo}; use crate::robocraft::{FactoryInfo, RoboShopItemsInfo};
use crate::robocraft::factory_json::ListPayload; use crate::robocraft::factory_json::ListPayload;
pub enum FactoryOrderType { pub enum FactoryOrderType {
@ -156,14 +156,14 @@ impl FactorySearchBuilder {
self self
} }
pub async fn send(mut self) -> Result<FactoryInfo, Error> { pub async fn send(mut self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
self.reqwest_builder = self.reqwest_builder.json(&self.payload); self.reqwest_builder = self.reqwest_builder.json(&self.payload);
if let Some(token) = self.token.clone() { if let Some(token) = self.token.clone() {
self.reqwest_builder = self.reqwest_builder.header("Authorization", "Web ".to_owned() + &token); self.reqwest_builder = self.reqwest_builder.header("Authorization", "Web ".to_owned() + &token);
} }
let result = self.reqwest_builder.send().await; let result = self.reqwest_builder.send().await;
if let Ok(response) = result { if let Ok(response) = result {
return response.json::<FactoryInfo>().await; return response.json::<FactoryInfo<RoboShopItemsInfo>>().await;
} }
Err(result.err().unwrap()) Err(result.err().unwrap())
} }

View file

@ -2,7 +2,7 @@ mod factory;
mod factory_json; mod factory_json;
mod factory_request_builder; mod factory_request_builder;
pub use self::factory::{FactoryAPI}; pub use self::factory::{FactoryAPI};
pub use self::factory_json::{FactoryInfo, FactoryRobotListInfo, RoboShopItemsInfo}; pub use self::factory_json::{FactoryInfo, FactoryRobotListInfo, RoboShopItemsInfo, FactoryRobotGetInfo};
pub use self::factory_request_builder::{FactorySearchBuilder, FactoryMovementType, FactoryOrderType, FactoryWeaponType, FactoryTextSearchType}; pub use self::factory_request_builder::{FactorySearchBuilder, FactoryMovementType, FactoryOrderType, FactoryWeaponType, FactoryTextSearchType};
mod auth; mod auth;

View file

@ -28,7 +28,7 @@ fn builder() -> robocraft::FactorySearchBuilder {
robocraft::FactoryAPI::new().list_builder() robocraft::FactoryAPI::new().list_builder()
} }
fn assert_factory_list(robo_info: robocraft::FactoryInfo) -> Result<(), ()> { fn assert_factory_list(robo_info: robocraft::FactoryInfo<robocraft::RoboShopItemsInfo>) -> Result<(), ()> {
assert_ne!(robo_info.response.roboshop_items.len(), 0); assert_ne!(robo_info.response.roboshop_items.len(), 0);
assert_eq!(robo_info.status_code, 200); assert_eq!(robo_info.status_code, 200);
for robot in &robo_info.response.roboshop_items { for robot in &robo_info.response.roboshop_items {
@ -76,3 +76,16 @@ async fn robocraft_factory_player_query() -> Result<(), ()> {
assert!(result.is_ok()); assert!(result.is_ok());
assert_factory_list(result.unwrap()) assert_factory_list(result.unwrap())
} }
#[tokio::test]
async fn robocraft_factory_robot_query() -> Result<(), ()> {
let api = robocraft::FactoryAPI::new();
let result = api.get(6478345 /* featured robot id*/).await;
assert!(result.is_ok());
let bot_info = result.unwrap();
assert_ne!(bot_info.response.item_name, "");
assert_eq!(bot_info.response.item_id, 6478345);
assert_ne!(bot_info.response.cube_data, "");
assert_ne!(bot_info.response.colour_data, "");
Ok(())
}