use crate::{presence::request_types::UserPresenceResponse, Client, RoboatError};
use serde::{Deserialize, Serialize};
mod request_types;
const REGISTER_PRESENCE_API: &str = "https://presence.roblox.com/v1/presence/register-app-presence";
const USER_PRESENCE_API: &str = "https://presence.roblox.com/v1/presence/users";
#[allow(missing_docs)]
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize)]
pub enum PresenceType {
#[default]
Offline,
Online,
InGame,
InStudio,
Invisible,
}
impl TryFrom<u8> for PresenceType {
type Error = RoboatError;
fn try_from(v: u8) -> Result<Self, Self::Error> {
match v {
0 => Ok(Self::Offline),
1 => Ok(Self::Online),
2 => Ok(Self::InGame),
3 => Ok(Self::InStudio),
4 => Ok(Self::Invisible),
_ => Err(RoboatError::MalformedResponse),
}
}
}
impl Client {
pub async fn register_presence(&self) -> Result<(), RoboatError> {
match self.register_presence_internal().await {
Ok(x) => Ok(x),
Err(e) => match e {
RoboatError::InvalidXcsrf(new_xcsrf) => {
self.set_xcsrf(new_xcsrf).await;
self.register_presence_internal().await
}
_ => Err(e),
},
}
}
pub async fn fetch_users_presence(
&self,
users: Vec<u64>,
) -> Result<UserPresenceResponse, RoboatError> {
match self.fetch_users_presence_internal(users).await {
Ok(x) => Ok(x),
Err(e) => Err(e),
}
}
}
mod internal {
use super::REGISTER_PRESENCE_API;
use crate::{
presence::{request_types::UserPresenceResponse, USER_PRESENCE_API},
Client, RoboatError, XCSRF_HEADER,
};
use reqwest::header;
impl Client {
pub(super) async fn register_presence_internal(&self) -> Result<(), RoboatError> {
let cookie = self.cookie_string()?;
let json = serde_json::json!({
"location": "Home",
});
let request_result = self
.reqwest_client
.post(REGISTER_PRESENCE_API)
.header(header::COOKIE, cookie)
.header(XCSRF_HEADER, self.xcsrf().await)
.json(&json)
.send()
.await;
let _ = Self::validate_request_result(request_result).await?;
Ok(())
}
pub(super) async fn fetch_users_presence_internal(
&self,
users: Vec<u64>,
) -> Result<UserPresenceResponse, RoboatError> {
let json = serde_json::json!({
"userIds": users,
});
let request = self
.cookie_string()
.map(|cookie| {
self.reqwest_client
.post(USER_PRESENCE_API)
.json(&json)
.header(header::COOKIE, cookie)
})
.unwrap_or_else(|_| self.reqwest_client.post(USER_PRESENCE_API).json(&json));
let request_result = request.send().await;
let response = Self::validate_request_result(request_result).await?;
let presense_json = Self::parse_to_raw::<UserPresenceResponse>(response).await?;
Ok(presense_json)
}
}
}