bpi_rs/user/relation/
action.rs1use crate::BilibiliRequest;
8use crate::BpiError;
9use crate::BpiResult;
10use crate::user::UserClient;
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, Deserialize, Serialize)]
18pub struct ModifyRelationResponseData;
19
20#[repr(u8)]
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
27pub enum RelationAction {
28 Follow = 1,
30 Unfollow = 2,
32 Whisper = 3,
34 Unwhisper = 4,
36 Blacklist = 5,
38 Unblacklist = 6,
40 KickFan = 7,
42}
43
44#[repr(u32)]
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
49pub enum RelationSource {
50 MonthlyCharge = 1,
52 Space = 11,
54 Video = 14,
56 Comment = 15,
58 VideoEndPage = 17,
60 H5Recommend = 58,
62 H5FollowingList = 106,
64 H5FanList = 107,
66 Article = 115,
68 Message = 118,
70 Search = 120,
72 VideoPlayerButton = 164,
74 H5CommonFollow = 167,
76 CreativeIncentive = 192,
78 ActivityPage = 222,
80 JointVideo = 229,
82 MessageCenterLike = 235,
84 VideoPlayerDanmaku = 245,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
90pub struct UserModifyRelationParams {
91 fid: u64,
92 action: RelationAction,
93 source: Option<RelationSource>,
94}
95
96impl UserModifyRelationParams {
97 pub fn new(fid: u64, action: RelationAction) -> BpiResult<Self> {
98 if fid == 0 {
99 return Err(BpiError::invalid_parameter("fid", "id must be non-zero"));
100 }
101
102 Ok(Self {
103 fid,
104 action,
105 source: None,
106 })
107 }
108
109 pub fn source(mut self, source: RelationSource) -> Self {
110 self.source = Some(source);
111 self
112 }
113
114 fn into_multipart(self, csrf: &str) -> reqwest::multipart::Form {
115 let mut form = reqwest::multipart::Form::new()
116 .text("fid", self.fid.to_string())
117 .text("act", (self.action as u8).to_string())
118 .text("csrf", csrf.to_string());
119
120 if let Some(source) = self.source {
121 form = form.text("re_src", (source as u32).to_string());
122 }
123
124 form
125 }
126}
127
128impl<'a> UserClient<'a> {
131 pub async fn modify_relation(&self, params: UserModifyRelationParams) -> BpiResult<Option<()>> {
133 let csrf = self.client.csrf()?;
134 let form = params.into_multipart(&csrf);
135
136 self.client
137 .post("https://api.bilibili.com/x/relation/modify")
138 .multipart(form)
139 .send_bpi_optional_payload("user.relation.modify")
140 .await
141 }
142}
143
144#[cfg(test)]
145mod tests {}