Skip to main content

chzzk/data/
channel.rs

1use super::string_like;
2use crate::ChzzkDateTime;
3use std::ops::Deref;
4
5string_like! {ChannelId} // Hexadecimal channel id
6string_like! {ChatChannelId} // 6-letters-long chat id
7
8#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
9pub struct Channel {
10    #[serde(rename = "channelId")]
11    pub channel_id: ChannelId,
12    #[serde(rename = "channelName")]
13    pub channel_name: String,
14    #[serde(rename = "channelImageUrl")]
15    pub channel_image_url: Option<String>,
16    #[serde(rename = "verifiedMark")]
17    pub verified_mark: bool,
18    #[serde(rename = "channelType")]
19    pub channel_type: String,
20    #[serde(rename = "channelDescription")]
21    pub channel_description: String,
22    #[serde(rename = "followerCount")]
23    pub follower_count: usize,
24    #[serde(rename = "openLive")]
25    pub open_live: bool,
26    #[serde(rename = "subscriptionAvailability")]
27    pub subscription_availability: bool,
28    #[serde(rename = "subscriptionPaymentAvailability")]
29    pub subscription_payment_availability: SubscriptionPaymentAvailability,
30    #[serde(rename = "adMonetizationAvailability")]
31    pub ad_monetization_availability: bool,
32    // #[serde(rename = "activatedChannelBadgeIds")]
33    // pub activated_channel_badge_ids: Unknown,
34}
35
36#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
37pub struct SubscriptionPaymentAvailability {
38    #[serde(rename = "iapAvailability")]
39    pub iap_availability: bool,
40    #[serde(rename = "iabAvailability")]
41    pub iab_availability: bool,
42}
43
44#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
45pub enum LiveStatus {
46    #[default]
47    Close,
48    Open,
49}
50
51impl<'de> serde::Deserialize<'de> for LiveStatus {
52    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
53    where
54        D: serde::Deserializer<'de>,
55    {
56        let s = String::deserialize(deserializer)?;
57        match s.as_str() {
58            "CLOSE" => Ok(LiveStatus::Close),
59            "OPEN" => Ok(LiveStatus::Open),
60            _ => Err(serde::de::Error::custom("unexpected value")),
61        }
62    }
63}
64
65#[derive(serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
66pub struct ChannelLiveStatus {
67    #[serde(rename = "liveTitle")]
68    pub live_title: String,
69    pub status: LiveStatus,
70    #[serde(rename = "concurrentUserCount")]
71    pub concurrent_user_count: i32,
72    #[serde(rename = "accumulateCount")]
73    pub accumulate_count: i32,
74    #[serde(rename = "paidPromotion")]
75    pub paid_promotion: bool,
76    pub adult: bool,
77    #[serde(rename = "krOnlyViewing")]
78    pub kr_only_viewing: bool,
79    #[serde(rename = "openDate")]
80    pub open_date: Option<ChzzkDateTime>,
81    #[serde(rename = "closeDate")]
82    pub close_date: Option<ChzzkDateTime>,
83    #[serde(rename = "clipActive")]
84    pub clip_active: bool,
85    #[serde(rename = "chatChannelId")]
86    pub chat_channel_id: ChatChannelId,
87    pub tags: Vec<String>,
88    #[serde(rename = "categoryType")]
89    pub category_type: Option<String>,
90    #[serde(rename = "liveCategory")]
91    pub live_category: Option<String>,
92    #[serde(rename = "liveCategoryValue")]
93    pub live_category_value: String,
94    // #[serde(rename = "faultStatus")]
95    // pub fault_status: Unknown,
96    #[serde(rename = "userAdultStatus")]
97    pub user_adult_status: String,
98    // #[serde(rename = "blindType")]
99    // pub blind_type: Unknown,
100    // #[serde(rename = "playerRecommendContent")]
101    // pub player_recommend_content: Unknown,
102    #[serde(rename = "chatActive")]
103    pub chat_active: bool,
104    #[serde(rename = "chatAvailableGroup")]
105    pub chat_available_group: String,
106    #[serde(rename = "chatAvailableCondition")]
107    pub chat_available_condition: String,
108    #[serde(rename = "minFollowerMinute")]
109    pub min_follower_minute: i32,
110    #[serde(rename = "allowSubscriberInFollowerMode")]
111    pub allow_subscriber_in_follower_mode: bool,
112    #[serde(rename = "chatDonationRankingExposure")]
113    pub chat_donation_ranking_exposure: bool,
114    // #[serde(rename = "dropsCampaignNo")]
115    // pub drops_campaign_no: Unknown,
116    // #[serde(rename = "liveTokenList")]
117    // pub live_token_list: Unknown,
118    // #[serde(rename = "watchPartyNo")]
119    // pub watch_party_no: Unknown,
120    // #[serde(rename = "watchPartyTag")]
121    // pub watch_party_tag: Unknown,
122}
123
124impl ChannelLiveStatus {
125    pub fn open_or<E>(self, err: E) -> Result<Self, E> {
126        if self.status == LiveStatus::Open {
127            Ok(self)
128        } else {
129            Err(err)
130        }
131    }
132}
133
134#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
135pub struct ChatAccessToken {
136    #[serde(rename = "accessToken")]
137    pub access_token: String,
138    // #[serde(rename = "temporaryRestrict")]
139    // pub temporary_restrict: Unknown,
140    #[serde(rename = "realNameAuth")]
141    pub real_name_auth: bool,
142    #[serde(rename = "extraToken")]
143    pub extra_token: String,
144}