use crate::api::BotApi;
use crate::models::Snowflake;
use serde::Serialize;
use serde_json::Value;
use super::{Emoji, MessageReaction, ReactionTarget, ReactionTargetType};
#[derive(Debug, Clone, Serialize)]
pub struct Reaction {
#[serde(skip)]
api: BotApi,
pub user_id: Snowflake,
pub channel_id: Snowflake,
pub guild_id: Snowflake,
pub emoji: Emoji,
pub target: ReactionTarget,
pub event_id: Option<String>,
}
impl Reaction {
pub fn new(api: BotApi, event_id: Option<String>, data: &Value) -> crate::Result<Self> {
let message_reaction = serde_json::from_value(data.clone())?;
Ok(Self::from_message_reaction(api, event_id, message_reaction))
}
pub fn from_message_reaction(
api: BotApi,
event_id: Option<String>,
message_reaction: MessageReaction,
) -> Self {
Self {
api,
event_id,
user_id: message_reaction.user_id,
channel_id: message_reaction.channel_id,
guild_id: message_reaction.guild_id,
emoji: message_reaction.emoji,
target: message_reaction.target,
}
}
pub fn api(&self) -> &BotApi {
&self.api
}
pub fn is_message_reaction(&self) -> bool {
self.target.target_type == ReactionTargetType::Message
}
pub fn is_post_reaction(&self) -> bool {
self.target.target_type == ReactionTargetType::Post
}
pub fn is_comment_reaction(&self) -> bool {
self.target.target_type == ReactionTargetType::Comment
}
pub fn is_reply_reaction(&self) -> bool {
self.target.target_type == ReactionTargetType::Reply
}
pub fn target_id(&self) -> &str {
&self.target.id
}
pub fn emoji_id(&self) -> &str {
&self.emoji.id
}
}
impl std::fmt::Display for Reaction {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Reaction {{ user_id: {}, channel_id: {}, guild_id: {}, target_type: {:?}, event_id: {:?} }}",
self.user_id, self.channel_id, self.guild_id, self.target.target_type, self.event_id
)
}
}