donat-widget/internal/model/widget-templates.go
2024-10-30 16:22:07 +05:00

204 lines
4.2 KiB
Go

package model
import "fmt"
func GetTemplate1(
streamerID StreamerID,
backgroundUrl MediaUrl,
) WidgetHTML {
style := fmt.Sprintf(`body {
margin: 0;
padding: 0;
height: 100vh;
display: flex;
justify-content: center;
align-items: flex-start;
background-image: url('%s');
background-repeat: no-repeat;
background-size: cover;
}
#content {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 100px
}
#content img {
width: 50vw;
height: 50vh;
object-fit: cover;
}
#content audio {
display: none;
}
#content p {
font-size: 60px;
}
`, backgroundUrl)
script := fmt.Sprintf(`
let widgetUrl = 'http://147.45.237.174/api/widget'
let ttsUrl = 'http://147.45.237.174/api/tts'
async function getDonatInfo(streamerID) {
let response = await fetch(widgetUrl + '/donat/get/' + String(streamerID));
let donat = await response.json();
return donat
}
async function getWidgetInfo(widgetID) {
let response = await fetch(widgetUrl + '/info/' + widgetID);
let widget = await response.json();
return widget
}
function addImage(imageUrl) {
img = document.createElement('img');
img.src = imageUrl + '?t=' + new Date().getTime();
contentDiv.appendChild(img);
}
function addText(text) {
p = document.createElement('p');
p.innerHTML = text;
contentDiv.appendChild(p);
}
function playAudio(audioUrl, widgetID, callback) {
if (!audioUrl.includes("http")) {
audioUrl = "http://147.45.237.174/api/widget/media/audio/file/get/" + String(widgetID);
}
fetch(audioUrl)
.then(response => {
if (!response.ok) {
throw new Error('Ошибка сети: ' + response.statusText);
}
return response.blob();
})
.then(blob => {
const url = URL.createObjectURL(blob);
const audio = new Audio(url);
audio.play().catch(error => {
console.error('Ошибка при воспроизведении:', error);
});
audio.addEventListener('ended', () => {
audio.pause();
audio.remove();
console.log('Музыка закончила играть');
if (callback) callback(); // Вызовите callback после завершения аудио
});
});
}
function playSpeech(text) {
fetch(ttsUrl + '/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify({
text: text,
}),
})
.then(response => {
if (!response.ok) {
throw new Error('Ошибка сети: ' + response.statusText);
}
return response.blob();
})
.then(blob => {
const url = URL.createObjectURL(blob);
const audio = new Audio(url);
audio.play().catch(error => {
console.error('Ошибка при воспроизведении:', error);
});
audio.addEventListener('ended', () => {
audio.pause();
audio.remove();
console.log('Аудио закончилось и временный URL удален.');
});
}
)
}
function playSpeechAfterAudio(text) {
playAudio(widget.AudioUrl, widgetID, () => playSpeech(text));
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function endDonat(donatID) {
if (audio) {
audio.pause();
audio.remove();
}
while (contentDiv.firstChild) {
contentDiv.removeChild(contentDiv.firstChild);
}
let response = await fetch(widgetUrl + '/donat/view/' + String(donatID), {method: 'POST'});
}
let audio;
const contentDiv = document.getElementById('content');
async function widgetView() {
let streamerID = '%v'
while (true) {
let donat = await getDonatInfo(streamerID);
if (!donat) {
await delay(5 * 1000);
continue
}
donat = donat[0]
widgetID = donat.WidgetID
let widget = await getWidgetInfo(widgetID)
widget = widget[0]
console.log(donat);
console.log(widget);
if (widget.ImageUrl != "") {
addImage(widget.ImageUrl)
}
addText(donat.Text + " " + donat.Amount)
if (widget.AudioUrl) {
playSpeechAfterAudio(donat.Text);
} else {
playSpeech(donat.Text); // Если нет аудио, просто сразу играет речь
}
await delay(widget.Duration * 1000);
await endDonat(donat.ID)
}
}
widgetView()`, streamerID)
template1 := fmt.Sprintf(`<!DOCTYPE html>
<html>
<style>
%s
</style>
<body>
<div id='content'>
</div>
<script>
%s
</script>
</body>
</html>`, style, script)
return WidgetHTML(template1)
}