Skip to content

Commit

Permalink
Implement the LinkShare (#90)
Browse files Browse the repository at this point in the history
  • Loading branch information
kkocdko authored Dec 8, 2022
1 parent 823f19b commit c3ec94e
Show file tree
Hide file tree
Showing 9 changed files with 118 additions and 28 deletions.
62 changes: 54 additions & 8 deletions ricq-core/src/command/oidb_svc/builder.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use bytes::{BufMut, BytesMut};

use crate::command::common::PbToBytes;
use crate::command::oidb_svc::music::{MusicShare, MusicVersion, SendMusicTarget};
use crate::command::oidb_svc::link::LinkShare;
use crate::command::oidb_svc::music::{MusicShare, MusicVersion};
use crate::command::oidb_svc::share::ShareTarget;
use crate::command::oidb_svc::ProfileDetailUpdate;
use crate::pb;
use crate::protocol::packet::Packet;
Expand Down Expand Up @@ -304,7 +306,7 @@ impl super::super::super::Engine {

pub fn build_share_music_request_packet(
&self,
send_music_target: SendMusicTarget,
share_target: ShareTarget,
music_share: MusicShare,
music_version: &'static MusicVersion,
) -> Packet {
Expand All @@ -323,11 +325,11 @@ impl super::super::super::Engine {
android_signature: music_version.signature.into(),
..Default::default()
}),
send_type: send_music_target.send_type(),
recv_uin: match send_music_target {
SendMusicTarget::Friend(uin) => uin as u64,
SendMusicTarget::Group(code) => code as u64,
SendMusicTarget::Guild { channel_id, .. } => channel_id,
send_type: share_target.send_type(),
recv_uin: match share_target {
ShareTarget::Friend(uin) => uin as u64,
ShareTarget::Group(code) => code as u64,
ShareTarget::Guild { channel_id, .. } => channel_id,
},
rich_msg_body: Some(pb::oidb::Db77RichMsgBody {
title: music_share.title,
Expand All @@ -338,7 +340,51 @@ impl super::super::super::Engine {
music_url: music_share.music_url,
..Default::default()
}),
recv_guild_id: if let SendMusicTarget::Guild { guild_id, .. } = send_music_target {
recv_guild_id: if let ShareTarget::Guild { guild_id, .. } = share_target {
guild_id
} else {
0
},
..Default::default()
};
let payload = self.transport.encode_oidb_packet(0xb77, 9, body.to_bytes());
self.uni_packet("OidbSvc.0xb77_9", payload)
}

pub fn build_share_link_request_packet(
&self,
share_target: ShareTarget,
link_share: LinkShare,
) -> Packet {
let body = pb::oidb::Db77ReqBody {
app_id: 100446242,
app_type: 1,
msg_style: 0,
client_info: Some(pb::oidb::Db77ClientInfo {
platform: 1,
sdk_version: "0.0.0".into(),
android_package_name: "com.tencent.mtt".into(),
android_signature: "d8391a394d4a179e6fe7bdb8a301258b".into(),
..Default::default()
}),
send_type: share_target.send_type(),
recv_uin: match share_target {
ShareTarget::Friend(uin) => uin as u64,
ShareTarget::Group(code) => code as u64,
ShareTarget::Guild { channel_id, .. } => channel_id,
},
rich_msg_body: Some(pb::oidb::Db77RichMsgBody {
summary: link_share.summary.unwrap_or_default(),
brief: link_share
.brief
.unwrap_or_else(|| format!("[分享] {}", link_share.title)),
title: link_share.title,
url: link_share.url,
picture_url: link_share.picture_url.unwrap_or_else(|| "".into()),
music_url: String::new(),
action: String::new(),
}),
recv_guild_id: if let ShareTarget::Guild { guild_id, .. } = share_target {
guild_id
} else {
0
Expand Down
9 changes: 9 additions & 0 deletions ricq-core/src/command/oidb_svc/link.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
pub struct LinkShare {
pub title: String,
pub summary: Option<String>,
/// 从消息列表中看到的文字,默认为 "[分享]" + title
pub brief: Option<String>,
/// 预览图网址, 默认为 QQ 浏览器图标,似乎对域名有限制
pub picture_url: Option<String>,
pub url: String,
}
2 changes: 2 additions & 0 deletions ricq-core/src/command/oidb_svc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ use crate::pb;

pub mod builder;
pub mod decoder;
pub mod link;
pub mod music;
pub mod share;

// 群 @全体 剩余次数
#[derive(Default, Debug)]
Expand Down
16 changes: 0 additions & 16 deletions ricq-core/src/command/oidb_svc/music.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,3 @@
pub enum SendMusicTarget {
Friend(i64),
Group(i64),
Guild { guild_id: u64, channel_id: u64 },
}

impl SendMusicTarget {
pub fn send_type(&self) -> u32 {
match self {
SendMusicTarget::Friend { .. } => 0,
SendMusicTarget::Group { .. } => 1,
SendMusicTarget::Guild { .. } => 3,
}
}
}

pub struct MusicShare {
pub title: String,
pub brief: String,
Expand Down
15 changes: 15 additions & 0 deletions ricq-core/src/command/oidb_svc/share.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
pub enum ShareTarget {
Friend(i64),
Group(i64),
Guild { guild_id: u64, channel_id: u64 },
}

impl ShareTarget {
pub fn send_type(&self) -> u32 {
match self {
ShareTarget::Friend { .. } => 0,
ShareTarget::Group { .. } => 1,
ShareTarget::Guild { .. } => 3,
}
}
}
1 change: 1 addition & 0 deletions ricq-core/src/msg/elem/light_app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::msg::{MessageElem, PushElem};
use crate::pb::msg;
use crate::{push_builder_impl, to_elem_vec_impl};

// Some of the share card message will be a LightApp with pkg id `com.tencent.structmsg`
#[derive(Default, Debug, Clone)]
pub struct LightApp {
pub content: String,
Expand Down
3 changes: 3 additions & 0 deletions ricq-core/src/structs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ use bytes::Bytes;
use std::time::Duration;

pub use crate::command::multi_msg::{ForwardMessage, ForwardNode, MessageNode};
pub use crate::command::oidb_svc::link::LinkShare;
pub use crate::command::oidb_svc::music as music_share; // TODO: merge to share module
pub use crate::command::oidb_svc::share::ShareTarget;
pub use crate::command::oidb_svc::ProfileDetailUpdate;
pub use crate::command::stat_svc::{CustomOnlineStatus, ExtOnlineStatus, OnlineStatus, Status};
use crate::msg::MessageChain;
Expand Down
17 changes: 15 additions & 2 deletions ricq/src/client/api/friend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ use std::time::Duration;
use bytes::BufMut;

use ricq_core::command::long_conn::OffPicUpResp;
use ricq_core::command::oidb_svc::music::{MusicShare, MusicType, SendMusicTarget};
use ricq_core::command::oidb_svc::link::LinkShare;
use ricq_core::command::oidb_svc::music::{MusicShare, MusicType};
use ricq_core::command::oidb_svc::share::ShareTarget;
use ricq_core::command::{friendlist::*, profile_service::*};
use ricq_core::hex::encode_hex;
use ricq_core::highway::BdhInput;
Expand Down Expand Up @@ -256,14 +258,25 @@ impl super::super::Client {
music_type: MusicType,
) -> RQResult<()> {
let req = self.engine.read().await.build_share_music_request_packet(
SendMusicTarget::Friend(uin),
ShareTarget::Friend(uin),
music_share,
music_type.version(),
);
let _ = self.send_and_wait(req).await?;
Ok(())
}

/// 分享链接
pub async fn send_friend_link_share(&self, uin: i64, link_share: LinkShare) -> RQResult<()> {
let req = self
.engine
.read()
.await
.build_share_link_request_packet(ShareTarget::Friend(uin), link_share);
let _ = self.send_and_wait(req).await?;
Ok(())
}

// 撤回好友消息
pub async fn recall_friend_message(
&self,
Expand Down
21 changes: 19 additions & 2 deletions ricq/src/client/api/group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ use cached::Cached;
use ricq_core::command::common::PbToBytes;
use ricq_core::command::img_store::GroupImageStoreResp;
use ricq_core::command::multi_msg::gen_forward_preview;
use ricq_core::command::oidb_svc::music::{MusicShare, MusicType, SendMusicTarget};
use ricq_core::command::oidb_svc::link::LinkShare;
use ricq_core::command::oidb_svc::music::{MusicShare, MusicType};
use ricq_core::command::oidb_svc::share::ShareTarget;
use ricq_core::command::{friendlist::*, oidb_svc::*, profile_service::*};
use ricq_core::common::group_code2uin;
use ricq_core::hex::encode_hex;
Expand Down Expand Up @@ -438,14 +440,29 @@ impl super::super::Client {
music_type: MusicType,
) -> RQResult<()> {
let req = self.engine.read().await.build_share_music_request_packet(
SendMusicTarget::Group(group_code),
ShareTarget::Group(group_code),
music_share,
music_type.version(),
);
let _ = self.send_and_wait(req).await?;
Ok(())
}

/// 分享链接
pub async fn send_group_link_share(
&self,
group_code: i64,
link_share: LinkShare,
) -> RQResult<()> {
let req = self
.engine
.read()
.await
.build_share_link_request_packet(ShareTarget::Group(group_code), link_share);
let _ = self.send_and_wait(req).await?;
Ok(())
}

/// 修改群名片
pub async fn edit_group_member_card(
&self,
Expand Down

0 comments on commit c3ec94e

Please sign in to comment.