An unofficial collection of APIs used in FreeJam games and mods
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.6KB

  1. use reqwest::{Client, Error};
  2. use url::{Url};
  3. use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FactoryInfo, FactorySearchBuilder, RoboShopItemsInfo, FactoryRobotGetInfo};
  4. use crate::robocraft::factory_json::ListPayload;
  5. pub const FACTORY_DOMAIN: &str = "https://factory.robocraftgame.com/";
  6. pub struct FactoryAPI {
  7. client: Client,
  8. token: Box<dyn ITokenProvider>,
  9. }
  10. impl FactoryAPI {
  11. pub fn new() -> FactoryAPI {
  12. FactoryAPI {
  13. client: Client::new(),
  14. token: Box::new(DefaultTokenProvider{}),
  15. }
  16. }
  17. pub fn with_auth(token_provider: Box<dyn ITokenProvider>) -> FactoryAPI {
  18. FactoryAPI {
  19. client: Client::new(),
  20. token: token_provider,
  21. }
  22. }
  23. pub async fn list(&self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
  24. let url = Url::parse(FACTORY_DOMAIN)
  25. .unwrap()
  26. .join("/api/roboShopItems/list")
  27. .unwrap();
  28. let payload = ListPayload::default();
  29. let mut request_builder = self.client.post(url)
  30. .json(&payload);
  31. if let Ok(token) = self.token.token() {
  32. request_builder = request_builder.header("Authorization", "Web ".to_owned() + &token);
  33. }
  34. let result = request_builder.send().await;
  35. if let Ok(response) = result {
  36. return response.json::<FactoryInfo<RoboShopItemsInfo>>().await;
  37. }
  38. Err(result.err().unwrap())
  39. }
  40. pub fn list_builder(&self) -> FactorySearchBuilder {
  41. let url = Url::parse(FACTORY_DOMAIN)
  42. .unwrap()
  43. .join("/api/roboShopItems/list")
  44. .unwrap();
  45. let mut token_opt = None;
  46. if let Ok(token) = self.token.token() {
  47. token_opt = Some(token);
  48. }
  49. let request_builder = self.client.post(url);
  50. FactorySearchBuilder::new(request_builder, token_opt)
  51. }
  52. pub async fn get(&self, item_id: usize) -> Result<FactoryInfo<FactoryRobotGetInfo>, Error> {
  53. let url = Url::parse(FACTORY_DOMAIN)
  54. .unwrap()
  55. .join(&format!("/api/roboShopItems/get/{}", item_id))
  56. .unwrap();
  57. let mut request_builder = self.client.get(url);
  58. if let Ok(token) = self.token.token() {
  59. request_builder = request_builder.header("Authorization", "Web ".to_owned() + &token);
  60. }
  61. let result = request_builder.send().await;
  62. if let Ok(response) = result {
  63. return response.json::<FactoryInfo<FactoryRobotGetInfo>>().await;
  64. }
  65. Err(result.err().unwrap())
  66. }
  67. }