1 Star 0 Fork 0

hilary/live2d-widget

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
waifu-tips.js 14.41 KB
一键复制 编辑 原始数据 按行查看 历史
shenjiaqi 提交于 2024-09-11 16:00 . #ADD 添加看板娘最新cdn地址
/*!
* Live2D Widget
* https://github.com/stevenjoezhang/live2d-widget
*/
!function () {
"use strict";
function e(e) {
return Array.isArray(e) ? e[Math.floor(Math.random() * e.length)] : e
}
let t;
function o(o, s, n) {
if (!o || sessionStorage.getItem("waifu-text") && sessionStorage.getItem("waifu-text") > n) return;
t && (clearTimeout(t), t = null), o = e(o), sessionStorage.setItem("waifu-text", n);
const i = document.getElementById("waifu-tips");
i.innerHTML = o, i.classList.add("waifu-tips-active"), t = setTimeout((() => {
sessionStorage.removeItem("waifu-text"), i.classList.remove("waifu-tips-active")
}), s)
}
class s {
constructor(e) {
let {apiPath: t, cdnPath: o} = e, s = !1;
if ("string" == typeof o) s = !0, o.endsWith("/") || (o += "/"); else {
if ("string" != typeof t) throw "Invalid initWidget argument!";
t.endsWith("/") || (t += "/")
}
this.useCDN = s, this.apiPath = t, this.cdnPath = o
}
async loadModelList() {
const e = await fetch(`${this.cdnPath}model_list.json`);
this.modelList = await e.json()
}
async loadModel(t, s, n) {
if (localStorage.setItem("modelId", t), localStorage.setItem("modelTexturesId", s), o(n, 4e3, 10), this.useCDN) {
this.modelList || await this.loadModelList();
const o = e(this.modelList.models[t]);
loadlive2d("live2d", `${this.cdnPath}model/${o}/index.json`)
} else loadlive2d("live2d", `${this.apiPath}get/?id=${t}-${s}`), console.log(`Live2D 模型 ${t}-${s} 加载完成`)
}
async loadRandModel() {
const t = localStorage.getItem("modelId"), s = localStorage.getItem("modelTexturesId");
if (this.useCDN) {
this.modelList || await this.loadModelList();
const s = e(this.modelList.models[t]);
loadlive2d("live2d", `${this.cdnPath}model/${s}/index.json`), o("我的新衣服好看嘛?", 4e3, 10)
} else fetch(`${this.apiPath}rand_textures/?id=${t}-${s}`).then((e => e.json())).then((e => {
1 !== e.textures.id || 1 !== s && 0 !== s ? this.loadModel(t, e.textures.id, "我的新衣服好看嘛?") : o("我还没有其他衣服呢!", 4e3, 10)
}))
}
async loadOtherModel() {
let e = localStorage.getItem("modelId");
if (this.useCDN) {
this.modelList || await this.loadModelList();
const t = ++e >= this.modelList.models.length ? 0 : e;
this.loadModel(t, 0, this.modelList.messages[t])
} else fetch(`${this.apiPath}switch/?id=${e}`).then((e => e.json())).then((e => {
this.loadModel(e.model.id, 0, e.model.message)
}))
}
}
const n = {
hitokoto: {
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e<path d="M512 240c0 114.9-114.6 208-256 208c-37.1 0-72.3-6.4-104.1-17.9c-11.9 8.7-31.3 20.6-54.3 30.6C73.6 471.1 44.7 480 16 480c-6.5 0-12.3-3.9-14.8-9.9c-2.5-6-1.1-12.8 3.4-17.4l0 0 0 0 0 0 0 0 .3-.3c.3-.3 .7-.7 1.3-1.4c1.1-1.2 2.8-3.1 4.9-5.7c4.1-5 9.6-12.4 15.2-21.6c10-16.6 19.5-38.4 21.4-62.9C17.7 326.8 0 285.1 0 240C0 125.1 114.6 32 256 32s256 93.1 256 208z"/></svg>',
callback: function () {
fetch("https://v1.hitokoto.cn").then((e => e.json())).then((e => {
const t = `这句一言来自 <span>「${e.from}」</span>,是 <span>${e.creator}</span> 在 hitokoto.cn 投稿的。`;
o(e.hitokoto, 6e3, 9), setTimeout((() => {
o(t, 4e3, 9)
}), 6e3)
}))
}
},
asteroids: {
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e<path d="M498.1 5.6c10.1 7 15.4 19.1 13.5 31.2l-64 416c-1.5 9.7-7.4 18.2-16 23s-18.9 5.4-28 1.6L277.3 424.9l-40.1 74.5c-5.2 9.7-16.3 14.6-27 11.9S192 499 192 488V392c0-5.3 1.8-10.5 5.1-14.7L362.4 164.7c2.5-7.1-6.5-14.3-13-8.4L170.4 318.2l-32 28.9 0 0c-9.2 8.3-22.3 10.6-33.8 5.8l-85-35.4C8.4 312.8 .8 302.2 .1 290s5.5-23.7 16.1-29.8l448-256c10.7-6.1 23.9-5.5 34 1.4z"/></svg>',
callback: () => {
if (window.Asteroids) window.ASTEROIDSPLAYERS || (window.ASTEROIDSPLAYERS = []), window.ASTEROIDSPLAYERS.push(new Asteroids); else {
const e = document.createElement("script");
e.src = "https://fastly.jsdelivr.net/gh/stevenjoezhang/asteroids/asteroids.js", document.head.appendChild(e)
}
}
},
"switch-model": {
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e<path d="M399 384.2C376.9 345.8 335.4 320 288 320H224c-47.4 0-88.9 25.8-111 64.2c35.2 39.2 86.2 63.8 143 63.8s107.8-24.7 143-63.8zM512 256c0 141.4-114.6 256-256 256S0 397.4 0 256S114.6 0 256 0S512 114.6 512 256zM256 272c39.8 0 72-32.2 72-72s-32.2-72-72-72s-72 32.2-72 72s32.2 72 72 72z"/></svg>',
callback: () => {
}
},
"switch-texture": {
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e<path d="M320 64c0-35.3-28.7-64-64-64s-64 28.7-64 64s28.7 64 64 64s64-28.7 64-64zm-96 96c-35.3 0-64 28.7-64 64v48c0 17.7 14.3 32 32 32h1.8l11.1 99.5c1.8 16.2 15.5 28.5 31.8 28.5h38.7c16.3 0 30-12.3 31.8-28.5L318.2 304H320c17.7 0 32-14.3 32-32V224c0-35.3-28.7-64-64-64H224zM132.3 394.2c13-2.4 21.7-14.9 19.3-27.9s-14.9-21.7-27.9-19.3c-32.4 5.9-60.9 14.2-82 24.8c-10.5 5.3-20.3 11.7-27.8 19.6C6.4 399.5 0 410.5 0 424c0 21.4 15.5 36.1 29.1 45c14.7 9.6 34.3 17.3 56.4 23.4C130.2 504.7 190.4 512 256 512s125.8-7.3 170.4-19.6c22.1-6.1 41.8-13.8 56.4-23.4c13.7-8.9 29.1-23.6 29.1-45c0-13.5-6.4-24.5-14-32.6c-7.5-7.9-17.3-14.3-27.8-19.6c-21-10.6-49.5-18.9-82-24.8c-13-2.4-25.5 6.3-27.9 19.3s6.3 25.5 19.3 27.9c30.2 5.5 53.7 12.8 69 20.5c3.2 1.6 5.8 3.1 7.9 4.5c3.6 2.4 3.6 7.2 0 9.6c-8.8 5.7-23.1 11.8-43 17.3C374.3 457 318.5 464 256 464s-118.3-7-157.7-17.9c-19.9-5.5-34.2-11.6-43-17.3c-3.6-2.4-3.6-7.2 0-9.6c2.1-1.4 4.8-2.9 7.9-4.5c15.3-7.7 38.8-14.9 69-20.5z"/></svg>',
callback: () => {
}
},
photo: {
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e<path d="M220.6 121.2L271.1 96 448 96v96H333.2c-21.9-15.1-48.5-24-77.2-24s-55.2 8.9-77.2 24H64V128H192c9.9 0 19.7-2.3 28.6-6.8zM0 128V416c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H271.1c-9.9 0-19.7 2.3-28.6 6.8L192 64H160V48c0-8.8-7.2-16-16-16H80c-8.8 0-16 7.2-16 16l0 16C28.7 64 0 92.7 0 128zM344 304c0 48.6-39.4 88-88 88s-88-39.4-88-88s39.4-88 88-88s88 39.4 88 88z"/></svg>',
callback: () => {
o("照好了嘛,是不是很可爱呢?", 6e3, 9), Live2D.captureName = "photo.png", Live2D.captureFrame = !0
}
},
info: {
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e<path d="M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"/></svg>',
callback: () => {
open("https://github.com/stevenjoezhang/live2d-widget")
}
},
quit: {
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e<path d="M310.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L160 210.7 54.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L114.7 256 9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 301.3 265.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L205.3 256 310.6 150.6z"/></svg>',
callback: () => {
localStorage.setItem("waifu-display", Date.now()), o("愿你有一天能与重要的人重逢。", 2e3, 11), document.getElementById("waifu").style.bottom = "-500px", setTimeout((() => {
document.getElementById("waifu").style.display = "none", document.getElementById("waifu-toggle").classList.add("waifu-toggle-active")
}), 3e3)
}
}
};
function i(t) {
const i = new s(t);
function c(t) {
let s, n = !1, i = t.message.default;
window.addEventListener("mousemove", (() => n = !0)), window.addEventListener("keydown", (() => n = !0)), setInterval((() => {
n ? (n = !1, clearInterval(s), s = null) : s || (s = setInterval((() => {
o(i, 6e3, 9)
}), 2e4))
}), 1e3), o(function (e) {
if ("/" === location.pathname) for (let {hour: t, text: o} of e) {
const e = new Date, s = t.split("-")[0], n = t.split("-")[1] || s;
if (s <= e.getHours() && e.getHours() <= n) return o
}
const t = `欢迎阅读<span>「${document.title.split(" - ")[0]}」</span>`;
let o;
if ("" !== document.referrer) {
const e = new URL(document.referrer), s = e.hostname.split(".")[1],
n = {baidu: "百度", so: "360搜索", google: "谷歌搜索"};
return location.hostname === e.hostname ? t : (o = s in n ? n[s] : e.hostname, `Hello!来自 <span>${o}</span> 的朋友<br>${t}`)
}
return t
}(t.time), 7e3, 11), window.addEventListener("mouseover", (s => {
for (let {
selector: n,
text: i
} of t.mouseover) if (s.target.matches(n)) return i = e(i), i = i.replace("{text}", s.target.innerText), void o(i, 4e3, 8)
})), window.addEventListener("click", (s => {
for (let {
selector: n,
text: i
} of t.click) if (s.target.matches(n)) return i = e(i), i = i.replace("{text}", s.target.innerText), void o(i, 4e3, 8)
})), t.seasons.forEach((({date: t, text: o}) => {
const s = new Date, n = t.split("-")[0], c = t.split("-")[1] || n;
n.split("/")[0] <= s.getMonth() + 1 && s.getMonth() + 1 <= c.split("/")[0] && n.split("/")[1] <= s.getDate() && s.getDate() <= c.split("/")[1] && (o = (o = e(o)).replace("{year}", s.getFullYear()), i.push(o))
}));
const c = () => {
};
console.log("%c", c), c.toString = () => {
o(t.message.console, 6e3, 9)
}, window.addEventListener("copy", (() => {
o(t.message.copy, 6e3, 9)
})), window.addEventListener("visibilitychange", (() => {
document.hidden || o(t.message.visibilitychange, 6e3, 9)
}))
}
localStorage.removeItem("waifu-display"), sessionStorage.removeItem("waifu-text"), document.body.insertAdjacentHTML("beforeend", '<div id="waifu">\n <div id="waifu-tips"></div>\n <canvas id="live2d" width="800" height="800"></canvas>\n <div id="waifu-tool"></div>\n </div>'), setTimeout((() => {
document.getElementById("waifu").style.bottom = 0
}), 0), function () {
n["switch-model"].callback = () => i.loadOtherModel(), n["switch-texture"].callback = () => i.loadRandModel(), Array.isArray(t.tools) || (t.tools = Object.keys(n));
for (let e of t.tools) if (n[e]) {
const {icon: t, callback: o} = n[e];
document.getElementById("waifu-tool").insertAdjacentHTML("beforeend", `<span id="waifu-tool-${e}">${t}</span>`), document.getElementById(`waifu-tool-${e}`).addEventListener("click", o)
}
}(), function () {
let e = localStorage.getItem("modelId"), o = localStorage.getItem("modelTexturesId");
null === e && (e = 1, o = 53), i.loadModel(e, o), fetch(t.waifuPath).then((e => e.json())).then(c)
}()
}
window.initWidget = function (e, t) {
"string" == typeof e && (e = {
waifuPath: e,
apiPath: t
}), document.body.insertAdjacentHTML("beforeend", '<div id="waifu-toggle">\n <span>看板娘</span>\n </div>');
const o = document.getElementById("waifu-toggle");
o.addEventListener("click", (() => {
o.classList.remove("waifu-toggle-active"), o.getAttribute("first-time") ? (i(e), o.removeAttribute("first-time")) : (localStorage.removeItem("waifu-display"), document.getElementById("waifu").style.display = "", setTimeout((() => {
document.getElementById("waifu").style.bottom = 0
}), 0))
})), localStorage.getItem("waifu-display") && Date.now() - localStorage.getItem("waifu-display") <= 864e5 ? (o.setAttribute("first-time", !0), setTimeout((() => {
o.classList.add("waifu-toggle-active")
}), 0)) : i(e)
}
}();
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/jqsup/live2d-widget.git
[email protected]:jqsup/live2d-widget.git
jqsup
live2d-widget
live2d-widget
master

搜索帮助