UNPKG

twitch-js

Version:

Javascript library for the Twitch Messaging Interface.

1,497 lines 57.7 kB
import EventEmitter from "eventemitter3"; import { LoggerOptions as PinoLoggerOptions } from "pino"; type DistributeKeys<T> = { [P in keyof T]: P; }; declare enum ApiVersions { Helix = "helix", Kraken = "kraken" } /** * Root URL response * @see https://dev.twitch.tv/docs/v5#root-url */ type ApiRootResponse = { token: { authorization: { createdAt: Date; updatedAt: Date; scopes: string[]; }; clientId: string; userId: string; userName: string; valid: boolean; }; }; /** * @see https://dev.twitch.tv/docs/irc/guide#twitch-irc-capabilities */ declare enum Capabilities { "tags" = "twitch.tv/tags", "commands" = "twitch.tv/commands", "membership" = "twitch.tv/membership" } /** * @see https://dev.twitch.tv/docs/irc/membership */ declare enum MembershipCommands { JOIN = "JOIN", MODE = "MODE", PART = "PART", NAMES = "353", NAMES_END = "366" } /** * @see https://dev.twitch.tv/docs/irc/tags */ declare enum TagCommands { CLEAR_CHAT = "CLEARCHAT", GLOBALUSERSTATE = "GLOBALUSERSTATE", PRIVATE_MESSAGE = "PRIVMSG", ROOM_STATE = "ROOMSTATE", USER_NOTICE = "USERNOTICE", USER_STATE = "USERSTATE" } declare enum OtherCommands { WELCOME = "001", PING = "PING", PONG = "PONG", WHISPER = "WHISPER" } /** * @see https://dev.twitch.tv/docs/irc/commands */ declare enum BaseCommands { CLEAR_CHAT = "CLEARCHAT", CLEAR_MESSAGE = "CLEARMSG", HOST_TARGET = "HOSTTARGET", NOTICE = "NOTICE", RECONNECT = "RECONNECT", ROOM_STATE = "ROOMSTATE", USER_NOTICE = "USERNOTICE", USER_STATE = "USERSTATE" } declare enum Commands { WELCOME = "001", PING = "PING", PONG = "PONG", RECONNECT = "RECONNECT", WHISPER = "PRIVMSG #jtv", JOIN = "JOIN", MODE = "MODE", PART = "PART", NAMES = "353", NAMES_END = "366", CLEAR_CHAT = "CLEARCHAT", CLEAR_MESSAGE = "CLEARMSG", GLOBALUSERSTATE = "GLOBALUSERSTATE", HOST_TARGET = "HOSTTARGET", NOTICE = "NOTICE", PRIVATE_MESSAGE = "PRIVMSG", ROOM_STATE = "ROOMSTATE", USER_NOTICE = "USERNOTICE", USER_STATE = "USERSTATE" } declare enum ChatEvents { RAW = "RAW", ALL = "*", CONNECTED = "CONNECTED", DISCONNECTED = "DISCONNECTED", RECONNECT = "RECONNECT", AUTHENTICATED = "AUTHENTICATED", AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED", GLOBALUSERSTATE = "GLOBALUSERSTATE", ERROR_ENCOUNTERED = "ERROR_ENCOUNTERED", PARSE_ERROR_ENCOUNTERED = "PARSE_ERROR_ENCOUNTERED", ANON_GIFT_PAID_UPGRADE = "ANON_GIFT_PAID_UPGRADE", GIFT_PAID_UPGRADE = "GIFT_PAID_UPGRADE", RAID = "RAID", RESUBSCRIPTION = "RESUBSCRIPTION", RITUAL = "RITUAL", SUBSCRIPTION = "SUBSCRIPTION", SUBSCRIPTION_GIFT = "SUBSCRIPTION_GIFT", SUBSCRIPTION_GIFT_COMMUNITY = "SUBSCRIPTION_GIFT_COMMUNITY", ROOM_MODS = "ROOM_MODS", MOD_GAINED = "MOD_GAINED", MOD_LOST = "MOD_LOST", USER_BANNED = "USER_BANNED", CHEER = "CHEER", HOST_ON = "HOST_ON", HOST_OFF = "HOST_OFF", HOSTED = "HOSTED", HOSTED_WITHOUT_VIEWERS = "HOSTED/WITHOUT_VIEWERS", HOSTED_WITH_VIEWERS = "HOSTED/WITH_VIEWERS", HOSTED_AUTO = "HOSTED/AUTO" } /** * @see https://help.twitch.tv/customer/en/portal/articles/659095-chat-moderation-commands */ declare enum ChatCommands { BAN = "ban", BLOCK = "block", CLEAR = "clear", COLOR = "color", COMMERCIAL = "commercial", // DISCONNECTED = 'disconnect', DELETE = "delete", EMOTE_ONLY = "emoteonly", EMOTE_ONLY_OFF = "emoteonlyoff", FOLLOWERS_ONLY = "followers", FOLLOWERS_ONLY_OFF = "followersoff", HELP = "help", HOST = "host", MARKER = "marker", ME = "me", MOD = "mod", MODS = "mods", // PART = 'part', R9K = "r9kbeta", R9K_OFF = "r9kbetaoff", RAID = "raid", SLOW = "slow", SLOW_OFF = "slowoff", SUBSCRIBERS = "subscribers", SUBSCRIBERS_OFF = "subscribersoff", TIMEOUT = "timeout", UNBAN = "unban", UNBLOCK = "unblock", UNHOST = "unhost", UNMOD = "unmod", UNRAID = "unraid", UNVIP = "unvip", VIP = "vip", VIPS = "vips", WHISPER = "w" } declare enum KnownNoticeMessageIds { ALREADY_BANNED = "already_banned", ALREADY_EMOTE_ONLY_OFF = "already_emote_only_off", ALREADY_EMOTE_ONLY_ON = "already_emote_only_on", ALREADY_R9K_OFF = "already_r9k_off", ALREADY_R9K_ON = "already_r9k_on", ALREADY_SUBS_OFF = "already_subs_off", ALREADY_SUBS_ON = "already_subs_on", BAD_HOST_HOSTING = "bad_host_hosting", BAD_MOD_MOD = "bad_mod_mod", BAN_SUCCESS = "ban_success", BAD_UNBAN_NO_BAN = "bad_unban_no_ban", COLOR_CHANGED = "color_changed", CMDS_AVAILABLE = "cmds_available", COMMERCIAL_SUCCESS = "commercial_success", EMOTE_ONLY_OFF = "emote_only_off", EMOTE_ONLY_ON = "emote_only_on", FOLLOWERS_OFF = "followers_off", FOLLOWERS_ON = "followers_on", FOLLOWERS_ONZERO = "followers_onzero", HOST_OFF = "host_off", HOST_ON = "host_on", HOSTS_REMAINING = "hosts_remaining", MSG_CHANNEL_SUSPENDED = "msg_channel_suspended", MOD_SUCCESS = "mod_success", NOT_HOSTING = "not_hosting", R9K_OFF = "r9k_off", R9K_ON = "r9k_on", ROOM_MODS = "room_mods", SLOW_OFF = "slow_off", SLOW_ON = "slow_on", SUBS_OFF = "subs_off", SUBS_ON = "subs_on", TIMEOUT_SUCCESS = "timeout_success", UNBAN_SUCCESS = "unban_success", UNMOD_SUCCESS = "unmod_success", UNRAID_SUCCESS = "unraid_success", UNRECOGNIZED_CMD = "unrecognized_cmd" } declare const KnownNoticeMessageIdsUpperCase: Record<"ALREADY_BANNED" | "ALREADY_EMOTE_ONLY_OFF" | "ALREADY_EMOTE_ONLY_ON" | "ALREADY_R9K_OFF" | "ALREADY_R9K_ON" | "ALREADY_SUBS_OFF" | "ALREADY_SUBS_ON" | "BAD_HOST_HOSTING" | "BAD_MOD_MOD" | "BAN_SUCCESS" | "BAD_UNBAN_NO_BAN" | "COLOR_CHANGED" | "CMDS_AVAILABLE" | "COMMERCIAL_SUCCESS" | "EMOTE_ONLY_OFF" | "EMOTE_ONLY_ON" | "FOLLOWERS_OFF" | "FOLLOWERS_ON" | "FOLLOWERS_ONZERO" | "HOST_OFF" | "HOST_ON" | "HOSTS_REMAINING" | "MSG_CHANNEL_SUSPENDED" | "MOD_SUCCESS" | "NOT_HOSTING" | "R9K_OFF" | "R9K_ON" | "ROOM_MODS" | "SLOW_OFF" | "SLOW_ON" | "SUBS_OFF" | "SUBS_ON" | "TIMEOUT_SUCCESS" | "UNBAN_SUCCESS" | "UNMOD_SUCCESS" | "UNRAID_SUCCESS" | "UNRECOGNIZED_CMD", string>; declare const NoticeEvents: DistributeKeys<typeof KnownNoticeMessageIds>; type NoticeEvents = keyof typeof NoticeEvents; declare enum PrivateMessageEvents { CHEER = "CHEER", HOSTED_WITHOUT_VIEWERS = "HOSTED_WITHOUT_VIEWERS", HOSTED_WITH_VIEWERS = "HOSTED_WITH_VIEWERS", HOSTED_AUTO = "HOSTED_AUTO" } /** * @see https://dev.twitch.tv/docs/irc/tags#usernotice-twitch-tags */ declare enum KnownUserNoticeMessageIds { ANON_GIFT_PAID_UPGRADE = "anongiftpaidupgrade", GIFT_PAID_UPGRADE = "giftpaidupgrade", RAID = "raid", RESUBSCRIPTION = "resub", RITUAL = "ritual", SUBSCRIPTION = "sub", SUBSCRIPTION_GIFT = "subgift", SUBSCRIPTION_GIFT_COMMUNITY = "submysterygift" } declare const UserNoticeEvents: DistributeKeys<typeof KnownUserNoticeMessageIds>; type UserNoticeEvents = keyof typeof UserNoticeEvents; declare const Events: { ANON_GIFT_PAID_UPGRADE: "ANON_GIFT_PAID_UPGRADE"; GIFT_PAID_UPGRADE: "GIFT_PAID_UPGRADE"; RAID: "RAID"; RESUBSCRIPTION: "RESUBSCRIPTION"; RITUAL: "RITUAL"; SUBSCRIPTION: "SUBSCRIPTION"; SUBSCRIPTION_GIFT: "SUBSCRIPTION_GIFT"; SUBSCRIPTION_GIFT_COMMUNITY: "SUBSCRIPTION_GIFT_COMMUNITY"; CHEER: PrivateMessageEvents.CHEER; HOSTED_WITHOUT_VIEWERS: PrivateMessageEvents.HOSTED_WITHOUT_VIEWERS; HOSTED_WITH_VIEWERS: PrivateMessageEvents.HOSTED_WITH_VIEWERS; HOSTED_AUTO: PrivateMessageEvents.HOSTED_AUTO; ALREADY_BANNED: "ALREADY_BANNED"; ALREADY_EMOTE_ONLY_OFF: "ALREADY_EMOTE_ONLY_OFF"; ALREADY_EMOTE_ONLY_ON: "ALREADY_EMOTE_ONLY_ON"; ALREADY_R9K_OFF: "ALREADY_R9K_OFF"; ALREADY_R9K_ON: "ALREADY_R9K_ON"; ALREADY_SUBS_OFF: "ALREADY_SUBS_OFF"; ALREADY_SUBS_ON: "ALREADY_SUBS_ON"; BAD_HOST_HOSTING: "BAD_HOST_HOSTING"; BAD_MOD_MOD: "BAD_MOD_MOD"; BAN_SUCCESS: "BAN_SUCCESS"; BAD_UNBAN_NO_BAN: "BAD_UNBAN_NO_BAN"; COLOR_CHANGED: "COLOR_CHANGED"; CMDS_AVAILABLE: "CMDS_AVAILABLE"; COMMERCIAL_SUCCESS: "COMMERCIAL_SUCCESS"; EMOTE_ONLY_OFF: "EMOTE_ONLY_OFF"; EMOTE_ONLY_ON: "EMOTE_ONLY_ON"; FOLLOWERS_OFF: "FOLLOWERS_OFF"; FOLLOWERS_ON: "FOLLOWERS_ON"; FOLLOWERS_ONZERO: "FOLLOWERS_ONZERO"; HOST_OFF: "HOST_OFF"; HOST_ON: "HOST_ON"; HOSTS_REMAINING: "HOSTS_REMAINING"; MSG_CHANNEL_SUSPENDED: "MSG_CHANNEL_SUSPENDED"; MOD_SUCCESS: "MOD_SUCCESS"; NOT_HOSTING: "NOT_HOSTING"; R9K_OFF: "R9K_OFF"; R9K_ON: "R9K_ON"; ROOM_MODS: "ROOM_MODS"; SLOW_OFF: "SLOW_OFF"; SLOW_ON: "SLOW_ON"; SUBS_OFF: "SUBS_OFF"; SUBS_ON: "SUBS_ON"; TIMEOUT_SUCCESS: "TIMEOUT_SUCCESS"; UNBAN_SUCCESS: "UNBAN_SUCCESS"; UNMOD_SUCCESS: "UNMOD_SUCCESS"; UNRAID_SUCCESS: "UNRAID_SUCCESS"; UNRECOGNIZED_CMD: "UNRECOGNIZED_CMD"; RAW: ChatEvents.RAW; ALL: ChatEvents.ALL; CONNECTED: ChatEvents.CONNECTED; DISCONNECTED: ChatEvents.DISCONNECTED; RECONNECT: ChatEvents.RECONNECT; AUTHENTICATED: ChatEvents.AUTHENTICATED; AUTHENTICATION_FAILED: ChatEvents.AUTHENTICATION_FAILED; GLOBALUSERSTATE: ChatEvents.GLOBALUSERSTATE; ERROR_ENCOUNTERED: ChatEvents.ERROR_ENCOUNTERED; PARSE_ERROR_ENCOUNTERED: ChatEvents.PARSE_ERROR_ENCOUNTERED; MOD_GAINED: ChatEvents.MOD_GAINED; MOD_LOST: ChatEvents.MOD_LOST; USER_BANNED: ChatEvents.USER_BANNED; HOSTED: ChatEvents.HOSTED; CLEAR_CHAT: BaseCommands.CLEAR_CHAT; CLEAR_MESSAGE: BaseCommands.CLEAR_MESSAGE; HOST_TARGET: BaseCommands.HOST_TARGET; NOTICE: BaseCommands.NOTICE; ROOM_STATE: BaseCommands.ROOM_STATE; USER_NOTICE: BaseCommands.USER_NOTICE; USER_STATE: BaseCommands.USER_STATE; WELCOME: OtherCommands.WELCOME; PING: OtherCommands.PING; PONG: OtherCommands.PONG; WHISPER: OtherCommands.WHISPER; PRIVATE_MESSAGE: TagCommands.PRIVATE_MESSAGE; JOIN: MembershipCommands.JOIN; MODE: MembershipCommands.MODE; PART: MembershipCommands.PART; NAMES: MembershipCommands.NAMES; NAMES_END: MembershipCommands.NAMES_END; }; type Events = keyof DistributeKeys<typeof Events>; declare enum BooleanBadges { "admin" = 0, "broadcaster" = 1, "globalMod" = 2, "moderator" = 3, "partner" = 4, "premium" = 5, "staff" = 6, "subGifter" = 7, "turbo" = 8, "vip" = 9 } declare enum NumberBadges { "bits" = 0, "bitsLeader" = 1, "subscriber" = 2 } type Badges = { // Booleans admin: boolean; broadcaster: boolean; globalMod: boolean; moderator: boolean; partner: boolean; premium: boolean; staff: boolean; subGifter: boolean; turbo: boolean; vip: boolean; // Numbers bits: number; bitsLeader: number; subscriber: number; } | { [key: string]: string; }; type EmoteTag = { id: string; start: number; end: number; }; /** * Tags */ interface BaseTags { [key: string]: any; } /** * CLEARCHAT tags * @see https://dev.twitch.tv/docs/irc/tags#clearchat-twitch-tags */ interface ClearChatTags extends BaseTags { banReason?: string; banDuration?: number; } /** * CLEARMSG tags * @see https://dev.twitch.tv/docs/irc/tags#clearmsg-twitch-tags */ interface ClearMessageTags extends BaseTags { login: string; targetMsgId: string; } /** * GLOBALUSERSTATE tags * @see https://dev.twitch.tv/docs/irc/tags#globaluserstate-twitch-tags */ interface GlobalUserStateTags extends BaseTags { emoteSets: string[]; userType?: string; username: string; } /** * ROOMSTATE Tag * @see https://dev.twitch.tv/docs/irc/tags#roomstate-twitch-tags */ interface RoomStateTags extends BaseTags { followersOnly?: number | boolean; broadcasterLang?: string; slow?: number; emoteOnly?: boolean; r9k?: boolean; subsOnly?: boolean; } interface NoticeTags extends BaseTags { msgId: KnownNoticeMessageIds; } /** * USERSTATE tags * @see https://dev.twitch.tv/docs/irc/tags#userstate-twitch-tags */ interface UserStateTags extends BaseTags { badges: Partial<Badges>; color: string; displayName: string; emotes: EmoteTag[]; emoteSets: string[]; mod?: string; subscriber?: string; turbo?: string; userType?: string; username: string; isModerator: boolean; } /** * PRIVMSG tags * @see https://dev.twitch.tv/docs/irc/tags#privmsg-twitch-tags */ interface PrivateMessageTags extends UserStateTags { bits?: string; } /** * USERNOTICE tags * @see https://dev.twitch.tv/docs/irc/tags#usernotice-twitch-tags */ interface UserNoticeTags extends UserStateTags { id: string; login: string; msgId: KnownUserNoticeMessageIds; roomId: string; systemMsg: string; tmiSentTs: string; } type Tags = ClearChatTags | GlobalUserStateTags | RoomStateTags | UserStateTags | PrivateMessageTags | NoticeTags | UserNoticeTags; /** * Messages */ /* Base message parsed from Twitch */ interface Message { _raw: string; timestamp: Date; channel: string; username: string; command: string; event: string; isSelf: boolean; message: string; tags: { [key: string]: any; }; parameters?: { [key: string]: string | number | boolean; }; } interface BaseMessage extends Message { _raw: string; timestamp: Date; channel: string; username: string; command: string; event: string; isSelf: boolean; message: string; tags: { [key: string]: any; }; } /** * Join a channel. * @see https://dev.twitch.tv/docs/irc/membership/#join-twitch-membership */ interface JoinMessage extends Omit<BaseMessage, "message"> { command: Commands.JOIN; event: Commands.JOIN; } /** * Depart from a channel. * @see https://dev.twitch.tv/docs/irc/membership/#part-twitch-membership */ interface PartMessage extends Omit<BaseMessage, "message"> { command: Commands.PART; event: Commands.PART; } /** * Gain/lose moderator (operator) status in a channel. * @see https://dev.twitch.tv/docs/irc/membership/#mode-twitch-membership */ interface ModeModGainedMessage extends BaseMessage { command: Commands.MODE; event: ChatEvents.MOD_GAINED; message: "+o"; isModerator: true; } interface ModeModLostMessage extends BaseMessage { command: Commands.MODE; event: ChatEvents.MOD_LOST; message: "-o"; isModerator: false; } type ModeMessages = ModeModGainedMessage | ModeModLostMessage; /** * List current chatters in a channel. * @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership */ interface NamesMessage extends Omit<BaseMessage, "message"> { command: Commands.NAMES; event: Commands.NAMES; usernames: string[]; } /** * End of list current chatters in a channel. * @see https://dev.twitch.tv/docs/irc/membership/#names-twitch-membership */ interface NamesEndMessage extends Omit<BaseMessage, "message"> { command: Commands.NAMES_END; event: Commands.NAMES_END; } /** * GLOBALUSERSTATE message * @see https://dev.twitch.tv/docs/irc/tags#globaluserstate-twitch-tags */ interface GlobalUserStateMessage extends BaseMessage { command: Commands.GLOBALUSERSTATE; event: Commands.GLOBALUSERSTATE; tags: GlobalUserStateTags; } /** * Temporary or permanent ban on a channel. * @see https://dev.twitch.tv/docs/irc/commands/#clearchat-twitch-commands * @see https://dev.twitch.tv/docs/irc/tags/#clearchat-twitch-tags */ interface ClearChatUserBannedMessage extends Omit<BaseMessage, "message"> { command: Commands.CLEAR_CHAT; event: ChatEvents.USER_BANNED; tags: ClearChatTags; } /** * All chat is cleared (deleted). * @see https://dev.twitch.tv/docs/irc/commands/#clearchat-twitch-commands * @see https://dev.twitch.tv/docs/irc/tags/#clearchat-twitch-tags */ interface ClearChatMessage extends Omit<BaseMessage, "tags" | "username" | "message"> { command: Commands.CLEAR_CHAT; event: Commands.CLEAR_CHAT; } type ClearChatMessages = ClearChatMessage | ClearChatUserBannedMessage; /** * Single message removal on a channel. * @see https://dev.twitch.tv/docs/irc/commands#clearmsg-twitch-commands * @see https://dev.twitch.tv/docs/irc/tags#clearmsg-twitch-tags */ interface ClearMessageMessage extends Omit<BaseMessage, "message"> { command: Commands.CLEAR_MESSAGE; event: Commands.CLEAR_MESSAGE; tags: ClearMessageTags; targetMessageId: string; } /** * Host starts or stops a message. * @see https://dev.twitch.tv/docs/irc/commands/#hosttarget-twitch-commands */ interface HostTargetMessage extends Omit<BaseMessage, "message"> { command: Commands.HOST_TARGET; event: ChatEvents.HOST_ON | ChatEvents.HOST_OFF; numberOfViewers?: number; } /** * When a user joins a channel or a room setting is changed. * @see https://dev.twitch.tv/docs/irc/tags#roomstate-twitch-tags */ interface RoomStateMessage extends BaseMessage { command: Commands.ROOM_STATE; event: Commands.ROOM_STATE; tags: RoomStateTags; } /** * Base NOTICE message */ interface NoticeMessage extends Omit<BaseMessage, "event"> { command: Commands.NOTICE; event: Exclude<NoticeEvents, typeof NoticeEvents.ROOM_MODS>; tags: NoticeTags; username: "tmi.twitch.tv" | string; } /** * NOTICE/ROOM_MODS message */ interface NoticeRoomModsMessage extends Omit<NoticeMessage, "event"> { event: typeof NoticeEvents.ROOM_MODS; /** The moderators of this channel. */ mods: string[]; } /** * NOTICE message * @see https://dev.twitch.tv/docs/irc/commands/#msg-id-tags-for-the-notice-commands-capability */ type NoticeMessages = NoticeMessage | NoticeRoomModsMessage; /** * USERSTATE message */ interface UserStateMessage extends BaseMessage { command: Commands.USER_STATE; event: Commands.USER_STATE; tags: UserStateTags; } /** * PRIVMSG messages */ interface BasePrivateMessage extends Omit<UserStateMessage, "command" | "event"> { command: Commands.PRIVATE_MESSAGE; } /** * When a user joins a channel or sends a PRIVMSG to a channel. */ interface PrivateMessage extends BasePrivateMessage { event: Commands.PRIVATE_MESSAGE; } interface PrivateMessageWithBits extends BasePrivateMessage { event: ChatEvents.CHEER; bits: number; } interface BaseHostingPrivateMessage extends Omit<BasePrivateMessage, "tags"> { } /** * When a user hosts your channel while connected as broadcaster. */ interface HostingPrivateMessage extends BaseHostingPrivateMessage { event: ChatEvents.HOSTED_WITHOUT_VIEWERS; tags: { displayName: string; }; } interface HostingWithViewersPrivateMessage extends BaseHostingPrivateMessage { event: ChatEvents.HOSTED_WITH_VIEWERS; tags: { displayName: string; }; numberOfViewers?: number; } interface HostingAutoPrivateMessage extends BaseHostingPrivateMessage { event: ChatEvents.HOSTED_AUTO; tags: { displayName: string; }; numberOfViewers?: number; } type PrivateMessages = PrivateMessage | PrivateMessageWithBits | HostingPrivateMessage | HostingWithViewersPrivateMessage | HostingAutoPrivateMessage; interface MessageParameters { [key: string]: string | number | boolean | Date | undefined; } interface AnonymousGiftPaidUpgradeParameters extends MessageParameters { } interface GiftPaidUpgradeParameters extends MessageParameters { promoGiftTotal: number; promoName: string; senderLogin: string; senderName: string; } interface RaidParameters extends MessageParameters { displayName: string; login: string; viewerCount: number; } interface ResubscriptionParameters extends MessageParameters { months: number; subPlan: string; subPlanName: string; } interface RitualParameters extends MessageParameters { ritualName: string; } interface SubscriptionGiftCommunityParameters extends MessageParameters { massGiftCount: number; senderCount: number; subPlan: number; } interface SubscriptionGiftParameters extends MessageParameters { months: number; subPlan: string; subPlanName: string; recipientDisplayName: string; recipientId: string; recipientName: string; } interface SubscriptionParameters extends MessageParameters { months: 1; subPlan: string; subPlanName: string; } type UserNoticeMessageParameters = AnonymousGiftPaidUpgradeParameters | GiftPaidUpgradeParameters | RaidParameters | ResubscriptionParameters | RitualParameters | SubscriptionGiftCommunityParameters | SubscriptionGiftParameters | SubscriptionParameters; interface UserNoticeMessage extends Omit<BaseMessage, "event" | "parameters"> { command: Commands.USER_NOTICE; event: UserNoticeEvents; tags: UserNoticeTags; parameters: MessageParameters; systemMessage: string; } /** * On anonymous gifted subscription paid upgrade to a channel. */ interface UserNoticeAnonymousGiftPaidUpgradeMessage extends UserNoticeMessage { command: Commands.USER_NOTICE; event: typeof UserNoticeEvents.ANON_GIFT_PAID_UPGRADE; parameters: AnonymousGiftPaidUpgradeParameters; } /** * On gifted subscription paid upgrade to a channel. */ interface UserNoticeGiftPaidUpgradeMessage extends Omit<UserNoticeMessage, "parameters"> { event: typeof UserNoticeEvents.GIFT_PAID_UPGRADE; parameters: { promoGiftTotal: number; promoName: string; senderLogin: string; senderName: string; }; } /** * On channel raid. */ interface UserNoticeRaidMessage extends Omit<UserNoticeMessage, "parameters"> { event: typeof UserNoticeEvents.RAID; parameters: { displayName: string; login: string; viewerCount: number; }; } /** * On resubscription (subsequent months) to a channel. */ interface UserNoticeResubscriptionMessage extends Omit<UserNoticeMessage, "parameters"> { event: typeof UserNoticeEvents.RESUBSCRIPTION; parameters: { months: number; subPlan: string; subPlanName: string; }; } /** * On channel ritual. */ interface UserNoticeRitualMessage extends Omit<UserNoticeMessage, "parameters"> { event: typeof UserNoticeEvents.RITUAL; parameters: { ritualName: string; }; } /** * On subscription gift to a channel community. */ interface UserNoticeSubscriptionGiftCommunityMessage extends Omit<UserNoticeMessage, "parameters"> { event: typeof UserNoticeEvents.SUBSCRIPTION_GIFT_COMMUNITY; parameters: { massGiftCount: number; senderCount: number; subPlan: number; }; } /** * On subscription gift to a channel. */ interface UserNoticeSubscriptionGiftMessage extends Omit<UserNoticeMessage, "parameters"> { event: typeof UserNoticeEvents.SUBSCRIPTION_GIFT; parameters: { months: number; subPlan: string; subPlanName: string; recipientDisplayName: string; recipientId: string; recipientName: string; }; } /** * On subscription (first month) to a channel. */ interface UserNoticeSubscriptionMessage extends Omit<UserNoticeMessage, "event" | "parameters"> { event: typeof UserNoticeEvents.SUBSCRIPTION; parameters: { months: 1; subPlan: string; subPlanName: string; }; } type UserNoticeMessages = UserNoticeAnonymousGiftPaidUpgradeMessage | UserNoticeGiftPaidUpgradeMessage | UserNoticeRaidMessage | UserNoticeResubscriptionMessage | UserNoticeRitualMessage | UserNoticeSubscriptionGiftCommunityMessage | UserNoticeSubscriptionGiftMessage | UserNoticeSubscriptionMessage; type Messages = BaseMessage | JoinMessage | PartMessage | ModeMessages | NamesMessage | NamesEndMessage | GlobalUserStateMessage | ClearChatMessages | ClearMessageMessage | HostTargetMessage | RoomStateMessage | NoticeMessages | UserStateMessage | PrivateMessages | UserNoticeMessages; /** * @see https://github.com/pinojs/pino/blob/v6.3.1/docs/api.md#options */ type LoggerOptions = PinoLoggerOptions; declare enum BaseClientEvents { RAW = "RAW", ALL = "*", CONNECTED = "CONNECTED", DISCONNECTED = "DISCONNECTED", RECONNECT = "RECONNECT", AUTHENTICATED = "AUTHENTICATED", AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED", ERROR_ENCOUNTERED = "ERROR_ENCOUNTERED" } declare const ClientEvents: { RAW: BaseClientEvents.RAW; ALL: BaseClientEvents.ALL; CONNECTED: BaseClientEvents.CONNECTED; DISCONNECTED: BaseClientEvents.DISCONNECTED; RECONNECT: BaseClientEvents.RECONNECT; AUTHENTICATED: BaseClientEvents.AUTHENTICATED; AUTHENTICATION_FAILED: BaseClientEvents.AUTHENTICATION_FAILED; ERROR_ENCOUNTERED: BaseClientEvents.ERROR_ENCOUNTERED; WELCOME: Commands.WELCOME; PING: Commands.PING; PONG: Commands.PONG; WHISPER: Commands.WHISPER; JOIN: Commands.JOIN; MODE: Commands.MODE; PART: Commands.PART; NAMES: Commands.NAMES; NAMES_END: Commands.NAMES_END; CLEAR_CHAT: Commands.CLEAR_CHAT; CLEAR_MESSAGE: Commands.CLEAR_MESSAGE; GLOBALUSERSTATE: Commands.GLOBALUSERSTATE; HOST_TARGET: Commands.HOST_TARGET; NOTICE: Commands.NOTICE; PRIVATE_MESSAGE: Commands.PRIVATE_MESSAGE; ROOM_STATE: Commands.ROOM_STATE; USER_NOTICE: Commands.USER_NOTICE; USER_STATE: Commands.USER_STATE; }; type ClientEvents = Commands | BaseClientEvents; type ClientEventTypes = { [ClientEvents.RAW]: [string]; [ClientEvents.ALL]: [BaseMessage]; [ClientEvents.CONNECTED]: [BaseMessage]; [ClientEvents.DISCONNECTED]: []; [ClientEvents.RECONNECT]: []; [ClientEvents.AUTHENTICATED]: [BaseMessage]; [ClientEvents.AUTHENTICATION_FAILED]: [BaseMessage]; [ClientEvents.ERROR_ENCOUNTERED]: [Error]; }; type ChatOptions = { username?: string; /** * OAuth token * @see https://twitchtokengenerator.com/ to generate a token */ token?: string; /** * Bot is known * @see https://dev.twitch.tv/docs/irc/guide/#known-and-verified-bots */ isKnown?: boolean; /** * Bot is verified * @see https://dev.twitch.tv/docs/irc/guide/#known-and-verified-bots */ isVerified?: boolean; connectionTimeout: number; joinTimeout: number; log?: LoggerOptions; onAuthenticationFailure?: () => Promise<string>; }; declare enum NoticeCompounds { ALREADY_BANNED = "NOTICE/ALREADY_BANNED", ALREADY_EMOTE_ONLY_OFF = "NOTICE/ALREADY_EMOTE_ONLY_OFF", ALREADY_EMOTE_ONLY_ON = "NOTICE/ALREADY_EMOTE_ONLY_ON", ALREADY_R9K_OFF = "NOTICE/ALREADY_R9K_OFF", ALREADY_R9K_ON = "NOTICE/ALREADY_R9K_ON", ALREADY_SUBS_OFF = "NOTICE/ALREADY_SUBS_OFF", ALREADY_SUBS_ON = "NOTICE/ALREADY_SUBS_ON", BAD_HOST_HOSTING = "NOTICE/BAD_HOST_HOSTING", BAD_MOD_MOD = "NOTICE/BAD_MOD_MOD", BAN_SUCCESS = "NOTICE/BAN_SUCCESS", BAD_UNBAN_NO_BAN = "NOTICE/BAD_UNBAN_NO_BAN", COLOR_CHANGED = "NOTICE/COLOR_CHANGED", CMDS_AVAILABLE = "NOTICE/CMDS_AVAILABLE", COMMERCIAL_SUCCESS = "NOTICE/COMMERCIAL_SUCCESS", EMOTE_ONLY_OFF = "NOTICE/EMOTE_ONLY_OFF", EMOTE_ONLY_ON = "NOTICE/EMOTE_ONLY_ON", FOLLOWERS_OFF = "NOTICE/FOLLOWERS_OFF", FOLLOWERS_ON = "NOTICE/FOLLOWERS_ON", FOLLOWERS_ONZERO = "NOTICE/FOLLOWERS_ONZERO", HOST_OFF = "NOTICE/HOST_OFF", HOST_ON = "NOTICE/HOST_ON", HOSTS_REMAINING = "NOTICE/HOSTS_REMAINING", MSG_CHANNEL_SUSPENDED = "NOTICE/MSG_CHANNEL_SUSPENDED", MOD_SUCCESS = "NOTICE/MOD_SUCCESS", NOT_HOSTING = "NOTICE/NOT_HOSTING", R9K_OFF = "NOTICE/R9K_OFF", R9K_ON = "NOTICE/R9K_ON", ROOM_MODS = "NOTICE/ROOM_MODS", SLOW_OFF = "NOTICE/SLOW_OFF", SLOW_ON = "NOTICE/SLOW_ON", SUBS_OFF = "NOTICE/SUBS_OFF", SUBS_ON = "NOTICE/SUBS_ON", TIMEOUT_SUCCESS = "NOTICE/TIMEOUT_SUCCESS", UNBAN_SUCCESS = "NOTICE/UNBAN_SUCCESS", UNMOD_SUCCESS = "NOTICE/UNMOD_SUCCESS", UNRAID_SUCCESS = "NOTICE/UNRAID_SUCCESS", UNRECOGNIZED_CMD = "NOTICE/UNRECOGNIZED_CMD" } declare enum PrivateMessageCompounds { CHEER = "PRIVMSG/CHEER", HOSTED_WITHOUT_VIEWERS = "PRIVMSG/HOSTED_WITHOUT_VIEWERS", HOSTED_WITH_VIEWERS = "PRIVMSG/HOSTED_WITH_VIEWERS", HOSTED_AUTO = "PRIVMSG/HOSTED_AUTO" } declare enum UserNoticeCompounds { ANON_GIFT_PAID_UPGRADE = "USERNOTICE/ANON_GIFT_PAID_UPGRADE", GIFT_PAID_UPGRADE = "USERNOTICE/GIFT_PAID_UPGRADE", RAID = "USERNOTICE/RAID", RESUBSCRIPTION = "USERNOTICE/RESUBSCRIPTION", RITUAL = "USERNOTICE/RITUAL", SUBSCRIPTION = "USERNOTICE/SUBSCRIPTION", SUBSCRIPTION_GIFT = "USERNOTICE/SUBSCRIPTION_GIFT", SUBSCRIPTION_GIFT_COMMUNITY = "USERNOTICE/SUBSCRIPTION_GIFT_COMMUNITY" } type EventTypes = Omit<ClientEventTypes, BaseClientEvents.ALL> & { [Events.ALL]: [Messages]; [Events.JOIN]: [JoinMessage]; [Events.PART]: [PartMessage]; [Events.ROOM_STATE]: [RoomStateMessage]; [Events.USER_STATE]: [UserStateMessage]; [Events.CLEAR_CHAT]: [ClearChatMessages]; [Events.HOST_TARGET]: [HostTargetMessage]; [Events.MODE]: [ModeMessages]; [Events.NAMES]: [NamesMessage]; [Events.NAMES_END]: [NamesEndMessage]; /** * NOTICE messages */ [Events.NOTICE]: [NoticeMessages]; [Events.ALREADY_BANNED]: [NoticeMessage]; [Events.ALREADY_EMOTE_ONLY_OFF]: [NoticeMessage]; [Events.ALREADY_EMOTE_ONLY_ON]: [NoticeMessage]; [Events.ALREADY_R9K_OFF]: [NoticeMessage]; [Events.ALREADY_R9K_ON]: [NoticeMessage]; [Events.ALREADY_SUBS_OFF]: [NoticeMessage]; [Events.ALREADY_SUBS_ON]: [NoticeMessage]; [Events.BAD_HOST_HOSTING]: [NoticeMessage]; [Events.BAD_MOD_MOD]: [NoticeMessage]; [Events.BAN_SUCCESS]: [NoticeMessage]; [Events.BAD_UNBAN_NO_BAN]: [NoticeMessage]; [Events.COLOR_CHANGED]: [NoticeMessage]; [Events.CMDS_AVAILABLE]: [NoticeMessage]; [Events.COMMERCIAL_SUCCESS]: [NoticeMessage]; [Events.EMOTE_ONLY_OFF]: [NoticeMessage]; [Events.EMOTE_ONLY_ON]: [NoticeMessage]; [Events.FOLLOWERS_OFF]: [NoticeMessage]; [Events.FOLLOWERS_ON]: [NoticeMessage]; [Events.FOLLOWERS_ONZERO]: [NoticeMessage]; [Events.HOST_OFF]: [NoticeMessage]; [Events.HOST_ON]: [NoticeMessage]; [Events.HOSTS_REMAINING]: [NoticeMessage]; [Events.MSG_CHANNEL_SUSPENDED]: [NoticeMessage]; [Events.MOD_SUCCESS]: [NoticeMessage]; [Events.R9K_OFF]: [NoticeMessage]; [Events.R9K_ON]: [NoticeMessage]; [Events.ROOM_MODS]: [NoticeRoomModsMessage]; [Events.SLOW_OFF]: [NoticeMessage]; [Events.SLOW_ON]: [NoticeMessage]; [Events.SUBS_OFF]: [NoticeMessage]; [Events.SUBS_ON]: [NoticeMessage]; [Events.TIMEOUT_SUCCESS]: [NoticeMessage]; [Events.UNBAN_SUCCESS]: [NoticeMessage]; [Events.UNRAID_SUCCESS]: [NoticeMessage]; [Events.UNRECOGNIZED_CMD]: [NoticeMessage]; [NoticeCompounds.ALREADY_BANNED]: [NoticeMessage]; [NoticeCompounds.ALREADY_EMOTE_ONLY_OFF]: [NoticeMessage]; [NoticeCompounds.ALREADY_EMOTE_ONLY_ON]: [NoticeMessage]; [NoticeCompounds.ALREADY_R9K_OFF]: [NoticeMessage]; [NoticeCompounds.ALREADY_R9K_ON]: [NoticeMessage]; [NoticeCompounds.ALREADY_SUBS_OFF]: [NoticeMessage]; [NoticeCompounds.ALREADY_SUBS_ON]: [NoticeMessage]; [NoticeCompounds.BAD_HOST_HOSTING]: [NoticeMessage]; [NoticeCompounds.BAD_MOD_MOD]: [NoticeMessage]; [NoticeCompounds.BAN_SUCCESS]: [NoticeMessage]; [NoticeCompounds.BAD_UNBAN_NO_BAN]: [NoticeMessage]; [NoticeCompounds.COLOR_CHANGED]: [NoticeMessage]; [NoticeCompounds.CMDS_AVAILABLE]: [NoticeMessage]; [NoticeCompounds.COMMERCIAL_SUCCESS]: [NoticeMessage]; [NoticeCompounds.EMOTE_ONLY_OFF]: [NoticeMessage]; [NoticeCompounds.EMOTE_ONLY_ON]: [NoticeMessage]; [NoticeCompounds.FOLLOWERS_OFF]: [NoticeMessage]; [NoticeCompounds.FOLLOWERS_ON]: [NoticeMessage]; [NoticeCompounds.FOLLOWERS_ONZERO]: [NoticeMessage]; [NoticeCompounds.HOST_OFF]: [NoticeMessage]; [NoticeCompounds.HOST_ON]: [NoticeMessage]; [NoticeCompounds.HOSTS_REMAINING]: [NoticeMessage]; [NoticeCompounds.MSG_CHANNEL_SUSPENDED]: [NoticeMessage]; [NoticeCompounds.MOD_SUCCESS]: [NoticeMessage]; [NoticeCompounds.R9K_OFF]: [NoticeMessage]; [NoticeCompounds.R9K_ON]: [NoticeMessage]; [NoticeCompounds.ROOM_MODS]: [NoticeRoomModsMessage]; [NoticeCompounds.SLOW_OFF]: [NoticeMessage]; [NoticeCompounds.SLOW_ON]: [NoticeMessage]; [NoticeCompounds.SUBS_OFF]: [NoticeMessage]; [NoticeCompounds.SUBS_ON]: [NoticeMessage]; [NoticeCompounds.TIMEOUT_SUCCESS]: [NoticeMessage]; [NoticeCompounds.UNBAN_SUCCESS]: [NoticeMessage]; [NoticeCompounds.UNRAID_SUCCESS]: [NoticeMessage]; [NoticeCompounds.UNRECOGNIZED_CMD]: [NoticeMessage]; /** * PRIVMSG messages */ [Events.PRIVATE_MESSAGE]: [PrivateMessages]; [Events.CHEER]: [PrivateMessageWithBits]; [Events.HOSTED_WITHOUT_VIEWERS]: [HostingPrivateMessage]; [Events.HOSTED_WITH_VIEWERS]: [HostingWithViewersPrivateMessage]; [Events.HOSTED_AUTO]: [HostingAutoPrivateMessage]; [PrivateMessageCompounds.CHEER]: [PrivateMessageWithBits]; [PrivateMessageCompounds.HOSTED_WITHOUT_VIEWERS]: [HostingPrivateMessage]; [PrivateMessageCompounds.HOSTED_WITH_VIEWERS]: [HostingWithViewersPrivateMessage]; [PrivateMessageCompounds.HOSTED_AUTO]: [HostingAutoPrivateMessage]; /** * USERNOTICE messages */ [Events.USER_NOTICE]: [UserNoticeMessages]; [Events.ANON_GIFT_PAID_UPGRADE]: [UserNoticeAnonymousGiftPaidUpgradeMessage]; [Events.GIFT_PAID_UPGRADE]: [UserNoticeGiftPaidUpgradeMessage]; [Events.RAID]: [UserNoticeRaidMessage]; [Events.RESUBSCRIPTION]: [UserNoticeResubscriptionMessage]; [Events.RITUAL]: [UserNoticeRitualMessage]; [Events.SUBSCRIPTION]: [UserNoticeSubscriptionMessage]; [Events.SUBSCRIPTION_GIFT]: [UserNoticeSubscriptionGiftMessage]; [Events.SUBSCRIPTION_GIFT_COMMUNITY]: [UserNoticeSubscriptionGiftCommunityMessage]; [UserNoticeCompounds.ANON_GIFT_PAID_UPGRADE]: [UserNoticeAnonymousGiftPaidUpgradeMessage]; [UserNoticeCompounds.GIFT_PAID_UPGRADE]: [UserNoticeGiftPaidUpgradeMessage]; [UserNoticeCompounds.RAID]: [UserNoticeRaidMessage]; [UserNoticeCompounds.RESUBSCRIPTION]: [UserNoticeResubscriptionMessage]; [UserNoticeCompounds.RITUAL]: [UserNoticeRitualMessage]; [UserNoticeCompounds.SUBSCRIPTION]: [UserNoticeSubscriptionMessage]; [UserNoticeCompounds.SUBSCRIPTION_GIFT]: [UserNoticeSubscriptionGiftMessage]; [UserNoticeCompounds.SUBSCRIPTION_GIFT_COMMUNITY]: [UserNoticeSubscriptionGiftCommunityMessage]; [eventName: string]: [Messages]; // This break p-event typing. }; /** * Interact with Twitch chat. * * ## Connecting * * ```js * const token = 'cfabdegwdoklmawdzdo98xt2fo512y' * const username = 'ronni' * const { chat } = new TwitchJs({ token, username }) * * chat.connect().then(globalUserState => { * // Do stuff ... * }) * ``` * * **Note:** Connecting with a `token` and a `username` is optional. * * Once connected, `chat.userState` will contain * [[GlobalUserStateTags|global user state information]]. * * ## Joining a channel * * ```js * const channel = '#dallas' * * chat.join(channel).then(channelState => { * // Do stuff with channelState... * }) * ``` * * After joining a channel, `chat.channels[channel]` will contain * [[ChannelState|channel state information]]. * * ## Listening for events * * ```js * // Listen to all events * chat.on('*', message => { * // Do stuff with message ... * }) * * // Listen to private messages * chat.on('PRIVMSG', privateMessage => { * // Do stuff with privateMessage ... * }) * ``` * * Events are nested; for example: * * ```js * // Listen to subscriptions only * chat.on('USERNOTICE/SUBSCRIPTION', userStateMessage => { * // Do stuff with userStateMessage ... * }) * * // Listen to all user notices * chat.on('USERNOTICE', userStateMessage => { * // Do stuff with userStateMessage ... * }) * ``` * * For added convenience, TwitchJS also exposes event constants. * * ```js * const { chat } = new TwitchJs({ token, username }) * * // Listen to all user notices * chat.on(chat.events.USER_NOTICE, userStateMessage => { * // Do stuff with userStateMessage ... * }) * ``` * * ## Sending messages * * To send messages, [Chat] must be initialized with a `username` and a * [`token`](../#authentication) with `chat_login` scope. * * All messages sent to Twitch are automatically rate-limited according to * [Twitch Developer documentation](https://dev.twitch.tv/docs/irc/guide/#command--message-limits). * * ### Speak in channel * * ```js * const channel = '#dallas' * * chat * .say(channel, 'Kappa Keepo Kappa') * // Optionally ... * .then(() => { * // ... do stuff on success ... * }) * ``` * * ### Send command to channel * * All chat commands are currently supported and exposed as camel-case methods. For * example: * * ```js * const channel = '#dallas' * * // Enable followers-only for 1 week * chat.followersOnly(channel, '1w') * * // Ban ronni * chat.ban(channel, 'ronni') * ``` * * **Note:** `Promise`-resolves for each commands are * [planned](https://github.com/twitch-devs/twitch-js/issues/87). * * ## Joining multiple channels * * ```js * const channels = ['#dallas', '#ronni'] * * Promise.all(channels.map(channel => chat.join(channel))).then(channelStates => { * // Listen to all messages from #dallas only * chat.on('#dallas', message => { * // Do stuff with message ... * }) * * // Listen to private messages from #dallas and #ronni * chat.on('PRIVMSG', privateMessage => { * // Do stuff with privateMessage ... * }) * * // Listen to private messages from #dallas only * chat.on('PRIVMSG/#dallas', privateMessage => { * // Do stuff with privateMessage ... * }) * * // Listen to all private messages from #ronni only * chat.on('PRIVMSG/#ronni', privateMessage => { * // Do stuff with privateMessage ... * }) * }) * ``` * * ### Broadcasting to all channels * * ```js * chat * .broadcast('Kappa Keepo Kappa') * // Optionally ... * .then(userStateMessages => { * // ... do stuff with userStateMessages on success ... * }) * ``` */ declare class Chat extends EventEmitter<EventTypes> { static Commands: typeof Commands; static Events: { ANON_GIFT_PAID_UPGRADE: "ANON_GIFT_PAID_UPGRADE"; GIFT_PAID_UPGRADE: "GIFT_PAID_UPGRADE"; RAID: "RAID"; RESUBSCRIPTION: "RESUBSCRIPTION"; RITUAL: "RITUAL"; SUBSCRIPTION: "SUBSCRIPTION"; SUBSCRIPTION_GIFT: "SUBSCRIPTION_GIFT"; SUBSCRIPTION_GIFT_COMMUNITY: "SUBSCRIPTION_GIFT_COMMUNITY"; CHEER: PrivateMessageEvents.CHEER; HOSTED_WITHOUT_VIEWERS: PrivateMessageEvents.HOSTED_WITHOUT_VIEWERS; HOSTED_WITH_VIEWERS: PrivateMessageEvents.HOSTED_WITH_VIEWERS; HOSTED_AUTO: PrivateMessageEvents.HOSTED_AUTO; ALREADY_BANNED: "ALREADY_BANNED"; ALREADY_EMOTE_ONLY_OFF: "ALREADY_EMOTE_ONLY_OFF"; ALREADY_EMOTE_ONLY_ON: "ALREADY_EMOTE_ONLY_ON"; ALREADY_R9K_OFF: "ALREADY_R9K_OFF"; ALREADY_R9K_ON: "ALREADY_R9K_ON"; ALREADY_SUBS_OFF: "ALREADY_SUBS_OFF"; ALREADY_SUBS_ON: "ALREADY_SUBS_ON"; BAD_HOST_HOSTING: "BAD_HOST_HOSTING"; BAD_MOD_MOD: "BAD_MOD_MOD"; BAN_SUCCESS: "BAN_SUCCESS"; BAD_UNBAN_NO_BAN: "BAD_UNBAN_NO_BAN"; COLOR_CHANGED: "COLOR_CHANGED"; CMDS_AVAILABLE: "CMDS_AVAILABLE"; COMMERCIAL_SUCCESS: "COMMERCIAL_SUCCESS"; EMOTE_ONLY_OFF: "EMOTE_ONLY_OFF"; EMOTE_ONLY_ON: "EMOTE_ONLY_ON"; FOLLOWERS_OFF: "FOLLOWERS_OFF"; FOLLOWERS_ON: "FOLLOWERS_ON"; FOLLOWERS_ONZERO: "FOLLOWERS_ONZERO"; HOST_OFF: "HOST_OFF"; HOST_ON: "HOST_ON"; HOSTS_REMAINING: "HOSTS_REMAINING"; MSG_CHANNEL_SUSPENDED: "MSG_CHANNEL_SUSPENDED"; MOD_SUCCESS: "MOD_SUCCESS"; NOT_HOSTING: "NOT_HOSTING"; R9K_OFF: "R9K_OFF"; R9K_ON: "R9K_ON"; ROOM_MODS: "ROOM_MODS"; SLOW_OFF: "SLOW_OFF"; SLOW_ON: "SLOW_ON"; SUBS_OFF: "SUBS_OFF"; SUBS_ON: "SUBS_ON"; TIMEOUT_SUCCESS: "TIMEOUT_SUCCESS"; UNBAN_SUCCESS: "UNBAN_SUCCESS"; UNMOD_SUCCESS: "UNMOD_SUCCESS"; UNRAID_SUCCESS: "UNRAID_SUCCESS"; UNRECOGNIZED_CMD: "UNRECOGNIZED_CMD"; RAW: ChatEvents.RAW; ALL: ChatEvents.ALL; CONNECTED: ChatEvents.CONNECTED; DISCONNECTED: ChatEvents.DISCONNECTED; RECONNECT: ChatEvents.RECONNECT; AUTHENTICATED: ChatEvents.AUTHENTICATED; AUTHENTICATION_FAILED: ChatEvents.AUTHENTICATION_FAILED; GLOBALUSERSTATE: ChatEvents.GLOBALUSERSTATE; ERROR_ENCOUNTERED: ChatEvents.ERROR_ENCOUNTERED; PARSE_ERROR_ENCOUNTERED: ChatEvents.PARSE_ERROR_ENCOUNTERED; MOD_GAINED: ChatEvents.MOD_GAINED; MOD_LOST: ChatEvents.MOD_LOST; USER_BANNED: ChatEvents.USER_BANNED; HOSTED: ChatEvents.HOSTED; CLEAR_CHAT: BaseCommands.CLEAR_CHAT; CLEAR_MESSAGE: BaseCommands.CLEAR_MESSAGE; HOST_TARGET: BaseCommands.HOST_TARGET; NOTICE: BaseCommands.NOTICE; ROOM_STATE: BaseCommands.ROOM_STATE; USER_NOTICE: BaseCommands.USER_NOTICE; USER_STATE: BaseCommands.USER_STATE; WELCOME: OtherCommands.WELCOME; PING: OtherCommands.PING; PONG: OtherCommands.PONG; WHISPER: OtherCommands.WHISPER; PRIVATE_MESSAGE: TagCommands.PRIVATE_MESSAGE; JOIN: MembershipCommands.JOIN; MODE: MembershipCommands.MODE; PART: MembershipCommands.PART; NAMES: MembershipCommands.NAMES; NAMES_END: MembershipCommands.NAMES_END; }; static CompoundEvents: { NOTICE: typeof NoticeCompounds; PRIVMSG: typeof PrivateMessageCompounds; USERNOTICE: typeof UserNoticeCompounds; }; private _options; private _log; private _client?; private _readyState; private _connectionAttempts; private _connectionInProgress?; private _globalUserState?; private _channelState; private _isAuthenticated; /** * Chat constructor. */ constructor(options: Partial<ChatOptions>); /** * Connect to Twitch. */ connect(): Promise<void>; /** * Updates the client options after instantiation. * To update `token` or `username`, use `reconnect()`. */ updateOptions(options: Partial<ChatOptions>): void; /** * Send a raw message to Twitch. */ send(message: string, options?: Partial<{ priority: number; isModerator: boolean; }>): Promise<void>; /** * Disconnected from Twitch. */ disconnect(): void; /** * Reconnect to Twitch, providing new options to the client. */ reconnect(options?: ChatOptions): Promise<{ roomState: RoomStateTags; userState: UserStateTags | undefined; }[]>; /** * Join a channel. * * @example <caption>Joining #dallas</caption> * const channel = '#dallas' * * chat.join(channel).then(channelState => { * // Do stuff with channelState... * }) * * @example <caption>Joining multiple channels</caption> * const channels = ['#dallas', '#ronni'] * * Promise.all(channels.map(channel => chat.join(channel))) * .then(channelStates => { * // Listen to all PRIVMSG * chat.on('PRIVMSG', privateMessage => { * // Do stuff with privateMessage ... * }) * * // Listen to PRIVMSG from #dallas ONLY * chat.on('PRIVMSG/#dallas', privateMessage => { * // Do stuff with privateMessage ... * }) * // Listen to all PRIVMSG from #ronni ONLY * chat.on('PRIVMSG/#ronni', privateMessage => { * // Do stuff with privateMessage ... * }) * }) */ join(channel: string): Promise<{ roomState: RoomStateTags; userState: UserStateTags | undefined; }>; /** * Depart from a channel. */ part(channel: string): Promise<void>; /** * Send a message to a channel. */ say(channel: string, message: string, options?: { priority?: number; }): Promise<void>; /** * Broadcast message to all connected channels. */ broadcast(message: string): Promise<Promise<void>[]>; /** * This command will allow you to permanently ban a user from the chat room. */ ban(channel: string, username: string): Promise<NoticeMessages>; /** * This command will allow you to block all messages from a specific user in * chat and whispers if you do not wish to see their comments. */ block(channel: string, username: string): Promise<void>; /** * Single message removal on a channel. */ delete(channel: string, targetMessageId: string): Promise<void>; /** * This command will allow the Broadcaster and chat moderators to completely * wipe the previous chat history. */ clear(channel: string): Promise<NoticeMessages>; /** * Allows you to change the color of your username. */ color(channel: string, color: string): Promise<NoticeMessages>; /** * An Affiliate and Partner command that runs a commercial for all of your * viewers. */ commercial(channel: string, length: 30 | 60 | 90 | 120 | 150 | 180): Promise<NoticeMessages>; /** * This command allows you to set your room so only messages that are 100% * emotes are allowed. */ emoteOnly(channel: string): Promise<NoticeMessages>; /** * This command allows you to disable emote only mode if you previously * enabled it. */ emoteOnlyOff(channel: string): Promise<NoticeMessages>; /** * This command allows you or your mods to restrict chat to all or some of * your followers, based on how long they’ve followed. * @param period - Follow time from 0 minutes (all followers) to 3 months. */ followersOnly(channel: string, period: string): Promise<NoticeMessages>; /** * This command will disable followers only mode if it was previously enabled * on the channel. */ followersOnlyOff(channel: string): Promise<NoticeMessages>; help(channel: string): Promise<NoticeMessages>; /** * This command will allow you to host another channel on yours. */ host(channel: string, hostChannel: string): Promise<NoticeMessages>; /** * Adds a stream marker (with an optional description, max 140 characters) at * the current timestamp. You can use markers in the Highlighter for easier * editing. */ marker(channel: string, description: string): Promise<void>; /** * This command will color your text based on your chat name color. */ me(channel: string, text: string): Promise<void>; /** * This command will allow you to promote a user to a channel moderator. */ mod(channel: string, username: string): Promise<NoticeMessages>; /** * This command will display a list of all chat moderators for that specific * channel. */ mods(channel: string): Promise<NoticeMessages>; /** * @deprecated */ r9K(channel: string): Promise<NoticeMessages>; /** * @deprecated */ r9KOff(channel: string): Promise<NoticeMessages>; /** * This command will send the viewer to another live channel. */ raid(channel: string, raidChannel: string): Promise<void>; /** * This command allows you to set a limit on how often users in the chat room * are allowed to send messages (rate limiting). */ slow(channel: string, seconds: string): Promise<NoticeMessages>; /** * This command allows you to disable slow mode if you had previously set it. */ slowOff(channel: string): Promise<NoticeMessages>; /** * This command allows you to set your room so only users subscribed to you * can talk in the chat room. If you don't have the subscription feature it * will only allow the Broadcaster and the channel moderators to talk in the * chat room. */ subscribers(channel: string): Promise<NoticeMessages>; /** * This command allows you to disable subscribers only chat room if you * previously enabled it. */ subscribersOff(channel: string): Promise<NoticeMessages>; /** * This command allows you to temporarily ban someone from the chat room for * 10 minutes by default. This will be indicated to yourself and the * temporarily banned subject in chat on a successful temporary ban. A new * timeout command will overwrite an old one. */ timeout(channel: string, username: string, timeout?: number): Promise<NoticeMessages>; /** * This command will allow you to lift a permanent ban on a user from the * chat room. You can also use this command to end a ban early; this also * applies to timeouts. */ unban(channel: string, username: string): Promise<NoticeMessages>; /** * This command will allow you to remove users from your block list that you * previously added. */ unblock(channel: string, username: string): Promise<void>; /** * Using this command will revert the embedding from hosting a channel and * return it to its normal state. */ unhost(channel: string): Promise<NoticeMessages>; /** * This command will allow you to demote an existing moderator back to viewer * status (removing their moderator abilities). */ unmod(channel: string, username: