我的自定义欢迎频道功能不工作。我使用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
为空。确保论点确实存在。有三种方法:
- 使斜杠命令选项必需(推荐)
- 如果没有找到参数,则提前返回
if (!message) return; //after the 'message' declaration
- 设置一个默认值,这使用逻辑或运算符(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
只能是一个对象