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.

171 lines
4.7KB

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