UNPKG

twitch-eventsub-client

Version:

A Twitch EventSub WebSocket client for Node.js

1,798 lines (1,796 loc) 119 kB
import { EventEmitter } from 'events'; import { AxiosError } from 'axios'; interface KeepaliveMessageMetadata extends EventSubMessageMetadata { message_type: 'session_keepalive'; } type KeepaliveMessagePayload = {}; type KeepaliveMessage = EventSubMessage<KeepaliveMessageMetadata, KeepaliveMessagePayload>; interface AutomodMessageHoldEventV1 { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; message_id: string; message: [ { text: string; fragments: [ { text: string; emote: { id: string; emote_set_id: string; } | null; cheermote: { prefix: string; bits: number; tier: number; } | null; } ]; } ]; category: string; level: number; held_at: string; } interface AutomodMessageHoldEventV2 { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; message_id: string; message: [ { text: string; fragments: [ { type: 'text' | 'emote' | 'cheermote'; text: string; emote: { id: string; emote_set_id: string; } | null; cheermote: { prefix: string; bits: number; tier: number; } | null; } ]; } ]; held_at: string; reason: 'automod' | 'blocked_term'; automod: { category: string; level: number; boundaries: [ { start_pos: number; end_pos: number; } ]; blocked_term: { terms_found: [ { term_id: string; boundary: { start_pos: number; end_pos: number; }; owner_broadcaster_user_id: string; owner_broadcaster_user_login: string; owner_broadcaster_user_name: string; } ]; } | null; } | null; } interface AutomodMessageUpdateEventV1 { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; message_id: string; message: [ { text: string; fragments: [ { text: string; emote: { id: string; emote_set_id: string; } | null; cheermote: { prefix: string; bits: number; tier: number; } | null; } ]; } ]; category: string; level: number; status: 'Approved' | 'Denied' | 'Expired'; held_at: string; } interface AutomodMessageUpdateEventV2 { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; message_id: string; message: [ { text: string; fragments: [ { type: 'text' | 'emote' | 'cheermote'; text: string; emote: { id: string; emote_set_id: string; } | null; cheermote: { prefix: string; bits: number; tier: number; } | null; } ]; } ]; status: 'Approved' | 'Denied' | 'Expired'; held_at: string; reason: 'automod' | 'blocked_term'; automod: { category: string; level: number; boundaries: [ { start_pos: number; end_pos: number; } ]; blocked_term: { terms_found: [ { term_id: string; boundary: { start_pos: number; end_pos: number; }; owner_broadcaster_user_id: string; owner_broadcaster_user_login: string; owner_broadcaster_user_name: string; } ]; } | null; } | null; } interface AutomodSettingsUpdateEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; bullying: number; overall_level: number | null; disability: number; race_ethnicity_or_religion: number; misogyny: number; sexuality_sex_or_gender: number; aggression: number; sex_based_terms: number; swearing: number; } interface AutomodTermsUpdateEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; action: 'add_permitted' | 'remove_permitted' | 'add_blocked' | 'remove_blocked'; from_automod: boolean; terms: string[]; } interface ChannelAdBreakBeginEvent { duration_seconds: number; started_at: string; is_automatic: boolean; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; requester_user_id: string; requester_user_login: string; requester_user_name: string; } interface ChannelBanEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; reason: string; banned_at: string; ends_at: string | null; is_permanent: boolean; } interface ChannelBitsUseEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; bits: number; type: 'cheer' | 'power_up'; message: [ { text: string; type: 'text' | 'cheermote' | 'emote'; fragments: [ { text: string; emote: { id: string; emote_set_id: string; owner_id: string; format: string[]; } | null; cheermote: { prefix: string; bits: number; tier: number; } | null; } ]; } ] | null; power_up: { type: 'message_effect' | 'celebration' | 'gigantify_an_emote'; emote: { id: string; name: string; }; message_effect_id: string; }; } interface ChannelChatClearEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcast_user_login: string; } interface ChannelChatClearUserMessagesEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcast_user_login: string; target_user_id: string; target_user_login: string; target_user_name: string; } interface ChannelChatMessageEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcast_user_login: string; chatter_user_id: string; chatter_user_name: string; chatter_user_login: string; message_id: string; message: { text: string; fragments: [ { type: 'text' | 'cheermote' | 'emote' | 'mention'; text: string; cheermote: { prefix: string; bits: number; tier: number; } | null; emote: { id: string; emote_set_id: string; owner_id: string; format: string[]; } | null; mention: { user_id: string; user_name: string; user_login: string; } | null; } ]; }; message_type: 'text' | 'channel_points_highlighted' | 'channel_points_sub_only' | 'user_intro' | 'power_ups_message_effect' | 'power_ups_gigantified_emote'; badges: [ { set_id: string; id: string; info: string; cheer: { bits: number; } | null; } ]; color: string; reply: { parent_message_id: string; parent_message_body: string; parent_user_id: string; parent_user_name: string; parent_user_login: string; thread_message_id: string; thread_user_id: string; thread_user_name: string; thread_user_login: string; } | null; channel_points_custom_reward_id: string | null; source_broadcaster_user_id: string | null; source_broadcaster_user_login: string | null; source_broadcaster_user_name: string | null; source_message_id: string | null; source_badges: [ { set_id: string; id: string; info: string; } ] | null; } interface ChannelChatMessageDeleteEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; target_user_id: string; target_user_name: string; target_user_login: string; message_id: string; } interface ChannelChatNotificationEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; chatter_user_id: string | null; chatter_user_name: string | null; chatter_user_login: string | null; chatter_is_anonymous: boolean; color: string; badges: [ { set_id: string; id: string; info: string; } ]; system_message: string; message_id: string; message: { text: string; fragments: [ { type: 'text' | 'cheermote' | 'emote' | 'mention'; text: string; cheermote: { prefix: string; bits: number; tier: number; } | null; emote: { id: string; emote_set_id: string; owner_id: string; format: string[]; } | null; mention: { user_id: string; user_name: string; user_login: string; } | null; } ]; }; notice_type: 'sub' | 'resub' | 'sub_gift' | 'community_sub_gift' | 'gift_paid_upgrade' | 'prime_paid_upgrade' | 'raid' | 'unraid' | 'pay_it_forward' | 'announcement' | 'bits_badge_tier' | 'charity_donation' | 'shared_chat_sub' | 'shared_chat_resub' | 'shared_chat_sub_gift' | 'shared_chat_community_sub_gift' | 'shared_chat_gift_paid_upgrade' | 'shared_chat_prime_paid_upgrade' | 'shared_chat_raid' | 'shared_chat_pay_it_forward' | 'shared_chat_announcement'; sub: { sub_tier: number; is_prime: boolean; duration_months: number; } | null; resub: { cumulative_months: number; duration_months: number; streak_months: number; sub_tier: number; is_prime: boolean; is_gift: boolean; gifter_is_anonymous: boolean; gifter_user_id: string | null; gifter_user_name: string | null; gifter_user_login: string | null; } | null; sub_gift: { duration_months: number; cumulative_total: number | null; recipient_user_id: string; recipient_user_name: string; recipient_user_login: string; sub_tier: number; community_gift_id: string | null; } | null; community_sub_gift: { id: string; total: number; sub_tier: number; cumulative_total: number | null; } | null; gift_paid_upgrade: { gifter_is_anonymous: boolean; gifter_user_id: string | null; gifter_user_name: string | null; gifter_user_login: string | null; } | null; prime_paid_upgrade: { sub_tier: number; } | null; pay_it_forward: { gifter_is_anonymous: boolean; gifter_user_id: string | null; gifter_user_name: string | null; gifter_user_login: string | null; }; raid: { user_id: string; user_name: string; user_login: string; viewer_count: number; profile_image_url: string; } | null; unraid: null; announcement: { color: string; } | null; bits_badge_tier: { tier: number; } | null; charity_donation: { charity_name: string; amount: { value: number; decimal_place: number; currency: string; }; } | null; source_broadcaster_user_id: string | null; source_broadcaster_user_name: string | null; source_broadcaster_user_login: string | null; source_message_id: string | null; source_badges: [ { set_id: string; id: string; info: string; } ] | null; shared_chat_sub: { sub_tier: number; is_prime: boolean; duration_months: number; } | null; shared_chat_resub: { cumulative_months: number; duration_months: number; streak_months: number; sub_tier: number; is_prime: boolean; is_gift: boolean; gifter_is_anonymous: boolean; gifter_user_id: string; gifter_user_name: string; gifter_user_login: string; } | null; shared_chat_sub_gift: { duration_months: number; cumulative_total: number | null; recipient_user_id: string; recipient_user_name: string; recipient_user_login: string; sub_tier: number; community_gift_id: string | null; } | null; shared_chat_community_sub_gift: { id: string; total: number; sub_tier: number; cumulative_total: number | null; } | null; shared_chat_gift_paid_upgrade: { gifter_is_anonymous: boolean; gifter_user_id: string | null; gifter_user_name: string | null; gifter_user_login: string | null; } | null; shared_chat_prime_paid_upgrade: { sub_tier: number; } | null; shared_chat_pay_it_forward: { gifter_is_anonymous: boolean; gifter_user_id: string | null; gifter_user_name: string | null; gifter_user_login: string | null; } | null; shared_chat_raid: { user_id: string; user_name: string; user_login: string; viewer_count: number; profile_image_url: string; } | null; shared_chat_announcement: { color: string; } | null; } interface ChannelChatSettingsUpdateEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; emote_mode: boolean; follower_mode: boolean; follower_mode_duration_minutes: number; slow_mode: boolean; slow_mode_wait_time_seconds: number; subscriber_mode: boolean; unique_chat_mode: boolean; } interface ChannelChatUserMessageHoldEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; message_id: string; message: [ { text: string; fragments: [ { text: string; emote: { id: string; emote_set_id: string; } | null; cheermote: { prefix: string; bits: number; tier: number; } | null; } ]; } ]; } interface ChannelChatUserMessageUpdateEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; status: 'approved' | 'denied' | 'invalid'; message_id: string; message: [ { text: string; fragments: [ { text: string; emote: { id: string; emote_set_id: string; } | null; cheermote: { prefix: string; bits: number; tier: number; } | null; } ]; } ]; } interface ChannelSubscribeEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; tier: string; is_gift: boolean; } interface ChannelCheerEvent { is_anonymous: boolean; user_id: string | null; user_login: string | null; user_name: string | null; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; message: string; bits: number; } interface ChannelUpdateEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; title: string; language: string; category_id: string; category_name: string; content_classification_labels: string[]; } interface ChannelUnbanEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; } interface ChannelUnbanRequestCreateEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; text: string; created_at: string; } interface ChannelUnbanRequestResolveEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; user_id: string; user_login: string; user_name: string; resolution_text: string; status: 'approved' | 'canceled' | 'denied'; } interface ChannelFollowEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; followed_at: string; } interface ChannelRaidEvent { from_broadcaster_user_id: string; from_broadcaster_user_login: string; from_broadcaster_user_name: string; to_broadcaster_user_id: string; to_broadcaster_user_login: string; to_broadcaster_user_name: string; viewers: number; } interface ChannelModerateEventV1 { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; source_broadcaster_user_id: string; source_broadcaster_user_login: string; source_broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; action: 'ban' | 'timeout' | 'unban' | 'untimeout' | 'clear' | 'emoteonly' | 'emoteonlyoff' | 'followers' | 'followersoff' | 'uniquechat' | 'uniquechatoff' | 'slow' | 'slowoff' | 'subscribers' | 'subscribersoff' | 'unraid' | 'delete' | 'unvip' | 'vip' | 'raid' | 'add_blocked_term' | 'add_permitted_term' | 'remove_blocked_term' | 'remove_permitted_term' | 'mod' | 'unmod' | 'approve_unban_request' | 'deny_unban_request' | 'shared_chat_ban' | 'shared_chat_timeout' | 'shared_chat_untimeout' | 'shared_chat_unban' | 'shared_chat_delete'; followers: { follow_duration_minutes: number; } | null; slow: { wait_time_seconds: number; } | null; vip: { user_id: string; user_login: string; user_name: string; } | null; unvip: { user_id: string; user_login: string; user_name: string; } | null; mod: { user_id: string; user_login: string; user_name: string; } | null; unmod: { user_id: string; user_login: string; user_name: string; } | null; ban: { user_id: string; user_login: string; user_name: string; } | null; unban: { user_id: string; user_login: string; user_name: string; } | null; timeout: { user_id: string; user_login: string; user_name: string; reason: string; expires_at: string; } | null; untimeout: { user_id: string; user_login: string; user_name: string; } | null; raid: { user_id: string; user_login: string; user_name: string; viewer_count: number; } | null; unraid: { user_id: string; user_login: string; user_name: string; } | null; delete: { user_id: string; user_login: string; user_name: string; message_id: string; message_body: string; } | null; automod_terms: { action: 'add' | 'remove'; list: 'blocked' | 'permitted'; terms: string[]; from_automod: boolean; } | null; unban_request: { is_approved: boolean; user_id: string; user_login: string; user_name: string; moderator_message: string; } | null; shared_chat_ban: { user_id: string; user_login: string; user_name: string; } | null; shared_chat_unban: { user_id: string; user_login: string; user_name: string; } | null; shared_chat_timeout: { user_id: string; user_login: string; user_name: string; reason: string; expires_at: string; } | null; shared_chat_untimeout: { user_id: string; user_login: string; user_name: string; } | null; shared_chat_delete: { user_id: string; user_login: string; user_name: string; message_id: string; message_body: string; } | null; } interface ChannelModerateEventV2 { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; source_broadcaster_user_id: string; source_broadcaster_user_login: string; source_broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; action: 'ban' | 'timeout' | 'unban' | 'untimeout' | 'clear' | 'emoteonly' | 'emoteonlyoff' | 'followers' | 'followersoff' | 'uniquechat' | 'uniquechatoff' | 'slow' | 'slowoff' | 'subscribers' | 'subscribersoff' | 'unraid' | 'delete' | 'unvip' | 'vip' | 'raid' | 'add_blocked_term' | 'add_permitted_term' | 'remove_blocked_term' | 'remove_permitted_term' | 'mod' | 'unmod' | 'approve_unban_request' | 'deny_unban_request' | 'warn' | 'shared_chat_ban' | 'shared_chat_timeout' | 'shared_chat_untimeout' | 'shared_chat_unban' | 'shared_chat_delete'; followers: { follow_duration_minutes: number; } | null; slow: { wait_time_seconds: number; } | null; vip: { user_id: string; user_login: string; user_name: string; } | null; unvip: { user_id: string; user_login: string; user_name: string; } | null; mod: { user_id: string; user_login: string; user_name: string; } | null; unmod: { user_id: string; user_login: string; user_name: string; } | null; ban: { user_id: string; user_login: string; user_name: string; } | null; unban: { user_id: string; user_login: string; user_name: string; } | null; timeout: { user_id: string; user_login: string; user_name: string; reason: string; expires_at: string; } | null; untimeout: { user_id: string; user_login: string; user_name: string; } | null; raid: { user_id: string; user_login: string; user_name: string; viewer_count: number; } | null; unraid: { user_id: string; user_login: string; user_name: string; } | null; delete: { user_id: string; user_login: string; user_name: string; message_id: string; message_body: string; } | null; automod_terms: { action: 'add' | 'remove'; list: 'blocked' | 'permitted'; terms: string[]; from_automod: boolean; } | null; unban_request: { is_approved: boolean; user_id: string; user_login: string; user_name: string; moderator_message: string; } | null; warn: { user_id: string; user_login: string; user_name: string; reason: string | null; chat_rules_cited: string[] | null; } | null; shared_chat_ban: { user_id: string; user_login: string; user_name: string; } | null; shared_chat_unban: { user_id: string; user_login: string; user_name: string; } | null; shared_chat_timeout: { user_id: string; user_login: string; user_name: string; reason: string; expires_at: string; } | null; shared_chat_untimeout: { user_id: string; user_login: string; user_name: string; } | null; shared_chat_delete: { user_id: string; user_login: string; user_name: string; message_id: string; message_body: string; } | null; } interface ChannelModeratorAddEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; } interface ChannelModeratorRemoveEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; } interface ChannelGuestStarSessionBeginEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; session_id: string; started_at: string; } interface ChannelGuestStarSessionEndEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; session_id: string; started_at: string; ended_at: string; host_user_id: string; host_user_name: string; host_user_login: string; } interface ChannelGuestStarGuestUpdateEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; session_id: string; moderator_user_id: string | null; moderator_user_name: string | null; moderator_user_login: string | null; guest_user_id: string | null; guest_user_name: string | null; guest_user_login: string | null; slot_id: string | null; state: 'invited' | 'accepted' | 'ready' | 'backstage' | 'live' | 'removed'; host_user_id: string; host_user_name: string; host_user_login: string; host_video_enabled: boolean | null; host_audio_enabled: boolean | null; host_volume: number | null; } interface ChannelGuestStarSettingsUpdateEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; is_moderator_send_live_enabled: boolean; slot_count: number; is_browser_source_audio_enabled: boolean; group_layout: 'tiled' | 'screenshare' | 'horizontal_top' | 'horizontal_bottom' | 'vertical_left' | 'vertical_right'; } interface ChannelPollBeginEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; title: string; choices: [ { id: string; title: string; bits_votes: number; channel_points_votes: number; votes: number; } ]; bits_voting: { is_enabled: boolean; amount_per_vote: number; }; channel_points_voting: { is_enabled: boolean; amount_per_vote: number; }; started_at: string; ends_at: string; } interface ChannelPollProgressEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; title: string; choices: [ { id: string; title: string; bits_votes: number; channel_points_votes: number; votes: number; } ]; bits_voting: { is_enabled: boolean; amount_per_vote: number; }; channel_points_voting: { is_enabled: boolean; amount_per_vote: number; }; started_at: string; ends_at: string; } interface ChannelPollEndEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; title: string; choices: [ { id: string; title: string; bits_votes: number; channel_points_votes: number; votes: number; } ]; bits_voting: { is_enabled: boolean; amount_per_vote: number; }; channel_points_voting: { is_enabled: boolean; amount_per_vote: number; }; status: 'completed' | 'archived' | 'terminated'; started_at: string; ended_at: string; } interface ChannelPointsAutomaticRewardRedemptionAddEventV1 { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; user_id: string; user_login: string; user_name: string; id: string; reward: { type: 'single_message_bypass_sub_mode' | 'send_highlighted_message' | 'random_sub_emote_unlock' | 'chosen_sub_emote_unlock' | 'chosen_modified_sub_emote_unlock' | 'message_effect' | 'gigantify_an_emote' | 'celebration'; cost: number; unlocked_emote: { id: string; name: string; } | null; }; message: { text: string; emotes: [ { id: string; begin: number; end: number; } ]; }; user_input: string | null; redeemed_at: string; } interface ChannelPointsAutomaticRewardRedemptionAddEventV2 { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; user_id: string; user_login: string; user_name: string; id: string; reward: { type: 'single_message_bypass_sub_mode' | 'send_highlighted_message' | 'random_sub_emote_unlock' | 'chosen_sub_emote_unlock' | 'chosen_modified_sub_emote_unlock'; channel_points: number; emote: { id: string; name: string; } | null; }; message: { text: string; type: 'text' | 'emote'; emotes: [ { id: string; } ] | null; } | null; redeemed_at: string; } interface ChannelPointsCustomRewardAddEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; is_enabled: boolean; is_paused: boolean; is_in_stock: boolean; title: string; cost: number; prompt: string; is_user_input_required: boolean; should_redemptions_skip_request_queue: boolean; max_per_stream: { is_enabled: boolean; value: number; }; max_per_user_per_stream: { is_enabled: boolean; value: number; }; background_color: string; image: { url_1x: string; url_2x: string; url_4x: string; } | null; default_image: { url_1x: string; url_2x: string; url_4x: string; }; global_cooldown: { is_enabled: boolean; seconds: number; }; cooldown_expires_at: string | null; redemptions_redeemed_current_stream: number | null; } interface ChannelPointsCustomRewardUpdateEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; is_enabled: boolean; is_paused: boolean; is_in_stock: boolean; title: string; cost: number; prompt: string; is_user_input_required: boolean; should_redemptions_skip_request_queue: boolean; max_per_stream: { is_enabled: boolean; value: number; }; max_per_user_per_stream: { is_enabled: boolean; value: number; }; background_color: string; image: { url_1x: string; url_2x: string; url_4x: string; } | null; default_image: { url_1x: string; url_2x: string; url_4x: string; }; global_cooldown: { is_enabled: boolean; seconds: number; }; cooldown_expires_at: string | null; redemptions_redeemed_current_stream: number | null; } interface ChannelPointsCustomRewardRemoveEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; is_enabled: boolean; is_paused: boolean; is_in_stock: boolean; title: string; cost: number; prompt: string; is_user_input_required: boolean; should_redemptions_skip_request_queue: boolean; max_per_stream: { is_enabled: boolean; value: number; }; max_per_user_per_stream: { is_enabled: boolean; value: number; }; background_color: string; image: { url_1x: string; url_2x: string; url_4x: string; } | null; default_image: { url_1x: string; url_2x: string; url_4x: string; }; global_cooldown: { is_enabled: boolean; seconds: number; }; cooldown_expires_at: string | null; redemptions_redeemed_current_stream: number | null; } interface ChannelPointsCustomRewardRedemptionAddEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; user_id: string; user_login: string; user_name: string; user_input: string | null; status: 'unknown' | 'unfulfilled' | 'fulfilled' | 'canceled'; reward: { id: string; title: string; cost: number; prompt: string; }; redeemed_at: string; } interface ChannelPointsCustomRewardRedemptionUpdateEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; user_id: string; user_login: string; user_name: string; user_input: string | null; status: 'unknown' | 'unfulfilled' | 'fulfilled' | 'canceled'; reward: { id: string; title: string; cost: number; prompt: string; }; redeemed_at: string; } interface ChannelPredictionBeginEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; title: string; outcomes: [ { id: string; title: string; color: 'pink' | 'blue'; users: number; channel_points: number; top_predictors: [ { user_id: string; user_login: string; user_name: string; channel_points_won: number | null; channel_points_used: number; } ]; } ]; started_at: string; locks_at: string; } interface ChannelPredictionProgressEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; title: string; outcomes: [ { id: string; title: string; color: 'pink' | 'blue'; users: number; channel_points: number; top_predictors: [ { user_id: string; user_login: string; user_name: string; channel_points_won: number | null; channel_points_used: number; } ]; } ]; started_at: string; locks_at: string; } interface ChannelPredictionLockEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; title: string; outcomes: [ { id: string; title: string; color: 'pink' | 'blue'; users: number; channel_points: number; top_predictors: [ { user_id: string; user_login: string; user_name: string; channel_points_won: number | null; channel_points_used: number; } ]; } ]; started_at: string; locked_at: string; } interface ChannelPredictionEndEvent { id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; title: string; winning_outcome_id: string; outcomes: [ { id: string; title: string; color: 'pink' | 'blue'; users: number; channel_points: number; top_predictors: [ { user_id: string; user_login: string; user_name: string; channel_points_won: number | null; channel_points_used: number; } ]; } ]; started_at: string; locked_at: string; } interface ChannelSharedChatSessionBeginEvent { session_id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; host_broadcaster_user_id: string; host_broadcaster_user_name: string; host_broadcaster_user_login: string; participants: [ { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; } ]; } interface ChannelSharedChatSessionUpdateEvent { session_id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; host_broadcaster_user_id: string; host_broadcaster_user_name: string; host_broadcaster_user_login: string; participants: [ { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; } ]; } interface ChannelSharedChatSessionEndEvent { session_id: string; broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; host_broadcaster_user_id: string; host_broadcaster_user_name: string; host_broadcaster_user_login: string; } interface ChannelSubscriptionEndEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; tier: string; is_gift: boolean; } interface ChannelSubscriptionGiftEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; total: number; tier: string; cumulative_total: number | null; is_anonymous: boolean; } interface ChannelSubscriptionMessageEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; tier: string; message: { text: string; emotes: [ { begin: number; end: number; id: string; } ] | null; }; cumulative_total: number; streak_months: number | null; duration_months: number; } interface ChannelSuspiciousUserUpdateEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; moderator_user_id: string; moderator_user_name: string; moderator_user_login: string; user_id: string; user_name: string; user_login: string; low_trust_status: 'none' | 'active_monitoring' | 'restricted'; } interface ChannelSuspiciousUserMessageEvent { broadcaster_user_id: string; broadcaster_user_name: string; broadcaster_user_login: string; user_id: string; user_name: string; user_login: string; low_trust_status: 'none' | 'active_monitoring' | 'restricted'; shared_ban_channel_ids: string[]; types: 'manually_added' | 'ban_evader' | 'banned_in_shared_channel'; ban_evasion_evaluation: 'unknown' | 'possible' | 'likely'; message: { message_id: string; text: string; fragments: [ { type: 'text' | 'cheermote' | 'emote'; text: string; cheermote: { prefix: string; bits: string; tier: string; } | null; emote: { id: string; emote_set_id: string; } | null; } ]; }; } interface ChannelVIPAddEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; } interface ChannelVIPRemoveEvent { user_id: string; user_login: string; user_name: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; } interface ChannelWarningAcknowledgeEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; } interface ChannelWarningSendEvent { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; moderator_user_id: string; moderator_user_login: string; moderator_user_name: string; user_id: string; user_login: string; user_name: string; reason: string | null; chat_rules_cited: string[] | null; } interface CharityDonationEvent { id: string; campaign_id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; charity_name: string; charity_description: string; charity_logo: string; charity_website: string; amount: { value: number; decimal_places: number; currency: string; }; } interface CharityCampaignStartEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; charity_name: string; charity_description: string; charity_logo: string; charity_website: string; current_amount: { value: number; decimal_places: number; currency: string; }; target_amount: { value: number; decimal_places: number; currency: string; }; started_at: string; } interface CharityCampaignProgressEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; charity_name: string; charity_description: string; charity_logo: string; charity_website: string; current_amount: { value: number; decimal_places: number; currency: string; }; target_amount: { value: number; decimal_places: number; currency: string; }; } interface CharityCampaignStopEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; charity_name: string; charity_description: string; charity_logo: string; charity_website: string; current_amount: { value: number; decimal_places: number; currency: string; }; target_amount: { value: number; decimal_places: number; currency: string; }; stopped_at: string; } interface ConduitShardDisabledEvent { conduit_id: string; shard_id: string; status: string; transport: string; method: string; callback: string | null; session_id: string | null; connected_at: string | null; disconnected_at: string | null; } interface DropEntitlementGrantEvent { id: string; data: [ { organization_id: string; category_id: string; category_name: string; campaign_id: string; user_id: string; user_name: string; user_login: string; entitlement_id: string; benefit_id: string; created_at: string; } ]; } interface ExtensionBitsTransactionCreateEvent { extension_client_id: string; id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; user_id: string; user_login: string; user_name: string; product: { name: string; bits: number; sku: string; in_development: boolean; }; } interface GoalsEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; type: 'follow' | 'subscription' | 'subscription_count' | 'new_subscription' | 'new_subscription_count' | 'new_bit' | 'new_cheerer '; description: string; current_amount: number; target_amount: number; started_at: string; ended_at: string; } interface GoalsEndEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; type: 'follow' | 'subscription' | 'subscription_count' | 'new_subscription' | 'new_subscription_count' | 'new_bit' | 'new_cheerer '; description: string; is_achieved: boolean; current_amount: number; target_amount: number; started_at: string; ended_at: string; } interface HypeTrainBeginEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; total: number; progress: number; goal: number; top_contributions: [ { user_id: string; user_login: string; user_name: string; type: 'bits' | 'subscription' | 'other'; total: number; } ]; last_contribution: { user_id: string; user_login: string; user_name: string; type: 'bits' | 'subscription' | 'other'; total: number; }; level: number; started_at: string; expires_at: string; is_golden_kappa_train: boolean; } interface HypeTrainBeginEventV2 { id: string; broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; total: number; progress: number; goal: number; top_contributions: [ { user_id: string; user_login: string; user_name: string; type: 'bits' | 'subscription' | 'other'; total: number; } ]; level: number; all_time_high_level: number; all_time_high_total: number; shared_train_participants: [ { broadcaster_user_id: string; broadcaster_user_login: string; broadcaster_user_name: string; } ] | null; started_at: string; expires_at: string; type: 'treasure' | 'golden_kappa' | 'regular'; is_shared_train: boolean; } interface HypeTrainProgressEvent { id: string; broadcaster_user_id: string; broadcaster_user_login: string; b