use super::{ChannelSubType, ChannelType, PrivateType, SpeakPermission};
use crate::models::serde_helpers::is_default;
use crate::models::{HasId, HasName, Snowflake};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct Channel {
#[serde(default)]
pub id: Snowflake,
#[serde(default)]
pub guild_id: Snowflake,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub name: String,
#[serde(default, rename = "type", skip_serializing_if = "is_default")]
pub channel_type: ChannelType,
#[serde(default, skip_serializing_if = "is_default")]
pub sub_type: ChannelSubType,
#[serde(default, skip_serializing_if = "is_default")]
pub position: i64,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub parent_id: Snowflake,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub owner_id: Snowflake,
#[serde(default, skip_serializing_if = "is_default")]
pub private_type: PrivateType,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub private_user_ids: Vec<String>,
#[serde(default, skip_serializing_if = "is_default")]
pub speak_permission: SpeakPermission,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub application_id: Snowflake,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub permissions: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub op_user_id: Snowflake,
}
impl Channel {
pub fn new() -> Self {
Self::default()
}
pub fn from_data(_api: crate::api::BotApi, id: String, data: serde_json::Value) -> Self {
let mut channel = serde_json::from_value::<Self>(data).unwrap_or_default();
channel.id = id;
channel
}
pub fn mention(&self) -> String {
format!("<#{}>", self.id)
}
pub fn is_text(&self) -> bool {
self.channel_type == ChannelType::Text
}
pub fn is_voice(&self) -> bool {
self.channel_type == ChannelType::Voice
}
pub fn is_group(&self) -> bool {
self.channel_type == ChannelType::Category
}
pub fn is_live(&self) -> bool {
self.channel_type == ChannelType::Live
}
pub fn is_application(&self) -> bool {
self.channel_type == ChannelType::Application
}
pub fn is_discussion(&self) -> bool {
self.channel_type == ChannelType::Forum
}
pub fn is_public(&self) -> bool {
self.private_type == PrivateType::Public
}
pub fn is_admin_only(&self) -> bool {
self.private_type == PrivateType::OnlyAdmin
}
pub fn is_specified_users_only(&self) -> bool {
self.private_type == PrivateType::AdminAndMember
}
pub fn everyone_can_speak(&self) -> bool {
self.speak_permission == SpeakPermission::Public
}
pub fn admin_only_speak(&self) -> bool {
self.speak_permission == SpeakPermission::AdminAndMember
}
pub fn display_name(&self) -> Option<&str> {
(!self.name.is_empty()).then_some(self.name.as_str())
}
}
impl HasId for Channel {
fn id(&self) -> Option<&Snowflake> {
(!self.id.is_empty()).then_some(&self.id)
}
}
impl HasName for Channel {
fn name(&self) -> &str {
&self.name
}
}