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.

98 lines
3.7KB

  1. use std::sync::Mutex;
  2. use reqwest::{Client, Error};
  3. use url::{Url};
  4. use crate::robocraft2::{SearchPayload, SearchResponse, ITokenProvider};
  5. /// Community Factory Robot 2 root URL
  6. pub const FACTORY_DOMAIN: &str = "https://factory.production.robocraft2.com";
  7. /// CRF API implementation
  8. pub struct FactoryAPI {
  9. client: Client,
  10. token: Mutex<Box<dyn ITokenProvider>>,
  11. }
  12. impl FactoryAPI {
  13. /*/// Create a new instance, using `DefaultTokenProvider`.
  14. pub fn new() -> FactoryAPI {
  15. FactoryAPI {
  16. client: Client::new(),
  17. token: Box::new(DefaultTokenProvider{}),
  18. }
  19. }*/
  20. /// Create a new instance using the provided token provider.
  21. pub fn with_auth(token_provider: Box<dyn ITokenProvider>) -> FactoryAPI {
  22. FactoryAPI {
  23. client: Client::new(),
  24. token: Mutex::new(token_provider),
  25. }
  26. }
  27. /// Retrieve CRF robots on the main page.
  28. ///
  29. /// For searching, use `list_builder()` instead.
  30. pub async fn list(&self) -> Result<SearchResponse, Error> {
  31. self.search(SearchPayload::default()).await
  32. }
  33. pub async fn search(&self, params: SearchPayload) -> Result<SearchResponse, Error> {
  34. let mut url = Url::parse(FACTORY_DOMAIN)
  35. .unwrap()
  36. .join("/v1/foundry/search")
  37. .unwrap();
  38. if let Some(text) = &params.text {
  39. url.query_pairs_mut().append_pair("text", text);
  40. }
  41. if let Some(base_minimum_cpu) = params.base_minimum_cpu {
  42. url.query_pairs_mut().append_pair("baseCpuMinimum", &base_minimum_cpu.to_string());
  43. }
  44. if let Some(base_maximum_cpu) = &params.base_maximum_cpu {
  45. url.query_pairs_mut().append_pair("baseCpuMaximum", &base_maximum_cpu.to_string());
  46. }
  47. if let Some(x) = &params.weapon_minimum_cpu {
  48. url.query_pairs_mut().append_pair("weaponCpuMinimum", &x.to_string());
  49. }
  50. if let Some(x) = &params.weapon_maximum_cpu {
  51. url.query_pairs_mut().append_pair("weaponCpuMaximum", &x.to_string());
  52. }
  53. if let Some(x) = &params.cosmetic_minimum_cpu {
  54. url.query_pairs_mut().append_pair("cosmeticCpuMinimum", &x.to_string());
  55. }
  56. if let Some(x) = &params.cosmetic_maximum_cpu {
  57. url.query_pairs_mut().append_pair("cosmeticCpuMaximum", &x.to_string());
  58. }
  59. if let Some(x) = &params.cluster_minimum {
  60. url.query_pairs_mut().append_pair("clusterMinimum", &x.to_string());
  61. }
  62. if let Some(x) = &params.cluster_maximum {
  63. url.query_pairs_mut().append_pair("clusterMaximum", &x.to_string());
  64. }
  65. if let Some(x) = &params.date_minimum {
  66. url.query_pairs_mut().append_pair("dateMinimum", x);
  67. }
  68. if let Some(x) = &params.date_maximum {
  69. url.query_pairs_mut().append_pair("dateMaximum", x);
  70. }
  71. if let Some(x) = &params.creator_id {
  72. url.query_pairs_mut().append_pair("creatorId", x);
  73. }
  74. if let Some(x) = &params.page {
  75. url.query_pairs_mut().append_pair("page", &x.to_string());
  76. }
  77. if let Some(x) = &params.count {
  78. url.query_pairs_mut().append_pair("count", &x.to_string());
  79. }
  80. url.query_pairs_mut().append_pair("sortBy", &params.sort_by);
  81. url.query_pairs_mut().append_pair("orderBy", &params.order_by);
  82. let mut request_builder = self.client.get(url);
  83. if let Ok(token) = self.token.lock().unwrap().token().await {
  84. request_builder = request_builder.header("Authorization", "Bearer ".to_owned() + &token);
  85. }
  86. let result = request_builder.send().await?;
  87. result.json::<SearchResponse>().await
  88. }
  89. }