ZZZ-Plugin/model/deadly.js
AthenaHibou b2c93724b3
Update deadly.js (#140) fix #139
修复危局查询中无邦布信息导致的报错,为其追加空白默认值
2025-07-28 20:54:04 +08:00

286 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import request from '../utils/request.js';
import { Buffer } from 'node:buffer';
/**
* @typedef {Object} DeadlyTime
* @property {number} hour
* @property {number} minute
* @property {number} second
* @property {number} year
* @property {number} month
* @property {number} day
*/
/**
* @typedef {Object} Bos
* @property {string} race_icon
* @property {string} icon
* @property {string} name
* @property {string} bg_icon
*/
/**
* @typedef {Object} DeadBuffer
* @property {string} desc
* @property {string} icon
* @property {string} name
*/
/**
* @typedef {Object} Buddy
* @property {number} id
* @property {string} rarity
* @property {number} level
* @property {string} bangboo_rectangle_url
*/
/**
* @typedef {Object} AvatarList
* @property {string} rarity
* @property {number} element_type
* @property {number} avatar_profession
* @property {number} id
* @property {number} level
* @property {number} rank
* @property {string} role_square_url
* @property {number} sub_element_type
*/
/**
* @typedef {Object} DeadlyList
* @property {number} star
* @property {number} score
* @property {Bos[]} boss
* @property {DeadBuffer[]} buffer
* @property {Buddy} buddy
* @property {number} total_star
* @property {DeadlyTime} challenge_time
* @property {AvatarList[]} avatar_list
*/
/**
* @typedef {Object} Deadly
* @property {DeadlyTime} start_time
* @property {DeadlyTime} end_time
* @property {string} nick_name
* @property {string} avatar_icon
* @property {boolean} has_data
* @property {number} zone_id
* @property {number} total_star
* @property {number} rank_percent
* @property {number} total_score
* @property {DeadlyList[]} list
*/
// 1x1像素透明用于填充无图情况
const BLANK_IMAGE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
/**
* @class Deadly.
*/
export class Deadly {
/**
* @param {Deadly} data
*/
constructor(data) {
this.start_time = new DeadlyTime(data.start_time);
this.end_time = new DeadlyTime(data.end_time);
this.nick_name = data.nick_name;
this.avatar_icon = data.avatar_icon;
this.has_data = data.has_data;
this.zone_id = data.zone_id;
this.total_star = data.total_star;
this.rank_percent = data.rank_percent;
this.total_score = data.total_score;
this.list = data.list.map(item => new DeadlyList(item));
}
async get_assets() {
const avatar_icon_b64 = await request
.get(this.avatar_icon, {}, { responseType: 'arraybuffer' })
.then(response => response.arrayBuffer())
.then(
buffer =>
`data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
);
this.avatar_icon = avatar_icon_b64;
await Promise.all(this.list.map(item => item.get_assets()));
}
}
/**
* @class DeadlyList.
*/
export class DeadlyList {
/**
* @param {DeadlyList} data
*/
constructor(data) {
this.star = data.star;
this.score = data.score;
this.boss = data.boss.map(b => new Bos(b));
this.buffer = data.buffer.map(b => new DeadBuffer(b));
this.buddy = new Buddy(data.buddy);
this.total_star = data.total_star;
this.challenge_time = new DeadlyTime(data.challenge_time);
this.avatar_list = data.avatar_list.map(item => new AvatarList(item));
}
async get_assets() {
await Promise.all([
this.buddy.get_assets(),
...this.avatar_list.map(avatar => avatar.get_assets()),
...this.boss.map(boss => boss.get_assets()),
...this.buffer.map(buffer => buffer.get_assets()),
]);
}
}
/**
* @class AvatarList.
*/
export class AvatarList {
/**
* @param {AvatarList} data
*/
constructor(data) {
this.rarity = data.rarity;
this.element_type = data.element_type;
this.avatar_profession = data.avatar_profession;
this.id = data.id;
this.level = data.level;
this.rank = data.rank;
this.role_square_url = data.role_square_url;
this.sub_element_type = data.sub_element_type;
}
async get_assets() {
const role_square_b64 = await request
.get(this.role_square_url, {}, { responseType: 'arraybuffer' })
.then(response => response.arrayBuffer())
.then(
buffer =>
`data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
);
this.role_square_url = role_square_b64;
}
}
/**
* @class Buddy.
*/
export class Buddy {
/**
* @param {Buddy} data
*/
constructor(data) {
//无邦布信息的时候使用默认空值
if (!data) {
this.id = 0;
this.rarity = '';
this.level = 0;
//邦布使用透明图
this.bangboo_rectangle_url = BLANK_IMAGE;
return;
}
this.id = data.id;
this.rarity = data.rarity;
this.level = data.level;
this.bangboo_rectangle_url = data.bangboo_rectangle_url;
}
async get_assets() {
const bangboo_rectangle_b64 = await request
.get(this.bangboo_rectangle_url, {}, { responseType: 'arraybuffer' })
.then(response => response.arrayBuffer())
.then(
buffer =>
`data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
);
this.bangboo_rectangle_url = bangboo_rectangle_b64;
}
}
/**
* @class DeadBuffer.
*/
export class DeadBuffer {
/**
* @param {DeadBuffer} data
*/
constructor(data) {
this.desc = data.desc;
this.icon = data.icon;
this.name = data.name;
}
async get_assets() {
const icon_b64 = await request
.get(this.icon, {}, { responseType: 'arraybuffer' })
.then(response => response.arrayBuffer())
.then(
buffer =>
`data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
);
this.icon = icon_b64;
}
}
/**
* @class Bos.
*/
export class Bos {
/**
* @param {Bos} data
*/
constructor(data) {
this.race_icon = data.race_icon;
this.icon = data.icon;
this.name = data.name;
this.bg_icon = data.bg_icon;
}
async get_assets() {
const race_icon_b64 = request
.get(this.race_icon, {}, { responseType: 'arraybuffer' })
.then(response => response.arrayBuffer())
.then(
buffer =>
`data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
);
const icon_b64 = request
.get(this.icon, {}, { responseType: 'arraybuffer' })
.then(response => response.arrayBuffer())
.then(
buffer =>
`data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
);
const bg_icon_b64 = request
.get(this.bg_icon, {}, { responseType: 'arraybuffer' })
.then(response => response.arrayBuffer())
.then(
buffer =>
`data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
);
const all = await Promise.all([race_icon_b64, icon_b64, bg_icon_b64]);
this.race_icon = all[0];
this.icon = all[1];
this.bg_icon = all[2];
}
}
/**
* @class DeadlyTime.
*/
export class DeadlyTime {
/**
* @param {DeadlyTime} data
*/
constructor(data) {
this.hour = data.hour;
this.minute = data.minute;
this.second = data.second;
this.year = data.year;
this.month = data.month;
this.day = data.day;
}
}