use crate::BilibiliRequest;
use crate::BpiResult;
use crate::login::LoginClient;
use serde::{Deserialize, Serialize};
const LOGOUT_WEB_ENDPOINT: &str = "https://passport.bilibili.com/login/exit/v2";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogoutData {
#[serde(rename = "redirectUrl")]
pub redirect_url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogoutResponse {
pub code: i32,
pub status: bool,
pub ts: u64,
pub message: Option<String>,
pub data: Option<LogoutData>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LogoutWebParams {
gourl: String,
}
impl Default for LogoutWebParams {
fn default() -> Self {
Self {
gourl: "javascript:history.go(-1)".to_string(),
}
}
}
impl LogoutWebParams {
pub fn new() -> Self {
Self::default()
}
pub fn gourl(mut self, gourl: impl Into<String>) -> Self {
self.gourl = gourl.into();
self
}
fn form_pairs(&self, csrf: &str) -> Vec<(&'static str, String)> {
vec![
("biliCSRF", csrf.to_string()),
("gourl", self.gourl.clone()),
]
}
}
impl<'a> LoginClient<'a> {
pub async fn logout(&self, params: LogoutWebParams) -> BpiResult<LogoutData> {
let csrf = self.client.csrf()?;
let form = params.form_pairs(&csrf);
self.client
.post(LOGOUT_WEB_ENDPOINT)
.form(&form)
.send_bpi_payload("login.logout")
.await
}
}
#[cfg(test)]
mod tests {}