基于quick.db的Discord通知功能仅单用户收推送如何修复
问题根因
你当前的代码存在两个核心错误,导致只能向单个用户发送通知:
- 你从quick.db取出的
notifiedusers_${message.author.id}存储的是单个用户ID,而非所有订阅用户的ID数组,且代码没有对订阅用户列表做遍历操作,仅调用了一次client.users.cache.get()获取单个用户发送消息 - 你使用的
try-finally逻辑存在缺陷,就算发送失败也会提示「所有人都已通知」,完全没有错误捕获和批量处理的逻辑
修复步骤
1. 调整订阅用户存储逻辑
首先需要修改用户订阅通知的逻辑,将新的订阅用户ID追加到数组中存储,而非直接覆盖存储单条ID,正确的存储逻辑示例如下:
// 订阅功能逻辑示例 const targetUserId = 申请订阅的用户ID; // 取出已有的订阅用户列表,默认是空数组 let notifyUserList = db.get(`notifiedusers_${message.author.id}`) || []; // 避免重复存储同一用户 if(!notifyUserList.includes(targetUserId)) { // 追加新用户到列表 notifyUserList.push(targetUserId); // 存回数据库 db.set(`notifiedusers_${message.author.id}`, notifyUserList); }
你也可以直接使用quick.db内置的push方法简化操作:
db.push(`notifiedusers_${message.author.id}`, 申请订阅的用户ID)
2. 替换notify.js的发送逻辑
将原代码中发送通知的逻辑替换为批量遍历发送的版本,修复后的完整代码如下:
module.exports = { name: 'notify', description: '发布新版本时通知所有订阅用户', category: "通知", async execute(client, message, args, Discord) { if(message.member.user.id === '601364286731714591'){ const db = require('quick.db') // 取出所有订阅用户的ID数组 let notifyUserList = db.get(`notifiedusers_${message.author.id}`); if(notifyUserList === null || !notifyUserList.length) { return message.channel.send('当前没有用户订阅更新通知') } const content = args.join(" ") if(!content) return message.channel.send('请输入更新通知的内容') const newEmbed = new Discord.MessageEmbed() .setColor('#b5b5b5') .setTitle('更新通知') .setDescription(`${content}`) message.channel.send('正在向所有订阅用户发送通知') let failCount = 0; // 遍历所有订阅用户逐一发送 for(const userId of notifyUserList) { try { const targetUser = await client.users.fetch(userId); if(targetUser) await targetUser.send({embeds: [newEmbed]}); else failCount++; } catch(e) { failCount++; // 此处可自行添加错误日志打印逻辑 } } message.channel.send(`通知发送完毕,成功发送${notifyUserList.length - failCount}人,失败${failCount}人`); }else{ return } } }
quick.db常用操作说明
db.get(键名):获取指定键名存储的值,支持返回字符串、数字、数组、对象等所有JS基础类型db.set(键名, 存储值):给指定键名设置存储值,会覆盖原有内容db.push(键名, 追加元素):如果指定键名存储的是数组,可以直接调用该方法追加元素,不需要手动取值修改后再存回db.delete(键名):删除指定键名的存储内容
内容的提问来源于stack exchange,提问作者Lokry
相关产品推荐
相关产品推荐

