UNPKG

@twurple/api

Version:

Interact with Twitch's API.

922 lines 61.1 kB
import { __decorate } from "tslib"; import { mapOptional } from '@d-fischer/shared-utils'; import { extractUserId, rtfm } from '@twurple/common'; import { createEventSubBroadcasterCondition, createEventSubDropEntitlementGrantCondition, createEventSubModeratorCondition, createEventSubRewardCondition, createEventSubUserCondition, createEventSubConduitCondition, createEventSubConduitUpdateCondition, createEventSubConduitShardsUpdateCondition, } from '../../interfaces/endpoints/eventSub.external.js'; import { createSingleKeyQuery } from '../../interfaces/endpoints/generic.external.js'; import { HelixPaginatedRequest } from '../../utils/pagination/HelixPaginatedRequest.js'; import { createPaginatedResultWithTotal, createPaginatedResult } from '../../utils/pagination/HelixPaginatedResult.js'; import { createPaginationQuery } from '../../utils/pagination/HelixPagination.js'; import { BaseApi } from '../BaseApi.js'; import { HelixEventSubSubscription } from './HelixEventSubSubscription.js'; import { HelixPaginatedEventSubSubscriptionsRequest } from './HelixPaginatedEventSubSubscriptionsRequest.js'; import { HelixEventSubConduit } from './HelixEventSubConduit.js'; import { HelixEventSubConduitShard } from './HelixEventSubConduitShard.js'; /** * The API methods that deal with EventSub. * * Can be accessed using `client.eventSub` on an {@link ApiClient} instance. * * ## Before using these methods... * * All methods in this class assume that you are already running a working EventSub listener reachable using the given transport. * * If you don't already have one, we recommend use of the `@twurple/eventsub-http` or `@twurple/eventsub-ws` libraries, * which handle subscribing and unsubscribing to these topics automatically. * * ## Example * ```ts * const api = new ApiClient({ authProvider }); * await api.eventSub.subscribeToUserFollowsTo('125328655', { callbackUrl: 'https://example.com' }); * ``` * * @meta category helix * @meta categorizedTitle EventSub */ let HelixEventSubApi = class HelixEventSubApi extends BaseApi { /** * Gets the current EventSub subscriptions for the current client. * * @param pagination * * @expandParams */ async getSubscriptions(pagination) { const result = await this._client.callApi({ type: 'helix', url: 'eventsub/subscriptions', query: createPaginationQuery(pagination), }); return { ...createPaginatedResultWithTotal(result, HelixEventSubSubscription, this._client), totalCost: result.total_cost, maxTotalCost: result.max_total_cost, }; } /** * Creates a paginator for the current EventSub subscriptions for the current client. */ getSubscriptionsPaginated() { return new HelixPaginatedEventSubSubscriptionsRequest({}, undefined, this._client); } /** * Gets the current EventSub subscriptions with the given status for the current client. * * @param status The status of the subscriptions to get. * @param pagination * * @expandParams */ async getSubscriptionsForStatus(status, pagination) { const result = await this._client.callApi({ type: 'helix', url: 'eventsub/subscriptions', query: { ...createPaginationQuery(pagination), status, }, }); return { ...createPaginatedResultWithTotal(result, HelixEventSubSubscription, this._client), totalCost: result.total_cost, maxTotalCost: result.max_total_cost, }; } /** * Creates a paginator for the current EventSub subscriptions with the given status for the current client. * * @param status The status of the subscriptions to get. */ getSubscriptionsForStatusPaginated(status) { return new HelixPaginatedEventSubSubscriptionsRequest({ status }, undefined, this._client); } /** * Gets the current EventSub subscriptions with the given type for the current client. * * @param type The type of the subscriptions to get. * @param pagination * * @expandParams */ async getSubscriptionsForType(type, pagination) { const result = await this._client.callApi({ type: 'helix', url: 'eventsub/subscriptions', query: { ...createPaginationQuery(pagination), type, }, }); return { ...createPaginatedResultWithTotal(result, HelixEventSubSubscription, this._client), totalCost: result.total_cost, maxTotalCost: result.max_total_cost, }; } /** * Creates a paginator for the current EventSub subscriptions with the given type for the current client. * * @param type The type of the subscriptions to get. */ getSubscriptionsForTypePaginated(type) { return new HelixPaginatedEventSubSubscriptionsRequest({ type }, undefined, this._client); } /** * Gets the current EventSub subscriptions for the current user and client. * * @param user The user to get subscriptions for. * @param pagination * * @expandParams */ async getSubscriptionsForUser(user, pagination) { const result = await this._client.callApi({ type: 'helix', url: 'eventsub/subscriptions', userId: extractUserId(user), query: { ...createSingleKeyQuery('user_id', extractUserId(user)), ...createPaginationQuery(pagination), }, }); return { ...createPaginatedResultWithTotal(result, HelixEventSubSubscription, this._client), totalCost: result.total_cost, maxTotalCost: result.max_total_cost, }; } /** * Creates a paginator for the current EventSub subscriptions with the given type for the current client. * * @param user The user to get subscriptions for. */ getSubscriptionsForUserPaginated(user) { const userId = extractUserId(user); return new HelixPaginatedEventSubSubscriptionsRequest(createSingleKeyQuery('user_id', userId), userId, this._client); } /** * Sends an arbitrary request to subscribe to an event. * * You can only create WebHook transport subscriptions using app tokens * and WebSocket transport subscriptions using user tokens. * * @param type The type of the event. * @param version The version of the event. * @param condition The condition of the subscription. * @param transport The transport of the subscription. * @param user The user to create the subscription in context of. * @param requiredScopeSet The scope set required by the subscription. Will only be checked for applicable transports. * @param canOverrideScopedUserContext Whether the auth user context can be overridden. * @param isBatched Whether to enable batching for the subscription. Is only supported for select topics. */ async createSubscription(type, version, condition, transport, user, requiredScopeSet, canOverrideScopedUserContext, isBatched) { const usesAppAuth = transport.method === 'webhook' || transport.method === 'conduit'; const scopes = usesAppAuth ? undefined : requiredScopeSet; if (!usesAppAuth && !user) { throw new Error(`Transport ${transport.method} can only handle subscriptions with user context`); } const jsonBody = { type, version, condition, transport, }; if (isBatched) { jsonBody.is_batching_enabled = true; } const result = await this._client.callApi({ type: 'helix', url: 'eventsub/subscriptions', method: 'POST', scopes, userId: mapOptional(user, extractUserId), canOverrideScopedUserContext, forceType: usesAppAuth ? 'app' : 'user', jsonBody, }); return new HelixEventSubSubscription(result.data[0], this._client); } /** * Deletes a subscription. * * @param id The ID of the subscription. */ async deleteSubscription(id) { await this._client.callApi({ type: 'helix', url: 'eventsub/subscriptions', method: 'DELETE', query: { id, }, }); } /** * Deletes *all* subscriptions. */ async deleteAllSubscriptions() { await this._deleteSubscriptionsWithCondition(); } /** * Deletes all broken subscriptions, i.e. all that are not enabled or pending verification. */ async deleteBrokenSubscriptions() { await this._deleteSubscriptionsWithCondition(sub => sub.status !== 'enabled' && sub.status !== 'webhook_callback_verification_pending'); } /** * Subscribe to events that represent a stream going live. * * @param broadcaster The broadcaster you want to listen to online events for. * @param transport The transport options. */ async subscribeToStreamOnlineEvents(broadcaster, transport) { return await this.createSubscription('stream.online', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster); } /** * Subscribe to events that represent a stream going offline. * * @param broadcaster The broadcaster you want to listen to online events for. * @param transport The transport options. */ async subscribeToStreamOfflineEvents(broadcaster, transport) { return await this.createSubscription('stream.offline', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster); } /** * Subscribe to events that represent a channel updating their metadata. * * @param broadcaster The broadcaster you want to listen to update events for. * @param transport The transport options. */ async subscribeToChannelUpdateEvents(broadcaster, transport) { return await this.createSubscription('channel.update', '2', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster); } /** * Subscribe to events that represent a user following a channel. * * @param broadcaster The broadcaster you want to listen to follow events for. * @param transport The transport options. */ async subscribeToChannelFollowEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.follow', '2', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcasterId, ['moderator:read:followers'], true); } /** * Subscribe to events that represent a user subscribing to a channel. * * @param broadcaster The broadcaster you want to listen to subscribe events for. * @param transport The transport options. */ async subscribeToChannelSubscriptionEvents(broadcaster, transport) { return await this.createSubscription('channel.subscribe', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:subscriptions']); } /** * Subscribe to events that represent a user gifting another user a subscription to a channel. * * @param broadcaster The broadcaster you want to listen to subscription gift events for. * @param transport The transport options. */ async subscribeToChannelSubscriptionGiftEvents(broadcaster, transport) { return await this.createSubscription('channel.subscription.gift', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:subscriptions']); } /** * Subscribe to events that represent a user's subscription to a channel being announced. * * @param broadcaster The broadcaster you want to listen to subscription message events for. * @param transport The transport options. */ async subscribeToChannelSubscriptionMessageEvents(broadcaster, transport) { return await this.createSubscription('channel.subscription.message', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:subscriptions']); } /** * Subscribe to events that represent a user's subscription to a channel ending. * * @param broadcaster The broadcaster you want to listen to subscription end events for. * @param transport The transport options. */ async subscribeToChannelSubscriptionEndEvents(broadcaster, transport) { return await this.createSubscription('channel.subscription.end', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:subscriptions']); } /** * Subscribe to events that represent a user cheering bits to a channel. * * @param broadcaster The broadcaster you want to listen to cheer events for. * @param transport The transport options. */ async subscribeToChannelCheerEvents(broadcaster, transport) { return await this.createSubscription('channel.cheer', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['bits:read']); } /** * Subscribe to events that represent a charity campaign starting in a channel. * * @param broadcaster The broadcaster you want to listen to charity donation events for. * @param transport The transport options. */ async subscribeToChannelCharityCampaignStartEvents(broadcaster, transport) { return await this.createSubscription('channel.charity_campaign.start', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:charity']); } /** * Subscribe to events that represent a charity campaign ending in a channel. * * @param broadcaster The broadcaster you want to listen to charity donation events for. * @param transport The transport options. */ async subscribeToChannelCharityCampaignStopEvents(broadcaster, transport) { return await this.createSubscription('channel.charity_campaign.stop', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:charity']); } /** * Subscribe to events that represent a user donating to a charity campaign in a channel. * * @param broadcaster The broadcaster you want to listen to charity donation events for. * @param transport The transport options. */ async subscribeToChannelCharityDonationEvents(broadcaster, transport) { return await this.createSubscription('channel.charity_campaign.donate', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:charity']); } /** * Subscribe to events that represent a charity campaign progressing in a channel. * * @param broadcaster The broadcaster you want to listen to charity donation events for. * @param transport The transport options. */ async subscribeToChannelCharityCampaignProgressEvents(broadcaster, transport) { return await this.createSubscription('channel.charity_campaign.progress', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:charity']); } /** * Subscribe to events that represent a user being banned in a channel. * * @param broadcaster The broadcaster you want to listen to ban events for. * @param transport The transport options. */ async subscribeToChannelBanEvents(broadcaster, transport) { return await this.createSubscription('channel.ban', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:moderate']); } /** * Subscribe to events that represent a user being unbanned in a channel. * * @param broadcaster The broadcaster you want to listen to unban events for. * @param transport The transport options. */ async subscribeToChannelUnbanEvents(broadcaster, transport) { return await this.createSubscription('channel.unban', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:moderate']); } /** * Subscribe to events that represent Shield Mode being activated in a channel. * * @param broadcaster The broadcaster you want to listen to Shield Mode activation events for. * @param transport The transport options. */ async subscribeToChannelShieldModeBeginEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.shield_mode.begin', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcasterId, ['moderator:read:shield_mode', 'moderator:manage:shield_mode'], true); } /** * Subscribe to events that represent Shield Mode being deactivated in a channel. * * @param broadcaster The broadcaster you want to listen to Shield Mode deactivation events for. * @param transport The transport options. */ async subscribeToChannelShieldModeEndEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.shield_mode.end', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcasterId, ['moderator:read:shield_mode', 'moderator:manage:shield_mode'], true); } /** * Subscribe to events that represent a moderator being added to a channel. * * @param broadcaster The broadcaster you want to listen for moderator add events for. * @param transport The transport options. */ async subscribeToChannelModeratorAddEvents(broadcaster, transport) { return await this.createSubscription('channel.moderator.add', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['moderation:read']); } /** * Subscribe to events that represent a moderator being removed from a channel. * * @param broadcaster The broadcaster you want to listen for moderator remove events for. * @param transport The transport options. */ async subscribeToChannelModeratorRemoveEvents(broadcaster, transport) { return await this.createSubscription('channel.moderator.remove', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['moderation:read']); } /** * Subscribe to events that represent a broadcaster raiding another broadcaster. * * @param broadcaster The broadcaster you want to listen to outgoing raid events for. * @param transport The transport options. */ async subscribeToChannelRaidEventsFrom(broadcaster, transport) { return await this.createSubscription('channel.raid', '1', createSingleKeyQuery('from_broadcaster_user_id', extractUserId(broadcaster)), transport, broadcaster); } /** * Subscribe to events that represent a broadcaster being raided by another broadcaster. * * @param broadcaster The broadcaster you want to listen to incoming raid events for. * @param transport The transport options. */ async subscribeToChannelRaidEventsTo(broadcaster, transport) { return await this.createSubscription('channel.raid', '1', createSingleKeyQuery('to_broadcaster_user_id', extractUserId(broadcaster)), transport, broadcaster); } /** * Subscribe to events that represent a Channel Points reward being added to a channel. * * @param broadcaster The broadcaster you want to listen to reward add events for. * @param transport The transport options. */ async subscribeToChannelRewardAddEvents(broadcaster, transport) { return await this.createSubscription('channel.channel_points_custom_reward.add', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a Channel Points reward being updated in a channel. * * @param broadcaster The broadcaster you want to listen to reward update events for. * @param transport The transport options. */ async subscribeToChannelRewardUpdateEvents(broadcaster, transport) { return await this.createSubscription('channel.channel_points_custom_reward.update', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a specific Channel Points reward being updated. * * @param broadcaster The broadcaster you want to listen to reward update events for. * @param rewardId The ID of the reward you want to listen to update events for. * @param transport The transport options. */ async subscribeToChannelRewardUpdateEventsForReward(broadcaster, rewardId, transport) { return await this.createSubscription('channel.channel_points_custom_reward.update', '1', createEventSubRewardCondition(broadcaster, rewardId), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a Channel Points reward being removed from a channel. * * @param broadcaster The broadcaster you want to listen to reward remove events for. * @param transport The transport options. */ async subscribeToChannelRewardRemoveEvents(broadcaster, transport) { return await this.createSubscription('channel.channel_points_custom_reward.remove', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a specific Channel Points reward being removed from a channel. * * @param broadcaster The broadcaster you want to listen to reward remove events for. * @param rewardId The ID of the reward you want to listen to remove events for. * @param transport The transport options. */ async subscribeToChannelRewardRemoveEventsForReward(broadcaster, rewardId, transport) { return await this.createSubscription('channel.channel_points_custom_reward.remove', '1', createEventSubRewardCondition(broadcaster, rewardId), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a Channel Points reward being redeemed. * * @param broadcaster The broadcaster you want to listen to redemption events for. * @param transport The transport options. */ async subscribeToChannelRedemptionAddEvents(broadcaster, transport) { return await this.createSubscription('channel.channel_points_custom_reward_redemption.add', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a specific Channel Points reward being redeemed. * * @param broadcaster The broadcaster you want to listen to redemption events for. * @param rewardId The ID of the reward you want to listen to redemption events for. * @param transport The transport options. */ async subscribeToChannelRedemptionAddEventsForReward(broadcaster, rewardId, transport) { return await this.createSubscription('channel.channel_points_custom_reward_redemption.add', '1', createEventSubRewardCondition(broadcaster, rewardId), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a Channel Points redemption being updated. * * @param broadcaster The broadcaster you want to listen to redemption update events for. * @param transport The transport options. */ async subscribeToChannelRedemptionUpdateEvents(broadcaster, transport) { return await this.createSubscription('channel.channel_points_custom_reward_redemption.update', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a specific Channel Points reward's redemption being updated. * * @param broadcaster The broadcaster you want to listen to redemption update events for. * @param rewardId The ID of the reward you want to listen to redemption updates for. * @param transport The transport options. */ async subscribeToChannelRedemptionUpdateEventsForReward(broadcaster, rewardId, transport) { return await this.createSubscription('channel.channel_points_custom_reward_redemption.update', '1', createEventSubRewardCondition(broadcaster, rewardId), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a Channel Points automatic reward being redeemed. * * @param broadcaster The broadcaster you want to listen to automatic reward redemption events for. * @param transport The transport options. */ async subscribeToChannelAutomaticRewardRedemptionAddEvents(broadcaster, transport) { return await this.createSubscription('channel.channel_points_automatic_reward_redemption.add', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a Channel Points automatic reward being redeemed. * * @param broadcaster The broadcaster you want to listen to automatic reward redemption events for. * @param transport The transport options. */ async subscribeToChannelAutomaticRewardRedemptionAddV2Events(broadcaster, transport) { return await this.createSubscription('channel.channel_points_automatic_reward_redemption.add', '2', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:redemptions', 'channel:manage:redemptions']); } /** * Subscribe to events that represent a poll starting in a channel. * * @param broadcaster The broadcaster you want to listen to poll begin events for. * @param transport The transport options. */ async subscribeToChannelPollBeginEvents(broadcaster, transport) { return await this.createSubscription('channel.poll.begin', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:polls', 'channel:manage:polls']); } /** * Subscribe to events that represent a poll being voted on in a channel. * * @param broadcaster The broadcaster you want to listen to poll progress events for. * @param transport The transport options. */ async subscribeToChannelPollProgressEvents(broadcaster, transport) { return await this.createSubscription('channel.poll.progress', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:polls', 'channel:manage:polls']); } /** * Subscribe to events that represent a poll ending in a channel. * * @param broadcaster The broadcaster you want to listen to poll end events for. * @param transport The transport options. */ async subscribeToChannelPollEndEvents(broadcaster, transport) { return await this.createSubscription('channel.poll.end', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:polls', 'channel:manage:polls']); } /** * Subscribe to events that represent a prediction starting in a channel. * * @param broadcaster The broadcaster you want to listen to prediction begin events for. * @param transport The transport options. */ async subscribeToChannelPredictionBeginEvents(broadcaster, transport) { return await this.createSubscription('channel.prediction.begin', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:predictions', 'channel:manage:predictions']); } /** * Subscribe to events that represent a prediction being voted on in a channel. * * @param broadcaster The broadcaster you want to listen to prediction preogress events for. * @param transport The transport options. */ async subscribeToChannelPredictionProgressEvents(broadcaster, transport) { return await this.createSubscription('channel.prediction.progress', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:predictions', 'channel:manage:predictions']); } /** * Subscribe to events that represent a prediction being locked in a channel. * * @param broadcaster The broadcaster you want to listen to prediction lock events for. * @param transport The transport options. */ async subscribeToChannelPredictionLockEvents(broadcaster, transport) { return await this.createSubscription('channel.prediction.lock', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:predictions', 'channel:manage:predictions']); } /** * Subscribe to events that represent a prediction ending in a channel. * * @param broadcaster The broadcaster you want to listen to prediction end events for. * @param transport The transport options. */ async subscribeToChannelPredictionEndEvents(broadcaster, transport) { return await this.createSubscription('channel.prediction.end', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:predictions', 'channel:manage:predictions']); } /** * Subscribe to events that represent the beginning of a creator goal event in a channel. * * @param broadcaster The broadcaster you want to listen to goal begin events for. * @param transport The transport options. */ async subscribeToChannelGoalBeginEvents(broadcaster, transport) { return await this.createSubscription('channel.goal.begin', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:goals']); } /** * Subscribe to events that represent progress towards a creator goal. * * @param broadcaster The broadcaster for which you want to listen to goal progress events. * @param transport The transport options. */ async subscribeToChannelGoalProgressEvents(broadcaster, transport) { return await this.createSubscription('channel.goal.progress', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:goals']); } /** * Subscribe to events that represent the end of a creator goal event. * * @param broadcaster The broadcaster for which you want to listen to goal end events. * @param transport The transport options. */ async subscribeToChannelGoalEndEvents(broadcaster, transport) { return await this.createSubscription('channel.goal.end', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:goals']); } /** * Subscribe to events that represent the beginning of a Hype Train event in a channel. * * @param broadcaster The broadcaster you want to listen to Hype train begin events for. * @param transport The transport options. */ async subscribeToChannelHypeTrainBeginEvents(broadcaster, transport) { return await this.createSubscription('channel.hype_train.begin', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:hype_train']); } /** * Subscribe to events that represent progress towards the Hype Train goal. * * @param broadcaster The broadcaster for which you want to listen to Hype Train progress events. * @param transport The transport options. */ async subscribeToChannelHypeTrainProgressEvents(broadcaster, transport) { return await this.createSubscription('channel.hype_train.progress', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:hype_train']); } /** * Subscribe to events that represent the end of a Hype Train event. * * @param broadcaster The broadcaster for which you want to listen to Hype Train end events. * @param transport The transport options. */ async subscribeToChannelHypeTrainEndEvents(broadcaster, transport) { return await this.createSubscription('channel.hype_train.end', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:hype_train']); } /** * Subscribe to events that represent the beginning of a Hype Train event in a channel. * * @param broadcaster The broadcaster you want to listen to Hype train begin events for. * @param transport The transport options. */ async subscribeToChannelHypeTrainBeginV2Events(broadcaster, transport) { return await this.createSubscription('channel.hype_train.begin', '2', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:hype_train']); } /** * Subscribe to events that represent progress towards the Hype Train goal. * * @param broadcaster The broadcaster for which you want to listen to Hype Train progress events. * @param transport The transport options. */ async subscribeToChannelHypeTrainProgressV2Events(broadcaster, transport) { return await this.createSubscription('channel.hype_train.progress', '2', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:hype_train']); } /** * Subscribe to events that represent the end of a Hype Train event. * * @param broadcaster The broadcaster for which you want to listen to Hype Train end events. * @param transport The transport options. */ async subscribeToChannelHypeTrainEndV2Events(broadcaster, transport) { return await this.createSubscription('channel.hype_train.end', '2', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:hype_train']); } /** * Subscribe to events that represent a broadcaster shouting out another broadcaster. * * @param broadcaster The broadcaster for which you want to listen to outgoing shoutout events. * @param transport The transport options. */ async subscribeToChannelShoutoutCreateEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.shoutout.create', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcasterId, ['moderator:read:shoutouts', 'moderator:manage:shoutouts'], true); } /** * Subscribe to events that represent a broadcaster being shouting out by another broadcaster. * * @param broadcaster The broadcaster for which you want to listen to incoming shoutout events. * @param transport The transport options. */ async subscribeToChannelShoutoutReceiveEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.shoutout.receive', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcasterId, ['moderator:read:shoutouts', 'moderator:manage:shoutouts'], true); } /** * Subscribe to events that represent an ad break beginning in a channel. * * @param broadcaster The broadcaster for which you want to listen to ad break begin events. * @param transport The transport options. */ async subscribeToChannelAdBreakBeginEvents(broadcaster, transport) { return await this.createSubscription('channel.ad_break.begin', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:ads']); } /** * Subscribe to events that represent a channel's chat being cleared. * * @param broadcaster The broadcaster for which you want to listen to chat clear events. * @param transport The transport options. */ async subscribeToChannelChatClearEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.chat.clear', '1', createEventSubUserCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['user:read:chat'], true); } /** * Subscribe to events that represent a user's chat messages being cleared in a channel. * * @param broadcaster The broadcaster for which you want to listen to user chat message clear events. * @param transport The transport options. */ async subscribeToChannelChatClearUserMessagesEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.chat.clear_user_messages', '1', createEventSubUserCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['user:read:chat'], true); } /** * Subscribe to events that represent a chat message being deleted in a channel. * * @param broadcaster The broadcaster for which you want to listen to chat message delete events. * @param transport The transport options. */ async subscribeToChannelChatMessageDeleteEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.chat.message_delete', '1', createEventSubUserCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['user:read:chat'], true); } /** * Subscribe to events that represent a chat notification in a channel. * * @param broadcaster The broadcaster for which you want to listen to chat notification events. * @param transport The transport options. */ async subscribeToChannelChatNotificationEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.chat.notification', '1', createEventSubUserCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['user:read:chat'], true); } /** * Subscribe to events that represent a chat message in a channel. * * @param broadcaster The broadcaster for which you want to listen to chat message events. * @param transport The transport options. */ async subscribeToChannelChatMessageEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.chat.message', '1', createEventSubUserCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['user:read:chat'], true); } /** * Subscribe to events that represent chat settings being updated in a channel. * * @param broadcaster The broadcaster for which you want to listen to chat settings update events. * @param transport The transport options. */ async subscribeToChannelChatSettingsUpdateEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.chat_settings.update', '1', createEventSubUserCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['user:read:chat'], true); } /** * Subscribe to events that represent a created unban requests in a channel. * * @param broadcaster The broadcaster for which you want to listen to unban requests. * @param transport The transport options. */ async subscribeToChannelUnbanRequestCreateEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.unban_request.create', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['moderator:read:unban_requests', 'moderator:manage:unban_requests'], true); } /** * Subscribe to events that represent a resolved unban requests in a channel. * * @param broadcaster The broadcaster for which you want to listen to unban requests. * @param transport The transport options. */ async subscribeToChannelUnbanRequestResolveEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.unban_request.resolve', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['moderator:read:unban_requests', 'moderator:manage:unban_requests'], true); } /** * Subscribe to events that represent a moderator performing an action on a channel. * * This requires the following scopes: * - `moderator:read:blocked_terms` OR `moderator:manage:blocked_terms` * - `moderator:read:chat_settings` OR `moderator:manage:chat_settings` * - `moderator:read:unban_requests` OR `moderator:manage:unban_requests` * - `moderator:read:banned_users` OR `moderator:manage:banned_users` * - `moderator:read:chat_messages` OR `moderator:manage:chat_messages` * - `moderator:read:warnings` OR `moderator:manage:warnings` * - `moderator:read:moderators` * - `moderator:read:vips` * * These scope requirements cannot be checked by the library, so they are just assumed. * Make sure to catch authorization errors yourself. * * @param broadcaster The broadcaster for which you want to listen to moderation events. * @param transport The transport options. */ async subscribeToChannelModerateEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.moderate', '2', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, [], true); } /** * Subscribe to events that represent a warning being acknowledged by a user. * * @param broadcaster The broadcaster for whom you want to listen to warnings. * @param transport The transport options. */ async subscribeToChannelWarningAcknowledgeEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.warning.acknowledge', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['moderator:read:warnings', 'moderator:manage:warnings'], true); } /** * Subscribe to events that represent a warning sent to a user. * * @param broadcaster The broadcaster for whom you want to listen to warnings. * @param transport The transport options. */ async subscribeToChannelWarningSendEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('channel.warning.send', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['moderator:read:warnings', 'moderator:manage:warnings'], true); } /** * Subscribe to events that represent a VIP being added to a channel. * * @param broadcaster The broadcaster you want to listen for VIP add events for. * @param transport The transport options. */ async subscribeToChannelVipAddEvents(broadcaster, transport) { return await this.createSubscription('channel.vip.add', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:vips', 'channel:manage:vips']); } /** * Subscribe to events that represent a VIP being removed from a channel. * * @param broadcaster The broadcaster you want to listen for VIP remove events for. * @param transport The transport options. */ async subscribeToChannelVipRemoveEvents(broadcaster, transport) { return await this.createSubscription('channel.vip.remove', '1', createEventSubBroadcasterCondition(broadcaster), transport, broadcaster, ['channel:read:vips', 'channel:manage:vips']); } /** * Subscribe to events that represent an extension Bits transaction. * * @param clientId The Client ID for the extension you want to listen to Bits transactions for. * @param transport The transport options. */ async subscribeToExtensionBitsTransactionCreateEvents(clientId, transport) { return await this.createSubscription('extension.bits_transaction.create', '1', createSingleKeyQuery('extension_client_id', clientId), transport); } /** * Subscribe to events that represent a user granting authorization to an application. * * @param clientId The Client ID for the application you want to listen to authorization grant events for. * @param transport The transport options. */ async subscribeToUserAuthorizationGrantEvents(clientId, transport) { return await this.createSubscription('user.authorization.grant', '1', createSingleKeyQuery('client_id', clientId), transport); } /** * Subscribe to events that represent a user revoking their authorization from an application. * * @param clientId The Client ID for the application you want to listen to authorization revoke events for. * @param transport The transport options. */ async subscribeToUserAuthorizationRevokeEvents(clientId, transport) { return await this.createSubscription('user.authorization.revoke', '1', createSingleKeyQuery('client_id', clientId), transport); } /** * Subscribe to events that represent a user updating their account details. * * @param user The user you want to listen to user update events for. * @param transport The transport options. * @param withEmail Whether to request adding the email address of the user to the notification. * * Only has an effect with the websocket transport. * With the webhook transport, this depends solely on the previous authorization given by the user. */ async subscribeToUserUpdateEvents(user, transport, withEmail) { return await this.createSubscription('user.update', '1', createSingleKeyQuery('user_id', extractUserId(user)), transport, user, withEmail ? ['user:read:email'] : undefined); } /** * Subscribe to events that represent a user receiving a whisper message from another user. * * @param user The user you want to listen to whisper message events for. * @param transport The transport options. */ async subscribeToUserWhisperMessageEvents(user, transport) { return await this.createSubscription('user.whisper.message', '1', createSingleKeyQuery('user_id', extractUserId(user)), transport, user, ['user:read:whispers', 'user:manage:whispers']); } /** * Subscribe to events that represent a drop entitlement being granted. * * @expandParams * * @param filter * @param transport The transport options. */ async subscribeToDropEntitlementGrantEvents(filter, transport) { return await this.createSubscription('drop.entitlement.grant', '1', createEventSubDropEntitlementGrantCondition(filter), transport, undefined, undefined, false, true); } /** * Subscribes to events that represent a chat message being held by AutoMod. * * @param broadcaster The broadcaster you want to listen to AutoMod message hold events for. * @param transport The transport options. */ async subscribeToAutoModMessageHoldEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('automod.message.hold', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['moderator:manage:automod'], true); } /** * Subscribes to events that represent a held chat message by AutoMod being resolved. * * @param broadcaster The broadcaster you want to listen to AutoMod message resolution events for. * @param transport The transport options. */ async subscribeToAutoModMessageUpdateEvents(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return await this.createSubscription('automod.message.update', '1', createEventSubModeratorCondition(broadcasterId, this._getUserContextIdWithDefault(broadcasterId)), transport, broadcaster, ['moderator:manage:automod'], true); } /** * Subscribes to events (v2) that represent a chat message being held by AutoMod. * * @param broadcaster The broadcaster you want to listen to AutoMod message hold events for. * @param transport The transport options. */ async subscribeToAutoModMessageHoldV2Events(broadcaster, transport) { const broadcasterId = extractUserId(broadcaster); return aw