twitch_tohell 0.1.1

Twitch EventSub webhook and WebSocket support
Documentation
use chrono::{DateTime, FixedOffset};
use serde::{Deserialize, Serialize};

use crate::{BroadcasterId, RedemptionId, UserId};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChannelPointsAutomaticRewardRedemptionAdd {
    pub broadcaster_user_id: BroadcasterId,
    pub broadcaster_user_login: String,
    pub broadcaster_user_name: String,
    pub user_id: UserId,
    pub user_login: String,
    pub user_name: String,
    pub id: RedemptionId,
    pub reward: Reward,
    pub message: Option<Message>,
    pub redeemed_at: DateTime<FixedOffset>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reward {
    #[serde(rename = "type")]
    pub kind: RewardType,
    pub channel_points: u64,
    pub emote: Option<RewardEmote>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RewardEmote {
    pub id: String,
    pub name: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RewardType {
    SingleMessageBypassSubMode,
    SendHighlightedMessage,
    RandomSubEmoteUnlock,
    ChosenSubEmoteUnlock,
    ChosenModifiedSubEmoteUnlock,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    pub text: String,
    pub fragments: Vec<Fragment>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Fragment {
    pub text: String,
    #[serde(rename = "type")]
    pub kind: FragmenetType,
    pub emote: Emote,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum FragmenetType {
    Text,
    Emote,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Emote {
    pub id: String,
}