javascript - Discord bot 在用户响应后无意中发送垃圾邮件
问题描述
我正在制作一个不和谐的机器人,它基本上检测用户在消息中发送的单词,它会回复一条消息。但问题是我的机器人正在发送垃圾邮件而不是只发送一次。我不确定发生了什么,我在整个互联网上寻找解决方案但找不到解决方案,这就是我来这里寻求帮助的原因。
let Discord;
let Database;
if(typeof window !== "undefined"){
Discord = DiscordJS;
Database = EasyDatabase;
} else {
Discord = require("discord.js");
Database = require("easy-json-database");
}
const delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));
const s4d = {
Discord,
client: null,
tokenInvalid: false,
reply: null,
joiningMember: null,
database: new Database("./db.json"),
checkMessageExists() {
if (!s4d.client) throw new Error('You cannot perform message operations without a Discord.js client')
if (!s4d.client.readyTimestamp) throw new Error('You cannot perform message operations while the bot is not connected to the Discord API')
}
};
s4d.client = new s4d.Discord.Client({
fetchAllMembers: true
});
s4d.client.on('raw', async (packet) => {
if(['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)){
const guild = s4d.client.guilds.cache.get(packet.d.guild_id);
if(!guild) return;
const member = guild.members.cache.get(packet.d.user_id) || guild.members.fetch(d.user_id).catch(() => {});
if(!member) return;
const channel = s4d.client.channels.cache.get(packet.d.channel_id);
if(!channel) return;
const message = channel.messages.cache.get(packet.d.message_id) || await channel.messages.fetch(packet.d.message_id).catch(() => {});
if(!message) return;
s4d.client.emit(packet.t, guild, channel, message, member, packet.d.emoji.name);
}
});
s4d.client.login('tokenNumber').catch((e) => { s4d.tokenInvalid = true; s4d.tokenError = e; });
s4d.client.on('message', (s4dmessage) => {
if (s4dmessage.content.includes('oranges')) {
s4dmessage.channel.send(String('Yum! I love eating oranges!'));
}
}
);
s4d;
解决方案
您的机器人会检查消息中是否包含“orange”一词,如果包含,则发送它喜欢吃orange的响应。由于响应还包含单词"orange",您的机器人会重复此功能,直到您受到速率限制。
确保检查消息作者是否是机器人,如果是,只需使用以下命令退出return
:
s4d.client.on('message', (s4dmessage) => {
if (s4dmessage.author.bot) return;
if (s4dmessage.content.includes('oranges')) {
s4dmessage.channel.send(String('Yum! I love eating oranges!'));
}
});
推荐阅读
- c# - 插入值后刷新 DataGridView
- sql-server - SQL Server 未捕获链接服务器超时错误
- ios - UISplitViewController - 在 iPad Portrait 中展开和折叠主视图
- python - 为什么列表推导不适用于使用等号更新字典元素
- pandas - 回填和增量一?
- swift - 在将 textField 传递给函数之前如何测试它是否为空:
- python - 当 content_type 是字典时,单元测试很热门
- node.js - 大文件不会传输到 Elastic Beanstalk 托管应用程序
- javascript - 覆盖 JS 原型函数
- networking - 客户端在 ftp 活动模式下启动数据连接?