updated everything to make it general
@@ -1,5 +1,5 @@
|
|||||||
<h1 align="center">Twitch Subathon Countdown</h1>
|
<h1 align="center">Twitch Subathon Countdown Template</h1>
|
||||||
<p align="center">This is a countdown specifically made for the Twitch streamer "SugusSusana"</p>
|
<p align="center">This is the template I created for my Twitch Subathon Countdowns</p>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<h2>Description</h2>
|
<h2>Description</h2>
|
||||||
@@ -14,17 +14,21 @@
|
|||||||
<p>After cloning this repository you'll have to edit the "config.js" file with any plain text editor, then change the value of the variables acording to what you want:</p>
|
<p>After cloning this repository you'll have to edit the "config.js" file with any plain text editor, then change the value of the variables acording to what you want:</p>
|
||||||
|
|
||||||
<h3>Streamlabs Token</h3>
|
<h3>Streamlabs Token</h3>
|
||||||
<p>To get the token you'll have to go to the api settings tab of your <a href="https://streamlabs.com/dashboard#/settings/api-settings">streamlabs dashboard</a> then click on tokens API, copy your socket API token and finally paste the code on the "streamlabsToken" variable in the "config.js" file.</p>
|
<p>To get the token you'll have to go to the api settings tab of your <a href="https://streamlabs.com/dashboard#/settings/api-settings">Streamlabs dashboard</a> then click on API Tokens, copy your socket API token and finally paste the code on the "streamlabs_token" variable in the "config.js" file.</p>
|
||||||
<img src="./auth_streamlabs.png">
|
<img src="./auth_streamlabs.png">
|
||||||
|
|
||||||
|
<h3>StreamElements Token</h3>
|
||||||
|
<p>To get the token you'll have to go to your <a href="https://streamelements.com/dashboard/account/channels">StreamElements channels dashboard</a>, then click on show secrets, copy the Overlay token and paste the code on the "streamelements_token" variable in the "config.js" file.</p>
|
||||||
|
<img src="./auth_streamelements.png">
|
||||||
|
|
||||||
<h3>Streamloots Token</h3>
|
<h3>Streamloots Token</h3>
|
||||||
<p>To get the token you'll have to go to your streamloots creator dashboard, then to alerts & widgets, then go to alerts, then copy the last part of the alerts url and finally paste the code on the "streamlootsToken" variable in the "config.js" file.</p>
|
<p>To get the token you'll have to go to your Streamloots creator dashboard, then to alerts & widgets, then go to alerts, then copy the last part of the alerts url and finally paste the code on the "streamloots_token" variable in the "config.js" file.</p>
|
||||||
<img src="./auth_streamloots.png">
|
<img src="./auth_streamloots.png">
|
||||||
|
|
||||||
<h3>Initial Time</h3>
|
<h3>Initial Time</h3>
|
||||||
<p>You can set the initial time of the timer by setting the hours, minutes and seconds to be added when the timer is added.</p>
|
<p>You can set the initial time of the timer by setting the hours, minutes and seconds to be added when the timer is created.</p>
|
||||||
|
|
||||||
<h3>Other Value</h3>
|
<h3>Other Values</h3>
|
||||||
<p>Change the other values to set the amount of seconds that will be added for the suscriptions, donations... And the minimum donation amounts to trigger the countdown increase.</p>
|
<p>Change the other values to set the amount of seconds that will be added for the suscriptions, donations... And the minimum donation amounts to trigger the countdown increase.</p>
|
||||||
|
|
||||||
<h3>Add To OBS</h3>
|
<h3>Add To OBS</h3>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 160 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 20 KiB |
@@ -1,17 +1,36 @@
|
|||||||
var streamlabsToken = ""
|
// Login Data
|
||||||
var streamlootsToken = ""
|
var twitch_channel_name = ""
|
||||||
|
var streamlabs_token = ""
|
||||||
|
var streamelements_token = ""
|
||||||
|
var streamloots_token = ""
|
||||||
|
|
||||||
var initialHours = 3
|
// Initial Counter Config
|
||||||
var initialMinutes = 30
|
var initialHours = 5
|
||||||
var initialSeconds = 40
|
var initialMinutes = 0
|
||||||
|
var initialSeconds = 0
|
||||||
|
|
||||||
var secondsPerSub = 300
|
// General Twitch, Streamlabs And StreamElements Config
|
||||||
|
var seconds_added_per_sub_prime = 30
|
||||||
|
var seconds_added_per_sub_tier1 = 30
|
||||||
|
var seconds_added_per_sub_tier2 = 60
|
||||||
|
var seconds_added_per_sub_tier3 = 120
|
||||||
|
|
||||||
var secondsPerDono = 300
|
var seconds_added_per_resub_prime = 30
|
||||||
var quantityDono = 5
|
var seconds_added_per_resub_tier1 = 30
|
||||||
|
var seconds_added_per_resub_tier2 = 60
|
||||||
|
var seconds_added_per_resub_tier3 = 120
|
||||||
|
|
||||||
var secondsPerChest = 300
|
var seconds_added_per_giftsub_tier1 = 30
|
||||||
var quantityChest = 10
|
var seconds_added_per_giftsub_tier2 = 60
|
||||||
|
var seconds_added_per_giftsub_tier3 = 120
|
||||||
|
|
||||||
var secondsPerBits = 300
|
var min_amount_of_bits = 500
|
||||||
var quantityBits = 500
|
var seconds_added_per_bits = 30
|
||||||
|
|
||||||
|
// Streamlabs And StreamElements Config
|
||||||
|
var min_donation_amount = 5
|
||||||
|
var seconds_added_per_donation = 30
|
||||||
|
|
||||||
|
// Streamloots Config
|
||||||
|
var min_amount_of_chests = 5
|
||||||
|
var seconds_added_per_chests = 30
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
body, body * {
|
body, body * {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
font-family: 'Manrope', sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
@@ -10,28 +11,36 @@ body {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--background-color: #f7fff7;
|
||||||
|
--shadow-color: #00000020;
|
||||||
|
--text-color: #292f36;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#container {
|
#container {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
|
background-color: var(--background-color);
|
||||||
|
box-shadow: 0 0 1.25rem 0.5rem var(--shadow-color);
|
||||||
|
width: 500px;
|
||||||
|
height: 180px;
|
||||||
|
border-radius: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#textDiv {
|
#textDiv {
|
||||||
background-color: #bea0af;
|
|
||||||
width: 420px;
|
|
||||||
height: 150px;
|
|
||||||
border-radius: 20px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
color: #3c3341;
|
color: var(--text-color);
|
||||||
font-size: 4rem;
|
font-size: 5rem;
|
||||||
font-family: 'Manrope', sans-serif;
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,11 +51,28 @@ img {
|
|||||||
}
|
}
|
||||||
|
|
||||||
canvas {
|
canvas {
|
||||||
width: 420px;
|
width: 500px;
|
||||||
height: 150px;
|
height: 180px;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.addedTime {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
opacity: 0;
|
||||||
|
display: none;
|
||||||
|
z-index: 5;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 3.25rem;
|
||||||
|
color: var(--background-color);
|
||||||
|
text-shadow: 0 0 1.5rem var(--text-color);
|
||||||
|
transition: top 1s ease-out, opacity .5s ease-out;
|
||||||
|
}
|
||||||
@@ -10,17 +10,25 @@
|
|||||||
<link rel="stylesheet" href="css/style.css">
|
<link rel="stylesheet" href="css/style.css">
|
||||||
<title>Subathon Timer</title>
|
<title>Subathon Timer</title>
|
||||||
</head>
|
</head>
|
||||||
<body onload="start()">
|
<body>
|
||||||
<div id="container">
|
<div id="container">
|
||||||
<div id="textDiv">
|
<div id="textDiv">
|
||||||
<p id="timeText">00:00:00</p>
|
<p id="timeText">00:00:00</p>
|
||||||
</div>
|
</div>
|
||||||
<img src="assets/background.svg" alt="">
|
|
||||||
<canvas id="canvas"></canvas>
|
<canvas id="canvas"></canvas>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js' type='text/javascript'></script>
|
<script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js' type='text/javascript'></script>
|
||||||
|
<script src='js/lib/tmi.min.js'></script>
|
||||||
|
<script src="js/lib/generalFunc.js"></script>
|
||||||
|
<script src="js/lib/timeFunc.js"></script>
|
||||||
|
|
||||||
<script src="config.js"></script>
|
<script src="config.js"></script>
|
||||||
<script src="js/timeFunc.js"></script>
|
|
||||||
<script src="js/script.js"></script>
|
<script src="js/script.js"></script>
|
||||||
|
|
||||||
|
<script src="js/api/twitch.js"></script>
|
||||||
|
<!-- <script src="js/api/streamlabs.js"></script> -->
|
||||||
|
<!-- <script src="js/api/streamelements.js"></script> -->
|
||||||
|
<!-- <script src="js/api/streamloots.js"></script> -->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
if (streamelements_token !== "") {
|
||||||
|
var streamElementsSocket;
|
||||||
|
const streamElementsConnect = () => {
|
||||||
|
streamElementsSocket = undefined;
|
||||||
|
streamElementsSocket = io('https://realtime.streamelements.com', {
|
||||||
|
transports: ['websocket']
|
||||||
|
});
|
||||||
|
|
||||||
|
streamElementsSocket.on('connect', onConnect);
|
||||||
|
streamElementsSocket.on('disconnect', onDisconnect);
|
||||||
|
streamElementsSocket.on('authenticated', onAuthenticated);
|
||||||
|
streamElementsSocket.on('unauthorized', console.error);
|
||||||
|
streamElementsSocket.on('event:test', onEvent);
|
||||||
|
streamElementsSocket.on('event', onEvent);
|
||||||
|
streamElementsSocket.on('event:update', onEvent);
|
||||||
|
streamElementsSocket.on('event:reset', onEvent);
|
||||||
|
|
||||||
|
function onConnect() {
|
||||||
|
logMessage("StreamElements", "Socket Connected");
|
||||||
|
streamElementsSocket.emit('authenticate', {method: 'apikey', token: streamelements_token});
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDisconnect() {
|
||||||
|
logMessage("StreamElements", "Socket Disconnected");
|
||||||
|
streamElementsConnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onAuthenticated(data) {
|
||||||
|
const {
|
||||||
|
channelId
|
||||||
|
} = data;
|
||||||
|
logMessage("StreamElements", `Channel ${channelId} Connected`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onEvent(data) {
|
||||||
|
logObject("StreamElements", data);
|
||||||
|
if (!countdownEnded) {
|
||||||
|
if (data['listener'] === "subscriber-latest") {
|
||||||
|
if (data['event']['gifted'] || data['event']['bulkGifted']) {
|
||||||
|
let amount;
|
||||||
|
if (data['event']['gifted']) amount = 1;
|
||||||
|
else amount = data['event']['amount'];
|
||||||
|
if (data['event']['tier'] == "prime" || data['event']['tier'] == "1000") {
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier1 * amount);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_giftsub_tier1 * amount} Seconds Because ${data['event']['name']} Gifted ${amount} Tier 1 Subs`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "2000") {
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier2 * amount);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_giftsub_tier2 * amount} Seconds Because ${data['event']['name']} Gifted ${amount} Tier 2 Subs`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "3000") {
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier3 * amount);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_giftsub_tier3 * amount} Seconds Because ${data['event']['name']} Gifted ${amount} Tier 3 Subs`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (data['event']['amount'] != "1") {
|
||||||
|
if (data['event']['tier'] == "prime") {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_prime);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_resub_prime} Seconds Because ${data['event']['name']} ReSubscribed With Prime`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "1000") {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier1);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_resub_tier1} Seconds Because ${data['event']['name']} ReSubscribed With Tier 1`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "2000") {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier2);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_resub_tier2} Seconds Because ${data['event']['name']} ReSubscribed With Tier 2`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "3000") {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier3);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_resub_tier3} Seconds Because ${data['event']['name']} ReSubscribed With Tier 3`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (data['event']['tier'] == "prime") {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_prime);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_sub_prime} Seconds Because ${data['event']['name']} Subscribed With Prime`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "1000") {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier1);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_sub_tier1} Seconds Because ${data['event']['name']} Subscribed With Tier 1`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "2000") {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier2);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_sub_tier2} Seconds Because ${data['event']['name']} Subscribed With Tier 2`);
|
||||||
|
}
|
||||||
|
else if (data['event']['tier'] == "3000") {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier3);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_sub_tier3} Seconds Because ${data['event']['name']} Subscribed With Tier 3`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!users.includes(data['event']['name'])) {
|
||||||
|
users.push(data['event']['name']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (data['listener'] === "cheer-latest") {
|
||||||
|
if (data['event']['amount'] >= min_amount_of_bits) {
|
||||||
|
let times = Math.floor(data['event']['amount']/min_amount_of_bits);
|
||||||
|
addTime(endingTime, seconds_added_per_bits * times);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_bits * times} Seconds Because ${data['event']['name']} Donated ${data['event']['amount']} Bits`);
|
||||||
|
if (!users.includes(data['event']['name'])) {
|
||||||
|
users.push(data['event']['name']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (data['listener'] === "tip-latest") {
|
||||||
|
if (data['event']['amount'] >= min_donation_amount) {
|
||||||
|
let times = Math.floor(data['event']['amount']/min_donation_amount);
|
||||||
|
addTime(endingTime, seconds_added_per_donation * times);
|
||||||
|
logMessage("StreamElements", `Added ${seconds_added_per_donation * times} Seconds Because ${data['event']['name']} Donated ${data['event']['amount']}$`);
|
||||||
|
if (!users.includes(data['event']['name'])) {
|
||||||
|
users.push(data['event']['name']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
streamElementsConnect();
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
if (streamlabs_token !== "") {
|
||||||
|
socket = io(`https://sockets.streamlabs.com?token=${streamlabs_token}`, {transports: ['websocket']});
|
||||||
|
|
||||||
|
socket.on("connect", () => {
|
||||||
|
logMessage("Streamlabs", "Socket Connected");
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on("event", (event) => {
|
||||||
|
logObject("Streamlabs", event);
|
||||||
|
if (event.type == "subscription" && !event.message[0].gifter) {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
if (event.message[0].sub_plan == "1000") {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier1);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_sub_tier1} Seconds Because ${event.message[0].name} Subscribed With Tier 1`);
|
||||||
|
}
|
||||||
|
else if (event.message[0].sub_plan == "2000") {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier2);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_sub_tier2} Seconds Because ${event.message[0].name} Subscribed With Tier 2`);
|
||||||
|
}
|
||||||
|
else if (event.message[0].sub_plan == "3000") {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier3);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_sub_tier3} Seconds Because ${event.message[0].name} Subscribed With Tier 3`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
addTime(endingTime, seconds_added_per_sub_prime);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_sub_prime} Seconds Because ${event.message[0].name} Subscribed With Prime`);
|
||||||
|
}
|
||||||
|
if (!users.includes(event.message[0].name)) {
|
||||||
|
users.push(event.message[0].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (event.type == "resub" && !event.message[0].gifter) {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
if (event.message[0].sub_plan == "1000") {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier1);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_resub_tier1} Seconds Because ${event.message[0].name} ReSubscribed With Tier 1`);
|
||||||
|
}
|
||||||
|
else if (event.message[0].sub_plan == "2000") {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier2);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_resub_tier2} Seconds Because ${event.message[0].name} ReSubscribed With Tier 2`);
|
||||||
|
}
|
||||||
|
else if (event.message[0].sub_plan == "3000") {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier3);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_resub_tier3} Seconds Because ${event.message[0].name} ReSubscribed With Tier 3`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
addTime(endingTime, seconds_added_per_resub_prime);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_resub_prime} Seconds Because ${event.message[0].name} ReSubscribed With Prime`);
|
||||||
|
}
|
||||||
|
if (!users.includes(event.message[0].name)) {
|
||||||
|
users.push(event.message[0].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (event.message[0].gifter) {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
if (event.message[0].sub_plan == "1000") {
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier1);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_giftsub_tier1} Seconds Because ${event.message[0].gifter} Gifted A Tier 1 Sub`);
|
||||||
|
}
|
||||||
|
else if (event.message[0].sub_plan == "2000") {
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier2);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_giftsub_tier2} Seconds Because ${event.message[0].gifter} Gifted A Tier 2 Sub`);
|
||||||
|
}
|
||||||
|
else if (event.message[0].sub_plan == "3000") {
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier3);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_giftsub_tier3} Seconds Because ${event.message[0].gifter} Gifted A Tier 3 Sub`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier1);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_giftsub_tier1} Seconds Because ${event.message[0].gifter} Gifted A Tier 1 Sub`);
|
||||||
|
}
|
||||||
|
if (!users.includes(event.message[0].name)) {
|
||||||
|
users.push(event.message[0].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (event.type == "donation") {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
let dono = parseInt(event.message[0].amount);
|
||||||
|
let currency = event.message[0].currency;
|
||||||
|
if (dono >= min_donation_amount) {
|
||||||
|
let times = Math.floor(dono/min_donation_amount);
|
||||||
|
addTime(endingTime, seconds_added_per_donation * times);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_donation * times} Seconds Because ${event.message[0].name} Donated ${dono} ${currency}`);
|
||||||
|
if (!users.includes(event.message[0].name)) {
|
||||||
|
users.push(event.message[0].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (event.type == "bits") {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
let bits = parseInt(event.message[0].amount);
|
||||||
|
if (bits >= min_amount_of_bits) {
|
||||||
|
let times = Math.floor(bits/min_amount_of_bits);
|
||||||
|
addTime(endingTime, seconds_added_per_bits * times);
|
||||||
|
logMessage("Streamlabs", `Added ${seconds_added_per_bits * times} Seconds Because ${event.message[0].name} Donated ${bits} Bits`);
|
||||||
|
if (!users.includes(event.message[0].name)) {
|
||||||
|
users.push(event.message[0].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on("disconnect", () => {
|
||||||
|
logMessage("Streamlabs", "Socket Disconnected");
|
||||||
|
socket.connect();
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
if (streamloots_token !== "") {
|
||||||
|
evtSourceStreamLoots = new EventSource(`https://widgets.streamloots.com/alerts/${streamloots_token}/media-stream`);
|
||||||
|
logMessage("Streamloots", "Event Source Created");
|
||||||
|
|
||||||
|
evtSourceStreamLoots.onmessage = async (event) => {
|
||||||
|
data = await JSON.parse(event.data);
|
||||||
|
logObject("Streamloots", data);
|
||||||
|
if (data.data.type == "purchase") {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
let chests;
|
||||||
|
if (typeof(data.data.fields[0].value) == "number") {
|
||||||
|
chests = data.data.fields[0].value;
|
||||||
|
if (chests >= min_amount_of_chests) {
|
||||||
|
let times = Math.floor(chests/min_amount_of_chests);
|
||||||
|
addTime(endingTime, seconds_added_per_chests * times);
|
||||||
|
logMessage("Streamloots", `Added ${seconds_added_per_chests * times} Seconds Because ${data.data.fields[1].value} Bought ${chests} Chests`);
|
||||||
|
if (!users.includes(data.data.fields[1].value)) {
|
||||||
|
users.push(data.data.fields[1].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
chests = data.data.fields[1].value;
|
||||||
|
if (chests >= min_amount_of_chests) {
|
||||||
|
let times = Math.floor(chests/min_amount_of_chests);
|
||||||
|
addTime(endingTime, seconds_added_per_chests * times);
|
||||||
|
logMessage("Streamloots", `Added ${seconds_added_per_chests * times} Seconds Because ${data.data.fields[0].value} Gifted ${chests} Chests`);
|
||||||
|
if (!users.includes(data.data.fields[0].value)) {
|
||||||
|
users.push(data.data.fields[0].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
if (twitch_channel_name !== "") {
|
||||||
|
const client = new tmi.client({
|
||||||
|
channels: [twitch_channel_name],
|
||||||
|
});
|
||||||
|
|
||||||
|
client.connect();
|
||||||
|
logMessage("Twitch", `Client Connected`);
|
||||||
|
|
||||||
|
client.on('subscription', (channel, username, methods, message, userstate) => {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
switch (methods['plan']) {
|
||||||
|
case "Prime":
|
||||||
|
addTime(endingTime, seconds_added_per_sub_prime);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_sub_prime} Seconds Because ${username} Subscribed With Prime`);
|
||||||
|
break;
|
||||||
|
case "1000":
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier1);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_sub_tier1} Seconds Because ${username} Subscribed With Tier 1`);
|
||||||
|
break;
|
||||||
|
case "2000":
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier2);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_sub_tier2} Seconds Because ${username} Subscribed With Tier 2`);
|
||||||
|
break;
|
||||||
|
case "3000":
|
||||||
|
addTime(endingTime, seconds_added_per_sub_tier3);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_sub_tier3} Seconds Because ${username} Subscribed With Tier 3`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!users.includes(username)) {
|
||||||
|
users.push(username);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('resub', (channel, username, months, message, userstate, methods) => {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
switch (methods['plan']) {
|
||||||
|
case "Prime":
|
||||||
|
addTime(endingTime, seconds_added_per_resub_prime);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_resub_prime} Seconds Because ${username} ReSubscribed With Prime`);
|
||||||
|
break;
|
||||||
|
case "1000":
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier1);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_resub_tier1} Seconds Because ${username} ReSubscribed With Tier 1`);
|
||||||
|
break;
|
||||||
|
case "2000":
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier2);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_resub_tier2} Seconds Because ${username} ReSubscribed With Tier 2`);
|
||||||
|
break;
|
||||||
|
case "3000":
|
||||||
|
addTime(endingTime, seconds_added_per_resub_tier3);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_resub_tier3} Seconds Because ${username} ReSubscribed With Tier 3`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!users.includes(username)) {
|
||||||
|
users.push(username);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('subgift', (channel, username, months, recipient, methods, userstate) => {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
switch (methods['plan']) {
|
||||||
|
case "Prime":
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier1);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_giftsub_tier1} Seconds Because ${username} Gifted A Tier 1 Sub`);
|
||||||
|
break;
|
||||||
|
case "1000":
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier1);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_giftsub_tier1} Seconds Because ${username} Gifted A Tier 1 Sub`);
|
||||||
|
break;
|
||||||
|
case "2000":
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier2);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_giftsub_tier2} Seconds Because ${username} Gifted A Tier 2 Sub`);
|
||||||
|
break;
|
||||||
|
case "3000":
|
||||||
|
addTime(endingTime, seconds_added_per_giftsub_tier3);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_giftsub_tier3} Seconds Because ${username} Gifted A Tier 3 Sub`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!users.includes(username)) {
|
||||||
|
users.push(username);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('cheer', (channel, userstate, message) => {
|
||||||
|
if (!countdownEnded) {
|
||||||
|
if (userstate.bits >= min_amount_of_bits) {
|
||||||
|
let times = Math.floor(userstate.bits/min_amount_of_bits);
|
||||||
|
addTime(endingTime, seconds_added_per_bits * times);
|
||||||
|
logMessage("Twitch", `Added ${seconds_added_per_bits * times} Seconds Because ${userstate['display-name']} Donated ${userstate.bits} Bits`);
|
||||||
|
if (!users.includes(userstate['display-name'])) {
|
||||||
|
users.push(userstate['display-name']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
const sleep = (ms) => {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
};
|
||||||
|
|
||||||
|
const randomInRange = (min, max) => {
|
||||||
|
return Math.floor(Math.random() * (max - min)) + min;
|
||||||
|
};
|
||||||
|
|
||||||
|
const logMessage = (module, message) => {
|
||||||
|
console.log(`[${module}]: ${message}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
const logObject = (module, object) => {
|
||||||
|
console.log(`[${module}]: `, object);
|
||||||
|
};
|
||||||
@@ -1,76 +1,60 @@
|
|||||||
const start = () => {
|
const timeText = document.getElementById("timeText");
|
||||||
screenWidth = window.innerWidth;
|
|
||||||
screenHeight = window.innerHeight;
|
|
||||||
|
|
||||||
endingTime = new Date(Date.now());
|
let endingTime = new Date(Date.now());
|
||||||
endingTime = timeFunc.addHours(endingTime, initialHours);
|
endingTime = timeFunc.addHours(endingTime, initialHours);
|
||||||
endingTime = timeFunc.addMinutes(endingTime, initialMinutes);
|
endingTime = timeFunc.addMinutes(endingTime, initialMinutes);
|
||||||
endingTime = timeFunc.addSeconds(endingTime, initialSeconds);
|
endingTime = timeFunc.addSeconds(endingTime, initialSeconds);
|
||||||
|
|
||||||
timeText = document.getElementById("timeText");
|
let countdownEnded = false;
|
||||||
|
let users = [];
|
||||||
|
let time;
|
||||||
|
|
||||||
const getNextTime = () => {
|
const getNextTime = () => {
|
||||||
let currentTime = new Date(Date.now());
|
let currentTime = new Date(Date.now());
|
||||||
let differenceTime = endingTime - currentTime;
|
let differenceTime = endingTime - currentTime;
|
||||||
let time = `${timeFunc.getHours(differenceTime)}:${timeFunc.getMinutes(differenceTime)}:${timeFunc.getSeconds(differenceTime)}`;
|
time = `${timeFunc.getHours(differenceTime)}:${timeFunc.getMinutes(differenceTime)}:${timeFunc.getSeconds(differenceTime)}`;
|
||||||
if (time === "00:00:00") {
|
if (differenceTime <= 0) {
|
||||||
clearInterval(inter);
|
clearInterval(countdownUpdater);
|
||||||
time = "¡FIN!";
|
countdownEnded = true;
|
||||||
console.log(time);
|
time = "00:00:00";
|
||||||
}
|
}
|
||||||
timeText.innerText = time;
|
timeText.innerText = time;
|
||||||
}
|
};
|
||||||
|
|
||||||
const inter = setInterval(() => {
|
let countdownUpdater = setInterval(() => {
|
||||||
getNextTime();
|
getNextTime();
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
socket = io(`https://sockets.streamlabs.com?token=${streamlabsToken}`, {transports: ['websocket']})
|
const addTime = async (time, s) => {
|
||||||
|
endingTime = timeFunc.addSeconds(time, s);
|
||||||
socket.on("connect", () => {
|
let addedTime = document.createElement("p");
|
||||||
console.log("Socket Connected");
|
addedTime.classList = "addedTime";
|
||||||
});
|
addedTime.innerText = `+${s}s`;
|
||||||
|
document.body.appendChild(addedTime);
|
||||||
socket.on("event", (event) => {
|
addedTime.style.display = "block";
|
||||||
console.log(event);
|
await sleep(50);
|
||||||
if (event.type == "subscription" || event.type == "resub") {
|
addedTime.style.left = `${randomInRange(35, 65)}%`;
|
||||||
endingTime = timeFunc.addSeconds(endingTime, secondsPerSub);
|
addedTime.style.top = `${randomInRange(25, 45)}%`;
|
||||||
}
|
addedTime.style.opacity = "1";
|
||||||
else if (event.type == "donation") {
|
await sleep(2500);
|
||||||
if (parseInt(event.message[0].amount) >= quantityDono) {
|
addedTime.style.opacity = "0";
|
||||||
endingTime = timeFunc.addSeconds(endingTime, secondsPerDono);
|
await sleep(500);
|
||||||
}
|
addedTime.remove();
|
||||||
}
|
};
|
||||||
else if (event.type == "bits") {
|
|
||||||
if (parseInt(event.message[0].amount) >= quantityBits) {
|
|
||||||
endingTime = timeFunc.addSeconds(endingTime, secondsPerBits);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
socket.on("disconnect", () => {
|
|
||||||
console.log("Socket Disconnected");
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
evtSourceStreamLoots = new EventSource(`https://widgets.streamloots.com/alerts/${streamlootsToken}/media-stream`);
|
const testAddTime = (times, delay) => {
|
||||||
|
let addTimeInterval = setInterval(async () => {
|
||||||
evtSourceStreamLoots.onmessage = async (event) => {
|
if (times > 0) {
|
||||||
data = await JSON.parse(event.data);
|
await sleep(randomInRange(50, delay-50));
|
||||||
if (data.data.type == "purchase") {
|
addTime(endingTime, 30);
|
||||||
if (typeof(data.data.fields[0].value) == "number") {
|
--times;
|
||||||
if (data.data.fields[0].value >= quantityChest) {
|
|
||||||
endingTime = timeFunc.addSeconds(endingTime, secondsPerChest);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (data.data.fields[1].value >= quantityChest) {
|
clearInterval(addTimeInterval);
|
||||||
endingTime = timeFunc.addSeconds(endingTime, secondsPerChest);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}, delay);
|
||||||
|
};
|
||||||
|
Before Width: | Height: | Size: 893 KiB |