use chrono::{DateTime, FixedOffset};
use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::{
channel::Channel,
message::Emoji,
presence::Presence,
User,
voice::VoiceState,
};
use crate::snowflake::Snowflake;
pub use self::{
audit_log::*,
member::*,
role::*
};
mod role;
mod audit_log;
mod member;
#[derive(Deserialize, Debug, Serialize, Clone)]
pub struct Guild {
pub id: Snowflake,
pub name: String,
pub icon: Option<String>,
pub splash: Option<String>,
pub owner: Option<bool>,
pub owner_id: String,
#[serde(default)]
pub permissions: i32,
pub region: String,
pub afk_channel_id: Option<String>,
pub afk_timeout: Option<i32>,
#[serde(default)]
pub embed_enabled: bool,
#[serde(default)]
pub embed_channel_id: String,
#[serde(default)]
pub member_count: i32,
pub features: Vec<String>,
pub roles: Vec<Role>,
pub emojis: Vec<Emoji>,
pub explicit_content_filter: ExplicitContentFilter,
pub application_id: Option<String>,
pub verification_level: VerificationLevel,
pub mfa_level: MfaLevel,
pub system_channel_id: Option<String>,
#[serde(default)]
pub joined_at: String,
#[serde(default)]
pub large: bool,
#[serde(default)]
pub unavailable: bool,
#[serde(default)]
pub widget_enabled: bool,
#[serde(default)]
pub widget_channel_id: String,
pub default_message_notifications: DefaultMessageNotifications,
pub voice_states: Vec<VoiceState>,
#[serde(default)]
pub channels: Vec<Channel>,
#[serde(default)]
pub members: Vec<GuildMember>,
#[serde(default)]
pub presences: Option<Vec<Presence>>
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct UnavailableGuild {
pub id: Snowflake,
pub unavailable: bool
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GuildEmbed {
pub enabled: bool,
pub channel_id: Snowflake,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ModifyGuildEmbedOptions {
#[serde(skip_serializing_if = "Option::is_none")]
enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
channel_id: Option<Snowflake>,
}
impl ModifyGuildEmbedOptions {
pub fn enabled(mut self, opt: bool) -> Self {
self.enabled = Some(opt);
self
}
pub fn channel_id(mut self, id: Snowflake) -> Self {
self.channel_id = Some(id);
self
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ModifyGuildOptions {
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
verification_level: Option<VerificationLevel>,
#[serde(skip_serializing_if = "Option::is_none")]
default_message_notifications: Option<DefaultMessageNotifications>,
#[serde(skip_serializing_if = "Option::is_none")]
explicit_content_filter: Option<ExplicitContentFilter>,
#[serde(skip_serializing_if = "Option::is_none")]
afk_channel_id: Option<Snowflake>,
#[serde(skip_serializing_if = "Option::is_none")]
afk_timeout: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
icon: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
owner: Option<Snowflake>,
#[serde(skip_serializing_if = "Option::is_none")]
splash: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
system_channel_id: Option<Snowflake>,
}
impl ModifyGuildOptions {
pub fn name(mut self, name: &str) -> Self {
self.name = Some(name.to_string());
self
}
pub fn region(mut self, reg: &str) -> Self {
self.region = Some(reg.to_string());
self
}
pub fn verification_level(mut self, level: VerificationLevel) -> Self {
self.verification_level = Some(level);
self
}
pub fn default_message_notifications(mut self, level: DefaultMessageNotifications) -> Self {
self.default_message_notifications = Some(level);
self
}
pub fn explicit_content_filter(mut self, filter: ExplicitContentFilter) -> Self {
self.explicit_content_filter = Some(filter);
self
}
pub fn afk_channel(mut self, id: Snowflake) -> Self {
self.afk_channel_id = Some(id);
self
}
pub fn afk_timeout(mut self, timeout: i32) -> Self {
self.afk_timeout = Some(timeout);
self
}
pub fn icon(mut self, url: &str) -> Self {
self.icon = Some(url.to_string());
self
}
pub fn owner(mut self, id: Snowflake) -> Self {
self.owner = Some(id);
self
}
pub fn splash(mut self, url: &str) -> Self {
self.splash = Some(url.to_string());
self
}
pub fn system_channel(mut self, chan: Snowflake) -> Self {
self.system_channel_id = Some(chan);
self
}
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildPrune {
pub pruned: i32
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildIntegration {
pub id: Snowflake,
pub name: String,
#[serde(rename = "type")]
pub kind: String,
pub enabled: bool,
pub syncing: bool,
pub role_id: Snowflake,
pub expire_behavior: i32,
pub expire_grace_period: i32,
pub user: User,
pub account: IntegrationAccount,
pub synced_at: DateTime<FixedOffset>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct IntegrationAccount {
pub id: String,
pub name: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, Default)]
pub struct ModifyGuildIntegrationOptions {
#[serde(skip_serializing_if = "Option::is_none")]
expire_behavior: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
expire_grace_period: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
enable_emoticons: Option<bool>,
}
impl ModifyGuildIntegrationOptions {
pub fn expire_behavior(mut self, beh: i32) -> Self {
self.expire_behavior = Some(beh);
self
}
pub fn expire_grace_period(mut self, per: i32) -> Self {
self.expire_grace_period = Some(per);
self
}
pub fn enable_emoticons(mut self, opt: bool) -> Self {
self.enable_emoticons = Some(opt);
self
}
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct CreateGuildOptions {
#[serde(default)]
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
icon: Option<String>,
verification_level: Option<VerificationLevel>,
#[serde(skip_serializing_if = "Option::is_none")]
default_message_notifications: Option<DefaultMessageNotifications>,
#[serde(skip_serializing_if = "Option::is_none")]
explicit_content_filter: Option<ExplicitContentFilter>,
}
impl CreateGuildOptions {
pub fn name(mut self, name: &str) -> Self {
self.name = name.to_string();
self
}
pub fn voice_region(mut self, region: &str) -> Self {
self.region = Some(region.to_string());
self
}
pub fn icon(mut self, icon: String) -> Self {
self.icon = Some(icon);
self
}
pub fn verification_level(mut self, lvl: VerificationLevel) -> Self {
self.verification_level = Some(lvl);
self
}
pub fn default_message_notifications(mut self, notifs: DefaultMessageNotifications) -> Self {
self.default_message_notifications = Some(notifs);
self
}
pub fn explicit_content_filter(mut self, filter: ExplicitContentFilter) -> Self {
self.explicit_content_filter = Some(filter);
self
}
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildBan {
pub reason: Option<String>,
pub user: User,
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildBanAdd {
pub guild_id: Snowflake,
pub user: User
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildBanRemove {
pub guild_id: Snowflake,
pub user: User
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildEmojisUpdate {
pub guild_id: Snowflake,
pub emojis: Vec<Emoji>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildIntegrationsUpdate {
pub guild_id: Snowflake
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildMemberRemove {
pub guild_id: Snowflake,
pub user: User
}
#[derive(Deserialize, Clone, Debug)]
pub struct GuildMemberUpdate {
pub guild_id: Snowflake,
pub roles: Vec<String>,
pub user: User,
pub nick: String
}
#[derive(Deserialize, Debug, Clone)]
pub struct GuildMembersChunk {
pub guild_id: Snowflake,
pub members: Vec<GuildMember>
}
#[derive(Deserialize, Clone, Debug)]
pub struct GuildRoleCreate {
pub guild_id: Snowflake,
pub role: Role
}
#[derive(Deserialize, Clone, Debug)]
pub struct GuildRoleUpdate {
pub guild_id: String,
pub role: Role
}
#[derive(Deserialize, Clone, Debug)]
pub struct GuildRoleDelete {
pub guild_id: Snowflake,
pub role: Snowflake
}
#[derive(Deserialize_repr, Debug, Serialize_repr, Clone)]
#[repr(u8)]
pub enum ExplicitContentFilter {
Disabled,
MembersWithoutRoles,
AllMembers
}
#[derive(Deserialize_repr, Debug, Serialize_repr, Clone)]
#[repr(u8)]
pub enum MfaLevel {
None,
Elevated,
}
#[derive(Deserialize_repr, Debug, Serialize_repr, Clone)]
#[repr(u8)]
pub enum DefaultMessageNotifications {
AllMessages,
OnlyMentions
}
#[derive(Deserialize_repr, Debug, Clone, Serialize_repr)]
#[repr(u8)]
pub enum VerificationLevel {
None,
Low,
Medium,
High,
Insane
}