use crate::BilibiliRequest;
use crate::BpiError;
use crate::BpiResult;
use crate::user::UserClient;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ModifyRelationResponseData;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
pub enum RelationAction {
Follow = 1,
Unfollow = 2,
Whisper = 3,
Unwhisper = 4,
Blacklist = 5,
Unblacklist = 6,
KickFan = 7,
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
pub enum RelationSource {
MonthlyCharge = 1,
Space = 11,
Video = 14,
Comment = 15,
VideoEndPage = 17,
H5Recommend = 58,
H5FollowingList = 106,
H5FanList = 107,
Article = 115,
Message = 118,
Search = 120,
VideoPlayerButton = 164,
H5CommonFollow = 167,
CreativeIncentive = 192,
ActivityPage = 222,
JointVideo = 229,
MessageCenterLike = 235,
VideoPlayerDanmaku = 245,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct UserModifyRelationParams {
fid: u64,
action: RelationAction,
source: Option<RelationSource>,
}
impl UserModifyRelationParams {
pub fn new(fid: u64, action: RelationAction) -> BpiResult<Self> {
if fid == 0 {
return Err(BpiError::invalid_parameter("fid", "id must be non-zero"));
}
Ok(Self {
fid,
action,
source: None,
})
}
pub fn source(mut self, source: RelationSource) -> Self {
self.source = Some(source);
self
}
fn into_multipart(self, csrf: &str) -> reqwest::multipart::Form {
let mut form = reqwest::multipart::Form::new()
.text("fid", self.fid.to_string())
.text("act", (self.action as u8).to_string())
.text("csrf", csrf.to_string());
if let Some(source) = self.source {
form = form.text("re_src", (source as u32).to_string());
}
form
}
}
impl<'a> UserClient<'a> {
pub async fn modify_relation(&self, params: UserModifyRelationParams) -> BpiResult<Option<()>> {
let csrf = self.client.csrf()?;
let form = params.into_multipart(&csrf);
self.client
.post("https://api.bilibili.com/x/relation/modify")
.multipart(form)
.send_bpi_optional_payload("user.relation.modify")
.await
}
}
#[cfg(test)]
mod tests {}