use chrono::{DateTime, FixedOffset};
use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::{Snowflake, User};
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct Channel {
pub id: Snowflake,
#[serde(rename = "type")]
pub kind: Option<ChannelType>,
#[serde(default)]
pub guild_id: Option<Snowflake>,
#[serde(default)]
pub position: Option<i32>,
#[serde(default)]
pub permission_overwrites: Option<Vec<PermissionOverwrites>>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub topic: Option<String>,
#[serde(default)]
pub nsfw: Option<bool>,
#[serde(default)]
pub last_message_id: Option<Snowflake>,
#[serde(default)]
pub bitrate: Option<i32>,
#[serde(default)]
pub user_limit: Option<i32>,
#[serde(default)]
pub rate_limit_per_user: Option<i32>,
#[serde(default)]
pub recipients: Option<Vec<User>>,
#[serde(default)]
pub icon: Option<String>,
#[serde(default)]
pub owner_id: Option<Snowflake>,
#[serde(default)]
pub application_id: Option<Snowflake>,
#[serde(default)]
pub parent_id: Option<Snowflake>,
#[serde(default)]
pub last_pin_timestamp: Option<DateTime<FixedOffset>>
}
impl ToString for Channel {
fn to_string(&self) -> String {
format!("<#{}>", self.id.0)
}
}
#[derive(Serialize, Clone, Debug, Default)]
pub struct CreateChannelOptions {
name: String,
#[serde(rename = "type")]
kind: Option<ChannelType>,
#[serde(skip_serializing_if = "Option::is_none")]
position: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
topic: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
nsfw: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
rate_limit_per_user: Option<i8>,
#[serde(skip_serializing_if = "Option::is_none")]
bitrate: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
user_limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
permission_overwrites: Option<Vec<PermissionOverwrites>>,
#[serde(skip_serializing_if = "Option::is_none")]
parent_id: Option<Snowflake>,
}
#[derive(Serialize, Clone, Debug, Default)]
pub struct ModifyChannelOptions {
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
position: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
topic: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
nsfw: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
rate_limit_per_user: Option<i8>,
#[serde(skip_serializing_if = "Option::is_none")]
bitrate: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
user_limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
parent_id: Option<Snowflake>
}
impl ModifyChannelOptions {
pub fn new() -> Self {
ModifyChannelOptions::default()
}
pub fn name(mut self, new_name: &str) -> Self {
self.name = Some(new_name.to_string());
self
}
pub fn set_position(mut self, pos: i32) -> Self {
self.position = Some(pos);
self
}
pub fn topic(mut self, top: &str) -> Self {
self.topic = Some(top.to_string());
self
}
pub fn nsfw(mut self, opt: bool) -> Self {
self.nsfw = Some(opt);
self
}
pub fn rate_limit_per_user(mut self, secs: i8) -> Self {
self.rate_limit_per_user = Some(secs);
self
}
pub fn user_limit(mut self, limit: i32) -> Self {
self.user_limit = Some(limit);
self
}
pub fn parent_id(mut self, id: u64) -> Self {
self.parent_id = Some(id.into());
self
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct PermissionOverwrites {
pub id: Snowflake,
#[serde(rename = "type")]
pub kind: String,
pub allow: i32,
pub deny: i32
}
#[derive(Serialize_repr, Deserialize_repr, Debug, Clone)]
#[repr(u8)]
pub enum ChannelType {
Text,
DM,
Voice,
GroupDM,
Category,
News,
Store
}