use either::Either;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use time::{OffsetDateTime, serde::rfc3339};
use crate::id;
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Group {
pub id: String,
pub name: String,
pub short_code: String,
pub discriminator: String,
pub description: String,
pub icon_id: String,
pub icon_url: String,
pub banner_id: String,
pub banner_url: String,
pub privacy: String,
pub owner_id: String,
pub rules: String,
pub links: Vec<String>,
pub languages: Vec<String>,
pub member_count: i64,
pub member_count_synced_at: String,
pub is_verified: bool,
pub join_state: String,
pub created_at: String,
pub online_member_count: i64,
pub membership_status: String,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupAuditLogs {
pub results: Vec<GroupAuditLog>,
pub total_count: u32,
pub has_next: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupAuditLog {
pub id: String,
#[serde(rename = "created_at", with = "rfc3339")]
pub created_at: OffsetDateTime,
pub group_id: String,
#[serde(with = "either::serde_untagged")]
pub actor_id: Either<id::User, String>,
pub actor_displayname: Option<String>,
#[serde(with = "either::serde_untagged_optional")]
pub target_id: Option<Either<id::User, id::Instance>>,
pub event_type: String,
pub description: String,
pub data: GroupAuditLogData,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupAuditLogData {
#[serde(default, with = "either::serde_untagged_optional")]
pub description: Option<Either<GroupAuditLogDataChange<String>, String>>,
#[serde(default, with = "either::serde_untagged_optional")]
pub join_state: Option<Either<GroupAuditLogDataChange<String>, String>>,
#[serde(default, with = "either::serde_untagged_optional")]
pub order: Option<Either<GroupAuditLogDataChange<u32>, u32>>,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupAuditLogDataChange<T> {
pub old: T,
pub new: T,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupBan {
pub id: id::GroupMember,
pub group_id: id::Group,
pub user_id: id::User,
pub is_representing: bool,
pub role_ids: Vec<Value>,
pub m_role_ids: Vec<Value>,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub joined_at: Option<OffsetDateTime>,
pub membership_status: String,
pub visibility: String,
pub is_subscribed_to_announcements: bool,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub last_post_read_at: Option<OffsetDateTime>,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub created_at: Option<OffsetDateTime>,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub banned_at: Option<OffsetDateTime>,
#[serde(default)]
pub manager_notes: String,
pub has_joined_from_purchase: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupMember {
pub id: id::GroupMember,
pub group_id: id::Group,
pub user_id: id::User,
pub is_representing: bool,
pub role_ids: Vec<String>,
pub m_role_ids: Vec<String>,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub joined_at: Option<OffsetDateTime>,
pub membership_status: String,
pub visibility: String,
pub is_subscribed_to_announcements: bool,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub last_post_read_at: Option<OffsetDateTime>,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub created_at: Option<OffsetDateTime>,
#[serde(default)]
#[serde(with = "rfc3339::option")]
pub banned_at: Option<OffsetDateTime>,
pub manager_notes: Option<String>,
pub has_joined_from_purchase: Option<bool>,
}