use crate::discord::ids::{
Id,
marker::{ChannelMarker, 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 current_user_joined_thread: Option<bool>,
pub recipients: Option<Vec<ChannelRecipientInfo>>,
pub permission_overwrites: Vec<PermissionOverwriteInfo>,
}
#[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)
}
}
#[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,
current_user_joined_thread: None,
recipients: None,
permission_overwrites: Vec::new(),
}
}
}
#[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,
}
}
}