feat:下载、删除图片资源

This commit is contained in:
bietiaop 2024-07-14 23:36:17 +08:00
parent 65652f87ef
commit b450b7f08b
8 changed files with 180 additions and 7 deletions

View file

@ -39,7 +39,13 @@ export class Card extends ZZZPlugin {
const finalIndexData = new ZZZIndexResp(indexData); const finalIndexData = new ZZZIndexResp(indexData);
this.e.playerCard.player.region_name = this.e.playerCard.player.region_name =
finalIndexData.stats.world_level_name; finalIndexData.stats.world_level_name;
const timer = setTimeout(() => {
if (this?.reply) {
this.reply('查询成功,正在下载图片资源,请稍候。');
}
}, 3000);
await finalIndexData.get_assets(); await finalIndexData.get_assets();
clearTimeout(timer);
const data = { const data = {
card: finalIndexData, card: finalIndexData,
}; };

139
apps/manage.js Normal file
View file

@ -0,0 +1,139 @@
import { ZZZPlugin } from '../lib/plugin.js';
import { rulePrefix } from '../lib/common.js';
import { getAllCharactersID } from '../lib/convert/char.js';
import { getAllEquipID } from '../lib/convert/equip.js';
import { getAllWeaponID } from '../lib/convert/weapon.js';
import { imageResourcesPath } from '../lib/path.js';
import fs from 'fs';
import {
getRoleImage,
getSquareAvatar,
getSuitImage,
getWeaponImage,
} from '../lib/download.js';
export class Panel extends ZZZPlugin {
constructor() {
super({
name: '[ZZZ-Plugin]Manage',
dsc: 'zzzmanage',
event: 'message',
priority: 100,
rule: [
{
reg: `${rulePrefix}下载(全部|所有)资源$`,
fnc: 'downloadAll',
},
{
reg: `${rulePrefix}删除(全部|所有)资源$`,
fnc: 'deleteAll',
},
],
});
}
async downloadAll() {
if (!this.e.isMaster) return false;
const charIDs = getAllCharactersID();
const equipSprites = getAllEquipID();
const weaponSprites = getAllWeaponID();
const result = {
char: {
success: 0,
failed: 0,
total: charIDs.length,
},
charSquare: {
success: 0,
failed: 0,
total: charIDs.length,
},
equip: {
success: 0,
failed: 0,
total: equipSprites.length,
},
weapon: {
success: 0,
failed: 0,
total: weaponSprites.length,
},
};
await this.reply(
'开始下载资源,注意,仅支持下载面板的角色图、武器图、套装图,以及角色卡片的角色头像图。暂不支持下载邦布头像。'
);
for (const id of charIDs) {
try {
await getSquareAvatar(id);
result.charSquare.success++;
} catch (error) {
logger.error('getSquareAvatar', id, error);
result.charSquare.failed++;
}
try {
await getRoleImage(id);
result.char.success++;
} catch (error) {
logger.error('getRoleImage', id, error);
result.char.failed++;
}
}
for (const sprite of equipSprites) {
try {
await getSuitImage(sprite);
result.equip.success++;
} catch (error) {
logger.error('getSuitImage', sprite, error);
result.equip.failed++;
}
}
for (const sprite of weaponSprites) {
try {
await getWeaponImage(sprite);
result.weapon.success++;
} catch (error) {
logger.error('getWeaponImage', sprite, error);
result.weapon.failed++;
}
}
const messages = [
'资源下载完成(成功的包含先前下载的图片)',
'角色图需下载' +
charIDs.length +
'张,成功' +
result.char.success +
'张,失败' +
result.char.failed +
'张',
'角色头像图需下载' +
charIDs.length +
'张,成功' +
result.charSquare.success +
'张,失败' +
result.charSquare.failed +
'张',
'套装图需下载' +
equipSprites.length +
'张,成功' +
result.equip.success +
'张,失败' +
result.equip.failed +
'张',
'武器图需下载' +
weaponSprites.length +
'张,成功' +
result.weapon.success +
'张,失败' +
result.weapon.failed +
'张',
];
await this.reply(messages.join('\n'));
}
async deleteAll() {
if (!this.e.isMaster) return false;
await this.reply('【注意】正在删除所有资源图片,后续使用需要重新下载!');
if (fs.existsSync(imageResourcesPath)) {
fs.rmdirSync(imageResourcesPath, { recursive: true });
}
await this.reply('资源图片已删除!');
}
}

View file

@ -39,7 +39,7 @@ export class Panel extends ZZZPlugin {
const { api, deviceFp } = await this.getAPI(); const { api, deviceFp } = await this.getAPI();
if (!api) return false; if (!api) return false;
await redis.set(`ZZZ:PANEL:${uid}:LASTTIME`, Date.now()); await redis.set(`ZZZ:PANEL:${uid}:LASTTIME`, Date.now());
await this.reply('正在刷新面板列表,请稍...'); await this.reply('正在刷新面板列表,请稍...');
await this.getPlayerInfo(); await this.getPlayerInfo();
const result = await refreshPanel(this.e, api, uid, deviceFp); const result = await refreshPanel(this.e, api, uid, deviceFp);
const newChar = result.filter(item => item.isNew); const newChar = result.filter(item => item.isNew);
@ -83,8 +83,13 @@ export class Panel extends ZZZPlugin {
await this.reply(`未找到角色${name}的面板信息`); await this.reply(`未找到角色${name}的面板信息`);
return; return;
} }
await this.reply('正在下载面板图片资源,请稍后...'); const timer = setTimeout(() => {
if (this?.reply) {
this.reply('查询成功,正在下载图片资源,请稍候。');
}
}, 3000);
await data.get_detail_assets(); await data.get_detail_assets();
clearTimeout(timer);
const finalData = { const finalData = {
charData: data, charData: data,
}; };

View file

@ -21,7 +21,7 @@ export function getStoken(e, mysid = '') {
try { try {
let cks = fs.readFileSync(file, 'utf-8'); let cks = fs.readFileSync(file, 'utf-8');
cks = YAML.parse(cks); cks = YAML.parse(cks);
for (let ck in cks) { for (const ck in cks) {
if (cks[ck]['stuid'] === mysid) { if (cks[ck]['stuid'] === mysid) {
return cks[ck]; return cks[ck];
} }
@ -47,7 +47,9 @@ export async function getAuthKey(e, _user, zzzUid, authAppid = 'csc') {
} }
let ck = getStoken(e, uidData.ltuid); let ck = getStoken(e, uidData.ltuid);
if (!ck) { if (!ck) {
throw new Error('获取cookie失败请确认绑定了 cookie'); throw new Error(
'获取cookie失败请确认绑定了cookie或者查询的UID是否与cookie对应请确认bot所使用的是绝区零UID'
);
} }
if (uidData.ltuid !== ck.stuid) { if (uidData.ltuid !== ck.stuid) {
throw new Error( throw new Error(

View file

@ -83,3 +83,11 @@ export const atlasToID = name => {
const id = charNameToID(_name); const id = charNameToID(_name);
return id; return id;
}; };
/**
* 获取所有角色ID
* @returns string[]
*/
export const getAllCharactersID = () => {
return Object.keys(PartnerId2SpriteId);
};

View file

@ -17,3 +17,11 @@ export function equipIdToSprite(equipId) {
} }
return null; return null;
} }
/**
* 获取所有装备的id
* @returns {string[]}
*/
export function getAllEquipID() {
return Object.keys(equipData);
}

View file

@ -22,3 +22,11 @@ export const weaponFileNameToID = name => {
} }
return null; return null;
}; };
/**
* 获取所有武器的ID
* @returns string[]
*/
export const getAllWeaponID = () => {
return Object.keys(WeaponId2Sprite);
};

View file

@ -80,16 +80,13 @@ export const getSquareBangboo = async bangbooId => {
* @returns Promise<string> * @returns Promise<string>
*/ */
export const getWeaponImage = async id => { export const getWeaponImage = async id => {
logger.debug('getWeaponImage', id);
const name = weapon.IDToWeaponFileName(id); const name = weapon.IDToWeaponFileName(id);
logger.debug('getWeaponImage', name);
const filename = `${name}.png`; const filename = `${name}.png`;
const weaponPath = path.join(ZZZ_WEAPON_PATH, filename); const weaponPath = path.join(ZZZ_WEAPON_PATH, filename);
if (fs.existsSync(weaponPath)) return weaponPath; if (fs.existsSync(weaponPath)) return weaponPath;
const url = await getResourceRemotePath('weapon', filename); const url = await getResourceRemotePath('weapon', filename);
const savePath = weaponPath; const savePath = weaponPath;
const download = await downloadFile(url, savePath); const download = await downloadFile(url, savePath);
logger.debug('getWeaponImage', download);
return download; return download;
}; };