use serde::{ Deserialize, Serialize };
use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct RedPocketAward {
pub gift_id: i64,
pub num: i32,
pub gift_name: String,
pub gift_pic: String,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct PopularityRedPocket {
pub lot_id: i64,
pub sender_uid: i64,
pub sender_name: String,
pub sender_face: String,
pub join_requirement: i32,
pub danmu: String,
pub awards: Vec<RedPocketAward>,
pub start_time: i64,
pub end_time: i64,
pub last_time: i64,
pub remove_time: i64,
pub replace_time: i64,
pub current_time: i64,
pub lot_status: i32,
pub h5_url: String,
pub user_status: i32,
pub lot_config_id: i64,
pub total_price: i64,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct ActivityBoxInfo {
#[serde(flatten)]
pub extra: Option<serde_json::Value>,
}
#[derive(Debug, Serialize, Clone, Deserialize)]
pub struct LotteryInfoData {
pub popularity_red_pocket: Option<Vec<PopularityRedPocket>>,
pub activity_box_info: Option<ActivityBoxInfo>,
#[serde(flatten)]
pub extra: serde_json::Value,
}
pub type LotteryInfoResponse = BpiResponse<LotteryInfoData>;
impl BpiClient {
pub async fn live_lottery_info(&self, room_id: i64) -> Result<LotteryInfoResponse, BpiError> {
let params = [("roomid", room_id.to_string())];
let resp: LotteryInfoResponse = self
.get(
"https://api.live.bilibili.com/xlive/lottery-interface/v1/lottery/getLotteryInfoWeb"
)
.query(¶ms)
.send_bpi("获取指定直播间的红包信息").await?;
Ok(resp)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_get_live_lottery_info() -> Result<(), Box<BpiError>> {
let bpi = BpiClient::new();
bpi.live_lottery_info(23174842).await?;
Ok(())
}
}