use super::{MessageAttachment, MessageMember, MessageReference, MessageScene, MessageUser};
use crate::models::{HasId, Snowflake, Timestamp};
use serde::{Deserialize, Serialize};
use crate::models::message::{Ark, Embed, MessageParams};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Message {
pub id: Option<Snowflake>,
pub content: Option<String>,
pub channel_id: Option<Snowflake>,
pub guild_id: Option<Snowflake>,
pub group_id: Option<Snowflake>,
pub author: Option<MessageUser>,
pub member: Option<MessageMember>,
pub message_reference: Option<MessageReference>,
#[serde(default)]
pub mentions: Vec<MessageUser>,
#[serde(default)]
pub attachments: Vec<MessageAttachment>,
#[serde(default)]
pub embeds: Vec<Embed>,
pub ark: Option<Ark>,
pub direct_message: Option<bool>,
pub seq: Option<u64>,
pub seq_in_channel: Option<String>,
pub timestamp: Option<Timestamp>,
pub edited_timestamp: Option<Timestamp>,
pub mention_everyone: Option<bool>,
pub src_guild_id: Option<Snowflake>,
pub file_info: Option<String>,
pub ttl: Option<u32>,
pub message_scene: Option<MessageScene>,
pub event_id: Option<String>,
}
impl Message {
pub fn new() -> Self {
Self {
id: None,
content: None,
channel_id: None,
guild_id: None,
group_id: None,
author: None,
member: None,
message_reference: None,
mentions: Vec::new(),
attachments: Vec::new(),
embeds: Vec::new(),
ark: None,
direct_message: None,
seq: None,
seq_in_channel: None,
timestamp: None,
edited_timestamp: None,
mention_everyone: None,
src_guild_id: None,
file_info: None,
ttl: None,
message_scene: None,
event_id: None,
}
}
pub fn from_data(_api: crate::api::BotApi, event_id: String, data: serde_json::Value) -> Self {
let mut message: Self = serde_json::from_value(data).unwrap_or_default();
message.event_id = Some(event_id);
message
}
pub async fn reply(
&self,
api: &crate::api::BotApi,
token: &crate::token::Token,
content: &str,
) -> Result<crate::models::api::MessageResponse, crate::error::BotError> {
if let (Some(channel_id), Some(msg_id)) = (&self.channel_id, &self.id) {
let params = MessageParams {
content: Some(content.to_string()),
msg_id: Some(msg_id.clone()),
event_id: self.event_id.clone(),
..Default::default()
};
api.post_message_with_params(token, channel_id, params)
.await
} else {
Err(crate::error::BotError::InvalidData(
"Missing channel_id or message_id for reply".to_string(),
))
}
}
pub fn has_content(&self) -> bool {
self.content.as_ref().is_some_and(|c| !c.is_empty())
}
pub fn has_attachments(&self) -> bool {
!self.attachments.is_empty()
}
pub fn has_mentions(&self) -> bool {
!self.mentions.is_empty()
}
pub fn is_from_bot(&self) -> bool {
self.author.as_ref().is_some_and(|a| a.bot.unwrap_or(false))
}
}
impl Default for Message {
fn default() -> Self {
Self::new()
}
}
impl HasId for Message {
fn id(&self) -> Option<&Snowflake> {
self.id.as_ref()
}
}