kichat.js
Version:
A JavaScript library to connect to Kick.com chat.
466 lines (465 loc) • 11.1 kB
TypeScript
export interface MessageEvent {
event: string;
data: string;
channel: string;
}
type KnownBadgeType = 'subscriber' | 'sub_gifter' | 'moderator' | 'verified' | 'founder';
export interface GenericBadge {
type: KnownBadgeType | (string & {});
text: string;
}
type SubscriberBadge = GenericBadge & {
type: 'subscriber';
count: number;
};
type SubGifterBadge = GenericBadge & {
type: 'sub_gifter';
count: number;
};
type ModeratorBadge = GenericBadge & {
type: 'moderator';
};
type VerifiedBadge = GenericBadge & {
type: 'verified';
};
type FounderBadge = GenericBadge & {
type: 'founder';
};
type BroadcasterBadge = GenericBadge & {
type: 'broadcaster';
};
export type Badge = BroadcasterBadge | SubscriberBadge | SubGifterBadge | ModeratorBadge | VerifiedBadge | FounderBadge | GenericBadge;
interface Sender {
id: number;
username: string;
slug: string;
identity: {
color: string;
badges: Badge[];
};
}
interface Clip {
id: string;
title: string;
thumbnail_url: string;
duration: number;
creator: {
id: number;
username: string;
slug: string;
profile_picture: string;
};
}
interface MessageBase {
id: string;
chatroom_id: number;
content: string;
created_at: string;
sender: Sender;
}
interface MetadataBase {
message_ref: string;
clip?: Clip;
}
type StandardMessage = MessageBase & {
type: 'message';
metadata: MetadataBase;
};
type CelebrationMessage = MessageBase & {
type: 'celebration';
metadata: MetadataBase & {
celebration: {
id: string;
type: 'subscription_renewed' | (string & {});
total_months: number;
created_at: string;
};
};
};
type ReplyMessage = MessageBase & {
type: 'reply';
metadata: MetadataBase & {
original_sender: {
id: string;
username: string;
};
original_message: {
id: string;
content: string;
};
};
};
export type MessageData = StandardMessage | CelebrationMessage | ReplyMessage;
export interface SubscriptionData {
username: string;
months: number;
}
export interface ChatMessage {
id: string;
chatroom_id: number;
content: string;
type: string;
created_at: string;
sender: {
id: number;
username: string;
slug: string;
identity: {
color: string;
badges: Badge[];
};
};
"metadata": MessageData['metadata'];
}
export interface Subscription {
chatroom_id: number;
username: string;
months: number;
}
export interface GiftedSubscriptionsEvent {
chatroom_id: number;
gifted_usernames: string[];
gifter_username: string;
gifter_total: number;
}
export interface StreamHostEvent {
chatroom_id: number;
optional_message: string;
number_viewers: number;
host_username: string;
}
export interface MessageDeletedEvent {
id: string;
message: {
id: string;
};
aiModerated: boolean;
violatedRules: any[];
}
export interface UserBanned {
id: string;
user: {
id: number;
username: string;
slug: string;
};
banned_by: {
id: number;
username: string;
slug: string;
};
}
type UserBannedPermanent = UserBanned & {
permanent: true;
};
type UserBannedTemporary = UserBanned & {
permanent: false;
duration: number;
expires_at: string;
};
export type UserBannedEvent = UserBannedPermanent | UserBannedTemporary;
export interface UserUnbannedEvent {
id: string;
user: {
id: number;
username: string;
slug: string;
};
unbanned_by: {
id: number;
username: string;
slug: string;
};
permanent: false;
}
export interface PinnedMessageCreatedEvent {
message: {
id: string;
chatroom_id: number;
content: string;
type: string;
created_at: string;
sender: {
id: number;
username: string;
slug: string;
identity: {
color: string;
badges: Badge[];
};
};
metadata: null;
};
duration: string;
}
export interface StreamerIsLiveEvent {
livestream: {
id: number;
channel_id: number;
session_title: string;
source: String | null;
created_at: string;
};
}
export interface StopStreamBroadcastEvent {
livestream: {
id: number;
channel: {
id: number;
is_banned: false;
};
};
}
export interface PollUpdateEvent {
poll: {
title: string;
options: {
id: number;
label: string;
votes: number;
}[];
duration: number;
remaining: number;
result_display_duration: number;
has_voted: boolean;
voted_option_id: null;
};
}
export interface GoalEvent {
id: string;
channel_id: string;
type: "followers" | String;
status: "active" | "canceled" | String;
target_value: number;
current_value: number;
progress_bar_emoji_id: string;
end_date: string | null;
achieved_at: null;
created_at: string;
updated_at: string;
count_from_creation: boolean;
}
export interface LivestreamUpdatedEvent {
livestream: {
id: number;
slug: string;
channel_id: number;
created_at: string;
session_title: string;
is_live: boolean;
risk_level_id: null | string;
start_time: string;
source: null | string;
twitch_channel: null | string;
duration: number;
language: string;
is_mature: boolean;
viewer_count: number;
tags: string[];
lang_iso: string;
categories: {
id: number;
category_id: number;
name: string;
slug: string;
tags: string[];
description: null | string;
deleted_at: null | string;
is_mature: boolean;
is_promoted: boolean;
viewers: number;
is_fallback: boolean;
category: {
id: number;
name: string;
slug: string;
icon: string;
};
}[];
};
}
export interface PredictionBase {
id: string;
channel_id: number;
title: string;
outcomes: {
id: string;
title: string;
total_vote_amount: number;
vote_count: number;
return_rate: number;
top_users: {
user_id: number;
username: string;
amount: number;
}[];
};
duration: number;
created_at: string;
updated_at: string;
}
type ActivePrediction = PredictionBase & {
state: "ACTIVE";
};
type LockedPrediction = PredictionBase & {
state: "LOCKED";
locked_at: string;
};
type ResolvedPrediction = PredictionBase & {
state: "RESOLVED";
locked_at: string;
winning_outcome_id: string;
};
export type PredictionEvent = {
prediction: ActivePrediction | LockedPrediction | ResolvedPrediction;
};
export interface RewardRedeemedEvent {
reward_title: string;
user_id: number;
channel_id: number;
username: string;
user_input: "" | String;
reward_background_color: `#${string}`;
}
export interface ConnectionEstablishedEvent {
socket_id: `${number}.${number}`;
activity_timeout: number;
}
export interface SubscriptionSuccededEvent {
channel: string;
data: {};
}
export interface PusherErrorEvent {
code: 4200 | Number;
message: string;
}
export interface ChannelSubscriptionEvent {
user_ids: number[];
username: string;
channel_id: number;
}
export interface ChatroomUpdatedEvent {
id: number;
slow_mode: {
enabled: boolean;
message_interval: number;
};
subscribers_mode: {
enabled: boolean;
};
followers_mode: {
enabled: boolean;
min_duration: number;
};
emotes_mode: {
enabled: boolean;
};
advanced_bot_protection: {
enabled: boolean;
remaining_time: number;
};
account_age: {
enabled: boolean;
min_duration: number;
};
}
export interface LuckyUsersWhoGotGiftSubscriptionsEvent {
channel: {
id: number;
user_id: number;
slug: string;
is_banned: boolean;
playback_url: string;
name_updated_at: string | null;
vod_enabled: boolean;
subscription_enabled: boolean;
is_affiliate: boolean;
can_host: boolean;
chatroom: {
id: number;
chatable_type: string;
channel_id: number;
created_at: string;
updated_at: string;
chat_mode_old: string;
chat_mode: string;
slow_mode: boolean;
chatable_id: number;
followers_mode: boolean;
subscribers_mode: boolean;
emotes_mode: boolean;
message_interval: number;
following_min_duration: number;
};
};
usernames: string[];
gifter_username: string;
}
export interface VideoPrivatedEvent {
video_id: string;
}
export interface GiftsLeaderboardUpdatedEvent {
leaderboard: {
user_id: number;
username: string;
quantity: number;
}[];
weekly_leaderboard: {
user_id: number;
username: string;
quantity: number;
}[];
monthly_leaderboard: {
user_id: number;
username: string;
quantity: number;
}[];
gifter_id: number;
gifter_username: string;
gifted_quantity: number;
}
export interface ChatMoveToSupportedChannelEvent {
channel: {
id: number;
user_id: number;
slug: string;
is_banned: boolean;
playback_url: string;
name_updated_at: string | null;
vod_enabled: boolean;
subscription_enabled: boolean;
is_affiliate: boolean;
can_host: boolean;
current_livestream: {
id: number;
slug: string;
channel_id: number;
created_at: string;
session_title: string;
is_live: boolean;
risk_level_id: null | string;
start_time: string;
source: null | string;
twitch_channel: null | string;
duration: number;
language: string;
is_mature: boolean;
viewer_count: number;
};
};
slug: string;
hosted: {
id: number;
username: string;
slug: string;
viewers_count: number;
is_live: boolean;
profile_pic: string;
category: string;
preview_thumbnail: {
srcset: string;
src: string;
};
};
}
export {};