sadkawaai prediction gen 1

This commit is contained in:
2025-08-17 09:14:33 +03:00
parent 5c9c53b117
commit 28ccaa49ea
3 changed files with 289 additions and 0 deletions

View File

@ -0,0 +1,138 @@
let widgetNode = document.getElementById('widget');
let predictionNode = document.getElementById('prediction');
let titleNode = document.getElementById('title');
let pointsNode = document.getElementById('points');
let timeNode = document.getElementById('time');
let outcomesNode = document.getElementById('outcomes');
let templateNode = document.getElementById('outcome');
let willEndAt = new Date();
let locksAt = null;
let endedAt = null;
window.addEventListener('message', function (event) {
let message = event.detail;
widgetNode.classList.add('active');
switch (message.type) {
case 'prediction.end':
if (message.status == "canceled") {
predictionNode.classList.remove('active');
predictionNode.classList.remove('ended');
} else {
predictionNode.classList.remove('locked');
predictionNode.classList.add('ended');
endedAt = new Date(message.ended_at);
let winnerNode = document.querySelector(`[outcomeId="${message.winning_outcome_id}"]`);
winnerNode.classList.add('winner');
};
break;
case 'prediction.lock':
predictionNode.classList.add('active');
locksAt = new Date();
endedAt = null;
break;
case 'prediction.begin':
case 'prediction.progress':
var totalPoints = message.outcomes.reduce((sum, outcome) => sum + (outcome.channel_points ?? 0), 0);
endedAt = null;
if (message.id != predictionNode.getAttribute('predictionId')) {
outcomesNode.innerHTML = '';
locksAt = new Date(message.ends_at);
predictionNode.setAttribute('predictionId', message.id);
titleNode.innerText = message.title;
pointsNode.innerHTML = `Поинтов: ${totalPoints}`;
predictionNode.classList.add('active');
predictionNode.classList.remove('locked');
predictionNode.classList.remove('ended');
message.outcomes.forEach(outcome => {
let root = templateNode.content.cloneNode(true);
let outcomeNode = root.querySelector('.outcome');
let title = root.querySelector('.title');
let points = root.querySelector('.points');
let outcomePoints = outcome.channel_points ?? 0;
let percent = (outcomePoints / (totalPoints || 1) * 100).toFixed(2);
outcomeNode.setAttribute('outcomeId', outcome.id);
outcomeNode.style.setProperty('--progress', `${percent}%`);
title.innerText = outcome.title;
points.innerText = `${percent}%`;
outcomesNode.appendChild(root);
});
} else {
pointsNode.innerHTML = `Поинтов: ${totalPoints}`;
message.outcomes.forEach(outcome => {
let outcomeNode = document.querySelector(`[outcomeId="${outcome.id}"]`);
let title = outcomeNode.querySelector('.title');
let points = outcomeNode.querySelector('.points');
let outcomePoints = outcome.channel_points ?? 0;
let percent = (outcomePoints / (totalPoints || 1) * 100).toFixed(2);
outcomeNode.style.setProperty('--progress', `${percent}%`);
title.innerText = outcome.title;
points.innerText = `${percent}%`;
});
};
locksAt = new Date(message.locks_at);
break;
default: break;
};
});
function convertSecondsToMMSS(seconds) {
seconds = Math.round(seconds);
if (seconds <= 0) {
seconds = 0;
};
const minutes = Math.floor((seconds % 3600) / 60);
const secs = seconds % 60;
const formattedMinutes = String(minutes).padStart(2, '0');
const formattedSeconds = String(secs).padStart(2, '0');
return `${formattedMinutes}м:${formattedSeconds}с`;
};
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
};
async function updateTimer() {
let now = new Date().getTime();
let left = (locksAt - now) / 1000;
timeNode.innerHTML = `Осталось: ${convertSecondsToMMSS(left)}`;
if (!endedAt && left <= 0) {
timeNode.innerHTML = `Ожидание результата`;
predictionNode.classList.add('locked');
};
left = (now - endedAt) / 1000;
if (endedAt) {
timeNode.innerHTML = `Закончилось`;
predictionNode.classList.remove('locked');
if (left > 5) {
predictionNode.classList.remove('active');
predictionNode.classList.remove('ended');
};
};
await delay(100);
updateTimer();
};
updateTimer();