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 Guild<'_> {
135 #[must_use]
137 pub fn icon_url(&self) -> Option<String> {
138 self.icon.as_ref().map(|hash| {
139 let ext = if hash.starts_with("a_") { "gif" } else { "png" };
140 format!(
141 "https://cdn.discordapp.com/icons/{}/{}.{}",
142 self.id, hash, ext
143 )
144 })
145 }
146
147 #[must_use]
149 pub fn splash_url(&self) -> Option<String> {
150 self.splash.as_ref().map(|hash| {
151 format!(
152 "https://cdn.discordapp.com/splashes/{}/{}.png",
153 self.id, hash
154 )
155 })
156 }
157
158 #[must_use]
160 pub fn discovery_splash_url(&self) -> Option<String> {
161 self.discovery_splash.as_ref().map(|hash| {
162 format!(
163 "https://cdn.discordapp.com/discovery-splashes/{}/{}.png",
164 self.id, hash
165 )
166 })
167 }
168
169 #[must_use]
171 pub fn banner_url(&self) -> Option<String> {
172 self.banner.as_ref().map(|hash| {
173 let ext = if hash.starts_with("a_") { "gif" } else { "png" };
174 format!(
175 "https://cdn.discordapp.com/banners/{}/{}.{}",
176 self.id, hash, ext
177 )
178 })
179 }
180}
181
182#[derive(Debug, Clone, Deserialize, Serialize)]
184pub struct UnavailableGuild {
185 pub id: Snowflake,
187 #[serde(default)]
189 pub unavailable: bool,
190}
191
192#[derive(Debug, Clone, Deserialize, Serialize)]
198pub struct GuildMemberUpdateEvent<'a> {
199 pub guild_id: Snowflake,
201 pub roles: Vec<Snowflake>,
203 pub user: User<'a>,
205 #[serde(default)]
207 pub nick: Option<String>,
208 #[serde(default)]
210 pub avatar: Option<String>,
211 #[serde(default)]
213 pub joined_at: Option<String>,
214 #[serde(default)]
216 pub premium_since: Option<String>,
217 #[serde(default)]
219 pub deaf: Option<bool>,
220 #[serde(default)]
222 pub mute: Option<bool>,
223 #[serde(default)]
225 pub pending: Option<bool>,
226 #[serde(default)]
228 pub communication_disabled_until: Option<String>,
229 #[serde(default)]
231 pub flags: Option<u64>,
232}
233
234#[derive(Debug, Clone, Deserialize, Serialize)]
236pub struct GuildMemberRemoveEvent<'a> {
237 pub guild_id: Snowflake,
239 pub user: User<'a>,
241}
242
243#[derive(Debug, Clone, Deserialize, Serialize)]
245pub struct GuildMembersChunkEvent<'a> {
246 pub guild_id: Snowflake,
248 pub members: Vec<crate::member::GuildMember<'a>>,
250 pub chunk_index: u32,
252 pub chunk_count: u32,
254 #[serde(default)]
256 pub not_found: Vec<Snowflake>,
257 #[serde(default)]
259 pub presences: Vec<crate::json::Value>,
260 #[serde(default)]
262 pub nonce: Option<String>,
263}
264
265#[derive(Debug, Clone, Deserialize, Serialize)]
267pub struct GuildBanEvent<'a> {
268 pub guild_id: Snowflake,
270 pub user: User<'a>,
272}
273
274#[derive(Debug, Clone, Deserialize, Serialize)]
276pub struct GuildRoleEvent<'a> {
277 pub guild_id: Snowflake,
279 pub role: Role<'a>,
281}
282
283#[derive(Debug, Clone, Deserialize, Serialize)]
285pub struct GuildRoleDeleteEvent {
286 pub guild_id: Snowflake,
288 pub role_id: Snowflake,
290}
291
292#[derive(Debug, Clone, Deserialize, Serialize)]
294pub struct GuildEmojisUpdateEvent<'a> {
295 pub guild_id: Snowflake,
297 pub emojis: Vec<Emoji<'a>>,
299}
300
301#[derive(Debug, Clone, Deserialize, Serialize)]
303pub struct GuildStickersUpdateEvent<'a> {
304 pub guild_id: Snowflake,
306 pub stickers: Vec<Sticker<'a>>,
308}
309
310#[derive(Debug, Clone, Deserialize, Serialize)]
312pub struct GuildMemberAddEvent<'a> {
313 pub guild_id: Snowflake,
315 #[serde(default)]
317 pub user: Option<User<'a>>,
318 #[serde(default)]
320 pub nick: Option<String>,
321 #[serde(default)]
323 pub avatar: Option<String>,
324 #[serde(default)]
326 pub roles: Vec<Snowflake>,
327 pub joined_at: String,
329 #[serde(default)]
331 pub deaf: bool,
332 #[serde(default)]
334 pub mute: bool,
335 #[serde(default)]
337 pub flags: u64,
338 #[serde(default)]
340 pub pending: Option<bool>,
341}
342
343#[derive(Debug, Clone, Deserialize, Serialize)]
345pub struct ReadyEventData<'a> {
346 pub v: u8,
348 pub user: User<'a>,
350 pub guilds: Vec<UnavailableGuild>,
352 pub session_id: String,
354 pub resume_gateway_url: String,
356 #[serde(default)]
358 pub shard: Option<[u16; 2]>,
359 #[serde(default)]
361 pub application: Option<Application>,
362}
363
364#[derive(Debug, Clone, Deserialize, Serialize)]
366pub struct Application {
367 pub id: Snowflake,
369 #[serde(default)]
371 pub flags: Option<u64>,
372}