parent
5eb60dbbc6
commit
6f89e87d53
|
@ -12,5 +12,5 @@ futures = "0.3.30"
|
|||
serde = { version = "1.0.195", features = ["derive"] }
|
||||
serde_bytes = "0.11.14"
|
||||
serde_json = "1.0.111"
|
||||
strum_macros = "0.25.3"
|
||||
thiserror = "1.0.56"
|
||||
tokio-tungstenite = "0.21.0"
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
use std::io;
|
||||
use serde::Serialize;
|
||||
use strum_macros::{AsRefStr, Display, EnumString};
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::core::packet::{Packet, PacketError};
|
||||
|
||||
// #[allow(unused_variables, dead_code)]
|
||||
|
@ -9,63 +8,67 @@ use crate::core::packet::{Packet, PacketError};
|
|||
pub enum MessageError {
|
||||
#[error("{0}")]
|
||||
InvalidPacket(#[from] PacketError),
|
||||
#[error("{0}")]
|
||||
InvalidJsonBody(#[from] serde_json::Error),
|
||||
#[error("parse json command failed")]
|
||||
InvalidCommand,
|
||||
#[error("no message available")]
|
||||
NoMessage,
|
||||
#[error("unknown message error")]
|
||||
Unknown,
|
||||
}
|
||||
|
||||
/// 命令名对照表,用于对应解析命令名称
|
||||
// #[allow(unused_variables, dead_code)]
|
||||
#[derive(Debug, PartialEq, Display, AsRefStr, EnumString)]
|
||||
pub enum Command {
|
||||
Undefined,
|
||||
#[strum(serialize = "DANMU_MSG")]
|
||||
DanmuMsg,
|
||||
#[strum(serialize = "SUPER_CHAT_MESSAGE")]
|
||||
SuperChatMessage,
|
||||
#[strum(serialize = "SUPER_CHAT_MESSAGE_DELETE")]
|
||||
SuperChatMessageDelete,
|
||||
#[strum(serialize = "SEND_GIFT")]
|
||||
SendGift,
|
||||
}
|
||||
|
||||
impl Default for Command {
|
||||
fn default() -> Self {
|
||||
Self::Undefined
|
||||
}
|
||||
}
|
||||
|
||||
impl Command {
|
||||
pub fn from_str(cmd: &str) -> Self {
|
||||
cmd.parse().unwrap_or_default()
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused_variables, dead_code)]
|
||||
#[derive(Serialize, Debug)]
|
||||
#[serde(tag = "cmd", content = "data")]
|
||||
pub enum Message {
|
||||
DanmuMsg {},
|
||||
SuperChatMessage,
|
||||
SuperChatMessageDelete,
|
||||
#[serde(rename = "DAMMU_MSG")]
|
||||
DanmuMsg {
|
||||
sender: String
|
||||
},
|
||||
#[serde(rename = "SUPER_CHAT_MESSAGE")]
|
||||
SuperChatMessage {
|
||||
message: String
|
||||
},
|
||||
#[serde(rename = "SUPER_CHAT_MESSAGE_DELETE")]
|
||||
SuperChatMessageDelete {
|
||||
id: u64
|
||||
},
|
||||
#[serde(rename = "SEND_GIFT")]
|
||||
SendGift {
|
||||
id: u64
|
||||
},
|
||||
}
|
||||
|
||||
impl Message {
|
||||
fn deserialize_json() {}
|
||||
|
||||
fn parse_packet_skip_err(single_packet: &Packet) -> Message {}
|
||||
fn parse_packet(single_packet: &mut Packet) -> Result<Message, MessageError> {
|
||||
let body = &single_packet.get_body().unwrap()[0];
|
||||
let message: serde_json::Result<Message> = serde_json::from_slice(body);
|
||||
match message {
|
||||
Ok(cmd_json) => Ok(cmd_json),
|
||||
// TODO: 对错误类型进行处理,字段不存在和语法错误
|
||||
Err(err) => MessageError::InvalidJsonBody(err)
|
||||
}
|
||||
}
|
||||
|
||||
/// 从 Packet 中提取 Message
|
||||
///
|
||||
/// 只有 Json 格式的非业务消息会被提取,即心跳包回复,认证请求回复等不会被解析。
|
||||
/// 只有 Json 格式的非业务消息会被提取,
|
||||
/// 即心跳包回复,认证请求回复等不会被解析,返回 MessageError::NoMessage
|
||||
pub fn from_packet(packet: &mut Packet) -> Result<Vec<Self>, MessageError> {
|
||||
let mut packets = packet.get_body_packets()?;
|
||||
if packets.len() == 0 {
|
||||
return Err(MessageError::NoMessage);
|
||||
};
|
||||
|
||||
let messages = packets.iter().map(|packet| {
|
||||
Self::parse_packet_skip_err(packet)
|
||||
let messages: Vec<Message> = packets.iter_mut().map(|packet| {
|
||||
let parsed = Self::parse_packet(packet);
|
||||
// ignore error
|
||||
match parsed {
|
||||
Ok(msg) => msg,
|
||||
Err(_) => ()
|
||||
}
|
||||
}).collect();
|
||||
if messages.len() == 0 {
|
||||
Err(MessageError::NoMessage)
|
||||
|
@ -74,3 +77,9 @@ impl Message {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn test_from_packet() {}
|
||||
}
|
Loading…
Reference in New Issue