feat: 刷新角色间隔,防止刷新太快导致IP黑名单

This commit is contained in:
bietiaop 2025-01-12 14:10:02 +08:00
parent 1dd7fe9fb5
commit 13f44a258e
4 changed files with 45 additions and 9 deletions

View file

@ -40,6 +40,10 @@ export class Panel extends ZZZPlugin {
reg: `${rulePrefix}刷新面板间隔(\\d+)$`,
fnc: 'setRefreshPanelInterval',
},
{
reg: `${rulePrefix}刷新角色间隔(\\d+)$`,
fnc: 'setRefreshCharInterval',
},
{
reg: `${rulePrefix}添加(\\S+)别名(\\S+)$`,
fnc: 'addAlias',
@ -94,6 +98,7 @@ export class Panel extends ZZZPlugin {
this.setRenderPrecision = manage.config.setRenderPrecision;
this.setRefreshGachaInterval = manage.config.setRefreshGachaInterval;
this.setRefreshPanelInterval = manage.config.setRefreshPanelInterval;
this.setRefreshCharInterval = manage.config.setRefreshCharInterval;
this.addAlias = manage.alias.addAlias;
this.deleteAlias = manage.alias.deleteAlias;
this.uploadCharacterImg = manage.panel.uploadCharacterImg;

View file

@ -83,3 +83,29 @@ export async function setRefreshPanelInterval() {
{ at: true, recallMsg: 100 }
);
}
/** 设置角色刷新间隔 */
export async function setRefreshCharInterval() {
if (!this.e.isMaster) {
this.reply('仅限主人设置', false, { at: true, recallMsg: 100 });
return false;
}
const match = /刷新角色间隔(\d+)$/g.exec(this.e.msg);
const refresh_char_interval = Number(match[1]);
if (refresh_char_interval < 0) {
await this.e.reply('刷新角色间隔不能小于0秒', false, {
at: true,
recallMsg: 100,
});
return false;
}
if (refresh_char_interval > 1000) {
await this.e.reply('刷新角色间隔不能大于1000秒', false, {
at: true,
recallMsg: 100,
});
return false;
}
settings.setSingleConfig('panel', 'roleInterval', refresh_char_interval);
await this.e.reply(`绝区零刷新角色间隔已设置为: ${refresh_char_interval}`);
}

View file

@ -1 +1,2 @@
interval: 60 # 刷新面板的时间间隔(单位:秒)
roleInterval: 3 # 查询每个角色的间隔时间(单位:秒)

View file

@ -2,6 +2,8 @@ import { ZZZAvatarBasic, ZZZAvatarInfo } from '../model/avatar.js';
import MysZZZApi from './mysapi.js';
import { getPanelData, savePanelData } from './db.js';
import { char } from './convert.js';
import _ from 'lodash';
import settings from './settings.js';
/**
* 获取角色基础信息列表
@ -33,15 +35,17 @@ export const getAvatarInfoList = async (api, origin = false) => {
const avatarBaseList = await getAvatarBasicList(api, origin);
if (!avatarBaseList) return null;
// 获取角色详细信息列表
const avatarInfoList = await Promise.all(
avatarBaseList.map(item =>
api.getFinalData('zzzAvatarInfo', {
query: {
id_list: [item.id],
},
})
)
).then(data => data.map(item => item.avatar_list[0]));
const avatarInfoList = [];
for (const item of avatarBaseList) {
const data = await api.getFinalData('zzzAvatarInfo', {
query: {
id_list: [item.id],
},
});
avatarInfoList.push(data.avatar_list[0]);
const time = _.get(settings.getConfig('panel'), 'roleInterval', 3) * 1000;
await new Promise(resolve => setTimeout(resolve, time));
}
if (!avatarInfoList?.length) return null;
// 是否返回原始数据
if (origin) return avatarInfoList;