1use std::collections::HashMap;
2
3#[cfg(feature = "db")]
4use crate::db::{DbRelationship, DbRelationshipType};
5use crate::models::Permissions;
6use crate::serde_for_bitflags;
7use serde::{Deserialize, Serialize};
8#[cfg(feature = "utoipa")]
9use utoipa::ToSchema;
10
11#[derive(Clone, Debug, Default, Serialize)]
16#[cfg_attr(feature = "client", derive(Deserialize))]
17#[cfg_attr(feature = "utoipa", derive(ToSchema))]
18#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
19pub struct User {
20 pub id: u64,
22 pub username: String,
24 pub display_name: Option<String>,
26 pub avatar: Option<String>,
28 pub banner: Option<String>,
30 pub bio: Option<String>,
32 #[cfg_attr(feature = "bincode", bincode(with_serde))]
34 pub flags: UserFlags,
35}
36
37bitflags::bitflags! {
38 #[derive(Default)]
40 pub struct UserFlags: u32 {
41 const BOT = 1 << 0;
43 const VERIFIED = 1 << 1;
45 const MAINTAINER = 1 << 2;
47 const CONTRIBUTOR = 1 << 3;
49 const BUG_HUNTER = 1 << 4;
51 const PRIVILEGED = 1 << 5;
53 }
54}
55
56serde_for_bitflags!(u32: UserFlags);
57
58#[derive(Clone, Debug, Deserialize, Serialize)]
61#[cfg_attr(feature = "utoipa", derive(ToSchema))]
62pub struct GuildFolderInfo {
63 pub name: String,
65 pub color: u32,
67}
68
69#[derive(Clone, Debug, Deserialize, Serialize)]
71#[cfg_attr(feature = "utoipa", derive(ToSchema))]
72pub struct GuildFolder {
73 pub path: Option<Vec<GuildFolderInfo>>,
78 pub guilds: Vec<u64>,
81}
82
83#[derive(Clone, Debug, Default, Serialize)]
86#[cfg_attr(feature = "client", derive(Deserialize))]
87#[cfg_attr(feature = "utoipa", derive(ToSchema))]
88#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
89pub struct ClientUser {
90 #[serde(flatten)]
92 pub user: User,
93 #[cfg_attr(feature = "utoipa", schema(format = "email"))]
97 pub email: Option<String>,
98 #[serde(skip)]
105 #[cfg(feature = "db")]
106 pub password: Option<String>,
107 #[cfg_attr(feature = "bincode", bincode(with_serde))]
109 pub dm_privacy: PrivacyConfiguration,
110 #[cfg_attr(feature = "bincode", bincode(with_serde))]
112 pub group_dm_privacy: PrivacyConfiguration,
113 #[cfg_attr(feature = "bincode", bincode(with_serde))]
115 pub friend_request_privacy: PrivacyConfiguration,
116 #[cfg_attr(feature = "bincode", bincode(with_serde))]
118 pub onboarding_flags: UserOnboardingFlags,
119 #[cfg_attr(feature = "bincode", bincode(with_serde))]
121 pub settings: Settings,
122 #[cfg_attr(feature = "bincode", bincode(with_serde))]
124 pub notification_override: HashMap<u64, NotificationFlags>,
125}
126
127bitflags::bitflags! {
128 #[derive(Default)]
129 pub struct Settings: i32 {
130 const NOTIFICATIONS = 1 << 0;
132 const ALWAYS_SHOW_GUILDS_IN_SIDEBAR = 1 << 1;
134 }
135}
136
137bitflags::bitflags! {
138 #[derive(Default)]
139 pub struct NotificationFlags: i16 {
140 const ALL = 1 << 0;
141 const ALL_MENTIONS = 1 << 1;
142 const DIRECT_MENTIONS = 1 << 2;
143 const HIGHLIGHTS = 1 << 3;
144 }
145}
146
147serde_for_bitflags!(i32: Settings);
148serde_for_bitflags!(i16: NotificationFlags);
149
150impl std::ops::Deref for ClientUser {
151 type Target = User;
152
153 fn deref(&self) -> &Self::Target {
154 &self.user
155 }
156}
157
158impl std::ops::DerefMut for ClientUser {
159 fn deref_mut(&mut self) -> &mut Self::Target {
160 &mut self.user
161 }
162}
163
164bitflags::bitflags! {
165 #[derive(Default)]
167 pub struct PrivacyConfiguration: i16 {
168 const FRIENDS = 1 << 0;
170 const MUTUAL_FRIENDS = 1 << 1;
172 const GUILD_MEMBERS = 1 << 2;
174 const EVERYONE = 1 << 3;
176
177 const DEFAULT_DM_PRIVACY = Self::FRIENDS.bits
180 | Self::MUTUAL_FRIENDS.bits
181 | Self::GUILD_MEMBERS.bits;
182 const DEFAULT_GROUP_DM_PRIVACY = Self::FRIENDS.bits;
184 const DEFAULT_FRIEND_REQUEST_PRIVACY = Self::EVERYONE.bits;
186 }
187}
188
189serde_for_bitflags!(i16: PrivacyConfiguration);
190
191bitflags::bitflags! {
192 #[derive(Default)]
194 pub struct UserOnboardingFlags: i64 {
195 const CONNECT_WITH_FRIENDS = 1 << 0;
197 const CREATE_A_COMMUNITY = 1 << 1;
198 const DISCOVER_COMMUNITIES = 1 << 2;
199 }
200}
201
202serde_for_bitflags!(i64: UserOnboardingFlags);
203
204#[derive(Clone, Debug, Serialize)]
206#[cfg_attr(feature = "client", derive(Deserialize))]
207#[cfg_attr(feature = "utoipa", derive(ToSchema))]
208#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
209#[serde(rename_all = "snake_case")]
210pub enum SidebarSection {
211 UnreadMessages,
213 RecentChannels,
215}
216
217#[derive(Copy, Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
219#[cfg_attr(feature = "utoipa", derive(ToSchema))]
220#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
221#[serde(rename_all = "snake_case")]
222pub enum RelationshipType {
223 Friend,
225 OutgoingRequest,
227 IncomingRequest,
229 Blocked,
231}
232
233#[cfg(feature = "db")]
234impl From<DbRelationshipType> for RelationshipType {
235 #[inline]
236 fn from(kind: DbRelationshipType) -> Self {
237 match kind {
238 DbRelationshipType::Friend => Self::Friend,
239 DbRelationshipType::Incoming => Self::IncomingRequest,
240 DbRelationshipType::Outgoing => Self::OutgoingRequest,
241 DbRelationshipType::Blocked => Self::Blocked,
242 }
243 }
244}
245
246#[derive(Clone, Debug, Serialize)]
248#[cfg_attr(feature = "client", derive(Deserialize))]
249#[cfg_attr(feature = "utoipa", derive(ToSchema))]
250#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
251pub struct Relationship {
252 pub user: User,
254 #[serde(rename = "type")]
256 pub kind: RelationshipType,
257}
258
259#[cfg(feature = "db")]
260impl Relationship {
261 #[inline]
264 #[allow(clippy::missing_const_for_fn)] pub(crate) fn from_db_relationship(data: DbRelationship) -> Self {
266 Self {
267 user: User {
268 id: data.target_id as _,
269 username: data.username,
270 display_name: data.display_name,
271 avatar: data.avatar,
272 banner: data.banner,
273 bio: data.bio,
274 flags: UserFlags::from_bits_truncate(data.flags as _),
275 },
276 kind: RelationshipType::from(data.kind),
277 }
278 }
279}
280
281#[derive(Clone, Debug, Serialize)]
283#[cfg_attr(feature = "client", derive(Deserialize))]
284#[cfg_attr(feature = "utoipa", derive(ToSchema))]
285#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
286pub struct Bot {
287 pub user: User,
289 pub owner_id: u64,
291 #[cfg_attr(feature = "bincode", bincode(with_serde))]
293 pub default_permissions: Permissions,
294 #[cfg_attr(feature = "bincode", bincode(with_serde))]
296 pub flags: BotFlags,
297}
298
299bitflags::bitflags! {
300 #[derive(Default)]
302 pub struct BotFlags: u32 {
303 const VERIFIED = 1 << 0;
305 const PUBLIC = 1 << 1;
307 const GUILD_ENABLED = 1 << 2;
309 const GROUP_DM_ENABLED = 1 << 3;
311 const GLOBAL_ENABLED = 1 << 4;
314 }
315}
316
317serde_for_bitflags!(u32: BotFlags);