use super::{configuration, ContentType, Error};
use crate::{apis::ResponseContent, models};
use reqwest;
use serde::{de::Error as _, Deserialize, Serialize};
/// struct for typed errors of method [`get_assigned_permissions`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetAssignedPermissionsError {
Status401(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_beta`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetBetaError {
Status404(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_beta_registration`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetBetaRegistrationError {
Status401(models::Error),
Status404(models::BetaRegistrationNotFoundError),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_config`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetConfigError {
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_css`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetCssError {
Status400(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_current_online_users`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetCurrentOnlineUsersError {
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_frontend_branches`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetFrontendBranchesError {
Status401(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_health`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetHealthError {
Status401(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_info_push`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetInfoPushError {
Status400(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_java_script`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetJavaScriptError {
Status400(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_permission`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetPermissionError {
Status401(models::Error),
UnknownValue(serde_json::Value),
}
/// struct for typed errors of method [`get_system_time`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum GetSystemTimeError {
UnknownValue(serde_json::Value),
}
/// Returns a list of all permissions currently granted by the user. Permissions are assigned e.g. by subscribing to VRC+.
pub async fn get_assigned_permissions(
configuration: &configuration::Configuration,
) -> Result<Vec<models::Permission>, Error<GetAssignedPermissionsError>> {
let uri_str = format!("{}/auth/permissions", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_assigned_permissions returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `Vec<models::Permission>`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `Vec<models::Permission>`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_assigned_permissions returned: {content}");
}
let entity: Option<GetAssignedPermissionsError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Get a beta program and the fields a registration must supply.
pub async fn get_beta(
configuration: &configuration::Configuration,
beta_name: &str,
) -> Result<models::Beta, Error<GetBetaError>> {
// add a prefix to parameters to efficiently prevent name collisions
let p_path_beta_name = beta_name;
let uri_str = format!(
"{}/beta/{betaName}",
configuration.base_path,
betaName = crate::apis::urlencode(p_path_beta_name)
);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_beta returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::Beta`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::Beta`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_beta returned: {content}");
}
let entity: Option<GetBetaError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Get the currently authenticated user's registration for a beta program.
pub async fn get_beta_registration(
configuration: &configuration::Configuration,
beta_name: &str,
) -> Result<(), Error<GetBetaRegistrationError>> {
// add a prefix to parameters to efficiently prevent name collisions
let p_path_beta_name = beta_name;
let uri_str = format!(
"{}/beta/{betaName}/register",
configuration.base_path,
betaName = crate::apis::urlencode(p_path_beta_name)
);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
if !status.is_client_error() && !status.is_server_error() {
Ok(())
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_beta_registration returned: {content}");
}
let entity: Option<GetBetaRegistrationError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// API config contains configuration that the clients needs to work properly. Currently the most important value here is `clientApiKey` which is used for all other API endpoints.
pub async fn get_config(
configuration: &configuration::Configuration,
) -> Result<models::ApiConfig, Error<GetConfigError>> {
let uri_str = format!("{}/config", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_config returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::ApiConfig`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::ApiConfig`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_config returned: {content}");
}
let entity: Option<GetConfigError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Fetches the CSS code to the frontend React website.
pub async fn get_css(
configuration: &configuration::Configuration,
variant: Option<&str>,
branch: Option<&str>,
) -> Result<String, Error<GetCssError>> {
// add a prefix to parameters to efficiently prevent name collisions
let p_query_variant = variant;
let p_query_branch = branch;
let uri_str = format!("{}/css/app.css", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref param_value) = p_query_variant {
req_builder = req_builder.query(&[("variant", ¶m_value.to_string())]);
}
if let Some(ref param_value) = p_query_branch {
req_builder = req_builder.query(&[("branch", ¶m_value.to_string())]);
}
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_css returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `String`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `String`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_css returned: {content}");
}
let entity: Option<GetCssError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Returns the current number of online users. **NOTE:** The response type is not a JSON object, but a simple JSON integer.
pub async fn get_current_online_users(
configuration: &configuration::Configuration,
) -> Result<i32, Error<GetCurrentOnlineUsersError>> {
let uri_str = format!("{}/visits", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_current_online_users returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `i32`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `i32`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_current_online_users returned: {content}");
}
let entity: Option<GetCurrentOnlineUsersError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// List the frontend branches the currently authenticated user may switch to.
pub async fn get_frontend_branches(
configuration: &configuration::Configuration,
) -> Result<Vec<serde_json::Value>, Error<GetFrontendBranchesError>> {
let uri_str = format!("{}/frontend/branches", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_frontend_branches returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `Vec<serde_json::Value>`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `Vec<serde_json::Value>`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_frontend_branches returned: {content}");
}
let entity: Option<GetFrontendBranchesError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Gets the overall health status, the server name, and the current build version tag of the API. VRChat has restricted this endpoint, which now always returns 401 Unauthorized.
#[deprecated]
pub async fn get_health(
configuration: &configuration::Configuration,
) -> Result<models::ApiHealth, Error<GetHealthError>> {
let uri_str = format!("{}/health", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_health returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::ApiHealth`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::ApiHealth`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_health returned: {content}");
}
let entity: Option<GetHealthError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// IPS (Info Push System) is a system for VRChat to push out dynamic information to the client. This is primarily used by the Quick-Menu info banners, but can also be used to e.g. alert you to update your game to the latest version. `include` is used to query what Information Pushes should be included in the response. If include is missing or empty, then no notices will normally be returned. This is an \"any of\" search. `require` is used to limit what Information Pushes should be included in the response. This is usually used in combination with `include`, and is an \"all of\" search.
pub async fn get_info_push(
configuration: &configuration::Configuration,
require: Option<&str>,
include: Option<&str>,
) -> Result<Vec<models::InfoPush>, Error<GetInfoPushError>> {
// add a prefix to parameters to efficiently prevent name collisions
let p_query_require = require;
let p_query_include = include;
let uri_str = format!("{}/infoPush", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref param_value) = p_query_require {
req_builder = req_builder.query(&[("require", ¶m_value.to_string())]);
}
if let Some(ref param_value) = p_query_include {
req_builder = req_builder.query(&[("include", ¶m_value.to_string())]);
}
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_info_push returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `Vec<models::InfoPush>`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `Vec<models::InfoPush>`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_info_push returned: {content}");
}
let entity: Option<GetInfoPushError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Fetches the JavaScript code to the frontend React website.
pub async fn get_java_script(
configuration: &configuration::Configuration,
variant: Option<&str>,
branch: Option<&str>,
) -> Result<String, Error<GetJavaScriptError>> {
// add a prefix to parameters to efficiently prevent name collisions
let p_query_variant = variant;
let p_query_branch = branch;
let uri_str = format!("{}/js/app.js", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref param_value) = p_query_variant {
req_builder = req_builder.query(&[("variant", ¶m_value.to_string())]);
}
if let Some(ref param_value) = p_query_branch {
req_builder = req_builder.query(&[("branch", ¶m_value.to_string())]);
}
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_java_script returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `String`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `String`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_java_script returned: {content}");
}
let entity: Option<GetJavaScriptError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Returns a single permission. This endpoint is pretty useless, as it returns the exact same information as `/auth/permissions`.
pub async fn get_permission(
configuration: &configuration::Configuration,
permission_id: &str,
) -> Result<models::Permission, Error<GetPermissionError>> {
// add a prefix to parameters to efficiently prevent name collisions
let p_path_permission_id = permission_id;
let uri_str = format!(
"{}/permissions/{permissionId}",
configuration.base_path,
permissionId = crate::apis::urlencode(p_path_permission_id)
);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_permission returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `models::Permission`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `models::Permission`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_permission returned: {content}");
}
let entity: Option<GetPermissionError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}
/// Returns the current time of the API server. **NOTE:** The response type is not a JSON object, but a simple JSON string.
pub async fn get_system_time(
configuration: &configuration::Configuration,
) -> Result<chrono::DateTime<chrono::FixedOffset>, Error<GetSystemTimeError>> {
let uri_str = format!("{}/time", configuration.base_path);
let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
if let Some(ref user_agent) = configuration.user_agent {
req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
}
let req = req_builder.build()?;
let resp = configuration.client.execute(req).await?;
let status = resp.status();
let content_type = resp
.headers()
.get("content-type")
.and_then(|v| v.to_str().ok())
.unwrap_or("application/octet-stream");
let content_type = super::ContentType::from(content_type);
if !status.is_client_error() && !status.is_server_error() {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_system_time returned: {content}");
}
match content_type {
ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
ContentType::Text => return Err(Error::from(serde_json::Error::custom("Received `text/plain` content type response that cannot be converted to `chrono::DateTime<chrono::FixedOffset>`"))),
ContentType::Unsupported(unknown_type) => return Err(Error::from(serde_json::Error::custom(format!("Received `{unknown_type}` content type response that cannot be converted to `chrono::DateTime<chrono::FixedOffset>`")))),
}
} else {
let content = resp.text().await?;
if configuration.debug {
log::debug!("get_system_time returned: {content}");
}
let entity: Option<GetSystemTimeError> = serde_json::from_str(&content).ok();
Err(Error::ResponseError(ResponseContent {
status,
content,
entity,
}))
}
}