feat: 增加全局和个人提醒时间

This commit is contained in:
Qian23333 2025-08-15 16:16:28 +08:00
parent b923ffa7fb
commit 9b88b14353
4 changed files with 145 additions and 49 deletions

View file

@ -2,6 +2,8 @@ import settings from '../../lib/settings.js';
import { rulePrefix } from '../../lib/common.js';
import { ZZZPlugin } from '../../lib/plugin.js';
const USER_CONFIGS_KEY = 'ZZZ:REMIND:USER_CONFIGS';
export class RemindManage extends ZZZPlugin {
constructor() {
super({
@ -11,19 +13,83 @@ export class RemindManage extends ZZZPlugin {
priority: 40, // 管理插件优先级较高
rule: [
{
reg: `${rulePrefix}设置提醒时间\\s*(.+)`,
fnc: 'setCron',
reg: `${rulePrefix}设置全局提醒\\s*(每日\\d+时|每周.\\d+时)`,
fnc: 'setGlobalRemind',
permission: 'master',
},
{
reg: `${rulePrefix}(设置|修改)个人提醒时间\\s*(每日\\d+时|每周.\\d+时)`,
fnc: 'setMyRemindTime',
},
{
reg: `${rulePrefix}个人提醒时间$`,
fnc: 'viewMyRemindTime',
},
{
reg: `${rulePrefix}取消个人提醒时间`,
fnc: 'deleteMyRemindTime',
},
],
});
}
async setCron() {
const match = this.e.msg.match(/设置提醒时间\s*(.+)/);
async getUserConfig(userId) {
const userConfigJson = await redis.hGet(USER_CONFIGS_KEY, String(userId));
return userConfigJson ? JSON.parse(userConfigJson) : null;
}
async setUserConfig(userId, config) {
await redis.hSet(USER_CONFIGS_KEY, String(userId), JSON.stringify(config));
}
async setGlobalRemind() {
const match = this.e.msg.match(/(每日\d+时|每周.\d+时)/);
if (!match) return;
const cron = match.trim();
settings.setSingleConfig('remind', 'cron', cron);
await this.reply(`式舆防卫战/危局强袭战提醒的定时任务已更新为: ${cron}`);
const remindTime = match.trim();
// 将全局提醒时间写入yaml配置
settings.setConfig('remind.globalRemindTime', remindTime);
await this.reply(`全局提醒时间已更新为: ${remindTime}`);
}
async setMyRemindTime() {
const match = this.e.msg.match(/(每日\d+时|每周.\d+时)/);
if (!match) return;
const remindTime = match.trim();
let userConfig = await this.getUserConfig(this.e.user_id);
if (!userConfig) {
const defaultConfig = settings.getConfig('remind');
userConfig = {
enable: false,
abyssCheckLevel: defaultConfig.abyssCheckLevel,
deadlyStars: defaultConfig.deadlyStars,
};
}
userConfig.remindTime = remindTime;
await this.setUserConfig(this.e.user_id, userConfig);
await this.reply(`您的个人提醒时间已设置为: ${remindTime}`);
}
async viewMyRemindTime() {
const userConfig = await this.getUserConfig(this.e.user_id);
if (userConfig && userConfig.remindTime) {
await this.reply(`当前提醒时间: ${userConfig.remindTime}`);
} else {
const globalRemindTime = settings.getConfig('remind.globalRemindTime') || '每日20时';
await this.reply(`个人提醒时间未设置,默认使用全局时间: ${globalRemindTime}`);
}
}
async deleteMyRemindTime() {
let userConfig = await this.getUserConfig(this.e.user_id);
if (userConfig && userConfig.remindTime) {
delete userConfig.remindTime;
await this.setUserConfig(this.e.user_id, userConfig);
await this.reply('个人提醒时间已取消');
} else {
await this.reply('个人提醒时间尚未设置');
}
}
}

View file

@ -38,16 +38,14 @@ export class Remind extends ZZZPlugin {
],
});
const globalRemindConfig = settings.getConfig('remind');
if (globalRemindConfig.enable) {
this.task = {
name: 'ZZZ-Plugin式舆防卫战/危局强袭战提醒任务',
cron: this.getCron(),
cron: '0 * * * *', // 每小时的第0分钟执行
fnc: () => this.runTask(),
};
}
getCron() {
const remindConfig = settings.getConfig('remind');
return _.get(remindConfig, 'cron', '0 30 20 * * ? *');
}
async getUserConfig(userId) {
@ -59,6 +57,31 @@ export class Remind extends ZZZPlugin {
await redis.hSet(USER_CONFIGS_KEY, String(userId), JSON.stringify(config));
}
isTimeMatch(remindTime, date) {
if (!remindTime) return false;
const currentHour = date.getHours();
const currentDay = date.getDay(); // 0 = 周日, 1 = 周一, ..., 6 = 周六
if (remindTime.includes('每日')) {
const match = remindTime.match(/每日(\d+)时/);
if (match) {
const hour = parseInt(match, 10);
return currentHour === hour;
}
} else if (remindTime.includes('每周')) {
const dayMap = { '日': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6 };
const match = remindTime.match(/每周(.)(\d+)时/);
if (match) {
const dayChar = match;
const hour = parseInt(match, 10);
const day = dayMap[dayChar];
return currentDay === day && currentHour === hour;
}
}
return false;
}
async subscribe() {
const uid = await this.getUID();
if (!uid) {
@ -221,17 +244,23 @@ export class Remind extends ZZZPlugin {
logger.info('[ZZZ-Plugin] 开始执行式舆防卫战/危局强袭战提醒任务');
const allUserConfigs = await redis.hGetAll(USER_CONFIGS_KEY);
const now = new Date();
const globalRemindTime = globalRemindConfig.globalRemindTime || '每日20时';
for (const userId in allUserConfigs) {
const userConfig = JSON.parse(allUserConfigs[userId]);
if (!userConfig.enable) continue;
const remindTime = userConfig.remindTime || globalRemindTime;
if (this.isTimeMatch(remindTime, now)) {
const messages = await this.checkUser(userId, userConfig);
if (messages.length > 0) {
const user = Bot.pickUser(userId);
await user.sendMsg(messages.join('\n'));
}
}
}
logger.info('[ZZZ-Plugin] 式舆防卫战/危局强袭战提醒任务执行完毕');
}
}

View file

@ -1,4 +1,4 @@
enable: true # 功能总开关
cron: 0 30 20 * * ? * # 定时任务cron表达式默认每天晚上8:30
globalRemindTime: '每日20时' # 全局提醒时间,用于没有个人设置的用户
abyssCheckLevel: 7 # 式舆防卫战提醒检查的最高关卡用户可自行设置最高为7
deadlyStars: 6 # 危局强袭战星星阈值

View file

@ -205,22 +205,23 @@ export function supportGuoba() {
component: 'Switch',
},
{
field: 'remind.cron',
label: '提醒时间',
bottomHelpMessage: '设置新用户订阅时的默认Cron表达式',
component: 'EasyCron',
field: 'remind.globalRemindTime',
label: '全局提醒时间',
bottomHelpMessage: '设置全局默认提醒时间,格式如"每日20时"或"每周一20时"',
component: 'Input',
componentProps: {
placeholder: '请输入或选择cron表达式',
placeholder: '请输入提醒时间,如"每日20时"',
},
},
{
field: 'remind.abyssSCount',
field: 'remind.abyssCheckLevel',
label: '默认式舆S评级阈值',
bottomHelpMessage: '新用户订阅时S评级数量低于此值会收到提醒',
component: 'InputNumber',
componentProps: {
min: 0,
placeholder: '请输入数字',
min: 1,
max: 7,
placeholder: '请输入数字(1-7)',
},
},
{