use crate::{Client, RoboatError};
use reqwest::header;
use serde::{Deserialize, Serialize};
mod request_types;
const PRIVATE_MESSAGES_API: &str =
"https://privatemessages.roblox.com/v1/messages?messageTab={message_tab_type}&pageNumber={page_number}&pageSize=20";
#[allow(missing_docs)]
#[derive(
Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize, Copy,
)]
pub enum MessageTabType {
#[default]
Inbox,
Sent,
Archive,
}
impl std::fmt::Display for MessageTabType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Inbox => write!(f, "inbox"),
Self::Sent => write!(f, "sent"),
Self::Archive => write!(f, "archive"),
}
}
}
#[allow(missing_docs)]
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize)]
pub struct Message {
pub message_id: u64,
pub sender_id: u64,
pub sender_username: String,
pub sender_display_name: String,
pub receiver_id: u64,
pub receiver_username: String,
pub receiver_display_name: String,
pub subject: String,
pub body: String,
pub created: String,
pub is_read: bool,
pub is_system_message: bool,
}
#[derive(
Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize, Copy,
)]
pub struct MessagesMetadata {
pub total_message_count: u64,
pub total_pages: u64,
}
impl Client {
pub async fn messages(
&self,
page: u64,
message_tab_type: MessageTabType,
) -> Result<(Vec<Message>, MessagesMetadata), RoboatError> {
let cookie_string = self.cookie_string()?;
let url = PRIVATE_MESSAGES_API
.replace("{message_tab_type}", message_tab_type.to_string().as_str())
.replace("{page_number}", page.to_string().as_str());
let request_result = self
.reqwest_client
.get(&url)
.header(header::COOKIE, cookie_string)
.send()
.await;
let response = Self::validate_request_result(request_result).await?;
let raw = Self::parse_to_raw::<request_types::MessagesResponse>(response).await?;
let messages = raw
.collection
.into_iter()
.map(|message| Message {
message_id: message.id as u64,
sender_id: message.sender.id as u64,
sender_username: message.sender.name,
sender_display_name: message.sender.display_name,
receiver_id: message.recipient.id as u64,
receiver_username: message.recipient.name,
receiver_display_name: message.recipient.display_name,
subject: message.subject,
body: message.body,
created: message.created,
is_read: message.is_read,
is_system_message: message.is_system_message,
})
.collect();
let metadata = MessagesMetadata {
total_message_count: raw.total_collection_size as u64,
total_pages: raw.total_pages as u64,
};
Ok((messages, metadata))
}
}