halo-theme-hao/templates/assets/zhheo/commentBarrage.js
2024-04-12 14:35:37 +08:00

305 lines
9.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

if (GLOBAL_CONFIG.htmlType != 'comments' && document.querySelector('#post-comment')) {
var commentBarrageConfig = {
//同时最多显示弹幕数
maxBarrage: GLOBAL_CONFIG.source.comments.maxBarrage,
//弹幕显示间隔时间ms
barrageTime: GLOBAL_CONFIG.source.comments.barrageTime,
//twikoo部署地址腾讯云的为环境ID
twikooUrl: GLOBAL_CONFIG.source.twikoo.twikooUrl,
artalkUrl: GLOBAL_CONFIG.source.artalk.artalkUrl,
walineUrl: GLOBAL_CONFIG.source.waline.serverURL,
//token获取见上方
accessToken: GLOBAL_CONFIG.source.twikoo.accessToken,
mailMd5: GLOBAL_CONFIG.source.comments.mailMd5,
pageUrl: window.location.pathname.replace(/\/page\/\d$/, ""),
barrageTimer: [],
barrageList: [],
siteName: GLOBAL_CONFIG.source.artalk.siteName,
barrageIndex: 0,
dom: document.querySelector('.comment-barrage'),
use: GLOBAL_CONFIG.source.comments.use
}
var commentInterval = null;
var hoverOnCommentBarrage = false;
$(".comment-barrage").hover(function() {
hoverOnCommentBarrage = true;
//console.log("热评悬浮");
}, function() {
hoverOnCommentBarrage = false;
//console.log("停止悬浮");
});
function initCommentBarrage() {
//console.log("开始创建热评")
if (commentBarrageConfig.use == 'Twikoo') {
var data = JSON.stringify({
"event": "COMMENT_GET",
"commentBarrageConfig.accessToken": commentBarrageConfig.accessToken,
"url": commentBarrageConfig.pageUrl
});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function() {
if (this.readyState === 4) {
commentBarrageConfig.barrageList = commentLinkFilter(JSON.parse(this.responseText).data);
commentBarrageConfig.dom.innerHTML = '';
}
});
xhr.open("POST", commentBarrageConfig.twikooUrl);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(data);
}
// if (commentBarrageConfig.use == 'Artalk') {
// var data = {
// "site_name": commentBarrageConfig.siteName,
// "page_key": commentBarrageConfig.pageUrl,
// "limit": 100,
// "offset": 0
// };
// var xhr = new XMLHttpRequest();
// xhr.withCredentials = true;
// xhr.addEventListener("readystatechange", function() {
// if (this.readyState === 4) {
// console.log(this.responseText.length);
// if (this.responseText.length > 0) {
// commentBarrageConfig.barrageList = commentLinkFilter(JSON.parse(this.responseText).data
// .comments);
// commentBarrageConfig.dom.innerHTML = '';
// }
// }
// });
// const usp = new URLSearchParams(data);
// const query = usp.toString();
// xhr.open("GET", commentBarrageConfig.artalkUrl + 'api/v2/comments?' + query);
// xhr.send();
// }
if (commentBarrageConfig.use == 'Artalk') {
var data = {
"site_name": commentBarrageConfig.siteName,
"page_key": commentBarrageConfig.pageUrl,
"limit": 100,
"offset": 0
};
fetch(commentBarrageConfig.artalkUrl + 'api/v2/comments?' + new URLSearchParams(data).toString(), {
method: 'GET',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Origin': window.location.origin
}
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
// 处理数据
commentBarrageConfig.barrageList = commentLinkFilter(data.comments);
commentBarrageConfig.dom.innerHTML = '';
})
.catch(error => {
// 处理错误
console.log('Error:', error);
});
}
if (commentBarrageConfig.use == 'Waline') {
fetch(commentBarrageConfig.walineUrl +
`/comment?path=${commentBarrageConfig.pageUrl}&pageSize=100&page=1&lang=zh-CN&sortBy=insertedAt_desc`
)
.then((e => e.json())).then((({
data: t
}) => {
if (t.length > 0) {
commentBarrageConfig.barrageList = commentLinkFilter(t);
commentBarrageConfig.dom.innerHTML = '';
}
}))
}
clearInterval(commentInterval);
commentInterval = null;
commentInterval = setInterval(() => {
if (commentBarrageConfig.barrageList.length && !hoverOnCommentBarrage) {
popCommentBarrage(commentBarrageConfig.barrageList[commentBarrageConfig.barrageIndex]);
commentBarrageConfig.barrageIndex += 1;
commentBarrageConfig.barrageIndex %= commentBarrageConfig.barrageList.length;
}
if ((commentBarrageConfig.barrageTimer.length > (commentBarrageConfig.barrageList.length >
commentBarrageConfig.maxBarrage ? commentBarrageConfig.maxBarrage : commentBarrageConfig
.barrageList.length)) && !hoverOnCommentBarrage) {
removeCommentBarrage(commentBarrageConfig.barrageTimer.shift())
}
}, commentBarrageConfig.barrageTime)
}
function commentLinkFilter(data) {
let newData = [];
if (commentBarrageConfig.use == 'Twikoo') {
data.sort((a, b) => {
return a.created - b.created;
})
data.forEach(item => {
newData.push(...getCommentReplies(item));
});
}
if (commentBarrageConfig.use == 'Artalk') {
data.sort((a, b) => {
const aCreated = Date.parse(a.date);
const bCreated = Date.parse(b.date);
return aCreated - bCreated;
})
data.forEach(item => {
newData.push(item);
});
}
if (commentBarrageConfig.use == 'Waline') {
data.sort((a, b) => {
return a.time - b.time;
})
data.forEach(item => {
newData.push(...getCommentWalineReplies(item));
});
}
return newData;
}
function getCommentReplies(item) {
if (item.replies) {
let replies = [item];
item.replies.forEach(item => {
replies.push(...getCommentReplies(item));
})
return replies;
} else {
return [];
}
}
function getCommentWalineReplies(item) {
if (item.children) {
let children = [item];
item.children.forEach(item => {
children.push(...getCommentReplies(item));
})
return children;
} else {
return [];
}
}
function changeContents(content) {
if (content === '') return content
content = content.replace(/<img.*?src="(.*?)"?[^\>]+>/ig, '[图片]') // replace image link
//content = content.replace(/<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[链接]') // replace url
content = content.replace(/<pre><code>.*?<\/pre>/gi, '[代码]') // replace code
content = content.replace(/<[^>]+>/g, "") // remove html tag
if (content.length > 150) {
content = content.substring(0, 150) + '...'
}
return content
}
function popCommentBarrage(data) {
let isTwikoo = commentBarrageConfig.use == 'Twikoo'
let isArtalk = commentBarrageConfig.use == 'Artalk';
let isWaline = commentBarrageConfig.use == 'Waline';
let nick = data.nick;
let avatar = isTwikoo ? `https://cravatar.cn/avatar/${data.mailMd5}` :
isArtalk ? `https://cravatar.cn/avatar/${data.email_encrypted}?d=mp&s=240` :
isWaline ? data.avatar : 'https://cravatar.cn/avatar/';
let barrageBlogger = isTwikoo ? data.mailMd5 === commentBarrageConfig.mailMd5 :
isArtalk ? data.email_encrypted === commentBarrageConfig.mailMd5 :
isWaline ? data.type === 'administrator' : false;
let id = isTwikoo ? data.id :
isArtalk ? 'atk-comment-' + data.id :
isWaline ? data.objectId : 'post-comment';
let comment = isTwikoo ? data.comment :
isArtalk ? data.content_marked :
isWaline ? data.comment : '';
let badge_name = isArtalk ? data.badge_name : '博主'
let badgeName = !barrageBlogger ? "热评" : badge_name != '' ? badge_name : "博主"
let barrage = document.createElement('div');
let width = commentBarrageConfig.dom.clientWidth;
let height = commentBarrageConfig.dom.clientHeight;
barrage.className = 'comment-barrage-item'
barrage.innerHTML = `
<div class="barrageHead">
<a class="barrageTitle
${barrageBlogger ? "barrageBloggerTitle" : ""}" href="javascript:heo.scrollTo('post-comment')">
${badgeName}
</a>
<div class="barrageNick">${nick}</div>
<img class="barrageAvatar" src="${avatar}"/>
<a class="comment-barrage-close" href="javascript:heo.switchCommentBarrage()"><i class="haofont hao-icon-xmark"></i></a>
</div>
<a class="barrageContent" href="javascript:heo.scrollTo('${id}');">${changeContents(comment)}</a>
`
// 获取hao标签内的所有pre元素
let haoPres = barrage.querySelectorAll(".barrageContent pre");
// 遍历每个pre元素将其替换为"【代码】"
haoPres.forEach((pre) => {
let codePlaceholder = document.createElement("span");
codePlaceholder.innerText = "【代码】";
pre.parentNode.replaceChild(codePlaceholder, pre);
});
// 获取hao标签内的所有图片元素
let haoImages = barrage.querySelectorAll(".barrageContent img");
// 遍历每个图片元素,将其替换为"【图片】"但排除带有class=tk-owo-emotion的图片
haoImages.forEach((image) => {
if (!image.classList.contains("tk-owo-emotion")) {
image.style.display = "none"; // 隐藏图片
let placeholder = document.createElement("span");
placeholder.innerText = "【图片】";
image.parentNode.replaceChild(placeholder, image);
}
});
commentBarrageConfig.barrageTimer.push(barrage);
commentBarrageConfig.dom.append(barrage);
}
function removeCommentBarrage(barrage) {
barrage.className = 'comment-barrage-item out';
setTimeout(() => {
commentBarrageConfig.dom.removeChild(barrage);
}, 1000)
}
initCommentBarrage();
if (localStorage.getItem('commentBarrageSwitch') !== 'false') {
$(".comment-barrage").show();
$(".menu-commentBarrage-text").text("关闭热评");
document.querySelector("#consoleCommentBarrage").classList.add("on");
} else {
$(".comment-barrage").hide();
$(".menu-commentBarrage-text").text("显示热评");
document.querySelector("#consoleCommentBarrage").classList.remove("on");
}
document.addEventListener('pjax:send', function() {
clearInterval(commentInterval);
});
}