Panel terminé + Refresh token auto

This commit is contained in:
Zachary Guénot committed 2023-05-11 00:37:16 +02:00
1 parent de01c981f8
commit 8846299424
16 files changed
+244 -57

No files matched your search

+17 -8
View File
@@ -5,12 +5,12 @@ require('dotenv').config()
// UTILS
const checkUser = require('./utils/checkUser')
const checkChannel = require('./utils/checkChannel')
const getRewardData = require('./utils/getRewardData')
const getRewardID = require('./utils/getRewardID')
const getUserAccessToken = require('./utils/getUserAccessToken')
const getUserID = require('./utils/getUserID')
const getUserInfo = require('./utils/getUserInfo')
const getUserName = require('./utils/getUserName')
const oauthGen = require('./utils/oauthGen')
const parseMessage = require('./utils/parseMessage')
const rewardRedemption = require('./utils/rewardRedemption')
@@ -54,19 +54,21 @@ app.get('/twitch/oauth/login/:type', async (req, res) => {
let type = req.params.type
if (type === 'user') {
user_access_token = await getUserAccessToken(client_id, client_secret, req.query.code, redirect_uri + type)
[ user_access_token, user_refresh_token ] = await getUserAccessToken(client_id, client_secret, req.query.code, redirect_uri + type)
writeEnv('TWITCH_USER_ACCESS_TOKEN', user_access_token)
writeEnv('TWITCH_USER_REFRESH_TOKEN', user_refresh_token)
user_name = await getUserName(client_id, user_access_token).login
user_name = await getUserInfo(client_id, user_access_token).login
writeEnv('TWITCH_USER_USERNAME', user_name)
clientChatBot.connect('wss://irc-ws.chat.twitch.tv:443')
}
else if (type === 'channel') {
channel_access_token = await getUserAccessToken(client_id, client_secret, req.query.code, redirect_uri + type)
[ channel_access_token, channel_refresh_token ] = await getUserAccessToken(client_id, client_secret, req.query.code, redirect_uri + type)
writeEnv('TWITCH_CHANNEL_ACCESS_TOKEN', channel_access_token)
writeEnv('TWITCH_CHANNEL_REFRESH_TOKEN', channel_refresh_token)
channel_name = await getUserName(client_id, channel_access_token).login
channel_name = await getUserInfo(client_id, channel_access_token).login
writeEnv('TWITCH_CHANNEL_USERNAME', channel_name)
clientEventSub.connect('wss://eventsub.wss.twitch.tv/ws')
@@ -102,9 +104,13 @@ const clientChatBot = new WebSocketClient()
let connectionChatBot
clientChatBot.on('connect', async connection => {
console.log('Twitch ChatBot WebSocket Connected !')
connectionChatBot = connection
console.log('Twitch ChatBot WebSocket Connected !')
// Check if the user access token is still valid
//[user_access_token, user_name] = await checkUser(user_access_token)
// Authenticate to Twitch IRC and join channel
connection.sendUTF('CAP REQ :twitch.tv/commands twitch.tv/membership twitch.tv/tags')
connection.sendUTF(`PASS oauth:${user_access_token}`)
@@ -151,6 +157,9 @@ clientChatBot.connect('wss://irc-ws.chat.twitch.tv:443')
const clientEventSub = new WebSocketClient().on('connect', async connection => {
console.log('Twitch EventSub WebSocket Connected !')
// Check if the channel access token is still valid
//[channel_access_token, channel_name] = await checkChannel(channel_access_token)
connection.on('message', async message => {
if (message.type === 'utf8') {
try {
@@ -160,7 +169,7 @@ const clientEventSub = new WebSocketClient().on('connect', async connection => {
if (data.metadata.message_type === 'session_welcome') {
// Get broadcaster user id and reward id
let broadcaster_user_id = await getUserID(client_id, channel_access_token)
let broadcaster_user_id = await getUserInfo(client_id, channel_access_token).id
writeEnv('TWITCH_CHANNEL_BROADCASTER_ID', broadcaster_user_id)
let reward_id = await getRewardID(client_id, channel_access_token, broadcaster_user_id, channel_reward_name)
writeEnv('TWITCH_CHANNEL_REWARD_ID', reward_id)
+9
View File
@@ -0,0 +1,9 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="10" height="10" fill="url(#pattern0)"/>
<defs>
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_7_302" transform="scale(0.00195312)"/>
</pattern>
<image id="image0_7_302" width="512" height="512" xlink:href="data:image/png;base64,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 truncated
</defs>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

+106 -9
View File
@@ -1,16 +1,113 @@
p {
color: white;
text-align: center;
@import url('https://fonts.googleapis.com/css2?family=Annie+Use+Your+Telescope&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Advent+Pro&display=swap');
body {
/* background-color: #B9F1FD; */
background: url(https://angels-dev.fr/twitch/panel/background.png);
background-repeat: no-repeat;
/* border: 2px solid black; */
font-family: 'Advent Pro', sans-serif;
font-weight: 400;
color: black;
}
.div__title {
width: 205px;
height: 34px;
border-radius: 15px;
border-bottom: 1px solid #205E8B;
background-color: #5FB5F4;
justify-content: center;
margin: auto;
margin-bottom: 15px;
}
.title {
color: black;
text-align: center;
font-family: 'Annie Use Your Telescope', cursive;
font-size: 24px;
font-weight: 600;
}
.table {
margin: auto;
border-collapse : separate;
border-spacing: 4px;
}
.table__body {
overflow-y: scroll;
scrollbar-width: thin; /* "auto" or "thin" */
scrollbar-color: #24AEEA #7A7979; /* scroll thumb and track */
}
.table__rank {
background-color: #5FB6F4;
width: 30px;
height: 20px;
border-radius: 5px;
font-size: 12px;
font-weight: 600;
}
.table__pseudos {
background-color: #5FB6F4;
width: 200px;
height: 20px;
border-radius: 5px;
text-align: left;
padding-left: 5px;
font-size: 12px;
font-weight: 600;
}
.table__arrows {
background-color: #5FB6F4;
width: 54px;
height: 20px;
border-radius: 5px;
font-size: 12px;
font-weight: 600;
}
.row__rank {
background-color: #99CFEE;
width: 30px;
height: 20px;
border-radius: 5px;
font-size: 12px;
font-weight: 800;
}
.row__pseudos {
background-color: #99CFEE;
width: 200px;
height: 20px;
border-radius: 5px;
text-align: left;
padding-left: 5px;
font-size: 16px;
font-weight: 400;
}
.row__arrows {
background-color: #99CFEE;
width: 54px;
height: 20px;
border-radius: 5px;
font-size: 14px;
font-weight: 400;
}
.row__arrows::after {
content: url(https://angels-dev.fr/twitch/panel/arrow.svg);
margin-left: 7.5px;
}
th {
color: white;
text-align: center;
}
td {
color: white;
text-align: center;
}
table .center {
margin-left: auto;
margin-right: auto;
}
+20 -11
View File
@@ -1,16 +1,25 @@
<!DOCTYPE HTML>
<script src="https://extension-files.twitch.tv/helper/v1/twitch-ext.min.js"></script>
<script src="https://angels-dev.fr/twitch/panel/script.js"></script>
<link rel="stylesheet" href="https://angels-dev.fr/twitch/panel/panel.css">
<html lang="en">
<head>
<script src="https://extension-files.twitch.tv/helper/v1/twitch-ext.min.js"></script>
<script src="https://angels-dev.fr/twitch/panel/script.js"></script>
<link rel="stylesheet" href="https://angels-dev.fr/twitch/panel/panel.css">
<link rel="image/svg" href="https://angels-dev.fr/twitch/panel/arrow.svg">
<title>Panel Laytho</title>
<p>Classement des Daily Arrows</p>
<table id="table" class="center">
<title>Laytho Panel</title>
</head>
<body>
<div class="div__title">
<h2 class="title">Stand de tir à l'arc</h2>
</div>
<table id="table" class="table">
<thead>
<tr>
<th scope="col">Pseudo</th>
<th scope="col">Daily Arrows</th>
<tr class="table__names">
<th scope="col" class="table__rank">Rank</th>
<th scope="col" class="table__pseudos">Pseudo</th>
<th scope="col" class="table__arrows">Carquois</th>
</tr>
</thead>
<tbody></tbody>
</table>
<tbody class="table__body"></tbody>
</table>
</html>
+11 -1
View File
@@ -8,10 +8,20 @@ xhr.onload = () => {
let tbodyRef = document.getElementById('table').getElementsByTagName('tbody')[0]
for (let entry of data.scoreboard) {
for (entry of data.scoreboard) {
let row = tbodyRef.insertRow()
row.insertCell().appendChild(document.createTextNode(data.scoreboard.indexOf(entry) + 1))
row.insertCell().appendChild(document.createTextNode(entry.user_name))
row.insertCell().appendChild(document.createTextNode(entry.count))
let i = 0
for (cell of row.cells) {
i++
if (i === 1) cell.className = "row__rank"
if (i === 2) cell.className = "row__pseudos"
if (i === 3) cell.className = "row__arrows"
}
}
} else console.error('Error:', xhr.statusText)
}
+25
View File
@@ -0,0 +1,25 @@
require('dotenv').config()
const validateToken = require('./validateToken')
const refreshToken = require('./refreshToken')
const writeEnv = require('./writeEnv')
let client_id = process.env.TWITCH_APP_ID
let client_secret = process.env.TWITCH_APP_SECRET
module.exports = async function (channel_access_token) {
let channel_refresh_token = ''
// Check if channel_access_token is valid
if (!await validateToken(channel_access_token)) {
// If not, refresh it
[channel_access_token, channel_refresh_token] = await refreshToken(client_id, client_secret, channel_access_token)
writeEnv('TWITCH_CHANNEL_ACCESS_TOKEN', channel_access_token)
writeEnv('TWITCH_CHANNEL_REFRESH_TOKEN', channel_refresh_token)
let channel_name = await getUserInfo(client_id, channel_access_token).login
writeEnv('TWITCH_CHANNEL_USERNAME', channel_name)
}
return [channel_access_token, channel_name]
}
+25
View File
@@ -0,0 +1,25 @@
require('dotenv').config()
const validateToken = require('./validateToken')
const refreshToken = require('./refreshToken')
const writeEnv = require('./writeEnv')
let client_id = process.env.TWITCH_APP_ID
let client_secret = process.env.TWITCH_APP_SECRET
module.exports = async function (user_access_token) {
let user_refresh_token = ''
// Check if user_access_token is valid
if (!await validateToken(user_access_token)) {
// If not, refresh it
[user_access_token, user_refresh_token ] = await refreshToken(client_id, client_secret, user_access_token)
writeEnv('TWITCH_USER_ACCESS_TOKEN', user_access_token)
writeEnv('TWITCH_USER_REFRESH_TOKEN', user_refresh_token)
let user_name = await getUserInfo(client_id, user_access_token).login
writeEnv('TWITCH_USER_USERNAME', user_name)
}
return [user_access_token, user_name]
}
+1
View File
@@ -1,4 +1,5 @@
const mysql = require('mysql2/promise')
require('dotenv').config()
module.exports = async function () {
// Create a connection to the MySQL database
+1
View File
@@ -7,6 +7,7 @@ module.exports = async function (client_id, access_token, broadcaster_id, reward
'Client-Id': client_id
}
}).then(response => {
//console.log(response.data)
let reward = response.data.data.find(reward => reward.title === reward_name)
return reward.id
}).catch(error => { console.log(error.response.data) })
+2 -2
View File
@@ -8,7 +8,7 @@ module.exports = async function (client_id, client_secret, code, redirect_uri) {
redirect_uri,
grant_type: 'authorization_code'
}).then(response => {
console.log(response.data)
if (response.data.token_type === 'bearer') return response.data.access_token
//console.log(response.data)
if (response.data.token_type === 'bearer') return [response.data.access_token, response.data.refresh_token]
}).catch(error => { console.log(error.response.data) })
}
-13
View File
@@ -1,13 +0,0 @@
const axios = require('axios')
module.exports = async function (client_id, access_token) {
return await axios.get(`https://api.twitch.tv/helix/users`, {
headers: {
'Authorization': `Bearer ${access_token}`,
'Client-Id': client_id
}
}).then(response => {
//console.log(response.data)
return response.data.data[0].id
}).catch(error => { console.log(error.response.data) })
}
-13
View File
@@ -1,13 +0,0 @@
const axios = require('axios')
module.exports = async function (client_id, access_token) {
return await axios.get(`https://api.twitch.tv/helix/users`, {
headers: {
'Authorization': `Bearer ${access_token}`,
'Client-Id': client_id
}
}).then(response => {
//console.log(response.data)
return response.data.data[0].login
}).catch(error => { console.log(error.response.data) })
}
+13
View File
@@ -0,0 +1,13 @@
const axios = require('axios')
module.exports = async function (client_id, client_secret, refresh_token) {
return await axios.post('https://id.twitch.tv/oauth2/token', {
client_id,
client_secret,
refresh_token,
grant_type: 'refresh_token'
}).then(response => {
//console.log(response.data)
if (response.data.token_type === 'bearer') return [response.data.access_token, response.data.refresh_token]
}).catch(error => { console.log(error.response.data) })
}
+1
View File
@@ -16,6 +16,7 @@ module.exports = async function (client_id, access_token, session_id, type, vers
'Content-Type': 'application/json'
}
}).then(response => {
//console.log(response.data)
return response.data.data[0].status
}).catch(error => { return error.response.data })
}
+13
View File
@@ -0,0 +1,13 @@
const axios = require('axios')
module.exports = async function (access_token) {
return await axios.get('https://id.twitch.tv/oauth2/validate', {
headers: {
'Authorization': `OAuth ${access_token}`,
}
}).then(response => {
//console.log(response.data)
if (response.data.status === '401') return false
else return true
}).catch(error => { console.log(error.response.data) })
}