1use crate::member::{Emoji, Role, Sticker};
2use crate::snowflake::Snowflake;
3use crate::PartialVoiceState;
4use crate::TitanString;
5use crate::User;
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
10pub struct Guild<'a> {
11 pub id: Snowflake,
13 pub name: TitanString<'a>,
15 #[serde(default)]
17 pub icon: Option<TitanString<'a>>,
18 #[serde(default)]
20 pub icon_hash: Option<TitanString<'a>>,
21 #[serde(default)]
23 pub splash: Option<TitanString<'a>>,
24 #[serde(default)]
26 pub discovery_splash: Option<TitanString<'a>>,
27 #[serde(default)]
29 pub owner_id: Option<Snowflake>,
30 #[serde(default)]
32 pub permissions: Option<crate::permissions::Permissions>,
33 #[serde(default)]
35 pub region: Option<TitanString<'a>>,
36 #[serde(default)]
38 pub afk_channel_id: Option<Snowflake>,
39 #[serde(default)]
41 pub afk_timeout: Option<u32>,
42 #[serde(default)]
44 pub verification_level: Option<u8>,
45 #[serde(default)]
47 pub default_message_notifications: Option<u8>,
48 #[serde(default)]
50 pub explicit_content_filter: Option<u8>,
51 #[serde(default)]
53 pub roles: Vec<Role<'a>>,
54 #[serde(default)]
56 pub emojis: Vec<Emoji<'a>>,
57 #[serde(default)]
59 pub features: Vec<TitanString<'a>>,
60 #[serde(default)]
62 pub mfa_level: Option<u8>,
63 #[serde(default)]
65 pub application_id: Option<Snowflake>,
66 #[serde(default)]
68 pub system_channel_id: Option<Snowflake>,
69 #[serde(default)]
71 pub system_channel_flags: Option<u64>,
72 #[serde(default)]
74 pub rules_channel_id: Option<Snowflake>,
75 #[serde(default)]
77 pub max_presences: Option<u32>,
78 #[serde(default)]
80 pub max_members: Option<u32>,
81 #[serde(default)]
83 pub vanity_url_code: Option<TitanString<'a>>,
84 #[serde(default)]
86 pub description: Option<TitanString<'a>>,
87 #[serde(default)]
89 pub banner: Option<TitanString<'a>>,
90 #[serde(default)]
92 pub premium_tier: Option<u8>,
93 #[serde(default)]
95 pub premium_subscription_count: Option<u32>,
96 #[serde(default)]
98 pub preferred_locale: Option<TitanString<'a>>,
99 #[serde(default)]
101 pub public_updates_channel_id: Option<Snowflake>,
102 #[serde(default)]
104 pub max_video_channel_users: Option<u32>,
105 #[serde(default)]
107 pub max_stage_video_channel_users: Option<u32>,
108 #[serde(default)]
110 pub approximate_member_count: Option<u32>,
111 #[serde(default)]
113 pub approximate_presence_count: Option<u32>,
114 #[serde(default)]
116 pub member_count: Option<u64>,
117 #[serde(default)]
119 pub nsfw_level: Option<u8>,
120 #[serde(default)]
122 pub stickers: Vec<Sticker<'a>>,
123 #[serde(default)]
125 pub premium_progress_bar_enabled: Option<bool>,
126 #[serde(default)]
128 pub safety_alerts_channel_id: Option<Snowflake>,
129 #[serde(default)]
131 pub voice_states: Vec<PartialVoiceState<'a>>,
132}
133
134impl<'a> Guild<'a> {
135 pub fn icon_url(&self) -> Option<String> {
137 self.icon.as_ref().map(|hash| {
138 let ext = if hash.starts_with("a_") { "gif" } else { "png" };
139 format!(
140 "https://cdn.discordapp.com/icons/{}/{}.{}",
141 self.id, hash, ext
142 )
143 })
144 }
145
146 pub fn splash_url(&self) -> Option<String> {
148 self.splash.as_ref().map(|hash| {
149 format!(
150 "https://cdn.discordapp.com/splashes/{}/{}.png",
151 self.id, hash
152 )
153 })
154 }
155
156 pub fn discovery_splash_url(&self) -> Option<String> {
158 self.discovery_splash.as_ref().map(|hash| {
159 format!(
160 "https://cdn.discordapp.com/discovery-splashes/{}/{}.png",
161 self.id, hash
162 )
163 })
164 }
165
166 pub fn banner_url(&self) -> Option<String> {
168 self.banner.as_ref().map(|hash| {
169 let ext = if hash.starts_with("a_") { "gif" } else { "png" };
170 format!(
171 "https://cdn.discordapp.com/banners/{}/{}.{}",
172 self.id, hash, ext
173 )
174 })
175 }
176}
177
178#[derive(Debug, Clone, Deserialize, Serialize)]
180pub struct UnavailableGuild {
181 pub id: Snowflake,
183 #[serde(default)]
185 pub unavailable: bool,
186}
187
188#[derive(Debug, Clone, Deserialize, Serialize)]
194pub struct GuildMemberUpdateEvent<'a> {
195 pub guild_id: Snowflake,
197 pub roles: Vec<Snowflake>,
199 pub user: User<'a>,
201 #[serde(default)]
203 pub nick: Option<String>,
204 #[serde(default)]
206 pub avatar: Option<String>,
207 #[serde(default)]
209 pub joined_at: Option<String>,
210 #[serde(default)]
212 pub premium_since: Option<String>,
213 #[serde(default)]
215 pub deaf: Option<bool>,
216 #[serde(default)]
218 pub mute: Option<bool>,
219 #[serde(default)]
221 pub pending: Option<bool>,
222 #[serde(default)]
224 pub communication_disabled_until: Option<String>,
225 #[serde(default)]
227 pub flags: Option<u64>,
228}
229
230#[derive(Debug, Clone, Deserialize, Serialize)]
232pub struct GuildMemberRemoveEvent<'a> {
233 pub guild_id: Snowflake,
235 pub user: User<'a>,
237}
238
239#[derive(Debug, Clone, Deserialize, Serialize)]
241pub struct GuildMembersChunkEvent<'a> {
242 pub guild_id: Snowflake,
244 pub members: Vec<crate::member::GuildMember<'a>>,
246 pub chunk_index: u32,
248 pub chunk_count: u32,
250 #[serde(default)]
252 pub not_found: Vec<Snowflake>,
253 #[serde(default)]
255 pub presences: Vec<crate::json::Value>,
256 #[serde(default)]
258 pub nonce: Option<String>,
259}
260
261#[derive(Debug, Clone, Deserialize, Serialize)]
263pub struct GuildBanEvent<'a> {
264 pub guild_id: Snowflake,
266 pub user: User<'a>,
268}
269
270#[derive(Debug, Clone, Deserialize, Serialize)]
272pub struct GuildRoleEvent<'a> {
273 pub guild_id: Snowflake,
275 pub role: Role<'a>,
277}
278
279#[derive(Debug, Clone, Deserialize, Serialize)]
281pub struct GuildRoleDeleteEvent {
282 pub guild_id: Snowflake,
284 pub role_id: Snowflake,
286}
287
288#[derive(Debug, Clone, Deserialize, Serialize)]
290pub struct GuildEmojisUpdateEvent<'a> {
291 pub guild_id: Snowflake,
293 pub emojis: Vec<Emoji<'a>>,
295}
296
297#[derive(Debug, Clone, Deserialize, Serialize)]
299pub struct GuildStickersUpdateEvent<'a> {
300 pub guild_id: Snowflake,
302 pub stickers: Vec<Sticker<'a>>,
304}
305
306#[derive(Debug, Clone, Deserialize, Serialize)]
308pub struct GuildMemberAddEvent<'a> {
309 pub guild_id: Snowflake,
311 #[serde(default)]
313 pub user: Option<User<'a>>,
314 #[serde(default)]
316 pub nick: Option<String>,
317 #[serde(default)]
319 pub avatar: Option<String>,
320 #[serde(default)]
322 pub roles: Vec<Snowflake>,
323 pub joined_at: String,
325 #[serde(default)]
327 pub deaf: bool,
328 #[serde(default)]
330 pub mute: bool,
331 #[serde(default)]
333 pub flags: u64,
334 #[serde(default)]
336 pub pending: Option<bool>,
337}
338
339#[derive(Debug, Clone, Deserialize, Serialize)]
341pub struct ReadyEventData<'a> {
342 pub v: u8,
344 pub user: User<'a>,
346 pub guilds: Vec<UnavailableGuild>,
348 pub session_id: String,
350 pub resume_gateway_url: String,
352 #[serde(default)]
354 pub shard: Option<[u16; 2]>,
355 #[serde(default)]
357 pub application: Option<Application>,
358}
359
360#[derive(Debug, Clone, Deserialize, Serialize)]
362pub struct Application {
363 pub id: Snowflake,
365 #[serde(default)]
367 pub flags: Option<u64>,
368}