diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d20060..a5c1b9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 1.2 +* 添加伤害计算,支持目前为止所有 `驱动盘` 以及 `艾莲` 、 `朱鸢` 的伤害计算,`强攻武器` 支持 `B` 级以上。 +* 修复攻略问题,若有对不上的问题,请“刷新攻略”。 + # 1.1 * 支持自定义面板图,详情请查看 `README`。 diff --git a/apps/guide.js b/apps/guide.js index 1db6f19..8aff0fc 100644 --- a/apps/guide.js +++ b/apps/guide.js @@ -6,12 +6,12 @@ import common from '../../../lib/common/common.js'; import { ZZZPlugin } from '../lib/plugin.js'; import { rulePrefix } from '../lib/common.js'; import { atlasToName } from '../lib/convert/char.js'; -import { imageResourcesPath, configPath } from '../lib/path.js'; +import { imageResourcesPath } from '../lib/path.js'; import _ from 'lodash'; import settings from '../lib/settings.js'; +import { downloadFile } from '../lib/download.js'; const ZZZ_GUIDES_PATH = path.join(imageResourcesPath, 'guides'); -const ZZZ_GUIDES_CONFIG_PATH = path.join(configPath, 'guide.yaml'); export class Guide extends ZZZPlugin { constructor() { @@ -23,20 +23,20 @@ export class Guide extends ZZZPlugin { rule: [ { reg: `^${rulePrefix}攻略(说明|帮助)$`, - fnc: 'GuideHelp' + fnc: 'GuideHelp', }, { reg: `^${rulePrefix}设置默认攻略(\\d+|all)$`, - fnc: 'SetDefaultGuide' + fnc: 'SetDefaultGuide', }, { reg: `^${rulePrefix}设置所有攻略显示个数(\\d+)$`, - fnc: 'SetMaxForwardGuide' + fnc: 'SetMaxForwardGuide', }, { reg: `${rulePrefix}(更新)?\\S+攻略(\\d+|all)?$`, fnc: 'Guide', - } + }, ], }); @@ -51,7 +51,7 @@ export class Guide extends ZZZPlugin { [2724610], [2722266], [2723586], - [2716049] + [2716049], ]; this.source = [ '新艾利都快讯', @@ -60,41 +60,42 @@ export class Guide extends ZZZPlugin { '猫冬', '月光中心', '苦雪的清心花凉糕Suki', - 'HoYo青枫' + 'HoYo青枫', ]; // 最大攻略数量 this.maxNum = this.source.length; // 最大显示攻略数量 - this.maxForwardGuides = _.get(settings.getConfig('guide'), 'max_forward_guides', 4); + this.maxForwardGuides = _.get( + settings.getConfig('guide'), + 'max_forward_guides', + 4 + ); } - async init() { - for (let group = 1; group <= this.maxNum; group++) { - let guideFolder = this.getGuideFolder(group); - if (!fs.existsSync(guideFolder)) { - fs.mkdirSync(guideFolder, { recursive: true }); - } - } - } + // async init() { + // for (let group = 1; group <= this.maxNum; group++) { + // let guideFolder = this.getGuideFolder(group); + // if (!fs.existsSync(guideFolder)) { + // fs.mkdirSync(guideFolder, { recursive: true }); + // } + // } + // } getGuideFolder(groupIndex) { let guideFolder = path.join(ZZZ_GUIDES_PATH, this.source[groupIndex - 1]); return guideFolder; } - getGuidePath(groupIndex, characterName) { - let filename = `role_guide_${characterName}.png`; - let guidePath = path.join(this.getGuideFolder(groupIndex), filename); - return guidePath; - } - - canGetImageFromFile(guidePath, isUpdate) { - return fs.existsSync(guidePath) && !isUpdate; + async getGuidePath(groupIndex, characterName, isUpdate = false) { + const filename = `role_guide_${characterName}.png`; + const guidePath = path.join(this.getGuideFolder(groupIndex), filename); + if (fs.existsSync(guidePath) && !isUpdate) return guidePath; + return await this.getImg(characterName, groupIndex); } async Guide() { - let reg = new RegExp(`${rulePrefix}(更新)?(\\S+)攻略(\\d+|all)?$`); + let reg = new RegExp(`${rulePrefix}(更新|刷新)?(\\S+)攻略(\\d+|all)?$`); let [ , , @@ -113,25 +114,19 @@ export class Guide extends ZZZPlugin { await this.reply(`超过攻略数量(${this.maxNum})`); return; } - let name = atlasToName(atlas); + const name = atlasToName(atlas); + if (!name) { await this.reply('该角色不存在'); return; } if (group === 0) { - // eslint-disable-next-line no-unused-vars - let msg = []; - // eslint-disable-next-line no-unused-vars + const msg = []; for (let i = 1; i <= this.maxNum; i++) { - let guidePath = this.getGuidePath(i, name); - if (this.canGetImageFromFile(guidePath, isUpdate)) { - msg.push(segment.image(`file://${guidePath}`)); - continue; - } - if (i <= this.maxForwardGuides && (await this.getImg(name, i))) { - msg.push(segment.image(`file://${guidePath}`)); - } + const guidePath = await this.getGuidePath(i, name, !!isUpdate); + // msg.push(segment.image(`file://${guidePath}`)); + msg.push(segment.image(guidePath)); } if (msg.length) { await this.reply(await common.makeForwardMsg(this.e, [msg])); @@ -139,15 +134,9 @@ export class Guide extends ZZZPlugin { return false; } - let guidePath = this.getGuidePath(group, name); - if (this.canGetImageFromFile(guidePath, isUpdate)) { - await this.e.reply(segment.image(`file://${guidePath}`)); - return; - } - - if (await this.getImg(name, group)) { - await this.e.reply(segment.image(`file://${guidePath}`)); - } + const guidePath = await this.getGuidePath(group, name, !!isUpdate); + await this.e.reply(segment.image(guidePath)); + return false; } /** 下载攻略图 */ @@ -166,12 +155,15 @@ export class Guide extends ZZZPlugin { } // 搜索时过滤特殊符号,譬如「11号」 - const filtered_name = name.replace(/[^\w\s]|_/g, '') - + const filtered_name = name.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, ''); let posts = lodash.flatten(lodash.map(mysRes, item => item.data.posts)); let url, created_at, updated_at; - for (let val of posts) { - if (val.post.subject.replace(/【[^】]*本[^】]*】/g, '').includes(filtered_name)) { + for (const val of posts) { + if ( + val.post.subject + .replace(/【[^】]*本[^】]*】/g, '') + .includes(filtered_name) + ) { let max = 0; val.image_list.forEach((v, i) => { if ( @@ -193,17 +185,19 @@ export class Guide extends ZZZPlugin { ); return false; } - console.log(`${this.e.logFnc} 下载${name}攻略图 - ${this.source[group - 1]}`); + logger.debug( + `${this.e.logFnc} 下载${name}攻略图 - ${this.source[group - 1]}` + ); - const download = await fetch(url); - const arrayBuffer = await download.arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - let guidePath = this.getGuidePath(group, name); - fs.writeFileSync(guidePath, buffer); + const filename = `role_guide_${name}.png`; + const guidePath = path.join(this.getGuideFolder(group), filename); + const download = await downloadFile(url, guidePath); - console.log(`${this.e.logFnc} 下载${name}攻略成功 - ${this.source[group - 1]}`); + logger.debug( + `${this.e.logFnc} 下载${name}攻略成功 - ${this.source[group - 1]}` + ); - return true; + return download; } /** 获取数据 */ @@ -216,7 +210,7 @@ export class Guide extends ZZZPlugin { } /** %攻略帮助 */ - async GuideHelp () { + async GuideHelp() { let reply_msg = [ '绝区零角色攻略帮助:', '%艾莲攻略+攻略id', @@ -225,46 +219,40 @@ export class Guide extends ZZZPlugin { '%设置所有攻略显示个数+攻略id', '示例: %艾莲攻略2', '', - '攻略来源:' - ].concat(this.source.map((element, index) => `${index + 1}: ${element}`)) - await this.e.reply(reply_msg.join('\n')) - } - - setConfig(key, value) { - let config = fs.readFileSync(ZZZ_GUIDES_CONFIG_PATH, 'utf8') - let newREG = new RegExp(`^${key}: (.*)`, 'gm') - config = config.replace(newREG, `${key}: ${value}`) - fs.writeFileSync(ZZZ_GUIDES_CONFIG_PATH, config, 'utf8') + '攻略来源:', + ].concat(this.source.map((element, index) => `${index + 1}: ${element}`)); + await this.e.reply(reply_msg.join('\n')); } /** %设置默认攻略1 */ - async SetDefaultGuide () { - let match = /设置默认攻略(\d+|all)$/g.exec(this.e.msg) - let guide_id = match[1] + async SetDefaultGuide() { + let match = /设置默认攻略(\d+|all)$/g.exec(this.e.msg); + let guide_id = match[1]; if (guide_id == 'all') { - guide_id = 0 + guide_id = 0; } + guide_id = Number(guide_id); if (guide_id > this.maxNum) { let reply_msg = [ '绝区零默认攻略设置方式为:', '%设置默认攻略[0123...]', `请增加数字0-${this.maxNum}其中一个,或者增加 all 以显示所有攻略`, - '攻略来源请输入 %攻略帮助 查看' - ] - await this.e.reply(reply_msg.join('\n')) - return + '攻略来源请输入 %攻略帮助 查看', + ]; + await this.e.reply(reply_msg.join('\n')); + return; } - this.setConfig('default_guide', guide_id) - - let source_name = guide_id == 0 ? 'all' : this.source[guide_id - 1] - await this.e.reply(`绝区零默认攻略已设置为: ${guide_id} (${source_name})`) + settings.setSingleConfig('guide', 'default_guide', guide_id); + + let source_name = guide_id == 0 ? 'all' : this.source[guide_id - 1]; + await this.e.reply(`绝区零默认攻略已设置为: ${guide_id} (${source_name})`); } /** %设置所有攻略显示个数3 */ - async SetMaxForwardGuide () { - let match = /设置所有攻略显示个数(\d+)$/g.exec(this.e.msg) - let max_forward_guide = Number(match[1]) - this.setConfig('max_forward_guides', max_forward_guide) - await this.e.reply(`绝区零所有攻略显示个数已设置为: ${max_forward_guide}`) + async SetMaxForwardGuide() { + let match = /设置所有攻略显示个数(\d+)$/g.exec(this.e.msg); + let max_forward_guide = Number(match[1]); + this.setSingleConfig('max_forward_guides', max_forward_guide); + await this.e.reply(`绝区零所有攻略显示个数已设置为: ${max_forward_guide}`); } } diff --git a/lib/download.js b/lib/download.js index 8d1b7c8..592cb43 100644 --- a/lib/download.js +++ b/lib/download.js @@ -24,7 +24,7 @@ const ZZZ_SUIT_PATH = path.join(imageResourcesPath, 'suit'); * @param {string} savePath 保存路径 * @returns */ -const downloadFile = async (url, savePath) => { +export const downloadFile = async (url, savePath) => { const _download = async (url, savePath, retry = 0) => { // 重试次数超过 5 次则返回 null if (retry > 5) { diff --git a/lib/settings.js b/lib/settings.js index 3fa8c9b..e6364d3 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -153,12 +153,31 @@ class Setting { /** * 设置对应模块用户配置 - * @param {'atlas'|'config'|'gacha'|'panel'} app + * @param {'atlas'|'config'|'gacha'|'panel'|'guide'} app * @param {object} obj * @returns */ setConfig(app, obj) { - return this.setYaml(app, 'config', { ...this.getdefSet(app), ...obj }); + // 先获取默认配置 + const defSet = this.getdefSet(app); + // 再获取用户配置 + const config = this.getConfig(app); + return this.setYaml(app, 'config', { ...defSet, ...config, ...obj }); + } + + /** + * 设置对应模块用户配置 + * @param {'atlas'|'config'|'gacha'|'panel'|'guide'} app + * @param {string} key + * @param {string} value + * @returns {boolean} + */ + setSingleConfig(app, key, value) { + // 先获取默认配置 + const defSet = this.getdefSet(app); + const config = this.getConfig(app); + config[key] = value; + return this.setYaml(app, 'config', { ...defSet, ...config }); } // 将对象写入YAML文件