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.

85 lines
3.3KB

  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. /// Simpler CRF API implementation.
  8. /// Refer to libfj::robocraft::FactoryAPI for in-depth documentation.
  9. /// The only API difference is that this API is blocking (i.e. no async).
  10. /// This version also works with Wine and Proton since it does not rely on tokio.
  11. pub struct FactoryAPI {
  12. client: Agent,
  13. token: Box<dyn ITokenProvider>,
  14. }
  15. impl FactoryAPI {
  16. /// Create a new instance using `DefaultTokenProvider`.
  17. pub fn new() -> FactoryAPI {
  18. FactoryAPI {
  19. client: Agent::new(),
  20. token: Box::new(DefaultTokenProvider{}),
  21. }
  22. }
  23. /// List CRF robots
  24. pub fn list(&self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
  25. let url = Url::parse(FACTORY_DOMAIN)
  26. .unwrap()
  27. .join("/api/roboShopItems/list")
  28. .unwrap();
  29. let payload = ListPayload::default();
  30. let mut request_builder = self.client.post(url.as_str())
  31. .set("Content-Type", "application/json");
  32. if let Ok(token) = self.token.token() {
  33. request_builder = request_builder.set("Authorization", &("Web ".to_owned() + &token));
  34. }
  35. let result = request_builder.send_string(&to_string(&payload).unwrap());
  36. if let Ok(response) = result {
  37. let json_res = response.into_json::<FactoryInfo<RoboShopItemsInfo>>();
  38. if let Ok(json) = json_res {
  39. return Ok(json);
  40. }
  41. return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); // server returned malformed data
  42. }
  43. Err(result.err().unwrap())
  44. }
  45. /// Build a list query
  46. pub fn list_builder(&self) -> FactorySearchBuilder {
  47. let url = Url::parse(FACTORY_DOMAIN)
  48. .unwrap()
  49. .join("/api/roboShopItems/list")
  50. .unwrap();
  51. let mut token_opt = None;
  52. if let Ok(token) = self.token.token() {
  53. token_opt = Some(token);
  54. }
  55. let request_builder = self.client.post(url.as_str());
  56. FactorySearchBuilder::new(request_builder, token_opt)
  57. }
  58. /// Get complete information on a robot.
  59. pub fn get(&self, item_id: usize) -> Result<FactoryInfo<FactoryRobotGetInfo>, Error> {
  60. let url = Url::parse(FACTORY_DOMAIN)
  61. .unwrap()
  62. .join(&format!("/api/roboShopItems/get/{}", item_id))
  63. .unwrap();
  64. let mut request_builder = self.client.get(url.as_str());
  65. if let Ok(token) = self.token.token() {
  66. request_builder = request_builder.set("Authorization", &("Web ".to_owned() + &token));
  67. }
  68. let result = request_builder.call();
  69. if let Ok(response) = result {
  70. let json_res = response.into_json::<FactoryInfo<FactoryRobotGetInfo>>();
  71. if let Ok(json) = json_res {
  72. return Ok(json);
  73. }
  74. return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); // server returned malformed data
  75. }
  76. Err(result.err().unwrap())
  77. }
  78. }