use crate::models::serde_helpers::is_zero_u32;
use crate::models::{HasId, HasName, Snowflake};
use serde::{Deserialize, Serialize};
#[allow(non_upper_case_globals)]
pub const DefaultColor: u32 = 4_278_245_297;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct GuildRoles {
#[serde(default)]
pub guild_id: Snowflake,
#[serde(default)]
pub roles: Vec<GuildRole>,
#[serde(default, rename = "role_num_limit")]
pub num_limit: String,
}
impl GuildRoles {
pub fn new(roles: Vec<GuildRole>) -> Self {
Self {
guild_id: String::new(),
roles,
num_limit: String::new(),
}
}
}
pub type RoleId = Snowflake;
pub type RoleID = RoleId;
pub const DEFAULT_ROLE_COLOR: u32 = 4_278_245_297;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct UpdateRoleInfo {
pub name: String,
pub color: u32,
pub hoist: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct GuildRole {
#[serde(default, skip_serializing_if = "String::is_empty")]
pub id: Snowflake,
#[serde(default)]
pub name: String,
#[serde(default)]
pub color: u32,
#[serde(default)]
pub hoist: u32,
#[serde(default, rename = "number", skip_serializing_if = "is_zero_u32")]
pub member_count: u32,
#[serde(default, skip_serializing_if = "is_zero_u32")]
pub member_limit: u32,
}
impl GuildRole {
fn default_color() -> u32 {
DEFAULT_ROLE_COLOR
}
fn hoist_value(&self) -> u32 {
self.hoist
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UpdateRoleFilter {
pub name: u32,
pub color: u32,
pub hoist: u32,
}
impl Default for UpdateRoleFilter {
fn default() -> Self {
Self {
name: 1,
color: 1,
hoist: 1,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UpdateRole {
pub guild_id: String,
pub filter: UpdateRoleFilter,
#[serde(rename = "info")]
pub update: GuildRole,
}
impl UpdateRole {
pub fn new(guild_id: impl Into<String>, mut role: GuildRole) -> Self {
if role.color == 0 {
role.color = GuildRole::default_color();
}
Self {
guild_id: guild_id.into(),
filter: UpdateRoleFilter::default(),
update: role,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct UpdateResult {
#[serde(default)]
pub role_id: Snowflake,
#[serde(default)]
pub guild_id: Snowflake,
#[serde(default)]
pub role: Option<GuildRole>,
}
impl GuildRole {
pub fn new() -> Self {
Self::default()
}
pub fn is_hoisted(&self) -> bool {
self.hoist != 0
}
pub fn hoist_as_u32(&self) -> u32 {
self.hoist_value()
}
pub fn color_hex(&self) -> Option<String> {
(self.color != 0).then(|| format!("#{:06X}", self.color))
}
pub fn member_count(&self) -> u32 {
self.member_count
}
pub fn get_member_limit(&self) -> u32 {
self.member_limit
}
pub fn is_at_member_limit(&self) -> bool {
self.member_limit > 0 && self.member_count >= self.member_limit
}
}
impl HasId for GuildRole {
fn id(&self) -> Option<&Snowflake> {
(!self.id.is_empty()).then_some(&self.id)
}
}
impl HasName for GuildRole {
fn name(&self) -> &str {
&self.name
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct Role {
#[serde(default, skip_serializing_if = "String::is_empty")]
pub id: Snowflake,
#[serde(default)]
pub name: String,
#[serde(default)]
pub color: u32,
#[serde(default)]
pub hoist: u32,
#[serde(default, rename = "number", skip_serializing_if = "is_zero_u32")]
pub member_count: u32,
#[serde(default, skip_serializing_if = "is_zero_u32")]
pub member_limit: u32,
}
impl Role {
pub fn new() -> Self {
Self::default()
}
pub fn is_hoisted(&self) -> bool {
self.hoist != 0
}
pub fn color_hex(&self) -> Option<String> {
(self.color != 0).then(|| format!("#{:06X}", self.color))
}
pub fn member_count(&self) -> u32 {
self.member_count
}
pub fn get_member_limit(&self) -> u32 {
self.member_limit
}
pub fn is_at_member_limit(&self) -> bool {
self.member_limit > 0 && self.member_count >= self.member_limit
}
}
impl HasId for Role {
fn id(&self) -> Option<&Snowflake> {
(!self.id.is_empty()).then_some(&self.id)
}
}
impl HasName for Role {
fn name(&self) -> &str {
&self.name
}
}
pub type Roles = Vec<Role>;