diff --git a/Cargo.toml b/Cargo.toml index 84d9708..6e85379 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/src/core/message.rs b/src/core/message.rs index 6038fdc..1dc3a1e 100644 --- a/src/core/message.rs +++ b/src/core/message.rs @@ -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 { + let body = &single_packet.get_body().unwrap()[0]; + let message: serde_json::Result = 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, 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 = 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) @@ -73,4 +76,10 @@ impl Message { Ok(messages) } } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_from_packet() {} } \ No newline at end of file