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.

77 lines
2.9KB

  1. use ureq::{Agent, Error, Response};
  2. use url::Url;
  3. use serde_json::{to_string};
  4. use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FACTORY_DOMAIN, FactoryInfo, RoboShopItemsInfo, FactoryRobotGetInfo};
  5. use crate::robocraft::{ListPayload};
  6. use crate::robocraft_simple::FactorySearchBuilder;
  7. pub struct FactoryAPI {
  8. client: Agent,
  9. token: Box<dyn ITokenProvider>,
  10. }
  11. impl FactoryAPI {
  12. pub fn new() -> FactoryAPI {
  13. FactoryAPI {
  14. client: Agent::new(),
  15. token: Box::new(DefaultTokenProvider{}),
  16. }
  17. }
  18. pub fn list(&self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
  19. let url = Url::parse(FACTORY_DOMAIN)
  20. .unwrap()
  21. .join("/api/roboShopItems/list")
  22. .unwrap();
  23. let payload = ListPayload::default();
  24. let mut request_builder = self.client.post(url.as_str())
  25. .set("Content-Type", "application/json");
  26. if let Ok(token) = self.token.token() {
  27. request_builder = request_builder.set("Authorization", &("Web ".to_owned() + &token));
  28. }
  29. let result = request_builder.send_string(&to_string(&payload).unwrap());
  30. if let Ok(response) = result {
  31. let json_res = response.into_json::<FactoryInfo<RoboShopItemsInfo>>();
  32. if let Ok(json) = json_res {
  33. return Ok(json);
  34. }
  35. return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); // server returned malformed data
  36. }
  37. Err(result.err().unwrap())
  38. }
  39. pub fn list_builder(&self) -> FactorySearchBuilder {
  40. let url = Url::parse(FACTORY_DOMAIN)
  41. .unwrap()
  42. .join("/api/roboShopItems/list")
  43. .unwrap();
  44. let mut token_opt = None;
  45. if let Ok(token) = self.token.token() {
  46. token_opt = Some(token);
  47. }
  48. let request_builder = self.client.post(url.as_str());
  49. FactorySearchBuilder::new(request_builder, token_opt)
  50. }
  51. pub fn get(&self, item_id: usize) -> Result<FactoryInfo<FactoryRobotGetInfo>, Error> {
  52. let url = Url::parse(FACTORY_DOMAIN)
  53. .unwrap()
  54. .join(&format!("/api/roboShopItems/get/{}", item_id))
  55. .unwrap();
  56. let mut request_builder = self.client.get(url.as_str());
  57. if let Ok(token) = self.token.token() {
  58. request_builder = request_builder.set("Authorization", &("Web ".to_owned() + &token));
  59. }
  60. let result = request_builder.call();
  61. if let Ok(response) = result {
  62. let json_res = response.into_json::<FactoryInfo<FactoryRobotGetInfo>>();
  63. if let Ok(json) = json_res {
  64. return Ok(json);
  65. }
  66. return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); // server returned malformed data
  67. }
  68. Err(result.err().unwrap())
  69. }
  70. }