From a22cf9c06e8f388621c55409ee2c0bcbb5087bee Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Tue, 4 Mar 2025 13:36:18 +0800 Subject: [PATCH] feat: impl hex extension --- mania/src/core/event.rs | 1 + .../core/event/message/file_group_download.rs | 2 +- .../core/event/message/image_c2c_upload.rs | 4 +- .../core/event/message/image_group_upload.rs | 4 +- .../core/event/message/record_c2c_upload.rs | 4 +- .../core/event/message/record_group_upload.rs | 4 +- .../core/event/message/video_c2c_upload.rs | 8 ++-- .../core/event/message/video_group_upload.rs | 8 ++-- mania/src/core/event/system/info_sync.rs | 2 +- mania/src/core/highway/hw_client.rs | 7 +-- mania/src/core/highway/hw_frame_codec.rs | 5 ++- mania/src/core/operation/highway_op.rs | 45 ++++++++++--------- mania/src/core/operation/wt_op.rs | 3 +- mania/src/core/packet.rs | 5 ++- mania/src/core/sign.rs | 5 +-- mania/src/core/sign/linux.rs | 3 +- mania/src/core/tlv.rs | 1 + mania/src/core/tlv/t106.rs | 2 +- mania/src/message/entity.rs | 1 + mania/src/message/entity/file.rs | 2 +- mania/src/message/entity/image.rs | 2 +- mania/src/message/entity/market_face.rs | 2 +- mania/src/message/entity/record.rs | 2 +- mania/src/message/entity/video.rs | 2 +- mania/src/utility/extensions.rs | 16 +++++++ mania/src/utility/mod.rs | 1 + 26 files changed, 83 insertions(+), 58 deletions(-) create mode 100644 mania/src/utility/extensions.rs diff --git a/mania/src/core/event.rs b/mania/src/core/event.rs index 47ba12e..9341549 100644 --- a/mania/src/core/event.rs +++ b/mania/src/core/event.rs @@ -133,6 +133,7 @@ pub(crate) mod prelude { PacketBuilder, PacketError, PacketReader, PacketType, }; pub use crate::dda; + pub use crate::utility::extensions::HexString; pub use bytes::Bytes; pub use inventory; pub use mania_macros::{DummyEvent, ServerEvent, command, oidb_command}; diff --git a/mania/src/core/event/message/file_group_download.rs b/mania/src/core/event/message/file_group_download.rs index dd230d7..3620970 100644 --- a/mania/src/core/event/message/file_group_download.rs +++ b/mania/src/core/event/message/file_group_download.rs @@ -34,7 +34,7 @@ impl ClientEvent for FileGroupDownloadEvent { let url = format!( "https://{}/ftn_handler/{}/?fname=", download.download_dns, - hex::encode(download.download_url) + download.download_url.hex() ); Ok(ClientResult::single(Box::new(dda!(Self { file_url: url })))) } diff --git a/mania/src/core/event/message/image_c2c_upload.rs b/mania/src/core/event/message/image_c2c_upload.rs index dc66048..4f2b308 100644 --- a/mania/src/core/event/message/image_c2c_upload.rs +++ b/mania/src/core/event/message/image_c2c_upload.rs @@ -59,8 +59,8 @@ impl ClientEvent for ImageC2CUploadEvent { upload_info: vec![UploadInfo { file_info: Some(FileInfo { file_size: self.req.size, - file_hash: hex::encode(self.req.md5.clone()), - file_sha1: hex::encode(self.req.sha1.clone()), + file_hash: self.req.md5.hex(), + file_sha1: self.req.md5.hex(), file_name: self.req.name.to_owned(), r#type: Some(FileType { r#type: 1, diff --git a/mania/src/core/event/message/image_group_upload.rs b/mania/src/core/event/message/image_group_upload.rs index 3451a19..e597787 100644 --- a/mania/src/core/event/message/image_group_upload.rs +++ b/mania/src/core/event/message/image_group_upload.rs @@ -58,8 +58,8 @@ impl ClientEvent for ImageGroupUploadEvent { upload_info: vec![UploadInfo { file_info: Some(FileInfo { file_size: self.req.size, - file_hash: hex::encode(self.req.md5.clone()), - file_sha1: hex::encode(self.req.sha1.clone()), + file_hash: self.req.md5.hex(), + file_sha1: self.req.sha1.hex(), file_name: self.req.name.to_owned(), r#type: Some(FileType { r#type: 1, diff --git a/mania/src/core/event/message/record_c2c_upload.rs b/mania/src/core/event/message/record_c2c_upload.rs index 261eba6..cca8816 100644 --- a/mania/src/core/event/message/record_c2c_upload.rs +++ b/mania/src/core/event/message/record_c2c_upload.rs @@ -56,8 +56,8 @@ impl ClientEvent for RecordC2CUploadEvent { upload_info: vec![UploadInfo { file_info: Some(FileInfo { file_size: self.req.size, - file_hash: hex::encode(self.req.md5.clone()), - file_sha1: hex::encode(self.req.sha1.clone()), + file_hash: self.req.md5.hex(), + file_sha1: self.req.sha1.hex(), file_name: self.req.name.to_owned(), r#type: Some(FileType { r#type: 3, diff --git a/mania/src/core/event/message/record_group_upload.rs b/mania/src/core/event/message/record_group_upload.rs index 1292a03..0f3fc7a 100644 --- a/mania/src/core/event/message/record_group_upload.rs +++ b/mania/src/core/event/message/record_group_upload.rs @@ -55,8 +55,8 @@ impl ClientEvent for RecordGroupUploadEvent { upload_info: vec![UploadInfo { file_info: Some(FileInfo { file_size: self.req.size, - file_hash: hex::encode(self.req.md5.clone()), - file_sha1: hex::encode(self.req.sha1.clone()), + file_hash: self.req.md5.hex(), + file_sha1: self.req.sha1.hex(), file_name: self.req.name.to_owned(), r#type: Some(FileType { r#type: 3, diff --git a/mania/src/core/event/message/video_c2c_upload.rs b/mania/src/core/event/message/video_c2c_upload.rs index 633f3d5..9f73991 100644 --- a/mania/src/core/event/message/video_c2c_upload.rs +++ b/mania/src/core/event/message/video_c2c_upload.rs @@ -63,8 +63,8 @@ impl ClientEvent for VideoC2CUploadEvent { UploadInfo { file_info: Some(FileInfo { file_size: self.req.video_size, - file_hash: hex::encode(self.req.video_md5.clone()), - file_sha1: hex::encode(self.req.video_sha1.clone()), + file_hash: self.req.video_md5.hex(), + file_sha1: self.req.video_sha1.hex(), file_name: self.req.video_name.to_owned(), r#type: Some(FileType { r#type: 2, @@ -82,8 +82,8 @@ impl ClientEvent for VideoC2CUploadEvent { UploadInfo { file_info: Some(FileInfo { file_size: self.req.thumb_size, - file_hash: hex::encode(self.req.thumb_md5.clone()), - file_sha1: hex::encode(self.req.thumb_sha1.clone()), + file_hash: self.req.thumb_md5.hex(), + file_sha1: self.req.thumb_sha1.hex(), file_name: self.req.thumb_name.to_owned(), r#type: Some(FileType { r#type: 1, diff --git a/mania/src/core/event/message/video_group_upload.rs b/mania/src/core/event/message/video_group_upload.rs index 14f4809..0a70083 100644 --- a/mania/src/core/event/message/video_group_upload.rs +++ b/mania/src/core/event/message/video_group_upload.rs @@ -62,8 +62,8 @@ impl ClientEvent for VideoGroupUploadEvent { UploadInfo { file_info: Some(FileInfo { file_size: self.req.video_size, - file_hash: hex::encode(self.req.video_md5.clone()), - file_sha1: hex::encode(self.req.video_sha1.clone()), + file_hash: self.req.video_md5.hex(), + file_sha1: self.req.video_sha1.hex(), file_name: self.req.video_name.to_owned(), r#type: Some(FileType { r#type: 2, @@ -81,8 +81,8 @@ impl ClientEvent for VideoGroupUploadEvent { UploadInfo { file_info: Some(FileInfo { file_size: self.req.thumb_size, - file_hash: hex::encode(self.req.thumb_md5.clone()), - file_sha1: hex::encode(self.req.thumb_sha1.clone()), + file_hash: self.req.thumb_md5.hex(), + file_sha1: self.req.thumb_sha1.hex(), file_name: self.req.thumb_name.to_owned(), r#type: Some(FileType { r#type: 1, diff --git a/mania/src/core/event/system/info_sync.rs b/mania/src/core/event/system/info_sync.rs index 964584a..9e5cbbe 100644 --- a/mania/src/core/event/system/info_sync.rs +++ b/mania/src/core/event/system/info_sync.rs @@ -28,7 +28,7 @@ impl ClientEvent for InfoSyncEvent { }), normal_config: Some(NormalConfig::default()), register_info: Some(RegisterInfo { - guid: hex::encode(ctx.device.uuid), + guid: ctx.device.uuid.hex(), kick_pc: 0, current_version: ctx.app_info.current_version.parse().unwrap(), is_first_register_proxy_online: 1, diff --git a/mania/src/core/highway/hw_client.rs b/mania/src/core/highway/hw_client.rs index af57c49..3d59702 100644 --- a/mania/src/core/highway/hw_client.rs +++ b/mania/src/core/highway/hw_client.rs @@ -6,6 +6,7 @@ use crate::core::protos::service::highway::{ DataHighwayHead, LoginSigHead, ReqDataHighwayHead, RespDataHighwayHead, SegHead, }; use crate::dda; +use crate::utility::extensions::HexString; use bytes::{Bytes, BytesMut}; use futures::SinkExt; use futures::StreamExt; @@ -33,13 +34,13 @@ pub struct HighwaySession { impl Debug for HighwaySession { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("HighwaySession") - .field("ticket", &hex::encode(self.ticket.clone())) + .field("ticket", &self.ticket.hex()) .field("uin", &self.uin) .field("cmd", &self.cmd) .field("command", &self.command) - .field("file_md5", &hex::encode(self.file_md5.clone())) + .field("file_md5", &self.file_md5.hex()) .field("file_size", &self.file_size) - .field("ext", &hex::encode(self.ext.clone())) + .field("ext", &self.ext.hex()) .finish() } } diff --git a/mania/src/core/highway/hw_frame_codec.rs b/mania/src/core/highway/hw_frame_codec.rs index 7b0284e..9addc5b 100644 --- a/mania/src/core/highway/hw_frame_codec.rs +++ b/mania/src/core/highway/hw_frame_codec.rs @@ -1,4 +1,5 @@ use crate::core::highway::HighwayError; +use crate::utility::extensions::HexString; use bytes::{Buf, BufMut, Bytes, BytesMut}; use std::fmt::Debug; use tokio_util::codec::{Decoder, Encoder}; @@ -11,8 +12,8 @@ pub struct HighwayFrame { impl Debug for HighwayFrame { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("HighwayFrame") - .field("head", &hex::encode(self.head.clone())) - .field("body", &hex::encode(self.body.clone())) + .field("head", &self.head.hex()) + .field("body", &self.body.hex()) .finish() } } diff --git a/mania/src/core/operation/highway_op.rs b/mania/src/core/operation/highway_op.rs index d82d392..e694a51 100644 --- a/mania/src/core/operation/highway_op.rs +++ b/mania/src/core/operation/highway_op.rs @@ -24,6 +24,7 @@ use crate::core::protos::service::highway::{ use crate::message::entity::image::ImageEntity; use crate::message::entity::record::RecordEntity; use crate::message::entity::video::VideoEntity; +use crate::utility::extensions::HexString; use crate::utility::image_resolver::{ImageFormat, resolve_image_metadata}; use crate::utility::stream_helper::{mut_stream_ctx, stream_pipeline}; use crate::{ManiaError, ManiaResult, dda}; @@ -114,7 +115,7 @@ impl BusinessHandle { size: image.size, name: image.file_path.clone().unwrap_or_else(|| format!( "{}.{}", - hex::encode(&sha1), + &sha1.hex(), iv.0 )), md5, @@ -149,8 +150,8 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let sha1 = hex::decode(&info.file_sha1).map_err(HighwayError::HexError)?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; + let sha1 = info.file_sha1.unhex().map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let extend = Ntv2RichMediaHighwayExt { file_uuid: index_node.file_uuid.to_owned(), u_key: res.res.u_key.to_owned().unwrap(), @@ -202,7 +203,7 @@ impl BusinessHandle { size: image.size, name: image.file_path.clone().unwrap_or_else(|| format!( "{}.{}", - hex::encode(&sha1), + &sha1.hex(), iv.0 )), md5, @@ -237,8 +238,8 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let sha1 = hex::decode(&info.file_sha1).map_err(HighwayError::HexError)?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; + let sha1 = info.file_sha1.unhex().map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let extend = Ntv2RichMediaHighwayExt { file_uuid: index_node.file_uuid.to_owned(), u_key: res.res.u_key.to_owned().unwrap(), @@ -333,14 +334,14 @@ impl BusinessHandle { video_name: video .video_path .clone() - .unwrap_or_else(|| { format!("{}.mp4", hex::encode(&file_sha1)) }), + .unwrap_or_else(|| { format!("{}.mp4", &file_sha1.hex()) }), video_md5: file_md5, video_sha1: file_sha1, thumb_size: video.video_thumb_size as u32, thumb_name: video .video_thumb_path .clone() - .unwrap_or_else(|| { format!("{}.jpg", hex::encode(&thumb_sha1)) }), + .unwrap_or_else(|| { format!("{}.jpg", &thumb_sha1.hex()) }), thumb_md5, thumb_sha1, thumb_width: video.video_thumb_width as u32, @@ -371,7 +372,7 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let extend = Ntv2RichMediaHighwayExt { file_uuid: index_node.file_uuid.to_owned(), u_key: res.res.u_key.to_owned().unwrap(), @@ -423,8 +424,8 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; - let sha1 = hex::decode(&info.file_sha1).map_err(HighwayError::HexError)?; + let sha1 = info.file_sha1.unhex().map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let size = video.video_thumb_size as u32; let extend = Ntv2RichMediaHighwayExt { file_uuid: index.file_uuid.to_owned(), @@ -477,14 +478,14 @@ impl BusinessHandle { video_name: video .video_path .clone() - .unwrap_or_else(|| { format!("{}.mp4", hex::encode(&file_sha1)) }), + .unwrap_or_else(|| { format!("{}.mp4", &file_sha1.hex()) }), video_md5: file_md5, video_sha1: file_sha1, thumb_size: video.video_thumb_size as u32, thumb_name: video .video_thumb_path .clone() - .unwrap_or_else(|| { format!("{}.jpg", hex::encode(&thumb_sha1)) }), + .unwrap_or_else(|| { format!("{}.jpg", &thumb_sha1.hex()) }), thumb_md5, thumb_sha1, thumb_width: video.video_thumb_width as u32, @@ -515,7 +516,7 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let extend = Ntv2RichMediaHighwayExt { file_uuid: index_node.file_uuid.to_owned(), u_key: res.res.u_key.to_owned().unwrap(), @@ -567,8 +568,8 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; - let sha1 = hex::decode(&info.file_sha1).map_err(HighwayError::HexError)?; + let sha1 = info.file_sha1.unhex().map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let size = video.video_thumb_size as u32; let extend = Ntv2RichMediaHighwayExt { file_uuid: index.file_uuid.to_owned(), @@ -708,7 +709,7 @@ impl BusinessHandle { name: record .file_path .clone() - .unwrap_or_else(|| format!("{}.amr", hex::encode(&md5))), + .unwrap_or_else(|| format!("{}.amr", &md5.hex())), md5, sha1, }, @@ -735,8 +736,8 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let sha1 = hex::decode(&info.file_sha1).map_err(HighwayError::HexError)?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; + let sha1 = info.file_sha1.unhex().map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let extend = Ntv2RichMediaHighwayExt { file_uuid: index_node.file_uuid.to_owned(), u_key: res.res.u_key.to_owned().unwrap(), @@ -796,7 +797,7 @@ impl BusinessHandle { name: record .file_path .clone() - .unwrap_or_else(|| format!("{}.mp3", hex::encode(&sha1))), + .unwrap_or_else(|| format!("{}.mp3", &sha1.hex())), md5, sha1, } @@ -823,8 +824,8 @@ impl BusinessHandle { .info .as_ref() .ok_or(ManiaError::GenericError(Cow::from("No info in response")))?; - let sha1 = hex::decode(&info.file_sha1).map_err(HighwayError::HexError)?; - let md5 = hex::decode(&info.file_hash).map_err(HighwayError::HexError)?; + let sha1 = info.file_sha1.unhex().map_err(HighwayError::HexError)?; + let md5 = info.file_hash.unhex().map_err(HighwayError::HexError)?; let extend = Ntv2RichMediaHighwayExt { file_uuid: index_node.file_uuid.to_owned(), u_key: res.res.u_key.to_owned().unwrap(), diff --git a/mania/src/core/operation/wt_op.rs b/mania/src/core/operation/wt_op.rs index a3ef567..4f90f00 100644 --- a/mania/src/core/operation/wt_op.rs +++ b/mania/src/core/operation/wt_op.rs @@ -11,6 +11,7 @@ use crate::core::http; use crate::core::session::QrSign; use crate::event::system::SystemEvent; use crate::event::system::bot_online::BotOnlineEvent; +use crate::utility::extensions::HexString; use crate::{KeyStore, ManiaError, ManiaResult}; use bytes::Bytes; use std::borrow::Cow; @@ -193,7 +194,7 @@ impl BusinessHandle { tracing::info!("Online success"); tracing::debug!( "d2key: {:?}", - hex::encode(**self.context.key_store.session.d2_key.load()) + (**self.context.key_store.session.d2_key.load()).hex() ); self.event_dispatcher .system diff --git a/mania/src/core/packet.rs b/mania/src/core/packet.rs index a297bb8..7b56293 100644 --- a/mania/src/core/packet.rs +++ b/mania/src/core/packet.rs @@ -14,6 +14,7 @@ use crate::core::crypto::tea; use crate::core::protos::service::oidb::{OidbLafter, OidbSvcTrpcTcpBase}; use crate::core::protos::system::{NtDeviceSign, NtPacketUid, Sign}; use crate::dda; +use crate::utility::extensions::HexString; #[repr(u8)] #[derive(Debug, Copy, Clone, PartialEq)] @@ -125,7 +126,7 @@ impl Debug for SsoPacket { .field("packet_type", &self.packet_type) .field("command", &self.command) .field("sequence", &self.sequence) - .field("payload", &hex::encode(&self.payload.0)) + .field("payload", &self.payload.0.hex()) .finish() } } @@ -208,7 +209,7 @@ impl SsoPacket { .section(|p| p.bytes(&ctx.key_store.session.tgt.load())) // tgt .section(|p| p.string(&self.command)) // command .section(|p| p) // unknown - .section(|p| p.string(&hex::encode(ctx.device.uuid))) // uuid + .section(|p| p.string(&ctx.device.uuid.hex())) // uuid .section(|p| p) // unknown .section_16(|p| p.string(ctx.app_info.current_version)) // version .section(|signature| { diff --git a/mania/src/core/sign.rs b/mania/src/core/sign.rs index 7b0259f..5eedc5f 100644 --- a/mania/src/core/sign.rs +++ b/mania/src/core/sign.rs @@ -1,4 +1,5 @@ use crate::core::context::Protocol; +use crate::utility::extensions::HexString; use bytes::Bytes; use phf::{Set, phf_set}; use serde::{Deserialize, Deserializer}; @@ -60,9 +61,7 @@ where D: Deserializer<'de>, { let str = String::deserialize(deserializer)?; - Ok(Bytes::from( - hex::decode(str).map_err(serde::de::Error::custom)?, - )) + Ok(Bytes::from(str.unhex().map_err(serde::de::Error::custom)?)) } pub trait SignProvider: Send + Sync { diff --git a/mania/src/core/sign/linux.rs b/mania/src/core/sign/linux.rs index 981346a..a3db0fa 100644 --- a/mania/src/core/sign/linux.rs +++ b/mania/src/core/sign/linux.rs @@ -1,5 +1,6 @@ use crate::core::http; use crate::core::sign::{SignProvider, SignResult}; +use crate::utility::extensions::HexString; use bytes::Bytes; use reqwest::header::HeaderMap; use serde::{Deserialize, Serialize}; @@ -36,7 +37,7 @@ impl SignProvider for LinuxSignProvider { let request_body = SignServerReq { cmd: cmd.to_string(), seq, - src: hex::encode(body), + src: body.hex(), }; let payload = match serde_json::to_vec(&request_body) { Ok(payload) => payload, diff --git a/mania/src/core/tlv.rs b/mania/src/core/tlv.rs index 46810b9..82945b8 100644 --- a/mania/src/core/tlv.rs +++ b/mania/src/core/tlv.rs @@ -271,6 +271,7 @@ mod prelude { pub use crate::core::crypto::tea::tea_encrypt; pub use crate::core::packet::{PacketBuilder, PacketReader}; pub use crate::core::tlv::{TlvDe, TlvError, TlvSer, serialize_tlv_set}; + pub use crate::utility::extensions::HexString; pub use bytes::Bytes; pub use prost::Message; pub use uuid::Uuid; diff --git a/mania/src/core/tlv/t106.rs b/mania/src/core/tlv/t106.rs index 4d9d57c..3974cf3 100644 --- a/mania/src/core/tlv/t106.rs +++ b/mania/src/core/tlv/t106.rs @@ -20,7 +20,7 @@ impl TlvSer for T106 { app_client_version: ctx.app_info.app_client_version as i32, uin: **ctx.key_store.uin.load() as i32, password_md5: ctx.key_store.password_md5.load().as_ref().to_owned(), - guid: hex::encode(ctx.device.uuid), + guid: ctx.device.uuid.hex(), tgtgt_key: ctx.session.stub.tgtgt_key.load().as_ref().to_owned(), ip: [0, 0, 0, 0], save_password: true, diff --git a/mania/src/message/entity.rs b/mania/src/message/entity.rs index ea6287e..06e3a6d 100644 --- a/mania/src/message/entity.rs +++ b/mania/src/message/entity.rs @@ -225,6 +225,7 @@ mod prelude { pub use crate::message::chain::{ClientSequence, MessageId}; pub use crate::message::entity::{MessageContentImpl, MessageEntity}; pub use crate::utility::compress::*; + pub use crate::utility::extensions::HexString; pub use bytes::Bytes; pub use chrono::{DateTime, Utc}; pub use mania_macros::pack_content; diff --git a/mania/src/message/entity/file.rs b/mania/src/message/entity/file.rs index 1b4f56a..cc6e4b6 100644 --- a/mania/src/message/entity/file.rs +++ b/mania/src/message/entity/file.rs @@ -66,7 +66,7 @@ impl MessageEntity for FileEntity { let extra = GroupFileExtra::decode(data).ok()?.inner?.info?; Some(dda!(Self { file_size: extra.file_size, - file_md5: Bytes::from(hex::decode(&extra.file_md5).ok()?), + file_md5: Bytes::from(extra.file_md5.unhex().ok()?), file_name: extra.file_name, extra: Some(FileUnique::Group(FileGroupUnique { file_id: Some(extra.file_id.to_owned()), diff --git a/mania/src/message/entity/image.rs b/mania/src/message/entity/image.rs index b82d90a..b77744b 100644 --- a/mania/src/message/entity/image.rs +++ b/mania/src/message/entity/image.rs @@ -113,7 +113,7 @@ impl MessageEntity for ImageEntity { height: index.info.as_ref()?.height, width: index.info.as_ref()?.width, file_path: Some(index.info.as_ref()?.file_name.clone()), - md5: Bytes::from(hex::decode(&index.info.as_ref()?.file_hash).ok()?), + md5: Bytes::from(index.info.as_ref()?.file_hash.unhex().ok()?), size: index.info.as_ref()?.file_size, msg_info: Some(extra.clone()), sub_type: ext_biz_info.pic.as_ref()?.biz_type, diff --git a/mania/src/message/entity/market_face.rs b/mania/src/message/entity/market_face.rs index 347687c..435337e 100644 --- a/mania/src/message/entity/market_face.rs +++ b/mania/src/message/entity/market_face.rs @@ -34,7 +34,7 @@ impl MessageEntity for MarketFaceEntity { fn unpack_element(elem: &Elem) -> Option { let market_face = elem.market_face.as_ref()?; Some(Self { - emoji_id: hex::encode(market_face.face_id.as_ref()?), + emoji_id: market_face.face_id.as_ref()?.hex(), emoji_package_id: market_face.tab_id?, key: market_face.key.clone()?, summary: market_face.face_name.clone()?, diff --git a/mania/src/message/entity/record.rs b/mania/src/message/entity/record.rs index 82f7271..2204544 100644 --- a/mania/src/message/entity/record.rs +++ b/mania/src/message/entity/record.rs @@ -72,7 +72,7 @@ impl MessageEntity for RecordEntity { &index.info.as_ref()?.file_hash, ); { - let md5 = Bytes::from(hex::decode(sha1).ok()?); + let md5 = Bytes::from(sha1.unhex().ok()?); Some(dda!(Self { audio_uuid: Some(uuid.to_owned()), audio_name: name.to_owned(), diff --git a/mania/src/message/entity/video.rs b/mania/src/message/entity/video.rs index 0c22bc6..c3ef8d3 100644 --- a/mania/src/message/entity/video.rs +++ b/mania/src/message/entity/video.rs @@ -275,7 +275,7 @@ impl MessageEntity for VideoEntity { fn unpack_element(elem: &Elem) -> Option { elem.video_file.as_ref().map(|video_file| { dda!(Self { - video_hash: hex::encode(&video_file.file_md5), + video_hash: video_file.file_md5.hex(), height: video_file.file_height, width: video_file.file_width, video_size: video_file.file_size, diff --git a/mania/src/utility/extensions.rs b/mania/src/utility/extensions.rs new file mode 100644 index 0000000..a40d99f --- /dev/null +++ b/mania/src/utility/extensions.rs @@ -0,0 +1,16 @@ +use hex::FromHexError; + +pub trait HexString { + fn hex(&self) -> String; + fn unhex(&self) -> Result, FromHexError>; +} + +impl> HexString for T { + fn hex(&self) -> String { + hex::encode(self.as_ref()) + } + + fn unhex(&self) -> Result, FromHexError> { + hex::decode(self.as_ref()) + } +} diff --git a/mania/src/utility/mod.rs b/mania/src/utility/mod.rs index 13c0917..942b496 100644 --- a/mania/src/utility/mod.rs +++ b/mania/src/utility/mod.rs @@ -1,5 +1,6 @@ pub mod compress; pub mod def_default; +pub mod extensions; pub mod image_resolver; pub mod random_gen; pub mod stream_helper;