use crate::{
models::{GuildChannel, Role, User},
serde_for_bitflags,
};
use chrono::{DateTime, Utc};
#[cfg(feature = "client")]
use serde::Deserialize;
use serde::Serialize;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(untagged)]
pub enum MaybePartialUser {
Full(User),
Partial { id: u64 },
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct Member {
#[serde(flatten)]
pub user: MaybePartialUser,
pub guild_id: u64,
pub nick: Option<String>,
pub roles: Option<Vec<u64>>,
pub joined_at: DateTime<Utc>,
}
impl Member {
#[inline]
#[must_use]
pub const fn user_id(&self) -> u64 {
match &self.user {
MaybePartialUser::Full(user) => user.id,
MaybePartialUser::Partial { id } => *id,
}
}
#[must_use]
pub fn display_name(&self) -> Option<&str> {
match &self.user {
MaybePartialUser::Full(user) => Some(self.nick.as_deref().unwrap_or(&user.username)),
MaybePartialUser::Partial { .. } => None,
}
}
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct GuildMemberCount {
pub total: u32,
pub online: Option<u32>,
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct PartialGuild {
pub id: u64,
pub name: String,
pub description: Option<String>,
pub icon: Option<String>,
pub banner: Option<String>,
pub owner_id: u64,
pub flags: GuildFlags,
pub member_count: Option<GuildMemberCount>,
pub vanity_url: Option<String>,
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct Guild {
#[serde(flatten)]
pub partial: PartialGuild,
pub members: Option<Vec<Member>>,
pub roles: Option<Vec<Role>>,
pub channels: Option<Vec<GuildChannel>>,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct GuildFlags: u32 {
const PUBLIC = 1 << 0;
const VERIFIED = 1 << 1;
const VANITY_URL = 1 << 2;
}
}
serde_for_bitflags!(u32: GuildFlags);