diff --git a/src/message.js b/src/message.js new file mode 100644 index 0000000..4d294b1 --- /dev/null +++ b/src/message.js @@ -0,0 +1,22 @@ +import randomSelection from "./utils.js"; + +let messageTimer; + +function showMessage(text, timeout, priority) { + if (!text || (sessionStorage.getItem("waifu-text") && sessionStorage.getItem("waifu-text") > priority)) return; + if (messageTimer) { + clearTimeout(messageTimer); + messageTimer = null; + } + text = randomSelection(text); + sessionStorage.setItem("waifu-text", priority); + const tips = document.getElementById("waifu-tips"); + tips.innerHTML = text; + tips.classList.add("waifu-tips-active"); + messageTimer = setTimeout(() => { + sessionStorage.removeItem("waifu-text"); + tips.classList.remove("waifu-tips-active"); + }, timeout); +} + +export default showMessage; diff --git a/src/model.js b/src/model.js new file mode 100644 index 0000000..ca8653c --- /dev/null +++ b/src/model.js @@ -0,0 +1,65 @@ +import showMessage from "./message.js"; +import randomSelection from "./utils.js"; + +class Model { + constructor(useCDN, apiPath, cdnPath) { + this.useCDN = useCDN; + this.apiPath = apiPath; + this.cdnPath = cdnPath; + } + + async loadModelList() { + const response = await fetch(`${this.cdnPath}model_list.json`); + this.modelList = await response.json(); + } + + async loadModel(modelId, modelTexturesId, message) { + localStorage.setItem("modelId", modelId); + localStorage.setItem("modelTexturesId", modelTexturesId); + showMessage(message, 4000, 10); + if (this.useCDN) { + if (!this.modelList) await this.loadModelList(); + const target = randomSelection(this.modelList.models[modelId]); + loadlive2d("live2d", `${this.cdnPath}model/${target}/index.json`); + } else { + loadlive2d("live2d", `${this.apiPath}get/?id=${modelId}-${modelTexturesId}`); + console.log(`Live2D 模型 ${modelId}-${modelTexturesId} 加载完成`); + } + } + + async loadRandModel() { + const modelId = localStorage.getItem("modelId"), + modelTexturesId = localStorage.getItem("modelTexturesId"); + if (this.useCDN) { + if (!this.modelList) await this.loadModelList(); + const target = randomSelection(this.modelList.models[modelId]); + loadlive2d("live2d", `${this.cdnPath}model/${target}/index.json`); + showMessage("我的新衣服好看嘛?", 4000, 10); + } else { + // 可选 "rand"(随机), "switch"(顺序) + fetch(`${this.apiPath}rand_textures/?id=${modelId}-${modelTexturesId}`) + .then(response => response.json()) + .then(result => { + if (result.textures.id === 1 && (modelTexturesId === 1 || modelTexturesId === 0)) showMessage("我还没有其他衣服呢!", 4000, 10); + else this.loadModel(modelId, result.textures.id, "我的新衣服好看嘛?"); + }); + } + } + + async loadOtherModel() { + let modelId = localStorage.getItem("modelId"); + if (this.useCDN) { + if (!this.modelList) await this.loadModelList(); + const index = (++modelId >= this.modelList.models.length) ? 0 : modelId; + this.loadModel(index, 0, this.modelList.messages[index]); + } else { + fetch(`${this.apiPath}switch/?id=${modelId}`) + .then(response => response.json()) + .then(result => { + this.loadModel(result.model.id, 0, result.model.message); + }); + } + } +} + +export default Model; diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 0000000..023b78a --- /dev/null +++ b/src/utils.js @@ -0,0 +1,5 @@ +function randomSelection(obj) { + return Array.isArray(obj) ? obj[Math.floor(Math.random() * obj.length)] : obj; +} + +export default randomSelection; diff --git a/src/waifu-tips.js b/src/waifu-tips.js index 2e3d911..dc51b09 100755 --- a/src/waifu-tips.js +++ b/src/waifu-tips.js @@ -11,9 +11,13 @@ import fa_camera_retro from "@fortawesome/fontawesome-free/svgs/solid/camera-ret import fa_info_circle from "@fortawesome/fontawesome-free/svgs/solid/circle-info.svg"; import fa_xmark from "@fortawesome/fontawesome-free/svgs/solid/xmark.svg"; +import Model from "./model.js"; +import showMessage from "./message.js"; +import randomSelection from "./utils.js"; + function loadWidget(config) { let { apiPath, cdnPath } = config; - let useCDN = false, modelList; + let useCDN = false; if (typeof cdnPath === "string") { useCDN = true; if (!cdnPath.endsWith("/")) cdnPath += "/"; @@ -23,6 +27,7 @@ function loadWidget(config) { console.error("Invalid initWidget argument!"); return; } + const model = new Model(useCDN, apiPath, cdnPath); localStorage.removeItem("waifu-display"); sessionStorage.removeItem("waifu-text"); document.body.insertAdjacentHTML("beforeend", `