titanium_model/
channel.rs

1use crate::snowflake::Snowflake;
2use crate::thread::{DefaultReaction, ForumTag, ThreadMember, ThreadMetadata};
3use crate::user::User;
4use crate::TitanString;
5use serde::{Deserialize, Serialize};
6
7/// Discord Channel representation.
8#[derive(Debug, Clone, Deserialize, Serialize)]
9pub struct Channel<'a> {
10    /// Channel ID.
11    pub id: Snowflake,
12    /// Channel type.
13    #[serde(rename = "type")]
14    pub channel_type: u8,
15    /// Guild ID (if in a guild).
16    #[serde(default)]
17    pub guild_id: Option<Snowflake>,
18    /// Sorting position.
19    #[serde(default)]
20    pub position: Option<i32>,
21    /// Permission overwrites.
22    #[serde(default)]
23    pub permission_overwrites: Vec<PermissionOverwrite>,
24    /// Channel name (1-100 characters).
25    #[serde(default)]
26    pub name: Option<TitanString<'a>>,
27    /// Channel topic (0-4096 characters for forum, 0-1024 for others).
28    #[serde(default)]
29    pub topic: Option<TitanString<'a>>,
30    /// Whether NSFW.
31    #[serde(default)]
32    pub nsfw: bool,
33    /// ID of the last message sent.
34    #[serde(default)]
35    pub last_message_id: Option<Snowflake>,
36    /// Bitrate (for voice).
37    #[serde(default)]
38    pub bitrate: Option<u32>,
39    /// User limit (for voice).
40    #[serde(default)]
41    pub user_limit: Option<u32>,
42    /// Rate limit per user in seconds.
43    #[serde(default)]
44    pub rate_limit_per_user: Option<u32>,
45    /// Recipients of the DM.
46    #[serde(default)]
47    pub recipients: Vec<User<'a>>,
48    /// Icon hash (for group DM).
49    #[serde(default)]
50    pub icon: Option<TitanString<'a>>,
51    /// ID of the DM creator.
52    #[serde(default)]
53    pub owner_id: Option<Snowflake>,
54    /// Application ID of the group DM creator if bot-created.
55    #[serde(default)]
56    pub application_id: Option<Snowflake>,
57    /// Whether the channel is managed by an application.
58    #[serde(default)]
59    pub managed: bool,
60    /// Parent category ID.
61    #[serde(default)]
62    pub parent_id: Option<Snowflake>,
63    /// Last pin timestamp.
64    #[serde(default)]
65    pub last_pin_timestamp: Option<TitanString<'a>>,
66    /// Voice region ID.
67    #[serde(default)]
68    pub rtc_region: Option<TitanString<'a>>,
69    /// Video quality mode.
70    #[serde(default)]
71    pub video_quality_mode: Option<u8>,
72    /// Approximate message count (threads).
73    #[serde(default)]
74    pub message_count: Option<u32>,
75    /// Approximate member count (threads).
76    #[serde(default)]
77    pub member_count: Option<u32>,
78    /// Thread metadata.
79    #[serde(default)]
80    pub thread_metadata: Option<ThreadMetadata<'a>>,
81    /// Thread member object for the current user.
82    #[serde(default)]
83    pub member: Option<ThreadMember<'a>>,
84    /// Default auto-archive duration.
85    #[serde(default)]
86    pub default_auto_archive_duration: Option<u32>,
87    /// Computed permissions for the user.
88    #[serde(default)]
89    pub permissions: Option<crate::permissions::Permissions>,
90    /// Channel flags as a bitfield.
91    #[serde(default)]
92    pub flags: Option<u64>,
93    /// Total messages ever sent (threads).
94    #[serde(default)]
95    pub total_message_sent: Option<u32>,
96    /// Tags available in a forum channel.
97    #[serde(default)]
98    pub available_tags: Vec<ForumTag<'a>>,
99    /// IDs of tags applied to a forum thread.
100    #[serde(default)]
101    pub applied_tags: Vec<Snowflake>,
102    /// Default reaction emoji.
103    #[serde(default)]
104    pub default_reaction_emoji: Option<DefaultReaction<'a>>,
105    /// Default slowmode for threads.
106    #[serde(default)]
107    pub default_thread_rate_limit_per_user: Option<u32>,
108    /// Default sort order for forum posts.
109    #[serde(default)]
110    pub default_sort_order: Option<u8>,
111    /// Default forum layout.
112    #[serde(default)]
113    pub default_forum_layout: Option<u8>,
114}
115
116impl crate::Mention for Channel<'_> {
117    fn mention(&self) -> String {
118        format!("<#{}>", self.id.0)
119    }
120}
121
122/// Permission overwrite for a channel.
123#[derive(Debug, Clone, Deserialize, Serialize, Default)]
124pub struct PermissionOverwrite {
125    /// Role or user ID.
126    pub id: Snowflake,
127    /// Type (0 = role, 1 = member).
128    #[serde(rename = "type")]
129    pub overwrite_type: u8,
130    /// Permission bit set for allowed permissions.
131    pub allow: crate::permissions::Permissions,
132    /// Permission bit set for denied permissions.
133    pub deny: crate::permissions::Permissions,
134}
135
136impl PermissionOverwrite {
137    /// Create an overwrite for a role.
138    #[inline]
139    pub fn role(role_id: impl Into<Snowflake>) -> Self {
140        Self {
141            id: role_id.into(),
142            overwrite_type: 0,
143            allow: crate::permissions::Permissions::empty(),
144            deny: crate::permissions::Permissions::empty(),
145        }
146    }
147
148    /// Create an overwrite for a user/member.
149    #[inline]
150    pub fn member(user_id: impl Into<Snowflake>) -> Self {
151        Self {
152            id: user_id.into(),
153            overwrite_type: 1,
154            allow: crate::permissions::Permissions::empty(),
155            deny: crate::permissions::Permissions::empty(),
156        }
157    }
158
159    /// Set allowed permissions.
160    #[inline]
161    #[must_use]
162    pub fn allow(mut self, permissions: crate::permissions::Permissions) -> Self {
163        self.allow = permissions;
164        self
165    }
166
167    /// Set denied permissions.
168    #[inline]
169    #[must_use]
170    pub fn deny(mut self, permissions: crate::permissions::Permissions) -> Self {
171        self.deny = permissions;
172        self
173    }
174}
175
176/// A channel mention.
177#[derive(Debug, Clone, Deserialize, Serialize)]
178pub struct ChannelMention {
179    /// Channel ID.
180    pub id: Snowflake,
181    /// Guild ID.
182    pub guild_id: Snowflake,
183    /// Channel type.
184    #[serde(rename = "type")]
185    pub channel_type: u8,
186    /// Channel name.
187    pub name: String,
188}
189
190/// Channel pins update event.
191#[derive(Debug, Clone, Deserialize, Serialize)]
192pub struct ChannelPinsUpdateEvent {
193    #[serde(default)]
194    pub guild_id: Option<Snowflake>,
195    pub channel_id: Snowflake,
196    #[serde(default)]
197    pub last_pin_timestamp: Option<String>,
198}