use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::message::segment::MessageSegment;
#[derive(Serialize, Debug, Clone, PartialEq, Eq)]
pub struct ApiResp {
pub status: String,
pub retcode: u32,
pub data: ApiRespData,
pub echo: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ApiRespBuilder {
pub status: String,
pub retcode: u32,
pub data: Value,
pub echo: Option<String>,
}
impl ApiRespBuilder {
pub fn build(self, resp_type: u8) -> Result<ApiResp, anyhow::Error> {
let data = ApiRespData::from_resp_type(resp_type, self.data)?;
Ok(ApiResp {
status: self.status,
retcode: self.retcode,
data,
echo: self.echo,
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ApiRespData {
SendPrivateMsgResponse(SendPrivateMsgResponse),
SendGroupMsgResponse(SendGroupMsgResponse),
SendMsgResponse(SendMsgResponse),
DeleteMsgResponse(DeleteMsgResponse),
GetMsgResponse(GetMsgResponse),
GetForwardMsgResponse(GetForwardMsgResponse),
GetLoginInfoResponse(GetLoginInfoResponse),
GetStrangerInfoResponse(GetStrangerInfoResponse),
GetFriendListResponse(GetFriendListResponse),
GetGroupInfoResponse(GetGroupInfoResponse),
GetGroupListResponse(GetGroupListResponse),
GetGroupMemberInfoResponse(GetGroupMemberInfoResponse),
GetGroupMemberListResponse(GetGroupMemberListResponse),
GetGroupHonorInfoResponse(GetGroupHonorInfoResponse),
GetCookiesResponse(GetCookiesResponse),
GetCsrfTokenResponse(GetCsrfTokenResponse),
GetCredentialsResponse(GetCredentialsResponse),
GetRecordResponse(GetRecordResponse),
GetImageResponse(GetImageResponse),
CanSendImageResponse(CanSendImageResponse),
CanSendRecordResponse(CanSendRecordResponse),
GetStatusResponse(GetStatusResponse),
GetVersionInfoResponse(GetVersionInfoResponse),
NoResponse(Option<()>),
GetGroupSystemMsgResponse(GetGroupSystemMsgResponse),
GetFileResponse(GetFileResponse),
GetFriendsWithCategoryResponse(Vec<GetFriendsWithCategoryResponseItem>),
GetRobotUinRangeResponse(Vec<GetRobotUinRangeResponseItem>),
GetGroupFileCountResponse(GetGroupFileCountResponse),
GetGroupFileListResponse(GetGroupFileListResponse),
SetGroupFileFolderResponse(SetGroupFileFolderResponse),
DelGroupFileResponse(DelGroupFileResponse),
DelGroupFileFolderResponse(CommonClientResponseResult),
SendGroupForwardMsgResponse(SendGroupForwardMsgResponse),
SendPrivateForwardMsgResponse(SendPrivateForwardMsgResponse),
}
impl Serialize for ApiRespData {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match self {
ApiRespData::SendPrivateMsgResponse(data) => data.serialize(serializer),
ApiRespData::SendGroupMsgResponse(data) => data.serialize(serializer),
ApiRespData::SendMsgResponse(data) => data.serialize(serializer),
ApiRespData::DeleteMsgResponse(data) => data.serialize(serializer),
ApiRespData::GetMsgResponse(data) => data.serialize(serializer),
ApiRespData::GetForwardMsgResponse(data) => data.serialize(serializer),
ApiRespData::GetLoginInfoResponse(data) => data.serialize(serializer),
ApiRespData::GetStrangerInfoResponse(data) => data.serialize(serializer),
ApiRespData::GetFriendListResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupInfoResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupListResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupMemberInfoResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupMemberListResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupHonorInfoResponse(data) => data.serialize(serializer),
ApiRespData::GetCookiesResponse(data) => data.serialize(serializer),
ApiRespData::GetCsrfTokenResponse(data) => data.serialize(serializer),
ApiRespData::GetCredentialsResponse(data) => data.serialize(serializer),
ApiRespData::GetRecordResponse(data) => data.serialize(serializer),
ApiRespData::GetImageResponse(data) => data.serialize(serializer),
ApiRespData::CanSendImageResponse(data) => data.serialize(serializer),
ApiRespData::CanSendRecordResponse(data) => data.serialize(serializer),
ApiRespData::GetStatusResponse(data) => data.serialize(serializer),
ApiRespData::GetVersionInfoResponse(data) => data.serialize(serializer),
ApiRespData::NoResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupSystemMsgResponse(data) => data.serialize(serializer),
ApiRespData::GetFileResponse(data) => data.serialize(serializer),
ApiRespData::GetFriendsWithCategoryResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupFileListResponse(data) => data.serialize(serializer),
ApiRespData::SetGroupFileFolderResponse(data) => data.serialize(serializer),
ApiRespData::DelGroupFileResponse(data) => data.serialize(serializer),
ApiRespData::DelGroupFileFolderResponse(data) => data.serialize(serializer),
ApiRespData::GetRobotUinRangeResponse(data) => data.serialize(serializer),
ApiRespData::GetGroupFileCountResponse(data) => data.serialize(serializer),
ApiRespData::SendGroupForwardMsgResponse(data) => data.serialize(serializer),
ApiRespData::SendPrivateForwardMsgResponse(data) => data.serialize(serializer),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SendPrivateMsgResponse {
pub message_id: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SendGroupMsgResponse {
pub message_id: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SendMsgResponse {
pub message_id: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct DeleteMsgResponse;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetMsgResponse {
pub time: i32,
pub message_type: String,
pub message_id: i32,
pub real_id: i32,
pub sender: CommonMessageSender,
pub message: MessageSegment,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct CommonMessageSender {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub card: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sex: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub age: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub area: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetForwardMsgResponse {
pub message: Vec<MessageSegment>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetLoginInfoResponse {
pub user_id: i64,
pub nickname: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetStrangerInfoResponse {
pub user_id: i64,
pub nickname: String,
pub sex: String,
pub age: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetFriendListResponse {
pub user_id: i64,
pub nickname: String,
pub remark: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupInfoResponse {
pub group_id: i64,
pub group_name: String,
pub member_count: i32,
pub max_member_count: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupListResponse {
pub group_id: i64,
pub group_name: String,
pub member_count: i32,
pub max_member_count: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupMemberInfoResponse {
pub group_id: i64,
pub user_id: i64,
pub nickname: String,
pub card: String,
pub sex: String,
pub age: i32,
pub area: String,
pub join_time: i32,
pub last_sent_time: i32,
pub level: String,
pub role: String,
pub unfriendly: bool,
pub title: String,
pub title_expire_time: i32,
pub card_changeable: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupMemberListResponse {
pub group_id: i64,
pub user_id: i64,
pub nickname: String,
pub card: String,
pub sex: String,
pub age: i32,
pub join_time: i32,
pub last_sent_time: i32,
pub level: String,
pub role: String,
pub unfriendly: bool,
pub title: String,
pub title_expire_time: i32,
pub card_changeable: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupHonorInfoResponse {
pub group_id: i64,
pub current_talkative: TalkativeInfo,
pub talkative_list: Vec<HonorInfo>,
pub performer_list: Vec<HonorInfo>,
pub legend_list: Vec<HonorInfo>,
pub strong_newbie_list: Vec<HonorInfo>,
pub emotion_list: Vec<HonorInfo>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct TalkativeInfo {
pub user_id: i64,
pub nickname: String,
pub avatar: String,
pub day_count: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct HonorInfo {
pub user_id: i64,
pub nickname: String,
pub avatar: String,
pub description: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetCookiesResponse {
pub cookies: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetCsrfTokenResponse {
pub token: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetCredentialsResponse {
pub cookies: String,
pub csrf_token: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetRecordResponse {
pub file: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetImageResponse {
pub file: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct CanSendImageResponse {
pub yes: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct CanSendRecordResponse {
pub yes: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetStatusResponse {
pub online: Option<bool>,
pub good: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetVersionInfoResponse {
pub app_name: String,
pub app_version: String,
pub protocol_version: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupSystemMsgResponse {
#[serde(rename = "InvitedRequest")]
pub invited_requests: Vec<InvitedRequest>,
pub join_requests: Vec<JoinRequest>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct InvitedRequest {
pub request_id: String,
pub invitor_uin: i64,
pub invitor_nick: String,
pub group_id: i64,
pub group_name: String,
pub checked: bool,
pub actor: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct JoinRequest {
pub request_id: String,
pub requester_uin: i64,
pub requester_nick: String,
pub group_id: i64,
pub group_name: String,
pub checked: bool,
pub actor: i32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetFileResponse {
pub file: String,
pub file_name: String,
pub file_size: u64,
pub base64: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetFriendsWithCategoryResponseItem {
pub user_id: i64,
pub nickname: String,
pub remark: Option<String>,
pub sex: Option<Sex>,
pub level: Option<i64>,
pub age: Option<i64>,
pub qid: Option<String>,
pub login_days: Option<i64>,
pub categroy_name: Option<String>,
pub category_id: Option<i64>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum Sex {
#[serde(rename = "male")]
Male,
#[serde(rename = "female")]
Female,
#[serde(rename = "unknown")]
Unknown,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetRobotUinRangeResponseItem {
#[serde(rename = "maxUin")]
pub max_uin: String,
#[serde(rename = "minUin")]
pub min_uin: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupFileCountResponse {
pub count: u64, }
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GetGroupFileListResponse {
#[serde(rename = "FileList")]
pub file_list: Vec<GroupFile>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct GroupFile {
#[serde(rename = "fileInfo")]
pub file_info: Option<FileInfo>,
#[serde(rename = "folderInfo")]
pub folder_info: Option<FolderInfo>,
#[serde(rename = "peerId")]
pub peer_id: String,
pub r#type: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct FileInfo {
#[serde(rename = "busId")]
pub bus_id: i64,
#[serde(rename = "deadTime")]
pub dead_time: i64,
#[serde(rename = "downloadTimes")]
pub download_times: i64,
#[serde(rename = "elementId")]
pub element_id: String,
#[serde(rename = "fileId")]
pub file_id: String,
#[serde(rename = "fileModelId")]
pub file_model_id: String,
#[serde(rename = "fileName")]
pub file_name: String,
#[serde(rename = "fileSize")]
pub file_size: String,
#[serde(rename = "isFolder")]
pub is_folder: bool,
#[serde(rename = "localPath")]
pub local_path: String,
#[serde(rename = "md5")]
pub md5: String,
#[serde(rename = "modifyTime")]
pub modify_time: i64,
#[serde(rename = "parentFolderId")]
pub parent_folder_id: String,
#[serde(rename = "sha")]
pub sha: String,
#[serde(rename = "sha3")]
pub sha3: String,
#[serde(rename = "transStatus")]
pub trans_status: i64,
#[serde(rename = "transType")]
pub strans_type: i64,
#[serde(rename = "uploadTime")]
pub upload_time: i64,
#[serde(rename = "uploadedSize")]
pub uploaded_size: String,
#[serde(rename = "uploaderLocalPath")]
pub uploader_local_path: String,
#[serde(rename = "uploaderName")]
pub uploader_name: String,
#[serde(rename = "uploaderUin")]
pub uploader_uin: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct FolderInfo {
#[serde(rename = "createTime")]
pub create_time: i64,
#[serde(rename = "createUin")]
pub create_uin: String,
#[serde(rename = "creatorName")]
pub creator_name: String,
#[serde(rename = "folderId")]
pub folder_id: String,
#[serde(rename = "folderName")]
pub folder_name: String,
#[serde(rename = "modifyName")]
pub modify_name: String,
#[serde(rename = "modifyTime")]
pub modify_time: i64,
#[serde(rename = "modifyUin")]
pub modify_uin: String,
#[serde(rename = "parentFolderId")]
pub parent_folder_id: String,
#[serde(rename = "totalFileCount")]
pub total_file_count: i64,
#[serde(rename = "usedSpace")]
pub used_space: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SetGroupFileFolderResponse {
#[serde(rename = "groupItem")]
pub group_item: GroupFile,
pub result: CommonClientResponseResult,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct CommonClientResponseResult {
#[serde(rename = "clientWording")]
pub client_wording: String,
#[serde(rename = "retCode")]
pub ret_code: i64,
#[serde(rename = "retMsg")]
pub ret_msg: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct DelGroupFileResponse {
#[serde(rename = "errMsg")]
pub error_msg: String,
pub result: i64,
#[serde(rename = "transGroupFileResult")]
pub trans_group_file_result: TransGroupFileResult,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct TransGroupFileResult {
#[serde(rename = "failFileIdList")]
pub fail_file_id_list: Vec<String>,
pub result: CommonClientResponseResult,
#[serde(rename = "successFileIdList")]
pub success_file_id_list: Vec<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SendGroupForwardMsgResponse {
pub message_id: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SendPrivateForwardMsgResponse {
pub message_id: i64,
}