use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::{ Deserialize, Serialize };
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct UserCoupon {
#[serde(rename = "ID")]
pub id: i32,
pub remain_amount: i32,
pub total_amount: u32,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct CouponsData {
pub total_remain_amount: i32,
pub user_coupons: Vec<UserCoupon>,
pub coupon_info: CouponInfo,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CouponInfo {
pub remain_coupon: i64,
pub remain_silver: i64,
pub remain_shop_coupon: i64,
}
#[derive(Debug, Clone, Serialize)]
pub struct GetCouponsRequest {
#[serde(rename = "pageNum")]
pub page_num: i32,
#[serde(rename = "pageSize")]
pub page_size: i32,
#[serde(rename = "notExpired", skip_serializing_if = "Option::is_none")]
pub not_expired: Option<bool>,
#[serde(rename = "tabType", skip_serializing_if = "Option::is_none")]
pub tab_type: Option<i32>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub r#type: Option<i32>,
}
impl BpiClient {
pub async fn manga_coupons(
&self,
page_num: i32,
page_size: i32
) -> Result<BpiResponse<CouponsData>, BpiError> {
let params = GetCouponsRequest {
page_num: page_num,
page_size: page_size,
not_expired: Some(true),
tab_type: Some(1),
r#type: Some(0),
};
self
.post("https://manga.bilibili.com/twirp/user.v1.User/GetCoupons")
.json(¶ms)
.send_bpi("获取漫读券列表").await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_get_manga_coupons() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
let result = bpi.manga_coupons(1, 20).await?;
tracing::info!("{:#?}", result.data.unwrap());
Ok(())
}
}