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.

192 lines
5.3KB

  1. use reqwest::{RequestBuilder, Error};
  2. use num_enum::{TryFromPrimitive};
  3. use crate::robocraft::{FactoryInfo, RoboShopItemsInfo};
  4. use crate::robocraft::factory_json::ListPayload;
  5. #[derive(Eq, PartialEq, TryFromPrimitive)]
  6. #[repr(u8)]
  7. pub enum FactoryOrderType {
  8. Suggested = 0,
  9. CombatRating = 1,
  10. CosmeticRating = 2,
  11. Added = 3,
  12. CPU = 4,
  13. MostBought = 5,
  14. }
  15. #[derive(Eq, PartialEq, TryFromPrimitive)]
  16. #[repr(u32)]
  17. pub enum FactoryMovementType {
  18. Wheels = 100000,
  19. Hovers = 200000,
  20. Aerofoils=300000,
  21. Thrusters=400000,
  22. Rudders=500000,
  23. InsectLegs=600000,
  24. MechLegs=700000,
  25. Skis=800000,
  26. TankTreads=900000,
  27. Rotors=1000000,
  28. Sprinters=1100000,
  29. Propellers=1200000
  30. }
  31. #[derive(Eq, PartialEq, TryFromPrimitive)]
  32. #[repr(u32)]
  33. pub enum FactoryWeaponType {
  34. Laser=10000000,
  35. PlasmaLauncher=20000000,
  36. GyroMortar=25000000,
  37. RailCannon=30000000,
  38. NanoDisruptor=40000000,
  39. TeslaBlade=50000000,
  40. AeroflakCannon=60000000,
  41. IonCannon=65000000,
  42. ProtoSeeker=70100000,
  43. ChainShredder=75000000,
  44. }
  45. #[derive(Eq, PartialEq, TryFromPrimitive)]
  46. #[repr(u8)]
  47. pub enum FactoryTextSearchType {
  48. All=0,
  49. Player=1,
  50. Name=2,
  51. }
  52. pub struct FactorySearchBuilder {
  53. reqwest_builder: RequestBuilder,
  54. payload: ListPayload,
  55. token: Option<String>,
  56. }
  57. impl FactorySearchBuilder {
  58. pub(crate) fn new(request_builder: RequestBuilder, token: Option<String>) -> FactorySearchBuilder {
  59. FactorySearchBuilder {
  60. reqwest_builder: request_builder,
  61. payload: ListPayload::empty(),
  62. token,
  63. }
  64. }
  65. pub fn page(mut self, page_number: isize) -> Self {
  66. self.payload.page = page_number;
  67. self
  68. }
  69. pub fn items_per_page(mut self, page_size: isize) -> Self {
  70. self.payload.page_size = page_size;
  71. self
  72. }
  73. pub fn order(mut self, order_type: FactoryOrderType) -> Self {
  74. self.payload.order = order_type as isize;
  75. self
  76. }
  77. /* // this appears to not do anything (removed to prevent confusion)
  78. // use text_search_type(FactoryTextSearchType::Player) instead
  79. pub fn players_only(mut self, p: bool) -> Self {
  80. self.payload.player_filter = p;
  81. self
  82. }
  83. */
  84. pub fn movement_or(mut self, movement_type: FactoryMovementType) -> Self {
  85. if self.payload.movement_filter == "" {
  86. self.payload.movement_filter = format!("{},{}", &self.payload.movement_filter, movement_type as isize);
  87. } else {
  88. self.payload.movement_filter = (movement_type as isize).to_string();
  89. }
  90. self.payload.movement_category_filter = self.payload.movement_filter.clone();
  91. self
  92. }
  93. pub fn movement_raw(mut self, filter: String) -> Self {
  94. self.payload.movement_filter = filter.clone();
  95. self.payload.movement_category_filter = filter.clone();
  96. self
  97. }
  98. pub fn weapon_or(mut self, weapon_type: FactoryWeaponType) -> Self {
  99. if self.payload.weapon_filter == "" {
  100. self.payload.weapon_filter = format!("{},{}", &self.payload.weapon_filter, weapon_type as isize);
  101. } else {
  102. self.payload.weapon_filter = (weapon_type as isize).to_string();
  103. }
  104. self.payload.weapon_category_filter = self.payload.weapon_filter.clone();
  105. self
  106. }
  107. pub fn weapon_raw(mut self, filter: String) -> Self {
  108. self.payload.weapon_filter = filter.clone();
  109. self.payload.weapon_category_filter = filter.clone();
  110. self
  111. }
  112. pub fn cpu_range(mut self, min: isize, max: isize) -> Self {
  113. self.payload.minimum_cpu = min;
  114. self.payload.maximum_cpu = max;
  115. self
  116. }
  117. pub fn min_cpu(mut self, min: isize) -> Self {
  118. self.payload.minimum_cpu = min;
  119. self
  120. }
  121. pub fn max_cpu(mut self, max: isize) -> Self {
  122. self.payload.maximum_cpu = max;
  123. self
  124. }
  125. pub fn no_minimum_cpu(mut self) -> Self {
  126. self.payload.minimum_cpu = -1;
  127. self
  128. }
  129. pub fn no_maximum_cpu(mut self) -> Self {
  130. self.payload.maximum_cpu = -1;
  131. self
  132. }
  133. pub fn text(mut self, t: String) -> Self {
  134. self.payload.text_filter = t;
  135. self
  136. }
  137. pub fn text_search_type(mut self, search_type: FactoryTextSearchType) -> Self {
  138. self.payload.text_search_field = search_type as isize;
  139. self
  140. }
  141. // setting buyable to false while using the default token provider will cause HTTP status 500 error
  142. pub fn buyable(mut self, b: bool) -> Self {
  143. self.payload.buyable = b;
  144. self
  145. }
  146. pub fn prepend_featured(mut self, b: bool) -> Self {
  147. self.payload.prepend_featured_robot = b;
  148. self
  149. }
  150. pub fn default_page(mut self, b: bool) -> Self {
  151. self.payload.default_page = b;
  152. self
  153. }
  154. pub async fn send(mut self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
  155. self.reqwest_builder = self.reqwest_builder.json(&self.payload);
  156. if let Some(token) = self.token.clone() {
  157. self.reqwest_builder = self.reqwest_builder.header("Authorization", "Web ".to_owned() + &token);
  158. }
  159. let result = self.reqwest_builder.send().await;
  160. if let Ok(response) = result {
  161. return response.json::<FactoryInfo<RoboShopItemsInfo>>().await;
  162. }
  163. Err(result.err().unwrap())
  164. }
  165. }