parent
5eb60dbbc6
commit
6f89e87d53
|
@ -12,5 +12,5 @@ futures = "0.3.30"
|
||||||
serde = { version = "1.0.195", features = ["derive"] }
|
serde = { version = "1.0.195", features = ["derive"] }
|
||||||
serde_bytes = "0.11.14"
|
serde_bytes = "0.11.14"
|
||||||
serde_json = "1.0.111"
|
serde_json = "1.0.111"
|
||||||
strum_macros = "0.25.3"
|
|
||||||
thiserror = "1.0.56"
|
thiserror = "1.0.56"
|
||||||
|
tokio-tungstenite = "0.21.0"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use std::io;
|
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum_macros::{AsRefStr, Display, EnumString};
|
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use crate::core::packet::{Packet, PacketError};
|
use crate::core::packet::{Packet, PacketError};
|
||||||
|
|
||||||
// #[allow(unused_variables, dead_code)]
|
// #[allow(unused_variables, dead_code)]
|
||||||
|
@ -9,63 +8,67 @@ use crate::core::packet::{Packet, PacketError};
|
||||||
pub enum MessageError {
|
pub enum MessageError {
|
||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
InvalidPacket(#[from] PacketError),
|
InvalidPacket(#[from] PacketError),
|
||||||
|
#[error("{0}")]
|
||||||
|
InvalidJsonBody(#[from] serde_json::Error),
|
||||||
|
#[error("parse json command failed")]
|
||||||
|
InvalidCommand,
|
||||||
#[error("no message available")]
|
#[error("no message available")]
|
||||||
NoMessage,
|
NoMessage,
|
||||||
#[error("unknown message error")]
|
#[error("unknown message error")]
|
||||||
Unknown,
|
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)]
|
#[allow(unused_variables, dead_code)]
|
||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug)]
|
||||||
|
#[serde(tag = "cmd", content = "data")]
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
DanmuMsg {},
|
#[serde(rename = "DAMMU_MSG")]
|
||||||
SuperChatMessage,
|
DanmuMsg {
|
||||||
SuperChatMessageDelete,
|
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 {
|
impl Message {
|
||||||
fn deserialize_json() {}
|
fn parse_packet(single_packet: &mut Packet) -> Result<Message, MessageError> {
|
||||||
|
let body = &single_packet.get_body().unwrap()[0];
|
||||||
fn parse_packet_skip_err(single_packet: &Packet) -> Message {}
|
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
|
/// 从 Packet 中提取 Message
|
||||||
///
|
///
|
||||||
/// 只有 Json 格式的非业务消息会被提取,即心跳包回复,认证请求回复等不会被解析。
|
/// 只有 Json 格式的非业务消息会被提取,
|
||||||
|
/// 即心跳包回复,认证请求回复等不会被解析,返回 MessageError::NoMessage
|
||||||
pub fn from_packet(packet: &mut Packet) -> Result<Vec<Self>, MessageError> {
|
pub fn from_packet(packet: &mut Packet) -> Result<Vec<Self>, MessageError> {
|
||||||
let mut packets = packet.get_body_packets()?;
|
let mut packets = packet.get_body_packets()?;
|
||||||
if packets.len() == 0 {
|
if packets.len() == 0 {
|
||||||
return Err(MessageError::NoMessage);
|
return Err(MessageError::NoMessage);
|
||||||
};
|
};
|
||||||
|
|
||||||
let messages = packets.iter().map(|packet| {
|
let messages: Vec<Message> = packets.iter_mut().map(|packet| {
|
||||||
Self::parse_packet_skip_err(packet)
|
let parsed = Self::parse_packet(packet);
|
||||||
|
// ignore error
|
||||||
|
match parsed {
|
||||||
|
Ok(msg) => msg,
|
||||||
|
Err(_) => ()
|
||||||
|
}
|
||||||
}).collect();
|
}).collect();
|
||||||
if messages.len() == 0 {
|
if messages.len() == 0 {
|
||||||
Err(MessageError::NoMessage)
|
Err(MessageError::NoMessage)
|
||||||
|
@ -73,4 +76,10 @@ impl Message {
|
||||||
Ok(messages)
|
Ok(messages)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn test_from_packet() {}
|
||||||
}
|
}
|
Loading…
Reference in New Issue