feature:支持Enka面板更新:%更新展柜面板

This commit is contained in:
UCPr 2025-06-09 15:40:27 +08:00
parent 0fea67a389
commit 21b8915418
25 changed files with 36048 additions and 382 deletions

View file

@ -102,17 +102,24 @@ export const refreshPanel = async (api, deviceFp) => {
// 获取新数据
const newData = await getAvatarInfoList(api, deviceFp, true);
if (!newData) return null;
return mergePanel(api.uid, newData);
};
/**
* 合并保存新面板
* @param {string|number} uid UID
* @param {import('../model/Enka/interface').Mys.Avatar[]} newData
*/
export const mergePanel = async (uid, newData) => {
// 合并新旧数据
const finalData = updatePanelData(api.uid, newData);
const finalData = updatePanelData(uid, newData);
const formattedData = finalData.map(item => new ZZZAvatarInfo(item));
for (const item of formattedData) {
// 下载图片资源
await item.get_basic_assets();
}
return formattedData;
};
}
/**
*获取面板数据

View file

@ -1,8 +1,9 @@
import settings from '../settings.js';
import settings from '../settings.js'
// import PartnerId2SpriteId from '../../resources/map/PartnerId2Data.json' assert { type: 'json' };
import { getMapData } from '../../utils/file.js';
import { getMapData } from '../../utils/file.js'
const PartnerId2SpriteId = getMapData('PartnerId2Data');
/** @type {import('../../model/Enka/interface.js').Map.PartnerId2Data} */
const PartnerId2Data = getMapData('PartnerId2Data')
/**
*
@ -12,12 +13,12 @@ const PartnerId2SpriteId = getMapData('PartnerId2Data');
* @returns {string | null}
*/
export const IDToCharName = (id, full = true, en = false) => {
const data = PartnerId2SpriteId?.[id];
if (!data) return null;
if (en) return data?.['en_name'];
if (full) return data?.['full_name'];
return data?.['name'];
};
const data = PartnerId2Data?.[id]
if (!data) return null
if (en) return data?.['en_name']
if (full) return data?.['full_name']
return data?.['name']
}
/**
*
@ -25,73 +26,73 @@ export const IDToCharName = (id, full = true, en = false) => {
* @returns {string | null}
*/
export const IDToCharSprite = id => {
const data = PartnerId2SpriteId?.[id];
if (!data) return null;
return data?.['sprite_id'];
};
const data = PartnerId2Data?.[id]
if (!data) return null
return data?.['sprite_id']
}
/**
* @param {string} name
* @returns {number | null}
*/
export const charNameToID = name => {
for (const [id, data] of Object.entries(PartnerId2SpriteId)) {
if (data['name'] === name) return Number(id);
for (const [id, data] of Object.entries(PartnerId2Data)) {
if (data['name'] === name) return Number(id)
}
return null;
};
return null
}
/**
* @param {string} name
* @returns {string | null}
*/
export const charNameToSprite = name => {
for (const [_id, data] of Object.entries(PartnerId2SpriteId)) {
if (data['name'] === name) return data['sprite'];
for (const [_id, data] of Object.entries(PartnerId2Data)) {
if (data['name'] === name) return data['sprite_id']
}
return null;
};
return null
}
/**
* @param {string} _alias
* @returns {string | null}
*/
export const aliasToName = _alias => {
const alias = settings.getConfig('alias');
const alias = settings.getConfig('alias')
for (const [id, data] of Object.entries(alias)) {
if (id === _alias) return id;
if (data.includes(_alias)) return id;
if (id === _alias) return id
if (data.includes(_alias)) return id
}
// 判断PartnerId2SpriteId是否有对应的name
for (const [_, data] of Object.entries(PartnerId2SpriteId)) {
if (data['name'] === _alias) return data['name'];
for (const [_, data] of Object.entries(PartnerId2Data)) {
if (data['name'] === _alias) return data['name']
}
return null;
};
return null
}
/**
* @param {string} _alias
* @returns {string | null}
*/
export const aliasToSprite = _alias => {
const name = aliasToName(_alias);
return charNameToSprite(name);
};
const name = aliasToName(_alias)
return charNameToSprite(name)
}
/**
* @param {string} name
* @returns {number | null}
*/
export const aliasToID = name => {
const _name = aliasToName(name);
const id = charNameToID(_name);
return id;
};
const _name = aliasToName(name)
const id = charNameToID(_name)
return id
}
/**
* 获取所有角色ID
* @returns {string[]}
*/
export const getAllCharactersID = () => {
return Object.keys(PartnerId2SpriteId);
};
return Object.keys(PartnerId2Data)
}

View file

@ -1,6 +1,7 @@
import { getMapData } from '../../utils/file.js';
import { getMapData } from '../../utils/file.js'
const equipData = getMapData('EquipId2Data');
/** @type {import('../../model/Enka/interface.js').Map.EquipId2Data} */
const EquipId2Data = getMapData('EquipId2Data')
/**
* 获取驱动盘装备的图片
@ -8,14 +9,14 @@ const equipData = getMapData('EquipId2Data');
* @returns {string | null}
*/
export function equipIdToSprite(equipId) {
equipId = equipId.toString();
equipId = equipId.toString()
if (equipId.length === 5) {
const suitId = equipId.slice(0, 3) + '00';
if (equipData.hasOwnProperty(suitId)) {
return equipData[suitId]['sprite_file'].replace('3D', '');
const suitId = equipId.slice(0, 3) + '00'
if (EquipId2Data.hasOwnProperty(suitId)) {
return EquipId2Data[suitId]['sprite_file'].replace('3D', '')
}
}
return null;
return null
}
/**
@ -23,5 +24,5 @@ export function equipIdToSprite(equipId) {
* @returns {string[]}
*/
export function getAllEquipID() {
return Object.keys(equipData);
return Object.keys(EquipId2Data)
}

View file

@ -93,7 +93,7 @@ export const idToShortName3 = id => {
*/
export const nameToShortName3 = propName => {
for (const id in propertyData) {
if (propertyData[id]?.[1] === propName) return propertyData[id][3];
if (propertyData[id][1] === propName) return propertyData[id][3];
};
return propName;
};
@ -101,13 +101,15 @@ export const nameToShortName3 = propName => {
/**
* 属性名转id
* @param {string} propName 属性名
* @returns {string}
* @returns {number}
*/
export const nameToId = (propName) => {
for (const id in propertyData) {
if (propertyData[id]?.[1] === propName) return Number(id);
if (propertyData[id][1] === propName ||
propertyData[id][1].replace('属性', '') === propName
) return Number(id);
};
return '';
return 0;
};
/**

View file

@ -1,32 +1,33 @@
// import WeaponId2Sprite from '../../resources/map/WeaponId2Sprite.json' assert { type: 'json' };
import { getMapData } from '../../utils/file.js';
import { getMapData } from '../../utils/file.js'
const WeaponId2Sprite = getMapData('WeaponId2Sprite');
/** @type {import('../../model/Enka/interface.js').Map.WeaponId2Data} */
const WeaponId2Data = getMapData('WeaponId2Data')
/**
* @param {string} id
* @returns string
*/
export const IDToWeaponFileName = id => {
const data = WeaponId2Sprite?.[id];
return data;
};
const data = WeaponId2Data?.[id]?.CodeName
return data
}
/**
* @param {string} name
* @returns string
*/
export const weaponFileNameToID = name => {
for (const [id, data] of Object.entries(WeaponId2Sprite)) {
if (data === name) return id;
for (const [id, data] of Object.entries(WeaponId2Data)) {
if (data.CodeName === name) return id
}
return null;
};
return null
}
/**
* 获取所有武器的ID
* @returns string[]
*/
export const getAllWeaponID = () => {
return Object.keys(WeaponId2Sprite);
};
return Object.keys(WeaponId2Data)
}

View file

@ -18,7 +18,7 @@ export function saveGachaLog(uid, data) {
/**
* @param {string} uid
* @returns {Array<object>}
* @returns {import('./../model/Enka/interface').Mys.Avatar[]}
*/
export function getPanelData(uid) {
return getDB('panel', uid) || [];

View file

@ -32,7 +32,7 @@ export default class MysZZZApi extends MysApi {
return item.ck && item.uid === uid;
});
if (!ck) {
throw new Error(`[ZZZ]要查询的UID:${uid}未绑定Cookie`);
throw new Error(`[ZZZ]UID:${uid}未绑定Cookie。若无法更新面板可尝试%更新展柜面板所更新角色数据与实际不一致时请提issue`);
}
this._device = ck?.device_id || ck?.device;
this.cookie = ck?.ck;

View file

@ -158,19 +158,21 @@ export class ZZZPlugin extends plugin {
* 获取玩家信息当调用此方法时会获取用户的玩家信息并将其保存到`e.playerCard`方便渲染用户信息此部分请查阅`lib/render.js`中两个模块的作用
* @returns {Promise<boolean | object>}
*/
async getPlayerInfo() {
// 获取 米游社 API
const { api, uid } = await this.getAPI();
// 获取用户信息
let userData = await api.getFinalData('zzzUser').catch(e => {
this.reply(e.message);
throw e;
});
async getPlayerInfo(playerData = null) {
if (!playerData) {
// 获取 米游社 API
const { api, uid } = await this.getAPI();
// 获取用户信息
playerData = await api.getFinalData('zzzUser').catch(e => {
this.reply(e.message);
throw e;
});
if (!userData) throw new Error('获取用户数据失败');
// 取第一个用户信息
userData =
userData?.list?.find(item => item.game_uid == uid) || userData?.list?.[0];
if (!playerData) throw new Error('获取用户数据失败');
// 取第一个用户信息
playerData =
playerData?.list?.find(item => item.game_uid == uid) || playerData?.list?.[0];
}
// 获取用户头像
let avatar = '';
@ -184,10 +186,10 @@ export class ZZZPlugin extends plugin {
// 写入数据
this.e.playerCard = {
avatar: avatar,
player: userData,
player: playerData,
};
// 返回数据
return userData;
return playerData;
}
/**