use crate::models::{HasId, Snowflake, Timestamp, channel::Channel};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct GuildRoleMembers {
#[serde(default)]
pub data: Vec<Member>,
#[serde(default)]
pub next: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct MemberAddRoleBody {
pub channel: Option<Channel>,
}
impl MemberAddRoleBody {
pub fn new() -> Self {
Self { channel: None }
}
pub fn with_channel_id(channel_id: impl Into<String>) -> Self {
let mut channel = Channel::new();
channel.id = channel_id.into();
Self {
channel: Some(channel),
}
}
}
pub type DeleteHistoryMsgDay = i32;
pub const NO_DELETE: DeleteHistoryMsgDay = 0;
pub const DELETE_THREE_DAYS: DeleteHistoryMsgDay = 3;
pub const DELETE_SEVEN_DAYS: DeleteHistoryMsgDay = 7;
pub const DELETE_FIFTEEN_DAYS: DeleteHistoryMsgDay = 15;
pub const DELETE_THIRTY_DAYS: DeleteHistoryMsgDay = 30;
pub const DELETE_ALL: DeleteHistoryMsgDay = -1;
#[allow(non_upper_case_globals)]
pub const NoDelete: DeleteHistoryMsgDay = NO_DELETE;
#[allow(non_upper_case_globals)]
pub const DeleteThreeDays: DeleteHistoryMsgDay = DELETE_THREE_DAYS;
#[allow(non_upper_case_globals)]
pub const DeleteSevenDays: DeleteHistoryMsgDay = DELETE_SEVEN_DAYS;
#[allow(non_upper_case_globals)]
pub const DeleteFifteenDays: DeleteHistoryMsgDay = DELETE_FIFTEEN_DAYS;
#[allow(non_upper_case_globals)]
pub const DeleteThirtyDays: DeleteHistoryMsgDay = DELETE_THIRTY_DAYS;
#[allow(non_upper_case_globals)]
pub const DeleteAll: DeleteHistoryMsgDay = DELETE_ALL;
pub type MemberDeleteOpts = MemberDeleteOptions;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MemberDeleteOptions {
pub add_blacklist: bool,
pub delete_history_msg_days: DeleteHistoryMsgDay,
}
impl MemberDeleteOptions {
pub fn new() -> Self {
Self::default()
}
pub fn with_add_blacklist(mut self, add_blacklist: bool) -> Self {
self.add_blacklist = add_blacklist;
self
}
pub fn with_delete_history_msg_days(mut self, days: DeleteHistoryMsgDay) -> Self {
self.delete_history_msg_days = normalize_delete_history_msg_days(days);
self
}
}
impl Default for MemberDeleteOptions {
fn default() -> Self {
Self {
add_blacklist: false,
delete_history_msg_days: NO_DELETE,
}
}
}
pub type MemberDeleteOption = Box<dyn FnOnce(&mut MemberDeleteOptions) + Send>;
#[allow(non_snake_case)]
pub fn WithAddBlackList(add_blacklist: bool) -> MemberDeleteOption {
Box::new(move |options| {
options.add_blacklist = add_blacklist;
})
}
#[allow(non_snake_case)]
pub fn WithDeleteHistoryMsg(days: DeleteHistoryMsgDay) -> MemberDeleteOption {
Box::new(move |options| {
options.delete_history_msg_days = normalize_delete_history_msg_days(days);
})
}
pub fn normalize_delete_history_msg_days(days: DeleteHistoryMsgDay) -> DeleteHistoryMsgDay {
match days {
DELETE_THREE_DAYS | DELETE_SEVEN_DAYS | DELETE_FIFTEEN_DAYS | DELETE_THIRTY_DAYS
| DELETE_ALL => days,
_ => NO_DELETE,
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct Member {
#[serde(default)]
pub guild_id: Snowflake,
#[serde(default)]
pub user: Option<crate::models::User>,
#[serde(default)]
pub nick: String,
#[serde(default)]
pub roles: Vec<Snowflake>,
#[serde(default)]
pub joined_at: Timestamp,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub op_user_id: Snowflake,
}
impl Member {
pub fn new() -> Self {
Self::default()
}
pub fn display_name(&self) -> Option<&str> {
(!self.nick.is_empty())
.then_some(self.nick.as_str())
.or_else(|| self.user.as_ref().map(|u| u.username.as_str()))
}
pub fn username(&self) -> Option<&str> {
self.user.as_ref().map(|u| u.username.as_str())
}
pub fn user_id(&self) -> Option<&Snowflake> {
self.user.as_ref().map(|u| &u.id)
}
pub fn is_bot(&self) -> bool {
self.user.as_ref().is_some_and(|u| u.is_bot())
}
pub fn role_ids(&self) -> &[Snowflake] {
&self.roles
}
pub fn has_role(&self, role_id: &str) -> bool {
self.role_ids().iter().any(|id| id == role_id)
}
}
impl HasId for Member {
fn id(&self) -> Option<&Snowflake> {
self.user_id()
}
}