社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103
Widget:评论区/js
<script> class NewWikiComment { sortBy = { by: "time", order: -1 } nb = new NBASE() ngb = new NGBASE() page = mw.config.values.wgPageName uid = getCookie("DedeUserID") cache = { user: {} }
constructor(dom) { this.dom = $(dom) this.dom.data("NWC", this) this.updateUserInfo() this.load().then((res) => { this.show(res) }) }
load() { return this.nb.read(`评论区/${this.page}`).catch((e) => { if (e.code === 201) { this.save([]) return Promise.resolve([]) } }) }
save(body) { if (!this.uid) { return $(".bili-game-header-user-noLogin a img").click() } return this.nb.save(`评论区/${this.page}`, body) }
show(data, dom = this.dom.find(".comment")) { dom.empty() let parentIndex = dom.closest("li").data("index") || [] data.forEach((e, i, a) => { if (e.delete) { return } let index = $.extend([], parentIndex) index.push(i)
let $li = $(`
this.getUser(e.uid).then((res) => { $avatar.append(``) $nickname.append(`${res.nickname}`) })
let $text = $(`$info.append($time)
let $index = $(`$info.append($index)
let $funBox = $(`if (e.like.includes(this.uid)) { $like.addClass("checked") } $funBox.append($like)
let $dislike = $(`if (e.dislike.includes(this.uid)) { $dislike.addClass("checked") } $funBox.append($dislike)
$funBox.append($(`if (e.uid === this.uid) {
$funBox.append($(`} $foot.append($info, $funBox) $left.append($avatar) $right.append($nickname, $text, $foot) $body.append($left, $right) $li.append($body)
let $reply = $(`- `)
$li.append($reply)
this.show(e.reply, $reply)
dom.prepend($li)
})
this.sort()
this.dom.removeClass("loading")
}
sort() {
let $comment = this.dom.find(".comment")
let $li = $comment.children("li")
$li.sort((a, b) => {
return NewWikiComment.sortFun[this.sortBy.by](a, b) * this.sortBy.order
})
$comment.append($li)
let $option = this.dom.find(".option .sort")
$option.find(".active").removeClass("active")
$option.find(`[data-type="by"] [data-value="${this.sortBy.by}"]`).addClass("active")
$option.find(`[data-type="order"] [data-value="${this.sortBy.order}"]`).addClass("active")
}
updateUserInfo() {
this.ngb.save(`userInfo/${this.uid}`, {
avatar: UserStatus.userInfo.face,
nickname: UserStatus.userInfo.uname
})
}
getUser(uid) {
if (!this.cache.user[uid]) {
let sSUser = sessionStorage[`NWC_userCache_${uid}`]
if (sSUser) {
this.cache.user[uid] = Promise.resolve(JSON.parse(sSUser))
} else {
this.cache.user[uid] = this.ngb.read(`userInfo/${uid}`).catch(() => {
return new Promise((resolve, reject) => {
$.getJSON(`https://api.bilibili.com/x/space/acc/info?mid=${uid}`).done((result) => {
resolve({
avatar: result.data.face.replace(/^https?:/, ""),
nickname: result.data.name
})
})
})
})
}
}
this.cache.user[uid].then((res) => {
sessionStorage[`NWC_userCache_${uid}`] = JSON.stringify(res)
})
return this.cache.user[uid]
}
formatTime(time = new Date()) {
let date = new Date(time)
let YYYY = date.getFullYear() + ""
let MM = (date.getMonth() + 1 + "").padStart(2, "0")
let DD = (date.getDate() + "").padStart(2, "0")
let hh = (date.getHours() + "").padStart(2, "0")
let mm = (date.getMinutes() + "").padStart(2, "0")
let ss = (date.getSeconds() + "").padStart(2, "0")
return `${YYYY}/${MM}/${DD} ${hh}:${mm}:${ss}`
}
createComment(text) {
return {
uid: this.uid,
text: text,
time: new Date().toISOString(),
like: [],
dislike: [],
reply: []
}
}
submit(text) {
this.load().then((body) => {
body.push(this.createComment(text))
this.save(body).then(() => {
this.show(body)
this.dom.find(".input textarea").val("")
}).catch((e) => {
if (e.code === 102) {
this.submit(text)
}
})
})
}
like(index) {
this.load().then((body) => {
let target = this.findTarget(body, index)
let like = target.like
let dislike = target.dislike
if (like.includes(this.uid)) {
like.splice(like.indexOf(this.uid), 1)
} else {
like.push(this.uid)
if (dislike.includes(this.uid)) {
dislike.splice(dislike.indexOf(this.uid), 1)
}
}
this.save(body).then(() => {
this.show(body)
}).catch((e) => {
if (e.code === 102) {
this.like(index)
}
})
})
}
dislike(index) {
this.load().then((body) => {
let target = this.findTarget(body, index)
let dislike = target.dislike
let like = target.like
if (dislike.includes(this.uid)) {
dislike.splice(dislike.indexOf(this.uid), 1)
} else {
dislike.push(this.uid)
if (like.includes(this.uid)) {
like.splice(like.indexOf(this.uid), 1)
}
}
this.save(body).then(() => {
this.show(body)
}).catch((e) => {
if (e.code === 102) {
this.dislike(index)
}
})
})
}
reply(text, index) {
this.load().then((body) => {
let target = this.findTarget(body, index)
target.reply.push(this.createComment(text))
this.save(body).then(() => {
this.show(body)
}).catch((e) => {
if (e.code === 102) {
this.reply(text, index)
}
})
})
}
delete(index) {
this.load().then((body) => {
let target = this.findTarget(body, index)
target.delete = true
this.save(body).then(() => {
this.show(body)
}).catch((e) => {
if (e.code === 102) {
this.delete(index)
}
})
})
}
findTarget(body, index) {
let target = body
for (let i = 0; i < index.length - 1; i++) {
target = target[index[i]].reply
}
return target[index[index.length - 1]]
}
static sortFun = {
time(a, b) {
return new Date($(a).find(".time").html()) - new Date($(b).find(".time").html())
},
like(a, b) {
return $(a).find(`[data-action="like"]`).html() - $(b).find(`[data-action="like"]`).html()
},
}
}
function getCookie(key) {
let result = {}
document.cookie.split(/ *; */).forEach((e, i, a) => {
let kv = e.split("=")
result[kv[0]] = kv[1]
})
if (key) {
result = result[key]
}
return result
}
(window.RLQ = window.RLQ || []).push(["jquery", () => {
$.getScript("/data/index.php?title=MediaWiki:Api.js&action=raw").done(() => {
window.NWC = new NewWikiComment("#NewWikiComment")
})
$(document).on("click", "#NewWikiComment .submit", function () {
let nwc = $(this).closest("#NewWikiComment").data("NWC")
let text = $(this).siblings("textarea").val()
if (text) {
nwc.dom.addClass("loading")
nwc.submit(text)
}
})
$(document).on("click", `#NewWikiComment .option .sort [data-type] [data-value]`, function () {
let nwc = $(this).closest("#NewWikiComment").data("NWC")
let type = $(this).parent().attr("data-type")
nwc.sortBy[type] = $(this).attr("data-value")
nwc.sort()
})
$(document).on("click", `#NewWikiComment .funBox [data-action="like"]`, function () {
let nwc = $(this).closest("#NewWikiComment").data("NWC")
nwc.dom.addClass("loading")
nwc.like($(this).closest("li").data("index"))
})
$(document).on("click", `#NewWikiComment .funBox [data-action="dislike"]`, function () {
let nwc = $(this).closest("#NewWikiComment").data("NWC")
nwc.dom.addClass("loading")
nwc.dislike($(this).closest("li").data("index"))
})
$(document).on("click", `#NewWikiComment .funBox [data-action="delete"]`, function () {
let nwc = $(this).closest("#NewWikiComment").data("NWC")
if (confirm("真的要删除吗?")) {
nwc.dom.addClass("loading")
nwc.delete($(this).closest("li").data("index"))
}
})
$(document).on("click", `#NewWikiComment .funBox [data-action="reply"]`, function () {
let nwc = $(this).closest("#NewWikiComment").data("NWC")
let text = prompt(`回复:${$(this).closest(".foot").siblings(".nickname").text()}`)
if (text) {
nwc.dom.addClass("loading")
nwc.reply(text, $(this).closest("li").data("index"))
}
})
}])
</script>