我的 Discord 机器人的可自定义欢迎频道功能不起作用,它看起来像是 MongoDB 的问题,但我无法弄清楚



我的自定义欢迎频道功能不工作。我使用MongoDB,所以我可以使它可定制的每台服务器。

有3个相关文件:welcome.js(我的模式文件),guildMemberAdd.js(我的事件文件)和setwelcome.js(我用来设置欢迎通道的命令)

welcome.js文件:

const mongoose = require('mongoose');

const schema = mongoose.Schema({
_id: {
type: String,
required: true
},
welcomeChannelId: {
type: String,
required: true
},
welcomeText: {
type: String,
required: true
}
});
module.exports = mongoose.model('welcome', schema);

guildMemberAdd.js文件:

const { MessageEmbed } = require('discord.js');
const schema = require('../models/welcome.js')
const welcomeData = {}
module.exports = {
name: 'guildMemberAdd',
async execute(member) {
const g = member.guild;
const ms = require('ms');
const timeSpan = ms('10 days');
//Alt detection
const createdAt = new Date(member.user.createdAt).getTime();
const difference = Date.now() - createdAt;
if (difference < timeSpan) {
member.send('Bye, alt.');
member.ban({ reason: 'This is an alt.' });
}
//Welcome Users

let data = welcomeData[member.guild.id]
if (!data) {
const results = await schema.find({
_id: member.guild.id
})
if (!results) {
return
}
const { welcomeChannelId, welcomeText } = results
const channel = member.guild.channels.cache.get(welcomeChannelId)
data = welcomeData[member.guild.id] = [channel, welcomeText]
}
data[0].send({
content: data[1].replace(/@/g, `<@${member.id}>`)
})

},
};
setwelcome.js

文件

const { MessageEmbed } = require('discord.js');
const schema = require('../../models/welcome.js')
module.exports = {
name: 'setwelcome',
description: 'Sets the welcome message for the server.',
options: [{
name: 'channel',
description: 'The channel to set as the welcome channel.',
type: 'CHANNEL',
required: true
},
{
name: 'message',
description: 'The welcome message.',
type: 'STRING',
required: true
}],
async execute(interaction) {
const channel = await interaction.options.getChannel('channel')
const message = await interaction.options.getString('message')
if (
channel.type !== 'GUILD_TEXT' &&
channel.type !== 'GUILD_NEWS' &&
channel.type !== 'GUILD_NEWS_THREAD' &&
channel.type !== 'GUILD_PUBLIC_THREAD' &&
channel.type !== 'GUILD_PRIVATE_THREAD'
)
return interaction.reply('That is not a valid channel type.');

await schema.findOneAndUpdate({
_id: interaction.guild.id,
},
{
_id: interaction.guild.id,
welcomeChannelId: channel.id,
welcomeText: message   
},
{
upsert: true
})
await interaction.reply(`Welcome channel is set to ${channel} and welcome message is set to `${message}`.`)
},
};

当一个新成员加入公会时,它抛出这个错误:

/home/runner/MultiBot/events/guildMemberAdd.js:38
data[0].send({
^
TypeError: Cannot read properties of undefined (reading 'send')
at Object.execute (/home/runner/MultiBot/events/guildMemberAdd.js:38:13)
at processTicksAndRejections (node:internal/process/task_queues:96:5)

请帮助我,提前感谢!

这意味着message为空。确保论点确实存在。有三种方法:

  1. 使斜杠命令选项必需(推荐)
  2. 如果没有找到参数,则提前返回
if (!message) return; //after the 'message' declaration
  1. 设置一个默认值,这使用逻辑或运算符(null合并运算符也足够了)
const message = await interaction.options.getString('message') || "Welcome to the server!"

这可能是因为data是一个数组/对象,没有send方法。您需要在使用

之类的内容发送之前找到通道。
const channel = await client.channels.fetch(welcomeChannelId);

const { welcomeChannelId, welcomeText } = results替换为const { welcomeChannelId, welcomeText } = results[0],因为结果是数组

const results = await schema.findOne({ _id: member.guild.id })使用让results只能是一个对象

最新更新