use std::collections::HashMap;
#[cfg(feature = "db")]
use crate::db::{DbRelationship, DbRelationshipType};
use crate::models::Permissions;
use crate::serde_for_bitflags;
use serde::{Deserialize, Serialize};
#[cfg(feature = "utoipa")]
use utoipa::ToSchema;
#[derive(Clone, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct User {
pub id: u64,
pub username: String,
pub display_name: Option<String>,
pub avatar: Option<String>,
pub banner: Option<String>,
pub bio: Option<String>,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub flags: UserFlags,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct UserFlags: u32 {
const BOT = 1 << 0;
const VERIFIED = 1 << 1;
const MAINTAINER = 1 << 2;
const CONTRIBUTOR = 1 << 3;
const BUG_HUNTER = 1 << 4;
const PRIVILEGED = 1 << 5;
}
}
serde_for_bitflags!(u32: UserFlags);
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct GuildFolderInfo {
pub name: String,
pub color: u32,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct GuildFolder {
pub path: Option<Vec<GuildFolderInfo>>,
pub guilds: Vec<u64>,
}
#[derive(Clone, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct ClientUser {
#[serde(flatten)]
pub user: User,
#[cfg_attr(feature = "utoipa", schema(format = "email"))]
pub email: Option<String>,
#[serde(skip)]
#[cfg(feature = "db")]
pub password: Option<String>,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub dm_privacy: PrivacyConfiguration,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub group_dm_privacy: PrivacyConfiguration,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub friend_request_privacy: PrivacyConfiguration,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub onboarding_flags: UserOnboardingFlags,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub settings: Settings,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub notification_override: HashMap<u64, NotificationFlags>,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct Settings: i32 {
const NOTIFICATIONS = 1 << 0;
const ALWAYS_SHOW_GUILDS_IN_SIDEBAR = 1 << 1;
}
}
bitflags::bitflags! {
#[derive(Default)]
pub struct NotificationFlags: i16 {
const ALL = 1 << 0;
const ALL_MENTIONS = 1 << 1;
const DIRECT_MENTIONS = 1 << 2;
const HIGHLIGHTS = 1 << 3;
}
}
serde_for_bitflags!(i32: Settings);
serde_for_bitflags!(i16: NotificationFlags);
impl std::ops::Deref for ClientUser {
type Target = User;
fn deref(&self) -> &Self::Target {
&self.user
}
}
impl std::ops::DerefMut for ClientUser {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.user
}
}
bitflags::bitflags! {
#[derive(Default)]
pub struct PrivacyConfiguration: i16 {
const FRIENDS = 1 << 0;
const MUTUAL_FRIENDS = 1 << 1;
const GUILD_MEMBERS = 1 << 2;
const EVERYONE = 1 << 3;
const DEFAULT_DM_PRIVACY = Self::FRIENDS.bits
| Self::MUTUAL_FRIENDS.bits
| Self::GUILD_MEMBERS.bits;
const DEFAULT_GROUP_DM_PRIVACY = Self::FRIENDS.bits;
const DEFAULT_FRIEND_REQUEST_PRIVACY = Self::EVERYONE.bits;
}
}
serde_for_bitflags!(i16: PrivacyConfiguration);
bitflags::bitflags! {
#[derive(Default)]
pub struct UserOnboardingFlags: i64 {
const CONNECT_WITH_FRIENDS = 1 << 0;
const CREATE_A_COMMUNITY = 1 << 1;
const DISCOVER_COMMUNITIES = 1 << 2;
}
}
serde_for_bitflags!(i64: UserOnboardingFlags);
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(rename_all = "snake_case")]
pub enum SidebarSection {
UnreadMessages,
RecentChannels,
}
#[derive(Copy, Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(rename_all = "snake_case")]
pub enum RelationshipType {
Friend,
OutgoingRequest,
IncomingRequest,
Blocked,
}
#[cfg(feature = "db")]
impl From<DbRelationshipType> for RelationshipType {
#[inline]
fn from(kind: DbRelationshipType) -> Self {
match kind {
DbRelationshipType::Friend => Self::Friend,
DbRelationshipType::Incoming => Self::IncomingRequest,
DbRelationshipType::Outgoing => Self::OutgoingRequest,
DbRelationshipType::Blocked => Self::Blocked,
}
}
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct Relationship {
pub user: User,
#[serde(rename = "type")]
pub kind: RelationshipType,
}
#[cfg(feature = "db")]
impl Relationship {
#[inline]
#[allow(clippy::missing_const_for_fn)] pub(crate) fn from_db_relationship(data: DbRelationship) -> Self {
Self {
user: User {
id: data.target_id as _,
username: data.username,
display_name: data.display_name,
avatar: data.avatar,
banner: data.banner,
bio: data.bio,
flags: UserFlags::from_bits_truncate(data.flags as _),
},
kind: RelationshipType::from(data.kind),
}
}
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct Bot {
pub user: User,
pub owner_id: u64,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub default_permissions: Permissions,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub flags: BotFlags,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct BotFlags: u32 {
const VERIFIED = 1 << 0;
const PUBLIC = 1 << 1;
const GUILD_ENABLED = 1 << 2;
const GROUP_DM_ENABLED = 1 << 3;
const GLOBAL_ENABLED = 1 << 4;
}
}
serde_for_bitflags!(u32: BotFlags);