An unofficial collection of APIs used in FreeJam games and mods
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

166 Zeilen
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. }