donat-widget/internal/model/widget-templates.go
2024-10-30 10:11:19 +05:00

176 lines
3.4 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);
}
async function playAudio(audioUrl) {
audio = document.createElement('audio');
audio.src = audioUrl;
audio.controls = false;
contentDiv.appendChild(audio);
audio.play()
await delay(5000);
audio.pause();
audio.remove();
}
function playSpeech(text) {
audioUrl = fetch(ttsUrl + '/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify({
text: text,
}),
}).then(
response => {
audio = document.createElement('audio');
audio.src = response.blob();
audio.play().catch(error => {
console.error('Ошибка при воспроизведении:', error);
});
audio.addEventListener('ended', () => {
audio.pause();
audio.remove();
console.log('Аудио закончилось и временный URL удален.');
});
}
)
}
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)
}
if (widget.AudioUrl) {
await playAudio(widget.AudioUrl)
}
playSpeech(donat.Text)
addText(donat.Text + " " + donat.Amount)
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)
}