use crate::models::{HasId, HasName, Snowflake, Timestamp, channel::Channel};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct Guild {
#[serde(default)]
pub id: Snowflake,
#[serde(default)]
pub name: String,
#[serde(default)]
pub icon: String,
#[serde(default)]
pub owner_id: Snowflake,
#[serde(rename = "owner")]
#[serde(default)]
pub is_owner: bool,
#[serde(default)]
pub member_count: i32,
#[serde(default)]
pub max_members: i64,
#[serde(default)]
pub description: String,
#[serde(default)]
pub joined_at: Timestamp,
#[serde(default)]
pub channels: Vec<Channel>,
#[serde(default)]
pub union_world_id: String,
#[serde(default)]
pub union_org_id: String,
#[serde(default)]
pub op_user_id: Snowflake,
}
impl Guild {
pub fn new() -> Self {
Self::default()
}
pub fn from_data(_api: crate::api::BotApi, id: String, data: serde_json::Value) -> Self {
let mut guild = serde_json::from_value::<Self>(data).unwrap_or_default();
if guild.id.is_empty() {
guild.id = id;
}
guild
}
pub fn icon_url(&self) -> Option<String> {
(!self.icon.is_empty()).then(|| {
format!(
"https://groupprofile.qq.com/groupicon/{}/{}",
self.id, self.icon
)
})
}
pub fn is_owned_by_current_user(&self) -> bool {
self.is_owner
}
pub fn get_member_count(&self) -> i32 {
self.member_count
}
pub fn get_max_members(&self) -> i64 {
self.max_members
}
pub fn is_at_member_limit(&self) -> bool {
self.max_members > 0 && i64::from(self.member_count) >= self.max_members
}
pub fn display_name(&self) -> Option<&str> {
(!self.name.is_empty()).then_some(self.name.as_str())
}
pub fn has_description(&self) -> bool {
!self.description.is_empty()
}
}
impl HasId for Guild {
fn id(&self) -> Option<&Snowflake> {
(!self.id.is_empty()).then_some(&self.id)
}
}
impl HasName for Guild {
fn name(&self) -> &str {
&self.name
}
}