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.

166 lines
5.5KB

  1. use ureq::{Request, Response, Error};
  2. use crate::robocraft::{FactoryInfo, RoboShopItemsInfo, FactoryTextSearchType, FactoryWeaponType, FactoryMovementType, FactoryOrderType};
  3. use crate::robocraft::{ListPayload};
  4. /// Factory API list query builder.
  5. /// This is the simpler, blocking equivalent of libfj::robocraft::FactorySearchBuilder.
  6. /// Please refer to that struct's documentation for details.
  7. #[derive(Clone)]
  8. pub struct FactorySearchBuilder {
  9. reqwest_builder: Request,
  10. payload: ListPayload,
  11. token: Option<String>,
  12. }
  13. impl FactorySearchBuilder {
  14. pub(crate) fn new(request_builder: Request, token: Option<String>) -> FactorySearchBuilder {
  15. FactorySearchBuilder {
  16. reqwest_builder: request_builder.set("Content-Type", "application/json"),
  17. payload: ListPayload::empty(),
  18. token,
  19. }
  20. }
  21. /// Set page number
  22. pub fn page(mut self, page_number: isize) -> Self {
  23. self.payload.page = page_number;
  24. self
  25. }
  26. /// Set page size
  27. pub fn items_per_page(mut self, page_size: isize) -> Self {
  28. self.payload.page_size = page_size;
  29. self
  30. }
  31. /// Set results ordering
  32. pub fn order(mut self, order_type: FactoryOrderType) -> Self {
  33. self.payload.order = order_type as isize;
  34. self
  35. }
  36. /* // this appears to not do anything (removed to prevent confusion)
  37. // use text_search_type(FactoryTextSearchType::Player) instead
  38. pub fn players_only(mut self, p: bool) -> Self {
  39. self.payload.player_filter = p;
  40. self
  41. }
  42. */
  43. /// Override movement filter
  44. pub fn movement_raw(mut self, filter: String) -> Self {
  45. self.payload.movement_filter = filter.clone();
  46. self.payload.movement_category_filter = filter.clone();
  47. self
  48. }
  49. /// Add allowed movement type
  50. pub fn movement_or(mut self, movement_type: FactoryMovementType) -> Self {
  51. if self.payload.movement_filter == "" {
  52. self.payload.movement_filter = format!("{},{}", &self.payload.movement_filter, movement_type as isize);
  53. } else {
  54. self.payload.movement_filter = (movement_type as isize).to_string();
  55. }
  56. self.payload.movement_category_filter = self.payload.movement_filter.clone();
  57. self
  58. }
  59. /// Override weapon filter
  60. pub fn weapon_raw(mut self, filter: String) -> Self {
  61. self.payload.weapon_filter = filter.clone();
  62. self.payload.weapon_category_filter = filter.clone();
  63. self
  64. }
  65. /// Add allowed weapon type
  66. pub fn weapon_or(mut self, weapon_type: FactoryWeaponType) -> Self {
  67. if self.payload.weapon_filter == "" {
  68. self.payload.weapon_filter = format!("{},{}", &self.payload.weapon_filter, weapon_type as isize);
  69. } else {
  70. self.payload.weapon_filter = (weapon_type as isize).to_string();
  71. }
  72. self.payload.weapon_category_filter = self.payload.weapon_filter.clone();
  73. self
  74. }
  75. /// Set CPU value min and max
  76. pub fn cpu_range(mut self, min: isize, max: isize) -> Self {
  77. self.payload.minimum_cpu = min;
  78. self.payload.maximum_cpu = max;
  79. self
  80. }
  81. /// Set CPU minimum value
  82. pub fn min_cpu(mut self, min: isize) -> Self {
  83. self.payload.minimum_cpu = min;
  84. self
  85. }
  86. /// Set CPU maximum value
  87. pub fn max_cpu(mut self, max: isize) -> Self {
  88. self.payload.maximum_cpu = max;
  89. self
  90. }
  91. /// Removem minimum CPU limit
  92. pub fn no_minimum_cpu(mut self) -> Self {
  93. self.payload.minimum_cpu = -1;
  94. self
  95. }
  96. /// Remove maximum CPU limit
  97. pub fn no_maximum_cpu(mut self) -> Self {
  98. self.payload.maximum_cpu = -1;
  99. self
  100. }
  101. /// Set text filter
  102. pub fn text(mut self, t: String) -> Self {
  103. self.payload.text_filter = t;
  104. self
  105. }
  106. /// Set fields which text filter searches
  107. pub fn text_search_type(mut self, search_type: FactoryTextSearchType) -> Self {
  108. self.payload.text_search_field = search_type as isize;
  109. self
  110. }
  111. // setting buyable to false while using the default token provider will cause HTTP status 500 error
  112. /// Only search robots which can be bought by the current account?
  113. pub fn buyable(mut self, b: bool) -> Self {
  114. self.payload.buyable = b;
  115. self
  116. }
  117. /// Prepend a featured robot to the response?
  118. pub fn prepend_featured(mut self, b: bool) -> Self {
  119. self.payload.prepend_featured_robot = b;
  120. self
  121. }
  122. /// Retrieve default CRF page?
  123. pub fn default_page(mut self, b: bool) -> Self {
  124. self.payload.default_page = b;
  125. self
  126. }
  127. /// Execute list query
  128. pub fn send(mut self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
  129. self.reqwest_builder = self.reqwest_builder;
  130. if let Some(token) = self.token.clone() {
  131. self.reqwest_builder = self.reqwest_builder.set("Authorization", &("Web ".to_owned() + &token));
  132. }
  133. let result = self.reqwest_builder.send_string(&serde_json::to_string(&self.payload).unwrap());
  134. if let Ok(response) = result {
  135. let json_res = response.into_json::<FactoryInfo<RoboShopItemsInfo>>();
  136. if let Ok(json) = json_res {
  137. return Ok(json);
  138. }
  139. return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); // server returned malformed data
  140. }
  141. Err(result.err().unwrap())
  142. }
  143. }