feat: card

This commit is contained in:
bietiaop 2024-07-09 10:30:33 +08:00
parent cd0793655d
commit ce3c509cd9
43 changed files with 508 additions and 7 deletions

3
.gitignore vendored
View file

@ -6,3 +6,6 @@ config/**/*.*
data/**/*.*
!data/.gitkeep
resources/images/**/*.*
!resources/images/.gitkeep

View file

@ -21,8 +21,8 @@ export class Card extends ZZZPlugin {
}
async card() {
const { api, deviceFp } = await this.getAPI();
const userData = await this.getPlayerInfo();
if (!userData) return false;
if (!api) return false;
await this.getPlayerInfo();
let indexData = await api.getData('zzzIndex', { deviceFp });
indexData = await api.checkCode(this.e, indexData, 'zzzIndex', {});
if (!indexData || indexData.retcode !== 0) {
@ -32,6 +32,7 @@ export class Card extends ZZZPlugin {
indexData = indexData.data;
indexData = new ZZZIndexResp(indexData);
this.e.playerCard.player.region_name = indexData.stats.world_level_name;
await indexData.get_assets();
const data = {
card: indexData,
};

View file

@ -71,13 +71,14 @@ export class GachaLog extends ZZZPlugin {
this.getLog(key);
}
async getLog(key) {
const uid = await this.getUID();
const lastQueryTime = await redis.get(`ZZZ:GACHA:${uid}:LASTTIME`);
if (lastQueryTime && Date.now() - lastQueryTime < 1000 * 60 * 5) {
await this.reply('1分钟内只能刷新一次请稍后重试');
return false;
}
await redis.set(`ZZZ:GACHA:${uid}:LASTTIME`, Date.now());
const uid = await this.getUID();
this.reply('正在更新抽卡记录,可能需要一段时间,请耐心等待');
const data = await updateGachaLog(key, uid);
let msg = `抽卡记录更新成功,共${Object.keys(data).length}个卡池`;
for (const name in data) {

View file

@ -22,8 +22,8 @@ export class Note extends ZZZPlugin {
}
async note() {
const { api, deviceFp } = await this.getAPI();
const userData = await this.getPlayerInfo();
if (!userData) return false;
if (!api) return false;
await this.getPlayerInfo();
let noteData = await api.getData('zzzNote', { deviceFp });
noteData = await api.checkCode(this.e, noteData, 'zzzNote', {});
if (!noteData || noteData.retcode !== 0) {

101
defSet/atlas.yaml Normal file
View file

@ -0,0 +1,101 @@
「11号」:
- 十一号
- 十一
- 11号
- '11'
- 「11号」
艾莲:
- 爱莲
- 爱怜
- 艾莲·乔
- 鲨鱼妹
- 鲨鱼
安东:
- 安东
- 安东·伊万诺夫
本:
- 熊本
- 熊本熊
- ben
- 比格
- 本·比格
比利:
- 比例
- bili
- 比利·奇德
- Billy
苍角:
- 苍绝
- 仓角
- 仓脚
格莉丝:
- 格利斯
- 格莉丝·霍华德
珂蕾妲:
- 柯雷妲
- 珂雷哒
- 柯蕾妲
猫又:
- 猫猫
- 猫妖
- 猫怪
- 猫鼬
- 猫宫 又奈
- 猫宫又奈
- 又奈
- Neko
- neko
妮可:
- 尼克
- 妮克
- 妮寇
- 妮可·德玛拉
- Nicole
朱鸢:
- 朱元
丽娜:
- 莉娜
- 李娜
- 亚历山德丽娜·莎芭丝缇安
- rina
莱卡恩:
- 冯·莱卡恩
安比:
- 安比
- 安笔
可琳:
- 克林
- 柯林
- 可林
雅:
- 星见雅
- 星见
露西:
- 路西
- 露西亚娜·德·蒙特夫
- 露西亚娜
- 鲁西
莱特:
- 赖特
- Lighter
悠真:
-
- 浅羽悠真
- 浅羽
柳:
- 月城
- 月城柳
青衣:
- 青医
赛斯:
- 赛斯·洛威尔
- 塞斯
- 洛威尔
派派:
- 拍拍
- 韦尔
- 派派·韦尔
哲:
-
铃:
-

86
lib/convert/char.js Normal file
View file

@ -0,0 +1,86 @@
import settings from '../settings.js';
import PartnerId2SpriteId from '../../resources/map/PartnerId2SpriteId.json';
/**
*
* @param {string} id
* @param {boolean} full 显示全称
* @param {boolean} en 是否为英文
* @returns string
*/
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'];
};
/**
*
* @param {string} id
* @returns string
*/
export const IDToCharSprite = id => {
const data = PartnerId2SpriteId?.[id];
if (!data) return null;
return data?.['sprite'];
};
/**
* @param {string} name
* @returns string
*/
export const charNameToID = name => {
for (const [id, data] of Object.entries(PartnerId2SpriteId)) {
if (data['full_name'] === name) return id;
}
return null;
};
/**
* @param {string} name
* @returns string
*/
export const charNameToSprite = name => {
for (const [_id, data] of Object.entries(PartnerId2SpriteId)) {
if (data['full_name'] === name) return data['sprite'];
}
return null;
};
/**
* @param {string} atlas
* @returns string
*/
export const atlasToName = atlas => {
const atlas = settings.getConfig('atlas');
for (const [id, data] of Object.entries(atlas)) {
if (data.includes(atlas)) return id;
}
return null;
};
/**
* @param {string} atlas
* @returns string
*/
export const atlasToSprite = atlas => {
const atlas = settings.getConfig('atlas');
for (const [_id, data] of Object.entries(atlas)) {
if (data.includes(atlas)) return data['sprite'];
}
return null;
};
/**
* @param {string} name
* @returns string
*/
export const atlasToID = name => {
const atlas = settings.getConfig('atlas');
for (const [id, data] of Object.entries(atlas)) {
if (data.includes(name)) return charNameToID(id);
}
return null;
};

21
lib/convert/weapon.js Normal file
View file

@ -0,0 +1,21 @@
import WeaponId2Sprite from '../../resources/map/WeaponId2Sprite.json';
/**
* @param {string} id
* @returns string
*/
export const IDToWeaponName = id => {
const data = WeaponId2Sprite?.[id];
return data;
};
/**
* @param {string} name
* @returns string
*/
export const weaponNameToID = name => {
for (const [id, data] of Object.entries(WeaponId2Sprite)) {
if (data === name) return id;
}
return null;
};

53
lib/download.js Normal file
View file

@ -0,0 +1,53 @@
import path from 'path';
import fs from 'fs';
import { ZZZ_SQUARE_AVATAR, ZZZ_SQUARE_BANGBOO } from './mysapi/api.js';
import { resourcesPath } from './path.js';
const ZZZ_SQUARE_AVATAR_PATH = path.join(resourcesPath, 'square_avatar');
const ZZZ_SQUARE_BANGBOO_PATH = path.join(
resourcesPath,
'bangboo_square_avatar'
);
const ZZZ_GUIDES_PATH = path.join(resourcesPath, 'guides');
/**
*
* @param {string | number} charID
* @returns Promise<string>
*/
export const getSquareAvatar = async charID => {
const filename = `role_square_avatar_${charID}.png`;
const avatarPath = path.join(ZZZ_SQUARE_AVATAR_PATH, filename);
if (fs.existsSync(avatarPath)) return avatarPath;
const url = `${ZZZ_SQUARE_AVATAR}/${filename}`;
const savePath = avatarPath;
const download = await fetch(url);
const arrayBuffer = await download.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
if (!fs.existsSync(ZZZ_SQUARE_AVATAR_PATH)) {
fs.mkdirSync(ZZZ_SQUARE_AVATAR_PATH, { recursive: true });
}
fs.writeFileSync(savePath, buffer);
return avatarPath;
};
/**
*
* @param {string | number} bangbooId
* @returns Promise<string>
*/
export const getSquareBangboo = async bangbooId => {
const filename = `bangboo_rectangle_avatar_${bangbooId}.png`;
const bangbooPath = path.join(ZZZ_SQUARE_BANGBOO_PATH, filename);
if (fs.existsSync(bangbooPath)) return bangbooPath;
const url = `${ZZZ_SQUARE_BANGBOO}/${filename}`;
const savePath = bangbooPath;
const download = await fetch(url);
const arrayBuffer = await download.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
if (!fs.existsSync(ZZZ_SQUARE_BANGBOO_PATH)) {
fs.mkdirSync(ZZZ_SQUARE_BANGBOO_PATH, { recursive: true });
}
fs.writeFileSync(savePath, buffer);
return bangbooPath;
};

View file

@ -1,4 +1,5 @@
import { element } from '../lib/convert.js';
import { getSquareAvatar } from '../lib/download.js';
import { Equip, Weapon } from './equip.js';
import { Property } from './property.js';
import { Skill } from './skill.js';
@ -194,6 +195,10 @@ export class ZZZAvatarInfo {
this.element_str = element.IDToElement(element_type);
}
async get_assets() {
const result = await getSquareAvatar(this.id);
this.square_icon = result;
}
}
/**

View file

@ -1,3 +1,5 @@
import { getSquareBangboo } from '../lib/download.js';
/**
* @class
*/
@ -19,6 +21,11 @@ export class Buddy {
this.level = level;
this.star = star;
}
async get_assets() {
const result = await getSquareBangboo(this.id);
this.square_icon = result;
}
}
/**
@ -39,6 +46,11 @@ export class Item {
this.level = level;
this.star = star;
}
async get_assets() {
const result = await getSquareBangboo(this.id);
this.square_icon = result;
}
}
/**
@ -67,4 +79,10 @@ export class ZZZBangbooResp {
this.items = items;
this.bangboo_wiki = bangboo_wiki;
}
async get_assets() {
for (const item of this.items) {
await item.get_assets();
}
}
}

View file

@ -46,4 +46,13 @@ export class ZZZIndexResp {
this.cur_head_icon_url = cur_head_icon_url;
this.buddy_list = buddy_list.map(item => new Buddy(item));
}
async get_assets() {
for (const avatar of this.avatar_list) {
await avatar.get_assets();
}
for (const buddy of this.buddy_list) {
await buddy.get_assets();
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -130,6 +130,8 @@
}
.card .list .item .image img {
width: 100%;
height: 100%;
object-fit: contain;
display: block;
}
.card .list .item .level {

View file

@ -47,7 +47,7 @@
<div class="rank rank{{char.rarity}}"></div>
<div class="property {{char.element_str}}"></div>
<div class="image">
<img src="./images/status.png" alt="">
<img src="{{char.square_icon}}" alt="">
</div>
<div class="level">等级{{char.level}}</div>
</div>
@ -76,7 +76,7 @@
<div class="item rank{{bangboo.rarity}}">
<div class="rank rank{{bangboo.rarity}}"></div>
<div class="image">
<img src="./images/status.png" alt="">
<img src="{{bangboo.square_icon}}" alt="">
</div>
<div class="level">等级{{bangboo.level}}</div>
</div>

View file

@ -141,6 +141,8 @@
background-color: #e2e2e2;
img {
width: 100%;
height: 100%;
object-fit: contain;
display: block;
}
}

View file

View file

@ -0,0 +1,152 @@
{
"1011": {
"sprite_id": "01",
"name": "安比",
"full_name": "安比·德玛拉",
"en_name": "Anby"
},
"1021": {
"sprite_id": "11",
"name": "猫又",
"full_name": "猫宫 又奈",
"en_name": "Nekomata"
},
"1031": {
"sprite_id": "12",
"name": "妮可",
"full_name": "妮可·德玛拉",
"en_name": "Nicole"
},
"1041": {
"sprite_id": "05",
"name": "「11号」",
"full_name": "「11号」",
"en_name": "Soldier 11"
},
"1061": {
"sprite_id": "09",
"name": "可琳",
"full_name": "可琳·威克斯",
"en_name": "Corin"
},
"1081": {
"sprite_id": "10",
"name": "比利",
"full_name": "比利·奇德",
"en_name": "Billy"
},
"1091": {
"sprite_id": "10",
"name": "雅",
"full_name": "星见 雅",
"en_name": "Miyabi"
},
"1101": {
"sprite_id": "14",
"name": "珂蕾妲",
"full_name": "珂蕾妲·贝洛伯格",
"en_name": "Koleda"
},
"1111": {
"sprite_id": "15",
"name": "安东",
"full_name": "安东·伊万诺夫",
"en_name": "Anton"
},
"1121": {
"sprite_id": "16",
"name": "本",
"full_name": "本·比格",
"en_name": "Ben"
},
"1131": {
"sprite_id": "17",
"name": "苍角",
"full_name": "苍角",
"en_name": "Soukaku"
},
"1141": {
"sprite_id": "18",
"name": "莱卡恩",
"full_name": "冯·莱卡恩",
"en_name": "Lycaon"
},
"1151": {
"sprite_id": "27",
"name": "露西",
"full_name": "露西亚娜·德·蒙特夫",
"en_name": "Lucy"
},
"1161": {
"sprite_id": "27",
"name": "莱特",
"full_name": "莱特",
"en_name": "Lighter"
},
"1181": {
"sprite_id": "20",
"name": "格莉丝",
"full_name": "格莉丝·霍华德",
"en_name": "Grace"
},
"1191": {
"sprite_id": "21",
"name": "艾莲",
"full_name": "艾莲·乔",
"en_name": "Ellen"
},
"1201": {
"sprite_id": "21",
"name": "悠真",
"full_name": "浅羽 悠真",
"en_name": "Harumasa"
},
"1211": {
"sprite_id": "22",
"name": "丽娜",
"full_name": "亚历山德丽娜·莎芭丝缇安",
"en_name": "Rina"
},
"1221": {
"sprite_id": "22",
"name": "柳",
"full_name": "月城 柳",
"en_name": "Yanagi"
},
"1241": {
"sprite_id": "23",
"name": "朱鸢",
"full_name": "朱鸢",
"en_name": "Zhu Yuan"
},
"1251": {
"sprite_id": "23",
"name": "青衣",
"full_name": "青衣",
"en_name": "QingYi"
},
"1271": {
"sprite_id": "23",
"name": "赛斯",
"full_name": "赛斯·洛威尔",
"en_name": "Seth"
},
"1281": {
"sprite_id": "28",
"name": "派派",
"full_name": "派派·韦尔",
"en_name": "Piper"
},
"2011": {
"sprite_id": "28",
"name": "哲",
"full_name": "哲",
"en_name": "Wise"
},
"2021": {
"sprite_id": "28",
"name": "铃",
"full_name": "铃",
"en_name": "Belle"
}
}

View file

@ -0,0 +1,47 @@
{
"12001": "Weapon_B_Common_01",
"12002": "Weapon_B_Common_02",
"12003": "Weapon_B_Common_03",
"12004": "Weapon_B_Common_04",
"12005": "Weapon_B_Common_05",
"12006": "Weapon_B_Common_06",
"12007": "Weapon_B_Common_07",
"12008": "Weapon_B_Common_08",
"12009": "Weapon_B_Common_09",
"12010": "Weapon_B_Common_10",
"12011": "Weapon_B_Common_11",
"12012": "Weapon_B_Common_12",
"12013": "Weapon_B_Common_13",
"12014": "Weapon_B_Common_14",
"13001": "Weapon_A_Common_01",
"13002": "Weapon_A_Common_02",
"13003": "Weapon_A_Common_03",
"13004": "Weapon_A_Common_04",
"13005": "Weapon_A_Common_05",
"13006": "Weapon_A_Common_06",
"13007": "Weapon_A_Common_07",
"13008": "Weapon_A_Common_08",
"13009": "Weapon_A_Common_09",
"13010": "Weapon_A_Common_10",
"13011": "Weapon_A_Common_11",
"13101": "Weapon_A_1011",
"13103": "Weapon_A_1031",
"13106": "Weapon_A_1061",
"13108": "Weapon_A_1081",
"13111": "Weapon_A_1111",
"13112": "Weapon_A_1121",
"13113": "Weapon_A_1131",
"13115": "Weapon_A_1151",
"13128": "Weapon_A_1281",
"14001": "Weapon_S_Common_01",
"14002": "Weapon_S_Common_02",
"14003": "Weapon_S_Common_03",
"14102": "Weapon_S_1021",
"14104": "Weapon_S_1041",
"14110": "Weapon_S_1101",
"14114": "Weapon_S_1141",
"14118": "Weapon_S_1181",
"14119": "Weapon_S_1191",
"14121": "Weapon_S_1211",
"14124": "Weapon_S_1241"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB