Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# [TwitchPS](https://github.com/jctrvlr/twitchps)
# [TwitchPS](https://github.com/thehamsti/twitchps)

[![dependency status](https://david-dm.org/jctrvlr/twitchps.svg)](https://david-dm.org/jctrvlr/twitchps)
[![Downloads](https://img.shields.io/npm/dm/twitchps.svg?style=flat)](https://www.npmjs.org/package/twitchps) [![Version](https://img.shields.io/npm/v/twitchps.svg?style=flat)](https://www.npmjs.org/package/twitchps) [![GitHub issues](https://img.shields.io/github/issues/jctrvlr/twitchPS.svg)](https://github.com/jctrvlr/twitchPS/issues) [![Build Status](https://travis-ci.org/jctrvlr/twitchPS.svg?branch=master)](https://travis-ci.org/jctrvlr/twitchPS)
[![dependency status](https://david-dm.org/thehamsti/twitchps.svg)](https://david-dm.org/thehamsti/twitchps)
[![Downloads](https://img.shields.io/npm/dm/twitchps.svg?style=flat)](https://www.npmjs.org/package/twitchps) [![Version](https://img.shields.io/npm/v/twitchps.svg?style=flat)](https://www.npmjs.org/package/twitchps) [![GitHub issues](https://img.shields.io/github/issues/thehamsti/twitchPS.svg)](https://github.com/thehamsti/twitchPS/issues) [![Build Status](https://travis-ci.org/thehamsti/twitchPS.svg?branch=master)](https://travis-ci.org/thehamsti/twitchPS)

## NO LONGER MAINTAINED.

Neat little [Node](http://nodejs.org) library which lets you easily interact with the Twitch.tv PubSub service.

Expand All @@ -12,6 +14,7 @@ Neat little [Node](http://nodejs.org) library which lets you easily interact wit
| Bits | ```channel-bits-events-v1.<channel ID>``` <br><br> ```channel-bits-events-v2.<channel ID>``` <br><br> Example: ```channel-bits-events-v1.44322889```| ```bits:read``` | Anyone cheers on a specified channel. |
| Bits Badge Notification | ```channel-bits-badge-unlocks.<channel_id>``` <br><br> Example: ```channel-bits-badge-unlocks.44322889```| ```bits:read``` | Message sent when a user earns a new Bits badge in a particular channel, and chooses to share the notification with chat. |
| Channel Points | ```channel-points-channel-v1.<channel_id>```<br><br> Example: ```channel-points-channel-v1.44322889```| ```channel:read:redemptions``` | A custom reward is redeemed in a channel. |
| Community Channel Points | ```community-points-channel-v1.<channel_id>```<br><br> Example: ```community-points-channel-v1.44322889```| No scope needed | Access to more events than standard channel points. It outputs to the ```reward-redeemed``` event. **Check events table below** |
| Channel Subscriptions | ```channel-subscribe-events-v1.<channel ID>``` <br><br> Example: ```channel-subscribe-events-v1.44322889```| ```channel_subscriptions``` | Anyone subscribes (first month, gift sub) or resubscribes (subsequent months) to a channel. |
| Whispers | ```whispers.<user ID>``` <br><br> Example: ```whispers.44322889``` | ```whispers:read``` | Anyone whispers the specified user. |
| Stream Status | ```video-playback.<channel name>``` <br><br> Example: ```video-playback.summit1g``` | No scope needed | Status on stream going up, down, and viewer count. **Not officially supported by Twitch**|
Expand Down Expand Up @@ -72,7 +75,10 @@ ps.on('stream-up', (data) => {
| 'error' | origin - {string}<br> error - {string} <br>(optional if topic is involved) topic - {string} |
| 'bits' | badge_entitlement - {object} (v2 only) <br> bits_used - {integer} <br> channel_id - {string} <br>channel_name - {string}<br> chat_message - {string}<br> context - {string} <br> is_anonymous - {boolean} (v2 only) <br> message_id - {string} <br>message_type - {string}<br> time - {string}<br> total_bits_used - {integer} <br>user_id - {string} <br>user_name - {string}<br> version - {string} |
| 'bits-badge' | user_id - {string} - ID of user who earned the new Bits badge <br> user_name - {string} - Login of user who earned the new Bits badge <br> channel_id - {string} - ID of channel where user earned the new Bits badge <br> channel_name - {string} - Login of channel where user earned the new Bits badge <br> badge_tier - {int} - Value of Bits badge tier that was earned (1000, 10000, etc.) <br> chat_message - {string} - [Optional] Custom message included with share <br> time - {string} - Time when the bits were used. RFC 3339 format |
| 'channel-points' | timestamp - {string} - Time the pubsub message was sent <br> redemption - {object} - Data about the redemption, includes unique id and user that redeemed it <br> channel_id - {string} - ID of the channel in which the reward was redeemed. <br> redeemed_at - {string} - Timestamp in which a reward was redeemed <br> reward - {object} - Data about the reward that was redeemed <br> user_input - {string} - [Optional] A string that the user entered if the reward requires input <br> status - {string} - reward redemption status, will be FULFULLED if a user skips the reward queue, UNFULFILLED otherwise |
| 'reward-redeemed'<br>(from ```community-points-channel-v1```) | timestamp - {string} - Time the pubsub message was sent <br> redemption - {object} - Data about the redemption, includes unique id and user that redeemed it <br> channel_id - {string} - ID of the channel in which the reward was redeemed. <br> redeemed_at - {string} - Timestamp in which a reward was redeemed <br> reward - {object} - Data about the reward that was redeemed <br> user_input - {string} - [Optional] A string that the user entered if the reward requires input <br> status - {string} - reward redemption status, will be FULFULLED if a user skips the reward queue, UNFULFILLED otherwise |
| 'channel-points'<br>(from ```channel-points-channel-v1```) | timestamp - {string} - Time the pubsub message was sent <br> redemption - {object} - Data about the redemption, includes unique id and user that redeemed it <br> channel_id - {string} - ID of the channel in which the reward was redeemed. <br> redeemed_at - {string} - Timestamp in which a reward was redeemed <br> reward - {object} - Data about the reward that was redeemed <br> user_input - {string} - [Optional] A string that the user entered if the reward requires input <br> status - {string} - reward redemption status, will be FULFULLED if a user skips the reward queue, UNFULFILLED otherwise |
| 'community-points-all' | type - {string}<br> timestamp - {string}<br> event - {object} |
| 'community-reward-created'<br>'community-reward-updated'<br>'community-reward-deleted'<br>'community-goal-created'<br>'community-goal-updated'<br>'community-goal-deleted' | timestamp - {string}<br> event - {object} |
| 'subscribe' | user_name - {string} <br>display_name - {string} <br>channel_name - {string}<br> user_id - {string} <br>channel_id- {string}<br> time- {string}<br> sub_plan- {string}<br> sub_plan_name - {string}<br> months - {integer}<br> cumulative_months - {integer}<br> context - {string}<br> sub_message - {object}<br> sub_message.message - {string}<br> sub_message.emotes - {array}<br> recipient_id - {integer}<br> recipient_user_name - {string}<br> recipient_display_name - {string} |
| 'whisper_sent' & 'whisper_received' | id - {integer}<br> body - {string} <br>thread_id - {string}<br> sender - {JSON} <br> sender.id - {integer} <br> sender.username - {string}<br> sender.display_name - {string}<br> sender.color - {string} <br> sender.badges - {Array}<br> sender.emotes - {Array}<br> recipient - {JSON} <br> recipient.id - {integer}<br> recipient.username - {string} <br> recipient.display_name - {string} <br> recipient.color - {string} <br> recipient.badges - {Array} <br>sent_ts - {integer}<br> nonce - {string} |
| 'stream-up' | time - {integer} <br>channel_name- {string}<br> play_delay - {string} |
Expand Down Expand Up @@ -106,6 +112,6 @@ ps.removeTopic([{topic: "video-playback.starladder_cs_en"}]);

## Community

- Follow [@thecuriouseng](https://twitter.com/thecuriouseng) on Twitter
- Follow [@thehamsti](https://x.com/thehamsti) on X
- Have a question that is not a bug report? - Tweet me [@thecuriouseng](https://twitter.com/thecuriouseng)
- Found a bug ? [Submit an issue](https://github.com/jctrvlr/twitchps/issues/new).
111 changes: 111 additions & 0 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ class TwitchPS extends EventEmitter {
case 'channel-points-channel-v1':
self._onChannelPoints(message);
break;
case 'community-points-channel-v1':
self._onCommunityPoints(message);
break;
case 'channel-subscribe-events-v1':
self._onSub(message);
break;
Expand Down Expand Up @@ -289,6 +292,114 @@ class TwitchPS extends EventEmitter {
});
}

/**
* Handles Community Channel Points Event Message
* @param message - {object} - Message object received from pubsub-edge
* @param message.type - {string} - Type of message - Will always be 'MESSAGE' - Handled by _connect()
* @param message.data - {JSON} - JSON wrapper of topic/message fields
* @param message.data.topic - {string} - Topic that message pertains too - Will always be 'community-points-channel-v1.<CHANNEL_ID>' - Handled by _connect()
* @param message.data.message - {JSON} - Parsed into JSON in _connect() - Originally received as string from Twitch
* @emits community-points-all, community-custom-reward-created, community-custom-reward-updated
* community-custom-reward-deleted, community-goal-created, community-goal-updated,
* community-goal-deleted, channel-points
* community-points-all
* JSON object -
* type - {string} - Type of the event
* timestamp - {string} - Time the pubsub message was sent
* event - {object} - All data from all points events
* community-reward-created
* JSON object -
* timestamp - {string} - Time the pubsub message was sent
* event - {object} - All data from the event
* community-reward-updated
* JSON object -
* timestamp - {string} - Time the pubsub message was sent
* event - {object} - All data from the event
* community-reward-deleted
* JSON object -
* timestamp - {string} - Time the pubsub message was sent
* event - {object} - All data from the event
* community-goal-created
* JSON object -
* timestamp - {string} - Time the pubsub message was sent
* event - {object} - All data from the event
* community-goal-updated
* JSON object -
* timestamp - {string} - Time the pubsub message was sent
* event - {object} - All data from the event
* community-goal-deleted
* JSON object -
* timestamp - {string} - Time the pubsub message was sent
* event - {object} - All data from the event
* channel-points
* JSON object -
* timestamp - {string} - Time the pubsub message was sent
* redemption - {object} - Data about the redemption, includes unique id and user that redeemed it
* channel_id - {string} - ID of the channel in which the reward was redeemed.
* redeemed_at - {string} - Timestamp in which a reward was redeemed
* reward - {object} - Data about the reward that was redeemed
* user_input - {string} - [Optional] A string that the user entered if the reward requires input
* status - {string} - reward redemption status, will be FULFULLED if a user skips the reward queue, UNFULFILLED otherwise
*/
_onCommunityPoints(message) {
this.emit('community-points-all', {
"type": message.data.message.type,
"timestamp": message.data.message.data.timestamp,
"event": message.data.message.data[`${Object.keys(message.data.message.data)[1]}`]
});
switch(message.data.message.type){
case "reward-redeemed":
this.emit('reward-redeemed', {
"timestamp": message.data.message.data.timestamp,
"redemption": message.data.message.data.redemption,
"channel_id": message.data.message.data.redemption.channel_id,
"redeemed_at": message.data.message.data.redemption.redeemed_at,
"reward": message.data.message.data.redemption.reward,
"user_input": message.data.message.data.redemption.user_input,
"status": message.data.message.data.redemption.status
});
break;
case "custom-reward-created":
this.emit('community-reward-created', {
"timestamp": message.data.message.data.timestamp,
"event": message.data.message.data.new_reward
});
break;
case "custom-reward-updated":
this.emit('community-reward-updated', {
"timestamp": message.data.message.data.timestamp,
"event": message.data.message.data.updated_reward
});
break;
case "custom-reward-deleted":
this.emit('community-reward-deleted', {
"timestamp": message.data.message.data.timestamp,
"event": message.data.message.data.deleted_reward
});
break;
case "community-goal-created":
this.emit('community-goal-created', {
"timestamp": message.data.message.data.timestamp,
"event": message.data.message.data.community_goal
});
break;
case "community-goal-updated":
this.emit('community-goal-updated', {
"timestamp": message.data.message.data.timestamp,
"event": message.data.message.data.community_goal
});
break;
case "community-goal-deleted":
this.emit('community-goal-deleted', {
"timestamp": message.data.message.data.timestamp,
"event": message.data.message.data.community_goal
});
break;
default:
// Do Nothing
}
}

/**
* Handles Subscription Message
* @param message - {object} - Message object received from pubsub-edge
Expand Down