From 39a6b3eebca24275b47328567d621d5e6f308fab Mon Sep 17 00:00:00 2001 From: yoimiya-kokomi <592981798@qq.com> Date: Tue, 26 Jul 2022 02:07:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3#=E5=96=B5=E5=96=B5=E6=97=A5?= =?UTF-8?q?=E5=8E=86=E4=B8=AD=E4=B8=80=E5=A4=84=E6=97=A5=E6=9C=9F=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Calendar.js | 298 +++++++++++++++++++++-------------------- 1 file changed, 151 insertions(+), 147 deletions(-) diff --git a/components/Calendar.js b/components/Calendar.js index be13ebd6..800612d4 100644 --- a/components/Calendar.js +++ b/components/Calendar.js @@ -1,134 +1,137 @@ -import fetch from "node-fetch"; -import moment from "moment"; -import { Character } from "./models.js"; -import lodash from "lodash"; +import fetch from 'node-fetch' +import moment from 'moment' +import { Character } from './models.js' +import lodash from 'lodash' -const ignoreIds = [495,// 有奖问卷调查开启! - 1263, // 米游社《原神》专属工具一览 - 423, // 《原神》玩家社区一览 - 422, // 《原神》防沉迷系统说明 - 762, // 《原神》公平运营声明 - 762, // 《原神》公平运营声明 +const ignoreIds = [495, // 有奖问卷调查开启! + 1263, // 米游社《原神》专属工具一览 + 423, // 《原神》玩家社区一览 + 422, // 《原神》防沉迷系统说明 + 762, // 《原神》公平运营声明 + 762 // 《原神》公平运营声明 ] -const ignoreReg = /(内容专题页|版本更新说明|调研|防沉迷|米游社|专项意见|更新修复与优化|问卷调查|版本更新通知|更新时间说明|预下载功能|周边限时|周边上新)/; -const fulltimeReg = /(魔神任务)/; +const ignoreReg = /(内容专题页|版本更新说明|调研|防沉迷|米游社|专项意见|更新修复与优化|问卷调查|版本更新通知|更新时间说明|预下载功能|周边限时|周边上新)/ +const fulltimeReg = /(魔神任务)/ let Cal = { - async reqCalData() { - let listApi = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnList?game=hk4e&game_biz=hk4e_cn&lang=zh-cn&bundle_id=hk4e_cn&platform=pc®ion=cn_gf01&level=55&uid=100000000"; + async reqCalData () { + let listApi = 'https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnList?game=hk4e&game_biz=hk4e_cn&lang=zh-cn&bundle_id=hk4e_cn&platform=pc®ion=cn_gf01&level=55&uid=100000000' - let request = await fetch(listApi); - let listData = await request.json(); + let request = await fetch(listApi) + let listData = await request.json() - let timeMap; - let timeMapCache = await redis.get("cache:calendar:detail"); + let timeMap + let timeMapCache = await redis.get('cache:calendar:detail') if (timeMapCache) { - timeMap = JSON.parse(timeMapCache) || {}; + timeMap = JSON.parse(timeMapCache) || {} } else { - let detailApi = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnContent?game=hk4e&game_biz=hk4e_cn&lang=zh-cn&bundle_id=hk4e_cn&platform=pc®ion=cn_gf01&level=55&uid=100000000"; - let request2 = await fetch(detailApi); - let detailData = await request2.json(); + let detailApi = 'https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnContent?game=hk4e&game_biz=hk4e_cn&lang=zh-cn&bundle_id=hk4e_cn&platform=pc®ion=cn_gf01&level=55&uid=100000000' + let request2 = await fetch(detailApi) + let detailData = await request2.json() timeMap = {} if (detailData && detailData.data && detailData.data.list) { let versionTime = { - "2.7": "2022-05-31 11:00:00", - "2.8": "2022-07-13 11:00:00" - }; + 2.7: '2022-05-31 11:00:00', + 2.8: '2022-07-13 11:00:00' + } lodash.forEach(detailData.data.list, (ds) => { let vRet = /(\d\.\d)版本更新通知/.exec(ds.title) if (vRet && vRet[1]) { - let content = /(?:更新时间)\s*〓([^〓]+)(?:〓|$)/.exec(ds.content); + let content = /(?:更新时间)\s*〓([^〓]+)(?:〓|$)/.exec(ds.content) if (content && content[1]) { - let tRet = /([0-9\\/\\: ]){9,}/.exec(content[1]); + let tRet = /([0-9\\/\\: ]){9,}/.exec(content[1]) if (tRet && tRet[0]) { - versionTime[vRet[1]] = versionTime[vRet[1]] || tRet[0].replace("06:00", "11:00"); + versionTime[vRet[1]] = versionTime[vRet[1]] || tRet[0].replace('06:00', '11:00') } } } }) lodash.forEach(detailData.data.list, (ds) => { - let { ann_id, content, title } = ds; + let { ann_id: annId, content, title } = ds if (ignoreReg.test(title)) { - return; + return } - content = content.replace(/(<|<)[\w "%:;=\-\\/\\(\\)\,\\.]+(>|>)/g, ""); - content = /(?:活动时间|祈愿介绍|任务开放时间|冒险....包|折扣时间)\s*〓([^〓]+)(〓|$)/.exec(content); + content = content.replace(/(<|<)[\w "%:;=\-\\/\\(\\),\\.]+(>|>)/g, '') + content = /(?:活动时间|祈愿介绍|任务开放时间|冒险....包|折扣时间)\s*〓([^〓]+)(〓|$)/.exec(content) if (!content || !content[1]) { - return; + return } - content = content[1]; - let annTime = []; + content = content[1] + let annTime = [] // 第一种简单格式 - let timeRet = /(?:活动时间)?(?:〓|\s)*([0-9\\/\\: ~]{6,}})/.exec(content); + let timeRet = /(?:活动时间)?(?:〓|\s)*([0-9\\/\\: ~]{6,})/.exec(content) if (timeRet && timeRet[1]) { - annTime = timeRet[1].split("~"); + annTime = timeRet[1].split('~') } else if (/\d\.\d版本更新后/.test(content)) { - let vRet = /(\d\.\d)版本更新后/.exec(content); - let vTime = ''; + let vRet = /(\d\.\d)版本更新后/.exec(content) + let vTime = '' if (vRet && vRet[1] && versionTime[vRet[1]]) { - vTime = versionTime[vRet[1]]; + vTime = versionTime[vRet[1]] } if (!vTime) { - return; + return } if (/永久开放/.test(content)) { - annTime = [vTime, '2099/01/01 00:00:00']; + annTime = [vTime, '2099/01/01 00:00:00'] } else { - timeRet = /([0-9\\/\\: ]){9,}/.exec(content); + timeRet = /([0-9\\/\\: ]){9,}/.exec(content) if (timeRet && timeRet[0]) { - annTime = [vTime, timeRet[0]]; + annTime = [vTime, timeRet[0]] } } } if (annTime.length === 2) { - timeMap[ann_id] = { - start: annTime[0].trim().replace(/\//g, "-"), - end: annTime[1].trim().replace(/\//g, "-") + timeMap[annId] = { + start: annTime[0].trim().replace(/\//g, '-'), + end: annTime[1].trim().replace(/\//g, '-') } } }) } - await redis.set("cache:calendar:detail", JSON.stringify(timeMap), { EX: 60 * 10 }); + await redis.set('cache:calendar:detail', JSON.stringify(timeMap), { EX: 60 * 10 }) } - return { listData, timeMap }; + return { listData, timeMap } }, - getDateList() { - let today = moment(); - let temp = today.add(-7, 'days'); - let dateList = [], month = 0, date = []; + getDateList () { + let today = moment() + let temp = today.add(-7, 'days') + let dateList = [] + let month = 0 + let date = [] - let startDate, endDate; + let startDate, endDate for (let idx = 0; idx < 13; idx++) { - let temp = today.add(1, 'days'), - m = temp.month() + 1, d = temp.date(); + temp = today.add(1, 'days') + let m = temp.month() + 1 + let d = temp.date() if (month === 0) { - startDate = temp.format("YYYY-MM-DD"); - month = m; + startDate = temp.format('YYYY-MM-DD') + month = m } if (month !== m && date.length > 0) { dateList.push({ month, date }) - date = []; - month = m; + date = [] + month = m } - date.push(d); + date.push(d) if (idx === 12) { dateList.push({ month, date }) - endDate = temp.format("YYYY-MM-DD"); + endDate = temp.format('YYYY-MM-DD') } } - let startTime = moment(startDate + " 00:00:00"), - endTime = moment(endDate + " 23:59:59"); + let startTime = moment(startDate + ' 00:00:00') + let endTime = moment(endDate + ' 23:59:59') let totalRange = endTime - startTime return { @@ -140,92 +143,92 @@ let Cal = { } }, - getAbyssCal(s1, e1) { - let now = moment(); - let check = [], f = "YYYY-MM"; - let last = now.add(-1, 'M').format(f), - lastM = now.format("MMMM"), - curr = now.add(1, "M").format(f), - currM = now.format("MMMM"), - next = now.add(1, "M").format(f), - nextM = now.format("MMMM"); + getAbyssCal (s1, e1) { + let now = moment() + let check = [] + let f = 'YYYY-MM' + let last = now.add(-1, 'M').format(f) + let lastM = now.format('MMMM') + let curr = now.add(1, 'M').format(f) + let currM = now.format('MMMM') + let next = now.add(1, 'M').format(f) + let nextM = now.format('MMMM') - check.push([moment(`${last}-16 04:00:00`), moment(`${curr}-01 03:59:59`), lastM + "下半"]); - check.push([moment(`${curr}-01 04:00:00`), moment(`${curr}-16 03:59:59`), currM + "上半"]); - check.push([moment(`${curr}-16 04:00:00`), moment(`${next}-01 03:59:59`), currM + "下半"]); - check.push([moment(`${next}-01 04:00:00`), moment(`${next}-16 03:59:59`), nextM + "上半"]); + check.push([moment(`${last}-16 04:00:00`), moment(`${curr}-01 03:59:59`), lastM + '下半']) + check.push([moment(`${curr}-01 04:00:00`), moment(`${curr}-16 03:59:59`), currM + '上半']) + check.push([moment(`${curr}-16 04:00:00`), moment(`${next}-01 03:59:59`), currM + '下半']) + check.push([moment(`${next}-01 04:00:00`), moment(`${next}-16 03:59:59`), nextM + '上半']) - let ret = []; + let ret = [] lodash.forEach(check, (ds) => { - let [s2, e2] = ds; + let [s2, e2] = ds if ((s2 <= s1 && s1 <= e2) || (s2 <= e1 && e1 <= e2)) { ret.push(ds) } }) - return ret; + return ret }, - getList(ds, target, { startTime, endTime, totalRange, now, timeMap = {} }, isAct = false,) { - let type = isAct ? "activity" : "normal", - id = ds.ann_id, - title = ds.title, - banner = isAct ? ds.banner : '', - extra = { sort: isAct ? 5 : 10 }, - detail = timeMap[id] || {}; - + getList (ds, target, { startTime, endTime, totalRange, now, timeMap = {} }, isAct = false) { + let type = isAct ? 'activity' : 'normal' + let id = ds.ann_id + let title = ds.title + let banner = isAct ? ds.banner : '' + let extra = { sort: isAct ? 5 : 10 } + let detail = timeMap[id] || {} if (ignoreIds.includes(id) || ignoreReg.test(title)) { - return; + return } - if (/神铸赋形/.test(title)) { - type = "weapon"; - title = title.replace(/(单手剑|双手剑|长柄武器|弓|法器|·)/g, ""); - extra.sort = 2; + type = 'weapon' + title = title.replace(/(单手剑|双手剑|长柄武器|弓|法器|·)/g, '') + extra.sort = 2 } else if (/祈愿/.test(title)) { - type = "character"; - let regRet = /·(.*)\(/.exec(title); + type = 'character' + let regRet = /·(.*)\(/.exec(title) if (regRet[1]) { - let char = Character.get(regRet[1]); - extra.banner2 = `/meta/character/${regRet[1]}/party.png`; - extra.character = regRet[1]; - extra.elem = char.elem; - extra.sort = 1; + let char = Character.get(regRet[1]) + extra.banner2 = `/meta/character/${regRet[1]}/party.png` + extra.character = regRet[1] + extra.elem = char.elem + extra.sort = 1 } else if (/纪行/.test(title)) { - type = "pass" - } else if ('深渊' === title) { - type = "abyss"; + type = 'pass' + } else if (title === '深渊') { + type = 'abyss' } } - let sDate = moment(detail.start || ds.start_time), - eDate = moment(detail.end || ds.end_time); - let sTime = moment.max(sDate, startTime), - eTime = moment.min(eDate, endTime); + let getDate = (d1, d2) => moment(d1 && d1.length > 6 ? d1 : d2) + let sDate = getDate(detail.start, ds.start_time) + let eDate = getDate(detail.end, ds.end_time) + let sTime = moment.max(sDate, startTime) + let eTime = moment.min(eDate, endTime) - let sRange = sTime - startTime, - eRange = eTime - startTime; + let sRange = sTime - startTime + let eRange = eTime - startTime - let left = sRange / totalRange * 100, - width = eRange / totalRange * 100 - left; + let left = sRange / totalRange * 100 + let width = eRange / totalRange * 100 - left - let label = ""; + let label = '' if (fulltimeReg.test(title) || eDate - sDate > 365 * 24 * 3600 * 1000) { if (sDate < now) { - left = 0; - width = 100; + left = 0 + width = 100 } - label = "永久有效"; + label = '永久有效' } else if (now > sDate && eDate > now) { - label = eDate.format("MM-DD HH:mm") + " (" + moment.duration(eDate - now).humanize() + "后结束)" + label = eDate.format('MM-DD HH:mm') + ' (' + moment.duration(eDate - now).humanize() + '后结束)' if (width > (isAct ? 38 : 55)) { - label = sDate.format("MM-DD HH:mm") + " ~ " + label; + label = sDate.format('MM-DD HH:mm') + ' ~ ' + label } } else if (sDate > now) { - label = sDate.format("MM-DD HH:mm") + " (" + moment.duration(sDate - now).humanize() + "后开始)" + label = sDate.format('MM-DD HH:mm') + ' (' + moment.duration(sDate - now).humanize() + '后开始)' } else if (isAct) { - label = sDate.format("MM-DD HH:mm") + " ~ " + eDate.format("MM-DD HH:mm"); + label = sDate.format('MM-DD HH:mm') + ' ~ ' + eDate.format('MM-DD HH:mm') } target.push({ @@ -239,47 +242,48 @@ let Cal = { width, label, duration: eTime - sTime, - start: sDate.format("MM-DD HH:mm"), - end: eDate.format("MM-DD HH:mm") - }); + start: sDate.format('MM-DD HH:mm'), + end: eDate.format('MM-DD HH:mm') + }) }, - async get() { + async get () { + moment.locale('zh-cn') + let now = moment() - moment.locale("zh-cn"); - let now = moment(); + let { listData, timeMap } = await Cal.reqCalData() - let { listData, timeMap } = await Cal.reqCalData(); + let dl = Cal.getDateList() - let dl = Cal.getDateList(); - - let list = [], abyss = []; + let list = [] + let abyss = [] lodash.forEach(listData.data.list[1].list, (ds) => Cal.getList(ds, list, { ...dl, now, timeMap }, true)) - lodash.forEach(listData.data.list[0].list, (ds) => Cal.getList(ds, list, { ...dl, now, timeMap }, false)); + lodash.forEach(listData.data.list[0].list, (ds) => Cal.getList(ds, list, { ...dl, now, timeMap }, false)) - let abyssCal = Cal.getAbyssCal(dl.startTime, dl.endTime); + let abyssCal = Cal.getAbyssCal(dl.startTime, dl.endTime) lodash.forEach(abyssCal, (t) => { Cal.getList({ title: `「深境螺旋」· ${t[2]}`, - start_time: t[0].format("YYYY-MM-DD HH:mm"), - end_time: t[1].format("YYYY-MM-DD HH:mm") + start_time: t[0].format('YYYY-MM-DD HH:mm'), + end_time: t[1].format('YYYY-MM-DD HH:mm') }, abyss, { ...dl, now }, true) - }); + }) - list = lodash.sortBy(list, ["sort", 'start', 'duration']); + list = lodash.sortBy(list, ['sort', 'start', 'duration']) - let charCount = 0, charOld = 0; - let weaponCount = 0; + let charCount = 0 + let charOld = 0 + let weaponCount = 0 lodash.forEach(list, (li) => { - if (li.type === "character") { - charCount++; - li.left === 0 && charOld++; - li.idx = charCount; + if (li.type === 'character') { + charCount++ + li.left === 0 && charOld++ + li.idx = charCount } - if (li.type === "weapon") { - weaponCount++; - li.idx = weaponCount; + if (li.type === 'weapon') { + weaponCount++ + li.idx = weaponCount } }) @@ -288,10 +292,10 @@ let Cal = { list, abyss, charMode: `char-${charCount}-${charOld}`, - nowTime: now.format("YYYY-MM-DD HH:mm"), - nowDate: now.date(), + nowTime: now.format('YYYY-MM-DD HH:mm'), + nowDate: now.date() } } } -export default Cal; \ No newline at end of file +export default Cal