use chrono::{DateTime, FixedOffset};
use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::guild::GuildMember;
use crate::snowflake::Snowflake;
use crate::User;
pub use self::embed::*;
pub use self::emoji::*;
pub use self::webhook::*;
mod embed;
mod webhook;
mod emoji;
pub trait MessageResponse {
fn as_message(self) -> CreateMessageOptions;
}
impl MessageResponse for &str {
fn as_message(self) -> CreateMessageOptions {
CreateMessageOptions::default().content(self)
}
}
impl MessageResponse for &String {
fn as_message(self) -> CreateMessageOptions {
CreateMessageOptions::default().content(self.clone())
}
}
impl MessageResponse for CreateMessageOptions {
fn as_message(self) -> CreateMessageOptions {
self
}
}
impl MessageResponse for String {
fn as_message(self) -> CreateMessageOptions {
CreateMessageOptions::default().content(self)
}
}
impl MessageResponse for Embed {
fn as_message(self) -> CreateMessageOptions {
CreateMessageOptions::default().embed(self)
}
}
impl MessageResponse for EditMessage {
fn as_message(self) -> CreateMessageOptions {
let mut m = CreateMessageOptions::default();
m = m.content(self.content.unwrap_or_default());
if let Some(e) = self.embed {
m.embed(e)
} else {
m
}
}
}
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct Message {
pub id: Snowflake,
pub channel_id: Snowflake,
#[serde(default)]
pub guild_id: Option<Snowflake>,
pub author: User,
pub content: String,
#[serde(default)]
pub member: Option<GuildMember>,
pub timestamp: DateTime<FixedOffset>,
pub edited_timestamp: Option<DateTime<FixedOffset>>,
pub tts: bool,
pub mention_everyone: bool,
pub mention_roles: Vec<Snowflake>,
pub attachments: Vec<MessageAttachment>,
pub embeds: Vec<Embed>,
#[serde(default)]
pub reactions: Vec<MessageReaction>,
#[serde(default)]
pub nonce: Option<Snowflake>,
pub pinned: bool,
#[serde(default)]
pub webhook_id: Option<Snowflake>,
#[serde(rename = "type")]
pub kind: MessageType,
#[serde(default)]
pub activity: Option<MessageActivity>,
#[serde(default)]
pub application: Option<MessageApplication>,
}
#[derive(Serialize, Debug, Default)]
pub struct CreateMessageOptions {
#[serde(skip_serializing_if = "Option::is_none")]
content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
embed: Option<Embed>,
tts: Option<bool>,
#[serde(skip_serializing)]
pub file: Option<(String, Vec<u8>)>
}
impl CreateMessageOptions {
pub fn new() -> Self {
CreateMessageOptions {
content: None,
embed: None,
tts: None,
file: None
}
}
pub fn content(mut self, content: impl ToString) -> Self {
self.content = Some(content.to_string());
self
}
pub fn embed(mut self, embed: Embed) -> Self {
self.embed = Some(embed);
self
}
pub fn file(mut self, name: &str, file: Vec<u8>) -> Self {
self.file = Some((name.to_string(), file));
self
}
pub fn tts(mut self, opt: bool) -> Self {
self.tts = Some(opt);
self
}
}
#[derive(Serialize, Clone, Debug, Default)]
pub struct EditMessage {
#[serde(skip_serializing_if = "Option::is_none")]
content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
embed: Option<Embed>
}
impl EditMessage {
pub fn new() -> EditMessage {
EditMessage {
content: None,
embed: None
}
}
pub fn with_content(mut self, content: impl Into<String>) -> Self {
self.content = Some(content.into());
self
}
pub fn with_embed(mut self, embed: Embed) -> Self {
self.embed = Some(embed);
self
}
}
#[derive(Serialize, Clone, Debug)]
pub struct ChannelMessagesQuery {
#[serde(skip_serializing_if = "Option::is_none")]
around: Option<Snowflake>,
#[serde(skip_serializing_if = "Option::is_none")]
before: Option<Snowflake>,
#[serde(skip_serializing_if = "Option::is_none")]
after: Option<Snowflake>,
limit: i32
}
impl ChannelMessagesQuery {
pub fn new() -> ChannelMessagesQuery {
ChannelMessagesQuery {
around: None,
before: None,
after: None,
limit: 50
}
}
pub fn around(mut self, id: u64) -> Self {
if self.after.is_some() || self.before.is_some() {
return self;
};
self.around = Some(id.into());
self
}
pub fn before(mut self, id: u64) -> Self {
if self.around.is_some() || self.after.is_some() {
return self;
};
self.before = Some(id.into());
self
}
pub fn after(mut self, id: u64) -> Self {
if self.around.is_some() || self.before.is_some() {
return self;
};
self.after = Some(id.into());
self
}
}
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct MessageAttachment {
pub id: Snowflake,
pub filename: String,
pub size: i32,
pub url: String,
pub proxy_url: String,
pub height: Option<i32>,
pub width: Option<i32>
}
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
pub struct MessageActivity {
#[serde(rename = "type")]
pub kind: MessageActivityType,
#[serde(default)]
pub party_id: String
}
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
pub struct MessageApplication {
pub id: Snowflake,
pub cover_image: String,
pub description: String,
pub icon: String,
pub name: String
}
#[derive(Deserialize_repr, Debug, Clone, Serialize_repr)]
#[repr(u8)]
pub enum MessageType {
Default,
RecipientAdd,
RecipientRemove,
Call,
ChannelNameChange,
ChannelIconChange,
ChannelPinnedMessage,
GuildMemberJoin
}
impl Default for MessageType {
fn default() -> Self {
MessageType::Default
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub enum MessageActivityType {
Join = 1,
Spectate,
Listen = 3,
JoinRequest = 5
}
impl Default for MessageActivityType {
fn default() -> Self {
MessageActivityType::Join
}
}