From 0f8573995564a3a9815cea5a9395d6baf6875afe Mon Sep 17 00:00:00 2001 From: NGnius Date: Sun, 18 Apr 2021 19:33:20 -0400 Subject: [PATCH] Implement Robocraft factory bot info get --- src/lib.rs | 3 -- src/robocraft/factory.rs | 22 +++++++-- src/robocraft/factory_json.rs | 62 +++++++++++++++++++++++- src/robocraft/factory_request_builder.rs | 6 +-- src/robocraft/mod.rs | 2 +- tests/robocraft_factory.rs | 15 +++++- 6 files changed, 97 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a79bcf3..c4cf11c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,2 @@ pub mod cardlife; pub mod robocraft; - -#[cfg(test)] -mod tests {} diff --git a/src/robocraft/factory.rs b/src/robocraft/factory.rs index 676468f..965a229 100644 --- a/src/robocraft/factory.rs +++ b/src/robocraft/factory.rs @@ -1,7 +1,7 @@ use reqwest::{Client, Error}; 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; const FACTORY_DOMAIN: &str = "https://factory.robocraftgame.com/"; @@ -26,7 +26,7 @@ impl FactoryAPI { } } - pub async fn list(&self) -> Result { + pub async fn list(&self) -> Result, Error> { let url = Url::parse(FACTORY_DOMAIN) .unwrap() .join("/api/roboShopItems/list") @@ -39,7 +39,7 @@ impl FactoryAPI { } let result = request_builder.send().await; if let Ok(response) = result { - return response.json::().await; + return response.json::>().await; } Err(result.err().unwrap()) } @@ -56,4 +56,20 @@ impl FactoryAPI { let request_builder = self.client.post(url); FactorySearchBuilder::new(request_builder, token_opt) } + + pub async fn get(&self, item_id: usize) -> Result, 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::>().await; + } + Err(result.err().unwrap()) + } } diff --git a/src/robocraft/factory_json.rs b/src/robocraft/factory_json.rs index 0e8ed2a..8d59bb2 100644 --- a/src/robocraft/factory_json.rs +++ b/src/robocraft/factory_json.rs @@ -1,5 +1,7 @@ use serde::{Deserialize, Serialize}; +// list endpoint + #[derive(Deserialize, Serialize, Clone)] pub(crate) struct ListPayload { #[serde(rename = "page")] @@ -81,9 +83,9 @@ impl ListPayload { } #[derive(Deserialize, Serialize, Clone)] -pub struct FactoryInfo { +pub struct FactoryInfo { #[serde(rename = "response")] - pub response: RoboShopItemsInfo, + pub response: T, #[serde(rename = "statusCode")] 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) } } + +// get/ 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, + #[serde(rename = "banDate")] + pub ban_date: Option, + #[serde(rename = "featured")] + pub featured: bool, + #[serde(rename = "bannerMessage")] + pub banner_message: Option, + #[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) + } +} diff --git a/src/robocraft/factory_request_builder.rs b/src/robocraft/factory_request_builder.rs index 0648f29..c6c2a68 100644 --- a/src/robocraft/factory_request_builder.rs +++ b/src/robocraft/factory_request_builder.rs @@ -1,6 +1,6 @@ use reqwest::{RequestBuilder, Error}; -use crate::robocraft::{FactoryInfo}; +use crate::robocraft::{FactoryInfo, RoboShopItemsInfo}; use crate::robocraft::factory_json::ListPayload; pub enum FactoryOrderType { @@ -156,14 +156,14 @@ impl FactorySearchBuilder { self } - pub async fn send(mut self) -> Result { + pub async fn send(mut self) -> Result, Error> { self.reqwest_builder = self.reqwest_builder.json(&self.payload); if let Some(token) = self.token.clone() { self.reqwest_builder = self.reqwest_builder.header("Authorization", "Web ".to_owned() + &token); } let result = self.reqwest_builder.send().await; if let Ok(response) = result { - return response.json::().await; + return response.json::>().await; } Err(result.err().unwrap()) } diff --git a/src/robocraft/mod.rs b/src/robocraft/mod.rs index 626c95d..1124780 100644 --- a/src/robocraft/mod.rs +++ b/src/robocraft/mod.rs @@ -2,7 +2,7 @@ mod factory; mod factory_json; mod factory_request_builder; 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}; mod auth; diff --git a/tests/robocraft_factory.rs b/tests/robocraft_factory.rs index a306c8e..8a26b91 100644 --- a/tests/robocraft_factory.rs +++ b/tests/robocraft_factory.rs @@ -28,7 +28,7 @@ fn builder() -> robocraft::FactorySearchBuilder { robocraft::FactoryAPI::new().list_builder() } -fn assert_factory_list(robo_info: robocraft::FactoryInfo) -> Result<(), ()> { +fn assert_factory_list(robo_info: robocraft::FactoryInfo) -> Result<(), ()> { assert_ne!(robo_info.response.roboshop_items.len(), 0); assert_eq!(robo_info.status_code, 200); for robot in &robo_info.response.roboshop_items { @@ -76,3 +76,16 @@ async fn robocraft_factory_player_query() -> Result<(), ()> { assert!(result.is_ok()); 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(()) +}