Remove limited argument from Instance

This commit is contained in:
bitfl0wer 2023-12-03 21:44:08 +01:00
parent bd1793fdb1
commit 39f7aa2a7a
1 changed files with 32 additions and 12 deletions

View File

@ -12,7 +12,9 @@ use crate::errors::ChorusResult;
use crate::gateway::{Gateway, GatewayHandle}; use crate::gateway::{Gateway, GatewayHandle};
use crate::ratelimiter::ChorusRequest; use crate::ratelimiter::ChorusRequest;
use crate::types::types::subconfigs::limits::rates::RateLimits; use crate::types::types::subconfigs::limits::rates::RateLimits;
use crate::types::{GeneralConfiguration, Limit, LimitType, User, UserSettings}; use crate::types::{
GeneralConfiguration, Limit, LimitType, LimitsConfiguration, User, UserSettings,
};
use crate::UrlBundle; use crate::UrlBundle;
#[derive(Debug, Clone, Default, Serialize, Deserialize)] #[derive(Debug, Clone, Default, Serialize, Deserialize)]
@ -71,23 +73,24 @@ impl PartialEq for LimitsInformation {
impl Instance { impl Instance {
/// Creates a new [`Instance`] from the [relevant instance urls](UrlBundle), where `limited` is whether Chorus will track and enforce rate limits for this instance. /// Creates a new [`Instance`] from the [relevant instance urls](UrlBundle), where `limited` is whether Chorus will track and enforce rate limits for this instance.
pub async fn new(urls: UrlBundle, limited: bool) -> ChorusResult<Instance> { pub async fn new(urls: UrlBundle) -> ChorusResult<Instance> {
let limits_information; let is_limited: Option<LimitsConfiguration> = Instance::is_limited(&urls.api).await?;
if limited { let limit_information;
let limits_configuration = ChorusRequest::get_limits_config(&urls.api).await?.rate;
let limits = ChorusRequest::limits_config_to_hashmap(&limits_configuration); if let Some(limits_configuration) = is_limited {
limits_information = Some(LimitsInformation { let limits = ChorusRequest::limits_config_to_hashmap(&limits_configuration.rate);
limit_information = Some(LimitsInformation {
ratelimits: limits, ratelimits: limits,
configuration: limits_configuration, configuration: limits_configuration.rate,
}); });
} else { } else {
limits_information = None; limit_information = None
} }
let mut instance = Instance { let mut instance = Instance {
urls: urls.clone(), urls: urls.clone(),
// Will be overwritten in the next step // Will be overwritten in the next step
instance_info: GeneralConfiguration::default(), instance_info: GeneralConfiguration::default(),
limits_information, limits_information: limit_information,
client: Client::new(), client: Client::new(),
}; };
instance.instance_info = match instance.general_configuration_schema().await { instance.instance_info = match instance.general_configuration_schema().await {
@ -111,9 +114,26 @@ impl Instance {
/// Shorthand for `Instance::new(UrlBundle::from_root_domain(root_domain).await?)`. /// Shorthand for `Instance::new(UrlBundle::from_root_domain(root_domain).await?)`.
/// ///
/// If `limited` is `true`, then Chorus will track and enforce rate limits for this instance. /// If `limited` is `true`, then Chorus will track and enforce rate limits for this instance.
pub async fn from_root_url(root_url: &str, limited: bool) -> ChorusResult<Instance> { pub async fn from_root_url(root_url: &str) -> ChorusResult<Instance> {
let urls = UrlBundle::from_root_url(root_url).await?; let urls = UrlBundle::from_root_url(root_url).await?;
Instance::new(urls, limited).await Instance::new(urls).await
}
pub async fn is_limited(api_url: &str) -> ChorusResult<Option<LimitsConfiguration>> {
let api_url = UrlBundle::parse_url(api_url.to_string());
let client = Client::new();
let request = client
.get(format!("{}/policies/instance/limits", &api_url))
.header(http::header::ACCEPT, "application/json")
.build()?;
let resp = match client.execute(request).await {
Ok(response) => response,
Err(_) => return Ok(None),
};
match resp.json::<LimitsConfiguration>().await {
Ok(limits) => Ok(Some(limits)),
Err(_) => Ok(None),
}
} }
} }