Files
StreamGoose/webroot/script.js
T

60 lines
2.1 KiB
JavaScript
Raw Normal View History

2024-09-14 14:41:59 +03:00
/* Client-side part of StreamGoose */
/* escape HTML entities (for non-server-provided stuff) */
function esc(s) {
return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')
.replace(/"/g,'&quot;').replace(/'/g,'&apos;')
}
/* handle Twitch and YouTube emotes */
function handleEmotes(text) {
var url = 'https://static-cdn.jtvnw.net/emoticons/v2/$id/default/dark/1.0'
/* Handle Twitch emotes coming from backends */
text = text.replace(/#EMOTE-[^\s]+#/g,
a=>'<img src="' + url.replace('$id', a.split('-')[1].slice(0,-1)) + '">')
/* Handle YouTube emotes */
text = text.replace(/:[^\s]+:/g, a => {
if(YT_EMOTES.indexOf(a) > -1) /* found in the database */
return '<img src="/img/yt-emotes/' + a + '.png">'
else return a
})
return text
}
/* detect if there are any overridden styles */
function overrideStyles(text) {
var styles = '', re
if(messageHighlightRules) {
for(re in messageHighlightRules) {
if((new RegExp(re, 'iu')).test(text))
styles += 'color:' + messageHighlightRules[re] + ';'
}
}
if(styles.length > 0) styles = ' style="' + esc(styles) + '"'
return styles
}
/* individual message appender */
function gooseAppendMessage(id, type, timestamp, username, text, icon) {
var html = ""
if(parseInt(id) > 0 && type.length > 0) {
var classes = type.split('-'), cl = classes.length, j,
colorpref = null
for(j=0;j<cl;j++) { /* detect color preference */
if(classes[j].startsWith('color'))
colorpref = classes[j].slice(5) /* remove color word */
}
html += '<div data-msg-id="' + id + '" class="' + classes.join(' ') +'">'
if(icon.length > 0)
html += '<span class=icon><img src="' + icon + '"></span>'
html += '<span class=timestamp>' + timestamp + '</span>'
html += '<span class=username'
if(colorpref) html += ' style="color:' + colorpref + '"'
html += '>' + username + '</span>'
html += '<span class=msg' + overrideStyles(text) +'>' + handleEmotes(text) + '</span></div>'
}
document.getElementById("msglist").innerHTML += html
/* autoscroll to the end */
window.scrollTo(0, document.body.scrollHeight)
}