use bitflags::bitflags;
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, hash::Hash};
use crate::models::{
attachment::Attachment,
permission::{OverrideField, Permission},
Id,
};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Role {
#[serde(skip_serializing_if = "Option::is_none")]
pub colour: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hoist: Option<bool>,
pub name: String,
pub permissions: OverrideField,
#[serde(skip_serializing_if = "Option::is_none")]
pub rank: Option<i64>,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub enum RoleFields {
Colour,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub enum ServerFields {
Banner,
Categories,
Description,
Icon,
SystemMessages,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct Category {
pub channels: Vec<Id>,
pub id: Id,
pub title: String,
}
#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
pub struct SystemMessageChannels {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_banned: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_joined: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_kicked: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_left: Option<Id>,
}
bitflags! {
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub struct ServerFlags: u32 {
const VerifiedServer = 1;
const OfficialServer = 2;
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Server {
#[serde(skip_serializing_if = "Option::is_none")]
pub analytics: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub banner: Option<Attachment>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub categories: Vec<Category>,
pub channels: Vec<Id>,
pub default_permissions: Permission,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub discoverable: Option<bool>,
pub flags: Option<ServerFlags>,
#[serde(rename = "_id")]
pub id: Id,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon: Option<Attachment>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub nsfw: Option<bool>,
pub owner: Id,
#[serde(default = "HashMap::<Id, Role>::new")]
pub roles: HashMap<Id, Role>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_messages: Option<SystemMessageChannels>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct ServerBan {
#[serde(rename = "_id")]
pub user: Id,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct ServerCreate {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
nsfw: Option<bool>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct ServerEdit {
#[serde(skip_serializing_if = "Option::is_none")]
analyrics: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
banner: Option<Attachment>,
#[serde(skip_serializing_if = "Option::is_none")]
categories: Option<Vec<Category>>,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
discoverable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
flags: Option<ServerFlags>,
#[serde(skip_serializing_if = "Option::is_none")]
icon: Option<Attachment>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
remove: Option<ServerFields>,
#[serde(skip_serializing_if = "Option::is_none")]
system_messages: Option<SystemMessageChannels>,
}