Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement the LinkShare #90

Merged
merged 1 commit into from
Dec 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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