如何解决当检测到一个词时,不和谐机器人带有多条消息
我有一个不和谐的机器人,当一个词被说出来时就会触发,我最初让它只说一件事(原始帖子在这里供参考:Discord bot unintentionally spamming messages after user response)但我现在希望它有多个说法我使用了一个带有随机数生成器函数生成的随机数的 switch 语句,它在 switch 语句中被调用以输出消息。由于某种原因,我的代码不起作用,我不知道为什么。
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('TOKEN').catch((e) => { s4d.tokenInvalid = true; s4d.tokenError = e; });
function GetRandomInteger(a,b){
if (a > b){
small = b;
large = a;
}
else{
small = a;
large = b;
}
s4d.client.on('message',async (s4dmessage) => {
if (s4dmessage.author.bot) return;
if (s4dmessage.content.includes('apples')) {
switch(GetRandomInteger(1,5)){
case 1: s4dmessage.channel.send(String('yum I love apples!')); break;
case 2: s4dmessage.channel.send(String('apples are the best')); break;
case 3: s4dmessage.channel.send(String('did someone say apples?')); break;
case 4: s4dmessage.channel.send(String('apples are great!')); break;
case 5: s4dmessage.channel.send(String('yum yum!')); break;
}
}
});
s4d;
解决方法
正如 Fabio 提到的,您的 GetRandomInteger()
函数后面缺少一个大括号,但该函数不会返回任何内容。
您可以简单地将响应存储在一个数组中并随机选择其中一个,而不是生成一个随机整数并为 switch 语句苦苦挣扎。
这样的事情应该可以工作,而且代码要少得多:
s4d.client.on('message',async (s4dmessage) => {
if (s4dmessage.author.bot) return;
let responses = [
'yum I love apples!','apples are the best','did someone say apples?','apples are great!','yum yum!',];
if (s4dmessage.content.includes('apples')) {
s4dmessage.channel.send(getRandom(responses));
}
});
function getRandom(arr) {
let index = Math.floor(Math.random() * arr.length);
return arr[index];
}
您甚至可以更进一步,将您对不同水果的响应数组添加到对象中,其中键是水果名称,值是响应。通过这种方式,您可以检查消息是否包含密钥,并从数组中发送随机响应,其中密钥是找到的水果名称。
如果你想添加一个新的水果,你可以简单地将它添加到你的 responses
对象中,如果你想添加/删除/更新一个响应,你可以编辑相应的数组。
看看下面的例子:
s4d.client.on('message',async (s4dmessage) => {
if (s4dmessage.author.bot) return;
let responses = {
apples: [
'yum I love apples!',],kiwi: [
'??? simply the best.. ???','yummmy','kiwi,kiwi,get in my belly','am I the only one who loves kiwi?'
],oranges: [
'yum I love oranges!','I love eating oranges!','did someone mention oranges?','??? love them','yummmm!',};
// check if the message contains any of the keys of responses
// returns the key if found,undefined otherwise
let firstKeyword = Object.keys(responses).find((str) =>
s4dmessage.content.includes(str),);
if (firstKeyword) {
s4dmessage.channel.send(getRandom(responses[firstKeyword]));
} else {
// message contains no apples,or oranges
}
});
function getRandom(arr) {
let index = Math.floor(Math.random() * arr.length);
return arr[index];
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。