From 1698ff760d352c5f4d5cd680fd8dfe92574b82c5 Mon Sep 17 00:00:00 2001 From: BarryCarlyon Date: Tue, 26 Nov 2024 11:27:43 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20BarryCar?= =?UTF-8?q?lyon/twitch=5Fmisc@b8b55fa696dfd17a5929fc913813bebd159b8e86=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../websockets/web/activity_feed/README.md | 42 ++ eventsub/websockets/web/activity_feed/feed.js | 564 +++++++++++++++ .../websockets/web/activity_feed/framework.js | 256 +++++++ .../websockets/web/activity_feed/index.html | 72 ++ eventsub/websockets/web/basic/README.md | 36 + eventsub/websockets/web/basic/index.html | 376 ++++++++++ eventsub/websockets/web/charity/README.md | 44 ++ eventsub/websockets/web/charity/example.png | Bin 0 -> 150152 bytes eventsub/websockets/web/charity/index.html | 465 ++++++++++++ eventsub/websockets/web/chat/README.md | 76 ++ eventsub/websockets/web/chat/index.html | 680 ++++++++++++++++++ .../websockets/web/creatorgoals/README.md | 43 ++ .../websockets/web/creatorgoals/index.html | 336 +++++++++ eventsub/websockets/web/eventsub.js | 208 ++++++ 14 files changed, 3198 insertions(+) create mode 100644 eventsub/websockets/web/activity_feed/README.md create mode 100644 eventsub/websockets/web/activity_feed/feed.js create mode 100644 eventsub/websockets/web/activity_feed/framework.js create mode 100644 eventsub/websockets/web/activity_feed/index.html create mode 100644 eventsub/websockets/web/basic/README.md create mode 100644 eventsub/websockets/web/basic/index.html create mode 100644 eventsub/websockets/web/charity/README.md create mode 100644 eventsub/websockets/web/charity/example.png create mode 100644 eventsub/websockets/web/charity/index.html create mode 100644 eventsub/websockets/web/chat/README.md create mode 100644 eventsub/websockets/web/chat/index.html create mode 100644 eventsub/websockets/web/creatorgoals/README.md create mode 100644 eventsub/websockets/web/creatorgoals/index.html create mode 100644 eventsub/websockets/web/eventsub.js diff --git a/eventsub/websockets/web/activity_feed/README.md b/eventsub/websockets/web/activity_feed/README.md new file mode 100644 index 0000000..b59ec01 --- /dev/null +++ b/eventsub/websockets/web/activity_feed/README.md @@ -0,0 +1,42 @@ +## What is this example + +This is an exmaple of how to setup a EventSub WebSockets connection inside a Web Browser utilising the Chat Over EventSub Topics to build an activity feed of sorts + +It will use implicit auth to obtain an access token and then connect to EventSub WebSockets + +## TRY THIS EXAMPLE NOW! + +This example is also available via GitHub Pages! + +Give it a [whirl here](https://barrycarlyon.github.io/twitch_misc/eventsub/websockets/web/activity_feed/) + +## Reference Documentation + +For what is used in this example + +- [OAuth Implicit Code Flow](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth#implicit-grant-flow) +- [EventSub](https://dev.twitch.tv/docs/eventsub) +- [EventSub WebSockets](https://dev.twitch.tv/docs/eventsub/handling-websocket-events) + +## Notes + +This example gives an opinion on how to prcocess and collect the relevant events that would be untilised to run an overlay or a notification program for example. + +Specifically how to collect sub bombs (aka Community Gifts) into their groupings. + +Note the use of trim in the processName function, some users can have a space in their display name (at the end) +Or in the middle such as `Riot Games` but you are not likely to see middle space names in the data. + +## Running the example + +This is so rough that you need to upload it somewhere or know how to start a WebServer on 127.0.0.1 port 80 locally + +If you have PHP installed + +> sudo php -S 127.0.0.1:80 + +Will get you going real quick + +## Disconnecting the App + +If you use the GitHub Live example to test, you can Disconnect the "Barry's GitHub Examples" Application on the [Connections page](https://www.twitch.tv/settings/connections) diff --git a/eventsub/websockets/web/activity_feed/feed.js b/eventsub/websockets/web/activity_feed/feed.js new file mode 100644 index 0000000..92f80fb --- /dev/null +++ b/eventsub/websockets/web/activity_feed/feed.js @@ -0,0 +1,564 @@ +function runLineNotification({ payload }) { + let { event } = payload; + + let { system_message, notice_type, message } = event; + + let { text, fragments } = message; + + // channel + let { broadcaster_user_name, broadcaster_user_login, broadcaster_user_id } = event; + // entity + let { chatter_user_name, chatter_user_login, chatter_user_id, color, chatter_is_anonymous } = event; + + switch (notice_type) { + case 'sub': + let { sub } = event; + var { duration_months, is_prime, sub_tier } = sub; + + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + + var cell = r.insertCell(); + cell.textContent = `New Sub ${processTier(sub_tier)}`; + + var cell = r.insertCell(); + // counts + var cell = r.insertCell(); + if (is_prime) { + cell.textContent = `With Twitch Prime`; + } else if (duration_months > 1) { + cell.textContent = `In Advance for ${duration_months}`; + } + + break; + case 'resub': + let { resub } = event; + + var { cumulative_months, streak_months, duration_months } = resub; + var { sub_tier, is_gift, is_prime } = resub; + + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + + var cell = r.insertCell(); + cell.textContent = `Resub ${processTier(sub_tier)}`; + var cell = r.insertCell(); + + let durational = `${cumulative_months} months`; + if (cumulative_months % 12 === 0) { + durational = `${cumulative_months / 12} years`; + } + + if (streak_months) { + cell.textContent = `${durational} for ${streak_months} streak`; + } else { + cell.textContent = `${durational}`; + } + + var cell = r.insertCell(); + if (is_prime) { + cell.textContent = 'With Twitch Prime: '; + } + buildFromFragments(cell, fragments); + + break; + + case 'sub_gift': + let { sub_gift } = event; + + let { community_gift_id } = sub_gift; + var { sub_tier, cumulative_total, duration_months } = sub_gift; + + var { recipient_user_name, recipient_user_login, recipient_user_id } = sub_gift; + + if (community_gift_id) { + // this gift is part of a bomb + // duration is useless here as gift bombs are only a monther + + // look for the sub table + let target = document.getElementById(`victims_for_${community_gift_id}`); + if (target) { + //let sr = target.insertRow(); + //var cell = sr.insertCell(); + let cell = document.createElement('li') + target.append(cell); + cell.textContent = processName(recipient_user_name, recipient_user_login); + } else { + //go = false; + console.log('target doesnt exist', notice_type, event); + // now the real question what would be the best way to _wait_ + // do we draw the line with what we can + // or _wait_ I don't LIKE this but it works... + setTimeout(() => { + runLineNotification({ payload }) + }, 500); + + let hasProc = document.getElementById(`processing_for_${community_gift_id}`); + if (!hasProc) { + var proc = activity_feed.insertRow(0); + proc.setAttribute('id', `processing_for_${community_gift_id}`); + var cell = proc.insertCell(); + cell.setAttribute('colspan', 50); + cell.style.backgroundColor = 'red'; + cell.style.textAlign = 'center'; + cell.textContent = `Processing ${community_gift_id}`; + } + } + } else { + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login, chatter_is_anonymous); + + var cell = r.insertCell(); + cell.textContent = `Direct Gift ${processTier(sub_tier)}`; + + var cell = r.insertCell(); + // counts N/A + var cell = r.insertCell(); + + let text = `Gifted ${processName(recipient_user_name, recipient_user_login)}`; + if (duration_months > 1) { + text = `${text} for ${duration_months} months`; + } + if (cumulative_total) { + text = `${text} it is their ${cumulative_total} gift to the channel`; + } + + cell.textContent = text; + } + + break; + case 'community_sub_gift': + let { community_sub_gift } = event; + // gift bomb occuring + var { cumulative_total } = community_sub_gift;// can be blank/null + var { id, sub_tier, total } = community_sub_gift; + + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login, chatter_is_anonymous); + + var cell = r.insertCell(); + cell.textContent = `Community Gift ${processTier(sub_tier)}`; + + var cell = r.insertCell(); + if (cumulative_total) { + cell.textContent = `${total} gift${total > 1 ? 's' : ''} for ${cumulative_total} cumulative in the channel`; + } else { + cell.textContent = `${total} gift${total > 1 ? 's' : ''}`; + } + + var cell = r.insertCell(); + //var t = document.createElement('table'); + var t = document.createElement('ul'); + cell.append(t); + t.setAttribute('id', `victims_for_${id}`); + + let hasProc = document.getElementById(`processing_for_${id}`); + if (hasProc) { + hasProc.remove(); + } + + break; + + case 'pay_it_forward': + // direct gift forward + let { pay_it_forward } = event; + + // chatter recieved a gift from + var { gifter_user_name, gifter_user_login, gifter_user_id, gifter_is_anonymous } = pay_it_forward; + // chatter is giving to + var { recipient_user_name, recipient_user_login, recipient_user_id } = pay_it_forward; + + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + + var cell = r.insertCell(); + cell.textContent = 'Paying it Forward'; + var cell = r.insertCell(); + // counts + var cell = r.insertCell(); + // message + if (!recipient_user_id) { + // its a bomb + cell.textContent = `Community Gifting in response to a gift from ${processName(gifter_user_name, gifter_user_login, gifter_is_anonymous)}`; + } else { + cell.textContent = `Gifting ${processName(recipient_user_name, recipient_user_login)} in response to a gift from ${processName(gifter_user_name, gifter_user_login, gifter_is_anonymous)}`; + } + // raises a sub_gift + + break; + + case 'gift_paid_upgrade': + let { gift_paid_upgrade } = event; + + // chatter recieved a gift from + var { gifter_user_name, gifter_user_login, gifter_user_id, gifter_is_anonymous } = gift_paid_upgrade; + // and is self upgrading + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + var cell = r.insertCell(); + cell.textContent = 'Gift Upgrade'; + var cell = r.insertCell(); + // counts + var cell = r.insertCell(); + // message + cell.textContent = `Continuing their sub they got from ${processName(gifter_user_name, gifter_user_login, gifter_is_anonymous)}`; + + break; + case 'prime_paid_upgrade': + let { prime_paid_upgrade } = event; + + var { sub_tier } = prime_paid_upgrade; + + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + var cell = r.insertCell(); + cell.textContent = `Prime Upgrade: ${processTier(sub_tier)}`; + var cell = r.insertCell(); + // counts + var cell = r.insertCell(); + // message + cell.textContent = `Upgraded from Twitch Prime`; + + break; + + case 'raid': + let { raid } = event; + let { profile_image_url, user_id, user_login, user_name, viewer_count } = raid; + + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + // the raiders is also the chatter.... soooo.... + //cell.textContent = processName(chatter_user_name, chatter_user_login); + cell.textContent = processName(user_name, user_login); + + var cell = r.insertCell(); + cell.textContent = 'Raid'; + var cell = r.insertCell(); + var cell = r.insertCell(); + cell.textContent = `Raiding with ${viewer_count} viewers`; + + break; + + case 'bits_badge_tier': + // to consider... + let { bits_badge_tier } = event; + var { tier } = bits_badge_tier; + + var r = activity_feed.insertRow(0); + r.setAttribute('title', system_message); + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + + var cell = r.insertCell(); + cell.textContent = 'Bits Tier'; + var cell = r.insertCell(); + cell.textContent = tier; + var cell = r.insertCell(); + buildFromFragments(cell, fragments); + + break; + + case 'announcement': + // skip + break; + default: + go = false; + console.log('Unexpected', notice_type, event); + } +} + +function runLineMessage({ payload }) { + let { event } = payload; + + let { message_type, message } = event; + + let { text, fragments } = message; + + // channel + let { broadcaster_user_name, broadcaster_user_login, broadcaster_user_id } = event; + // entity + let { chatter_user_name, chatter_user_login, chatter_user_id, color } = event; + + let { cheer, channel_points_custom_reward_id } = event; + + let title_of_event = ''; + switch (message_type) { + case 'channel_points_sub_only': + title_of_event = 'SubOnly Message'; + break; + case 'channel_points_highlighted': + title_of_event = 'Highlighted'; + break; + case 'user_intro': + title_of_event = 'User Intro'; + break; + case 'power_ups_gigantified_emote': + title_of_event = 'Big Emote'; + break; + case 'power_ups_message_effect': + title_of_event = 'Pretty Chat'; + break; + default: + if (channel_points_custom_reward_id) { + title_of_event = 'ChannelPoints'; + } + } + + if (title_of_event != '') { + var r = activity_feed.insertRow(0); + + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + + // what span tier + var cell = r.insertCell(); + cell.textContent = title_of_event; + // counts + var cell = r.insertCell(); + //message + var cell = r.insertCell(); + buildFromFragments(cell, fragments); + } else { + if (cheer) { + // it's a cheer message + // bits is the total bits used + let { bits } = cheer; + var r = activity_feed.insertRow(0); + + var cell = r.insertCell(); + cell.textContent = dateTime(); + var cell = r.insertCell(); + cell.textContent = broadcaster_user_login; + + var cell = r.insertCell(); + cell.style.color = color; + cell.textContent = processName(chatter_user_name, chatter_user_login); + // what span tier + var cell = r.insertCell(); + cell.textContent = 'Cheer'; + // count + var cell = r.insertCell(); + cell.textContent = bits; + //message + var cell = r.insertCell(); + buildFromFragments(cell, fragments); + } else { + //go = false; + //console.log('Unexpected', message_type, event); + } + } +} + + + +function dateTime() { + let n = new Date(); + let d = []; + d.push(n.getHours()); + d.push(n.getMinutes()); + d.push(n.getSeconds()); + for (var x=0;x { + let { prefix, tiers } = cheermote; + if (tiers && tiers.length > 0) { + prefix = prefix.toLowerCase(); + knownCheermotes[prefix] = {}; + + tiers.forEach(tier => { + let { can_cheer, id, images } = tier; + if (can_cheer) { + let image = images.dark.animated["1.5"]; + knownCheermotes[prefix][id] = image; + } + }); + } + }); +} diff --git a/eventsub/websockets/web/activity_feed/framework.js b/eventsub/websockets/web/activity_feed/framework.js new file mode 100644 index 0000000..860c756 --- /dev/null +++ b/eventsub/websockets/web/activity_feed/framework.js @@ -0,0 +1,256 @@ +// These are set for the GitHub Pages Example +// Substitute as needed +var client_id = 'hozgh446gdilj5knsrsxxz8tahr3koz'; +var redirect = window.location.origin + '/twitch_misc/'; +var access_token = ''; +var socket_space = ''; +var session_id = ''; +var my_user_id = ''; + +document.getElementById('authorize').setAttribute('href', 'https://id.twitch.tv/oauth2/authorize?client_id=' + client_id + '&redirect_uri=' + encodeURIComponent(redirect) + '&response_type=token&scope=user:read:chat'); + +if (document.location.hash && document.location.hash != '') { + log('Checking for token'); + var parsedHash = new URLSearchParams(window.location.hash.slice(1)); + if (parsedHash.get('access_token')) { + log('Got a token'); + processToken(parsedHash.get('access_token')); + } +} + +function log(line) { + console.log(line); +} + +function processToken(token) { + access_token = token; + + authorize.style.display = 'none';//remove link to avoid relinks.... + + fetch( + 'https://api.twitch.tv/helix/users', + { + "headers": { + "Client-ID": client_id, + "Authorization": `Bearer ${access_token}` + } + } + ) + .then(resp => resp.json()) + .then(resp => { + socket_space = new initSocket(true); + // and build schnanaigans + socket_space.on('connected', (id) => { + log(`Connected to WebSocket with ${id}`); + session_id = id; + my_user_id = resp.data[0].id; + + requestHooks(resp.data[0].id, my_user_id); + }); + + socket_space.on('session_silenced', () => { + document.getElementById('keepalive').textContent = 'Session mystery died due to silence detected'; + }); + socket_space.on('session_keepalive', () => { + document.getElementById('keepalive').textContent = new Date(); + }); + + socket_space.on('channel.chat.notification', runLineNotification); + socket_space.on('channel.chat.message', runLineMessage); + }) + .catch(err => { + console.log(err); + log('Error with Users Call'); + }); +} + +function addUser(username) { + let url = new URL('https://api.twitch.tv/helix/users'); + url.search = new URLSearchParams([['login', username]]).toString(); + + fetch( + url, + { + "headers": { + "Client-ID": client_id, + "Authorization": `Bearer ${access_token}` + } + } + ) + .then(resp => resp.json()) + .then(resp => { + log(`Got ${resp.data[0].id} for ${username}`); + requestHooks(resp.data[0].id, my_user_id); + loadCheermotes(resp.data[0].id); + }) + .catch(err => { + console.log(err); + log('Error with Users Call'); + }); +} + + +function requestHooks(broadcaster_user_id, user_id) { + let topics = { + 'channel.chat.notification': { version: "1", condition: { broadcaster_user_id, user_id } }, + 'channel.chat.message': { version: "1", condition: { broadcaster_user_id, user_id } } + } + + log(`Spawn Topics for ${user_id}`); + + for (let type in topics) { + log(`Attempt create ${type} - ${broadcaster_user_id} via ${user_id}`); + let { version, condition } = topics[type]; + + fetch( + 'https://api.twitch.tv/helix/eventsub/subscriptions', + { + "method": "POST", + "headers": { + "Client-ID": client_id, + "Authorization": `Bearer ${access_token}`, + 'Content-Type': 'application/json' + }, + "body": JSON.stringify({ + type, + version, + condition, + transport: { + method: "websocket", + session_id + } + }) + } + ) + .then(resp => resp.json()) + .then(resp => { + if (resp.error) { + log(`Error with eventsub Call ${type} Call: ${resp.message ? resp.message : ''}`); + } else { + log(`Created ${type}`); + document.getElementById('subscriptions_cost').textContent = `${resp.total}/${resp.total_cost}/${resp.max_total_cost}`; + } + }) + .catch(err => { + console.log(err); + log(`Error with eventsub Call ${type} Call: ${err.message ? err.message : ''}`); + }); + } +} + +document.getElementById('subscriptions_refresh').addEventListener('click', (e) => { + fetchSubs(); +}); + +let subscriptions = document.getElementById('subscriptions'); +function fetchSubs(after) { + let url = new URL('https://api.twitch.tv/helix/eventsub/subscriptions'); + let params = { + first: 100, + status: 'enabled' + }; + if (after) { + params.after = after; + } + + url.search = new URLSearchParams(params).toString(); + + fetch( + url, + { + "method": "GET", + "headers": { + "Client-ID": client_id, + "Authorization": `Bearer ${access_token}`, + 'Content-Type': 'application/json' + } + } + ) + .then(resp => resp.json()) + .then(resp => { + + subscriptions.textContent = ''; + + resp.data.forEach(sub => { + let tr = document.createElement('tr'); + subscriptions.append(tr); + + add(tr, sub.id); + add(tr, sub.type); + + let keys = Object.keys(sub.condition); + if (sub.condition[keys[0]]) { + add(tr, sub.condition[keys[0]]); + } else { + add(tr, sub.condition[keys[1]]); + } + add(tr, sub.cost); + + add(tr, sub.status); + + let td = document.createElement('td'); + tr.append(td); + td.textContent = 'Delete'; + td.classList.add('delete_button'); + td.addEventListener('click', (e) => { + deleteSub(sub.id) + .then(resp => { + console.log('Delete', resp.status); + + if (resp.status) { + td.textContent = 'Deleted'; + } else { + td.textContent = `Err ${resp.status}`; + } + }) + .catch(err => { + console.log(err); + log(`Error with eventsub delete`); + }); + }); + }); + + document.getElementById('subscriptions_cost').textContent = `${resp.total}/${resp.total_cost}/${resp.max_total_cost}`; + + if (resp.pagination) { + if (resp.pagination.cursor) { + fetchSubs(resp.pagination.cursor); + } + } + }) + .catch(err => { + console.log(err); + log(`Error with eventsub Fetch`); + }); +} + +function add(tr, text) { + let td = document.createElement('td'); + td.textContent = text; + tr.append(td); +} + +function deleteSub(id) { + let url = new URL('https://api.twitch.tv/helix/eventsub/subscriptions'); + url.search = new URLSearchParams([['id', id]]).toString(); + + return fetch( + url, + { + "method": "DELETE", + "headers": { + "Client-ID": client_id, + "Authorization": `Bearer ${access_token}`, + 'Content-Type': 'application/json' + } + } + ) +} + +document.getElementById('form').addEventListener('submit', (e) => { + e.preventDefault(); + let username = document.getElementById('add_user').value; + log(`Lets lookup and add ${username}`); + addUser(username); + document.getElementById('add_user').value = ''; +}); \ No newline at end of file diff --git a/eventsub/websockets/web/activity_feed/index.html b/eventsub/websockets/web/activity_feed/index.html new file mode 100644 index 0000000..eceeaba --- /dev/null +++ b/eventsub/websockets/web/activity_feed/index.html @@ -0,0 +1,72 @@ + + + + Activity Feed | Twitch API Example + + + + + + +

This example demonstrates how to connect to, create subscriptions and recieve data from EventSub WebSockets

+

It'll use Implicit auth to obtain a token to use

+ +

Authorize and Connect

+ +
+

Add another broadcaster channel to your socket to listen to

+
+
+ + + +
+
+
+ +
Last KeepAlive: Total/Cost/MaxCost:
+ +
+ + + + + + + + + + + + +
TimeChannelWhomWhatCountsMessage
+
+ +
+
Click to Refresh Subscriptions
+ + + + + + + + + + + + +
Subscription IDTopicCondition User IDCostStatus
+
+ + + + + + \ No newline at end of file diff --git a/eventsub/websockets/web/basic/README.md b/eventsub/websockets/web/basic/README.md new file mode 100644 index 0000000..9034ce1 --- /dev/null +++ b/eventsub/websockets/web/basic/README.md @@ -0,0 +1,36 @@ +## What is this example + +This is an exmaple of how to setup a EventSub WebSockets connection inside a Web Browser. + +It will use implicit auth to obtain an access token and then connect to EventSub WebSockets + +## TRY THIS EXAMPLE NOW! + +This example is also available via GitHub Pages! + +Give it a [whirl here](https://barrycarlyon.github.io/twitch_misc/eventsub/websockets/web/basic/) + +## Reference Documentation + +- [OAuth Implicit Code Flow](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth#implicit-grant-flow) +- [EventSub](https://dev.twitch.tv/docs/eventsub) +- [EventSub WebSockets](https://dev.twitch.tv/docs/eventsub/handling-websocket-events) + +## What this example doesn't do + +This example doesn't handle "long periods of silence where something has gone wrong and you need to reconnect". +So make sure you honor the returned value in the welcome message of `keepalive_timeout_seconds` + +## Running the example + +This is so rough that you need to upload it somewhere or know how to start a WebServer on 127.0.0.1 port 80 locally + +If you have PHP installed + +> sudo php -S 127.0.0.1:80 + +Will get you going real quick + +## Disconnecting the App + +If you use the GitHub Live example to test, you can Disconnect the "Barry's GitHub Examples" Application on the [Connections page](https://www.twitch.tv/settings/connections) diff --git a/eventsub/websockets/web/basic/index.html b/eventsub/websockets/web/basic/index.html new file mode 100644 index 0000000..5cf0879 --- /dev/null +++ b/eventsub/websockets/web/basic/index.html @@ -0,0 +1,376 @@ + + + + EventSub WebSockets with Implicit Auth Example + + + + + + +

This example demonstrates how to connect to, create subscriptions and recieve data from EventSub WebSockets

+

It will just "dumb log" an EventSub notification.

+

It'll use Implicit auth to obtain a token to use

+ + + +
+
LOG
+
+ +
+

From the RFC - https://discuss.dev.twitch.tv/t/rfc-0016-eventsub-websockets/32652

+
    +
  • When using a user access token, the developer may create up to 3 WebSocket connections per ClientID/user tuple.
  • +
  • Additionally, a WebSocket connection is limited to 300 subscriptions.
  • +
  • However when using a user access token, the default value of max_total_cost will be 10 rather than the + default of 10,000 for an application access token.
  • +
  • A given websocket session ID can only use one users access token. You can't connect `fred` and `bob` subscriptions authenticated using each users access token to the same WebSocket SessionID
  • +
+

The above may be out of date check the Subscription limits for changes

+

A Websocket can subscribe to 10 cost 1 subscriptions

+
+
+

Add another user to your socket to listen to

+
+
+ + + +
+
+
+ +
Last KeepAlive:
+
Click to Refresh Subscriptions
+
+ + + + + + + + + + + + +
Subscription IDTopicCondition User IDCostStatus
+
+ +
+ + + + + + diff --git a/eventsub/websockets/web/charity/README.md b/eventsub/websockets/web/charity/README.md new file mode 100644 index 0000000..c6bab03 --- /dev/null +++ b/eventsub/websockets/web/charity/README.md @@ -0,0 +1,44 @@ +## What is this example + +This is an exmaple of how to setup a EventSub Websockets connection inside a Web Browser. + +It will use implicit auth to obtain an access token and then connect to EventSub Websockets. + +This example will draw a simple example of a Chairty goal bar and draw donations as they occur. + +It would also handle drawing multiple bars if multiple charities were running. +Which, sure, isn't a thing right now, but the API is designed in a way that it could be a thing. + +![A Screenshot](example.png) + +## TRY THIS EXAMPLE NOW! + +This example is also available via GitHub Pages! + +Give it a [whirl here](https://barrycarlyon.github.io/twitch_misc/eventsub/websockets/web/charity/) + +## Reference Documentation + +- [OAuth Implicit Code Flow](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth#implicit-grant-flow) +- [EventSub](https://dev.twitch.tv/docs/eventsub) +- [EventSub WebSockets](https://dev.twitch.tv/docs/eventsub/handling-websocket-events) +- [Get Charity Campaign](https://dev.twitch.tv/docs/api/reference#get-charity-campaign) + +## What this example doesn't do + +This example doesn't handle "long periods of silence where something has gone wrong and you need to reconnect". +So make sure you honor the returned value in the welcome message of `keepalive_timeout_seconds` + +## Running the example + +This is so rough that you need to upload it somewhere or know how to start a WebServer on 127.0.0.1 port 80 locally + +If you have PHP installed + +> sudo php -S 127.0.0.1:80 + +Will get you going real quick + +## Disconnecting the App + +If you use the GitHub Live example to test, you can Disconnect the "Barry's GitHub Examples" Application on the [Connections page](https://www.twitch.tv/settings/connections) diff --git a/eventsub/websockets/web/charity/example.png b/eventsub/websockets/web/charity/example.png new file mode 100644 index 0000000000000000000000000000000000000000..98e663169f72f39dbc76ea7ba5fcf6eeee862afc GIT binary patch literal 150152 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

i+3Jl`8nE1~9Ko2Ov6L>A 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

g#b*^F< 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 + + + Charity EventSub Websockets with Implicit Auth Example + + + + + + + + +

This example demonstrates how to connect to, create subscriptions and recieve data from EventSub Websockets

+

This will draw some basic overlay style charity stuff.

+

It'll use Implicit auth to obtain a token to use

+ +
+ +
+
LOG
+
+ +
Last KeepAlive:
+ +
+
+ + + + + + diff --git a/eventsub/websockets/web/chat/README.md b/eventsub/websockets/web/chat/README.md new file mode 100644 index 0000000..9021bcc --- /dev/null +++ b/eventsub/websockets/web/chat/README.md @@ -0,0 +1,76 @@ +## What is this example + +This is an exmaple of how to setup a EventSub WebSockets connection inside a Web Browser utilising the Chat Over EventSub Topics. + +It will use implicit auth to obtain an access token and then connect to EventSub WebSockets + +## TRY THIS EXAMPLE NOW! + +This example is also available via GitHub Pages! + +Give it a [whirl here](https://barrycarlyon.github.io/twitch_misc/eventsub/websockets/web/chat/) + +## How Does Authentication work + +### If you are using EventSub over Websockets: + +For example you are making a third party chat client, or you are a game client running from the game. + +Just generated user access token with the following scopes + +- `user:read:chat` from the user you wish to read chat as + +You then use that user access token to create subscriptions to your socket. + +Thats it + +### If you are using EventSub over Webhooks/Conduits: + +For example you are a channel bot that handles moderation + +Prior generated user access token with the following scopes or permissions: + +- `user:read:chat` from the user account you wish to read chat as (usually the bot) +- `user:bot` from the user account you wish to act as a bot as +- moderator status in the channel you wish to connect to + +You then ignore the user access token(s) and use an [App Access/Client Credentials](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/#client-credentials-grant-flow) token to create subscriptions to your Webhook. + +### If you are using EventSub over Webhooks/Conduits (more common approach): + +For example you are the channel bot that just sends/reads chat, such as a game (where a control server is in use) or hydrationBot (as water bot doesn't and shouldn't be given perms) + +Prior generated user access token with the following scopes or permissions: + +- `user:read:chat` from the user account you wish to read chat as (usually the bot) +- `user:bot` from the user account you wish to act as a bot as +- `channel:bot` from the channel you wish to connect to + +You then ignore the user access token(s) and use an [App Access/Client Credentials](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/#client-credentials-grant-flow) token to create subscriptions to your Webhook. + +## Reference Documentation + +For what is used in this example + +- [OAuth Implicit Code Flow](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth#implicit-grant-flow) +- [EventSub](https://dev.twitch.tv/docs/eventsub) +- [EventSub WebSockets](https://dev.twitch.tv/docs/eventsub/handling-websocket-events) + +## What this example doesn't do + +This example doesn't handle "long periods of silence where something has gone wrong and you need to reconnect". +So make sure you honor the returned value in the welcome message of `keepalive_timeout_seconds` + +## Running the example + +This is so rough that you need to upload it somewhere or know how to start a WebServer on 127.0.0.1 port 80 locally + +If you have PHP installed + +> sudo php -S 127.0.0.1:80 + +Will get you going real quick + +## Disconnecting the App + +If you use the GitHub Live example to test, you can Disconnect the "Barry's GitHub Examples" Application on the [Connections page](https://www.twitch.tv/settings/connections) diff --git a/eventsub/websockets/web/chat/index.html b/eventsub/websockets/web/chat/index.html new file mode 100644 index 0000000..5888832 --- /dev/null +++ b/eventsub/websockets/web/chat/index.html @@ -0,0 +1,680 @@ + + + + EventSub WebSockets Chat edition with Implicit Auth Example + + + + + + +

This example demonstrates how to connect to, create subscriptions and recieve data from EventSub WebSockets

+

It'll use Implicit auth to obtain a token to use

+ +

Authorize and Connect

+ +
+
+
+
+

Click on a window to switch which is visible/on top. (Barrys Crap Tabs). Left is a brain dump right is a easy to read.

+ +
+

Add another broadcaster channel to your socket to listen to

+
+
+ + + +
+
+
+ +
Last KeepAlive: Total/Cost/MaxCost:
+
Click to Refresh Subscriptions
+
+ + + + + + + + + + + + +
Subscription IDTopicCondition User IDCostStatus
+
+ +
+ + + + + + diff --git a/eventsub/websockets/web/creatorgoals/README.md b/eventsub/websockets/web/creatorgoals/README.md new file mode 100644 index 0000000..3cc486f --- /dev/null +++ b/eventsub/websockets/web/creatorgoals/README.md @@ -0,0 +1,43 @@ +## What is this example + +This is an exmaple of how to setup a EventSub Websockets connection inside a Web Browser. + +It will use implicit auth to obtain an access token and then connect to EventSub Websockets. + +This example will draw a creator goal bar and update it as events occur. +And handles a goal ending and starting. + +It would also handle drawing multiple bars if multiple goals were running. +Which, sure, isn't a thing right now, but the API is designed in a way that it could be a thing. + +## TRY THIS EXAMPLE NOW! + +This example is also available via GitHub Pages! + +Give it a [whirl here](https://barrycarlyon.github.io/twitch_misc/eventsub/websockets/web/creatorgoals/) + +## Reference Documentation + +- [OAuth Implicit Code Flow](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth#implicit-grant-flow) +- [EventSub](https://dev.twitch.tv/docs/eventsub) +- [EventSub WebSockets](https://dev.twitch.tv/docs/eventsub/handling-websocket-events) +- [Get Creator Goals](https://dev.twitch.tv/docs/api/reference#get-creator-goals) + +## What this example doesn't do + +This example doesn't handle "long periods of silence where something has gone wrong and you need to reconnect". +So make sure you honor the returned value in the welcome message of `keepalive_timeout_seconds` + +## Running the example + +This is so rough that you need to upload it somewhere or know how to start a WebServer on 127.0.0.1 port 80 locally + +If you have PHP installed + +> sudo php -S 127.0.0.1:80 + +Will get you going real quick + +## Disconnecting the App + +If you use the GitHub Live example to test, you can Disconnect the "Barry's GitHub Examples" Application on the [Connections page](https://www.twitch.tv/settings/connections) diff --git a/eventsub/websockets/web/creatorgoals/index.html b/eventsub/websockets/web/creatorgoals/index.html new file mode 100644 index 0000000..c276fc4 --- /dev/null +++ b/eventsub/websockets/web/creatorgoals/index.html @@ -0,0 +1,336 @@ + + + + EventSub Websockets with Implicit Auth Example + + + + + + + + +

This example demonstrates how to connect to, create subscriptions and recieve data from EventSub Websockets

+

It will just "dumb log" an EventSub notification.

+

It'll use Implicit auth to obtain a token to use

+ + + +
+
LOG
+
+ +
Last KeepAlive:
+ +
+ + + + + + \ No newline at end of file diff --git a/eventsub/websockets/web/eventsub.js b/eventsub/websockets/web/eventsub.js new file mode 100644 index 0000000..9c572e6 --- /dev/null +++ b/eventsub/websockets/web/eventsub.js @@ -0,0 +1,208 @@ +class initSocket { + counter = 0 + closeCodes = { + 4000: 'Internal Server Error', + 4001: 'Client sent inbound traffic', + 4002: 'Client failed ping-pong', + 4003: 'Connection unused', + 4004: 'Reconnect grace time expired', + 4005: 'Network Timeout', + 4006: 'Network error', + 4007: 'Invalid Reconnect' + } + + constructor(connect) { + this._events = {}; + + if (connect) { + this.connect(); + } + } + + connect(url, is_reconnect) { + this.eventsub = {}; + this.counter++; + + url = url ? url : 'wss://eventsub.wss.twitch.tv/ws'; + is_reconnect = is_reconnect ? is_reconnect : false; + + log(`Connecting to ${url}|${is_reconnect}`); + this.eventsub = new WebSocket(url); + this.eventsub.is_reconnecting = is_reconnect; + this.eventsub.counter = this.counter; + + this.eventsub.addEventListener('open', () => { + log(`Opened Connection to Twitch`); + }); + // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event + // https://github.com/Luka967/websocket-close-codes + this.eventsub.addEventListener('close', (close) => { + console.log('EventSub close', close, this.eventsub); + log(`${this.eventsub.twitch_websocket_id}/${this.eventsub.counter} Connection Closed: ${close.code} Reason - ${this.closeCodes[close.code]}`); + + if (!this.eventsub.is_reconnecting) { + log(`${this.eventsub.twitch_websocket_id}/${this.eventsub.counter} Is not reconnecting, auto reconnect`); + //new initSocket(); + this.connect(); + } + + if (close.code == 1006) { + // do a single retry + this.eventsub.is_reconnecting = true; + } + }); + // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/error_event + this.eventsub.addEventListener('error', (err) => { + console.log(err); + log(`${this.eventsub.twitch_websocket_id}/${this.eventsub.counter} Connection Error`); + }); + // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/message_event + this.eventsub.addEventListener('message', (message) => { + //log('Message'); + //console.log(this.eventsub.counter, message); + let { data } = message; + data = JSON.parse(data); + + let { metadata, payload } = data; + let { message_id, message_type, message_timestamp } = metadata; + //log(`Recv ${message_id} - ${message_type}`); + + switch (message_type) { + case 'session_welcome': + let { session } = payload; + let { id, keepalive_timeout_seconds } = session; + + log(`${this.eventsub.counter} This is Socket ID ${id}`); + this.eventsub.twitch_websocket_id = id; + + log(`${this.eventsub.counter} This socket declared silence as ${keepalive_timeout_seconds} seconds`); + + if (!this.eventsub.is_reconnecting) { + log('Dirty disconnect or first spawn'); + this.emit('connected', id); + // now you would spawn your topics + } else { + this.emit('reconnected', id); + // no need to spawn topics as carried over + } + + this.silence(keepalive_timeout_seconds); + + break; + case 'session_keepalive': + //log(`Recv KeepAlive - ${message_type}`); + this.emit('session_keepalive'); + this.silence(); + break; + + case 'notification': + //console.log('notification', metadata, payload); + //log(`${this.eventsub.twitch_websocket_id}/${this.eventsub.counter} Recv notification`);// ${JSON.stringify(payload)}`); + + let { subscription, event } = payload; + let { type } = subscription; + + this.emit('notification', { metadata, payload }); + this.emit(type, { metadata, payload }); + this.silence(); + + break; + + case 'session_reconnect': + this.eventsub.is_reconnecting = true; + + let reconnect_url = payload.session.reconnect_url; + + console.log('Connect to new url', reconnect_url); + log(`${this.eventsub.twitch_websocket_id}/${this.eventsub.counter} Reconnect request ${reconnect_url}`) + + //this.eventsub.close(); + //new initSocket(reconnect_url, true); + this.connect(reconnect_url, true); + + break; + case 'websocket_disconnect': + log(`${this.eventsub.counter} Recv Disconnect`); + console.log('websocket_disconnect', payload); + + break; + + case 'revocation': + log(`${this.eventsub.counter} Recv Topic Revocation`); + console.log('revocation', payload); + this.emit('revocation', { metadata, payload }); + break; + + default: + console.log(`${this.eventsub.counter} unexpected`, metadata, payload); + break; + } + }); + } + + trigger() { + // this function lets you test the disconnect on send method + this.eventsub.send('cat'); + } + close() { + this.eventsub.close(); + } + + silenceHandler = false; + silenceTime = 10;// default per docs is 10 so set that as a good default + silence(keepalive_timeout_seconds) { + if (keepalive_timeout_seconds) { + this.silenceTime = keepalive_timeout_seconds; + this.silenceTime++;// add a little window as it's too anal + } + clearTimeout(this.silenceHandler); + this.silenceHandler = setTimeout(() => { + this.emit('session_silenced');// -> self reconnecting + this.close();// close it and let it self loop + }, (this.silenceTime * 1000)); + } + + on(name, listener) { + if (!this._events[name]) { + this._events[name] = []; + } + + this._events[name].push(listener); + } + emit(name, data) { + if (!this._events[name]) { + return; + } + + const fireCallbacks = (callback) => { + callback(data); + }; + + this._events[name].forEach(fireCallbacks); + } +} + +function log(msg) { + if (!document.getElementById('log')) { + return; + } + + let div = document.createElement('div'); + document.getElementById('log').prepend(div); + + let tim = document.createElement('span'); + div.append(tim); + let t = [ + new Date().getHours(), + new Date().getMinutes(), + new Date().getSeconds() + ] + t.forEach((v,i) => { + t[i] = v < 10 ? '0'+v : v; + }); + tim.textContent = t.join(':'); + + let sp = document.createElement('span'); + div.append(sp); + sp.textContent = msg; +}