use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone)]
pub struct RawProto {
pub packet_length: u32,
pub header_length: u16,
pub version: u16,
pub operation: u32,
pub sequence_id: u32,
pub body: Vec<u8>,
}
impl RawProto {
pub fn new(operation: u32, body: Vec<u8>) -> Self {
let packet_length = 16 + body.len() as u32;
Self {
packet_length,
header_length: 16,
operation,
body,
..Default::default()
}
}
}
impl TryFrom<Vec<u8>> for RawProto {
fn try_from(raw: Vec<u8>) -> Result<Self, Self::Error> {
if raw.len() < 16 {
println!("Error raw data:{:?}", raw);
return Err("Error raw data!");
}
let packet_length = u32::from_be_bytes(raw[0..4].try_into().unwrap());
let header_length = u16::from_be_bytes(raw[4..6].try_into().unwrap());
let version = u16::from_be_bytes(raw[6..8].try_into().unwrap());
let operation = u32::from_be_bytes(raw[8..12].try_into().unwrap());
let sequence_id = u32::from_be_bytes(raw[12..16].try_into().unwrap());
let body = raw[16..].to_vec();
Ok(RawProto {
packet_length,
header_length,
version,
operation,
sequence_id,
body,
})
}
type Error = &'static str;
}
impl From<RawProto> for Vec<u8> {
fn from(mut p: RawProto) -> Self {
p.packet_length = 16 + p.body.len() as u32;
let mut result = Vec::new();
result.extend(p.packet_length.to_be_bytes());
result.extend(p.header_length.to_be_bytes());
result.extend(p.version.to_be_bytes());
result.extend(p.operation.to_be_bytes());
result.extend(p.sequence_id.to_be_bytes());
result.extend(p.body.iter());
result
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct LiveOpenPlatformCmd<T>
where
T: Serialize + Default,
{
pub cmd: String,
pub data: T,
}
pub const LIVE_OPEN_PLATFORM_DM: &str = "LIVE_OPEN_PLATFORM_DM";
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CDM {
pub uname: String, pub uid: i64, pub uface: String, pub timestamp: i64, pub room_id: i64, pub msg: String, pub msg_id: String, pub guard_level: i64, pub fans_medal_wearing_status: bool, pub fans_medal_name: String, pub fans_medal_level: i64, pub emoji_img_url: String, pub dm_type: i64, }
pub const LIVE_OPEN_PLATFORM_SEND_GIFT: &str = "LIVE_OPEN_PLATFORM_SEND_GIFT";
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CSendGift {
pub room_id: i64, pub uid: i64, pub uname: String, pub uface: String, pub gift_id: i64, pub gift_name: String, pub gift_num: i64, pub price: i64, pub paid: bool, pub fans_medal_level: i64, pub fans_medal_name: String, pub fans_medal_wearing_status: bool, pub guard_level: i64, pub timestamp: i64, pub anchor_info: CAnchorInfo, pub msg_id: String, pub gift_icon: String, pub combo_gift: bool, pub combo_info: CComboInfo, }
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CAnchorInfo {
pub uid: i64, pub uname: String, pub uface: String, }
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CComboInfo {
pub combo_base_num: i64, pub combo_count: i64, pub combo_id: String, pub combo_timeout: i64, }
pub const LIVE_OPEN_PLATFORM_SUPER_CHAT: &str = "LIVE_OPEN_PLATFORM_SUPER_CHAT";
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CSuperChat {
pub room_id: i64, pub uid: i64, pub uname: String, pub uface: String, pub message_id: i64, pub message: String, pub rmb: i64, pub timestamp: i64, pub start_time: i64, pub end_time: i64, pub guard_level: i64, pub fans_medal_level: i64, pub fans_medal_name: String, pub fans_medal_wearing_status: bool, pub msg_id: String, }
pub const LIVE_OPEN_PLATFORM_SUPER_CHAT_DEL: &str = "LIVE_OPEN_PLATFORM_SUPER_CHAT_DEL";
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CSuperChatDel {
pub room_id: i64, pub message_ids: Vec<i64>, pub msg_id: String, }
pub const LIVE_OPEN_PLATFORM_GUARD: &str = "LIVE_OPEN_PLATFORM_GUARD";
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CGuard {
pub user_info: CUserInfo, pub guard_level: i64, pub guard_num: i64, pub guard_unit: String, pub fans_medal_level: i64, pub fans_medal_name: String, pub fans_medal_wearing_status: bool, pub room_id: i64, pub msg_id: String, pub timestamp: i64, }
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CUserInfo {
pub uid: i64, pub uname: String, pub uface: String, }
pub const LIVE_OPEN_PLATFORM_LIKE: &str = "LIVE_OPEN_PLATFORM_LIKE";
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CLike {
pub uname: String, pub uid: i64, pub uface: String, pub timestamp: i64, pub room_id: i64, pub like_text: String, pub like_conut: i64, pub fans_medal_wearing_status: bool, pub fans_medal_name: String, pub fans_medal_level: i64, }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_trans() {
let proto = RawProto::new(2, Vec::new());
println!("{:?}", &proto);
let bytes: Vec<u8> = proto.into();
println!("{:?}", bytes);
let mut proto: RawProto = bytes.try_into().unwrap();
println!("{:?}", &proto);
proto.operation = 7;
proto.body = "{json:0}".to_string().as_bytes().to_vec();
println!("{:?}", &proto);
let bytes: Vec<u8> = proto.into();
println!("{:?}", bytes);
let proto: RawProto = bytes.try_into().unwrap();
println!("{:?}", &proto);
}
#[test]
fn test_data_dm() {
let data = LiveOpenPlatformCmd {
cmd: LIVE_OPEN_PLATFORM_DM.to_string(),
data: CDM::default(),
};
println!("{:?}", data);
let data = serde_json::to_string_pretty(&data).unwrap();
println!("{}", data);
}
#[test]
fn test_data_send_gift() {
let data = LiveOpenPlatformCmd {
cmd: LIVE_OPEN_PLATFORM_SEND_GIFT.to_string(),
data: CSendGift::default(),
};
println!("{:?}", data);
let data = serde_json::to_string_pretty(&data).unwrap();
println!("{}", data);
}
#[test]
fn test_data_super_chat() {
let data = LiveOpenPlatformCmd {
cmd: LIVE_OPEN_PLATFORM_SUPER_CHAT.to_string(),
data: CSuperChat::default(),
};
println!("{:?}", data);
let data = serde_json::to_string_pretty(&data).unwrap();
println!("{}", data);
}
#[test]
fn test_data_super_chat_del() {
let data = LiveOpenPlatformCmd {
cmd: LIVE_OPEN_PLATFORM_SUPER_CHAT_DEL.to_string(),
data: CSuperChatDel::default(),
};
println!("{:?}", data);
let data = serde_json::to_string_pretty(&data).unwrap();
println!("{}", data);
}
#[test]
fn test_data_guard() {
let data = LiveOpenPlatformCmd {
cmd: LIVE_OPEN_PLATFORM_GUARD.to_string(),
data: CGuard::default(),
};
println!("{:?}", data);
let data = serde_json::to_string_pretty(&data).unwrap();
println!("{}", data);
}
#[test]
fn test_data_like() {
let data = LiveOpenPlatformCmd {
cmd: LIVE_OPEN_PLATFORM_LIKE.to_string(),
data: CLike::default(),
};
println!("{:?}", data);
let data = serde_json::to_string_pretty(&data).unwrap();
println!("{}", data);
}
}