use crate::id::{MessageId, Uin};
use crate::message::Message;
use serde_json::Value;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Sex {
Male,
Female,
Unknown,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Role {
Owner,
Admin,
Member,
}
#[derive(Clone, Debug)]
pub struct FriendCategory {
pub id: i32,
pub name: String,
}
#[derive(Clone, Debug)]
pub struct FriendGroup {
pub group_id: i32,
pub group_name: String,
}
#[derive(Clone, Debug)]
pub struct FriendInfo {
pub user: Uin,
pub nickname: String,
pub sex: Sex,
pub remark: String,
pub qid: Option<String>,
pub category: Option<FriendCategory>,
pub group: Option<FriendGroup>,
pub birthday: Option<String>,
pub phone: Option<String>,
pub email: Option<String>,
pub login_days: Option<i32>,
pub long_nick: Option<String>,
pub raw: Value,
}
impl FriendInfo {
pub fn display_name(&self) -> &str {
let remark = self.remark.trim();
if !remark.is_empty() {
remark
} else {
self.nickname.trim()
}
}
}
#[derive(Clone, Debug)]
pub struct FriendStatus {
pub status: Option<i32>,
pub ext_status: Option<i32>,
pub battery_status: Option<i32>,
}
#[derive(Clone, Debug)]
pub struct Business {
pub kind: Option<i32>,
pub name: Option<String>,
pub level: Option<i32>,
pub icon: Option<String>,
pub is_pro: Option<bool>,
pub is_year: Option<bool>,
}
#[derive(Clone, Debug)]
pub struct UserInfo {
pub user: Uin,
pub nickname: String,
pub sex: Sex,
pub age: Option<i32>,
pub level: Option<i32>,
pub qid: Option<String>,
pub bio: Option<String>,
pub country: Option<String>,
pub city: Option<String>,
pub school: Option<String>,
pub remark: Option<String>,
pub status: Option<FriendStatus>,
pub business: Vec<Business>,
pub register_time: Option<i64>,
pub avatar: Option<String>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct GroupInfo {
pub group: Uin,
pub name: String,
pub member_count: i32,
pub max_member_count: i32,
pub remark: Option<String>,
pub created_time: Option<i64>,
pub description: Option<String>,
pub announcement: Option<String>,
pub question: Option<String>,
pub is_freeze: Option<bool>,
pub active_member_count: Option<i32>,
pub is_top: Option<bool>,
pub owner_id: Option<Uin>,
pub shut_up_all_time: Option<i64>,
pub shut_up_me_time: Option<i64>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct MemberInfo {
pub user: Uin,
pub group: Uin,
pub nickname: String,
pub card: String,
pub title: String,
pub level: i32,
pub role: Role,
pub sex: Sex,
pub age: Option<i32>,
pub join_time: i64,
pub last_sent_time: Option<i64>,
pub mute_end_time: Option<i64>,
pub area: Option<String>,
pub unfriendly: Option<bool>,
pub title_expire_time: Option<i64>,
pub card_changeable: Option<bool>,
pub qq_level: Option<i32>,
pub is_robot: Option<bool>,
pub qage: Option<i32>,
pub raw: Value,
}
impl MemberInfo {
pub fn display_name(&self) -> &str {
let card = self.card.trim();
if !card.is_empty() {
card
} else {
self.nickname.trim()
}
}
}
#[derive(Clone, Debug)]
pub struct FileMeta {
pub id: String,
pub name: String,
pub size: u64,
pub hash: Option<String>,
pub busid: Option<i64>,
pub uploader: Option<Uin>,
pub upload_time: Option<i64>,
pub dead_time: Option<i64>,
pub download_times: Option<i32>,
pub parent_folder_id: Option<String>,
}
#[derive(Clone, Debug)]
pub struct GroupFolder {
pub id: String,
pub name: String,
pub file_count: Option<u32>,
pub create_time: Option<i64>,
pub parent_folder_id: Option<String>,
pub last_modified_time: Option<i64>,
pub creator_id: Option<Uin>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct GroupFileList {
pub files: Vec<FileMeta>,
pub folders: Vec<GroupFolder>,
}
#[derive(Clone, Debug)]
pub struct Announcement {
pub id: String,
pub group: Uin,
pub sender: Uin,
pub content: String,
pub time: i64,
pub image_url: Option<String>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct EssenceMessage {
pub group: Uin,
pub message_id: MessageId,
pub sender: Uin,
pub sender_nick: String,
pub operator: Uin,
pub operator_time: i64,
pub content: Message,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct ImplStat {
pub message_received: Option<i64>,
pub message_sent: Option<i64>,
}
#[derive(Clone, Debug)]
pub struct ImplStatus {
pub online: bool,
pub good: bool,
pub stat: Option<ImplStat>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct VersionInfo {
pub app_name: String,
pub app_version: String,
pub protocol_version: String,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct ForwardSendResult {
pub message_id: MessageId,
pub forward_id: Option<String>,
}
#[derive(Clone, Debug)]
pub struct OcrText {
pub text: String,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct EmojiLiker {
pub tiny_id: String,
pub nickname: String,
pub head_url: String,
}
#[derive(Clone, Debug)]
pub struct Rkey {
pub kind: String,
pub rkey: String,
pub create_time: Option<i64>,
pub ttl: Option<i64>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct FileFetch {
pub url: Option<String>,
pub path: Option<String>,
pub name: String,
pub size: u64,
pub base64: Option<String>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct AiCharacter {
pub id: String,
pub name: String,
pub preview_url: Option<String>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct AiCharacterGroup {
pub kind: String,
pub characters: Vec<AiCharacter>,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct ProfileLiker {
pub user: Uin,
pub nickname: String,
pub times: i32,
pub raw: Value,
}
#[derive(Clone, Debug)]
pub struct FriendCategoryList {
pub category_id: i32,
pub category_name: String,
pub friends: Vec<FriendInfo>,
}
#[derive(Clone, Debug)]
pub struct HonorMember {
pub user: Uin,
pub nickname: String,
pub avatar: Option<String>,
pub description: Option<String>,
pub day_count: Option<i32>,
pub raw: Value,
}
#[derive(Clone, Debug, Default)]
pub struct HonorList {
pub group: Uin,
pub current_talkative: Option<HonorMember>,
pub talkative_list: Vec<HonorMember>,
pub performer_list: Vec<HonorMember>,
pub legend_list: Vec<HonorMember>,
pub strong_newbie_list: Vec<HonorMember>,
pub emotion_list: Vec<HonorMember>,
pub raw: Value,
}
impl MemberInfo {
pub fn is_operator(&self) -> bool {
matches!(self.role, Role::Owner | Role::Admin)
}
}