use crate::discord::ids::{
Id,
marker::{ChannelMarker, EmojiMarker, ForumTagMarker, GuildMarker, MessageMarker, UserMarker},
};
use crate::discord::PresenceStatus;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ChannelInfo {
pub guild_id: Option<Id<GuildMarker>>,
pub channel_id: Id<ChannelMarker>,
pub parent_id: Option<Id<ChannelMarker>>,
pub owner_id: Option<Id<UserMarker>>,
pub position: Option<i32>,
pub last_message_id: Option<Id<MessageMarker>>,
pub name: String,
pub kind: String,
pub message_count: Option<u64>,
pub member_count: Option<u64>,
pub total_message_sent: Option<u64>,
pub thread_metadata: Option<ThreadMetadataInfo>,
pub flags: Option<u64>,
pub rate_limit_per_user: Option<u64>,
pub available_tags: Vec<ForumTagInfo>,
pub applied_tags: Vec<Id<ForumTagMarker>>,
pub current_user_joined_thread: Option<bool>,
pub recipients: Option<Vec<ChannelRecipientInfo>>,
pub permission_overwrites: Vec<PermissionOverwriteInfo>,
pub is_message_request: Option<bool>,
pub is_spam: Option<bool>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ForumTagInfo {
pub id: Id<ForumTagMarker>,
pub name: String,
pub moderated: bool,
pub emoji_id: Option<Id<EmojiMarker>>,
pub emoji_name: Option<String>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ThreadMetadataInfo {
pub archived: bool,
pub auto_archive_duration: Option<u64>,
pub archive_timestamp: Option<String>,
pub locked: bool,
pub invitable: Option<bool>,
pub create_timestamp: Option<String>,
}
impl ChannelInfo {
pub fn thread_archived(&self) -> Option<bool> {
self.thread_metadata
.as_ref()
.map(|metadata| metadata.archived)
}
pub fn thread_locked(&self) -> Option<bool> {
self.thread_metadata
.as_ref()
.map(|metadata| metadata.locked)
}
pub fn thread_pinned(&self) -> Option<bool> {
self.flags.map(|flags| flags & (1 << 1) != 0)
}
pub fn requires_forum_tag(&self) -> bool {
const REQUIRE_TAG: u64 = 1 << 4;
self.flags
.is_some_and(|flags| flags & REQUIRE_TAG == REQUIRE_TAG)
}
}
#[cfg(test)]
impl ChannelInfo {
pub(crate) fn test(channel_id: Id<ChannelMarker>, kind: impl Into<String>) -> Self {
Self {
guild_id: None,
channel_id,
parent_id: None,
owner_id: None,
position: None,
last_message_id: None,
name: String::new(),
kind: kind.into(),
message_count: None,
member_count: None,
total_message_sent: None,
thread_metadata: None,
flags: None,
rate_limit_per_user: None,
available_tags: Vec::new(),
applied_tags: Vec::new(),
current_user_joined_thread: None,
recipients: None,
permission_overwrites: Vec::new(),
is_message_request: None,
is_spam: None,
}
}
}
#[cfg(test)]
impl ThreadMetadataInfo {
pub(crate) fn test(archived: bool, locked: bool) -> Self {
Self {
archived,
auto_archive_duration: None,
archive_timestamp: None,
locked,
invitable: None,
create_timestamp: None,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum PermissionOverwriteKind {
Role,
Member,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PermissionOverwriteInfo {
pub id: u64,
pub kind: PermissionOverwriteKind,
pub allow: u64,
pub deny: u64,
}
#[cfg(test)]
#[allow(dead_code)]
impl PermissionOverwriteInfo {
pub(crate) fn test(id: u64, kind: PermissionOverwriteKind) -> Self {
Self {
id,
kind,
allow: 0,
deny: 0,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ChannelRecipientInfo {
pub user_id: Id<UserMarker>,
pub display_name: String,
pub username: Option<String>,
pub is_bot: bool,
pub avatar_url: Option<String>,
pub status: Option<PresenceStatus>,
}
#[cfg(test)]
#[allow(dead_code)]
impl ChannelRecipientInfo {
pub(crate) fn test(user_id: Id<UserMarker>, display_name: impl Into<String>) -> Self {
Self {
user_id,
display_name: display_name.into(),
username: None,
is_bot: false,
avatar_url: None,
status: None,
}
}
}