我的 Discord 机器人的可自定义欢迎频道功能不起作用,它看起来像是 MongoDB 的问题,但我无法弄清楚
Posted
技术标签:
【中文标题】我的 Discord 机器人的可自定义欢迎频道功能不起作用,它看起来像是 MongoDB 的问题,但我无法弄清楚【英文标题】:My customizable welcome channel feature for my Discord bot isn't working, it looks like a problem with MongoDB but I'm unable to figure it out 【发布时间】:2021-11-22 23:57:25 【问题描述】:我的 Discord 机器人的可自定义欢迎频道功能无法正常工作。我使用 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)
请帮帮我,提前谢谢!
【问题讨论】:
欢迎来到 Stack Overflow!请不要发布大量代码或完整的错误消息,尽量更具体,以便我们更好更快地为您提供帮助。 你能不能 console.log(data) @Zeroconsole.log(data)
console.log(welcomeData[member.guild.id])
我在data[0].send
行上方插入了这些代码行,它记录了[ undefined, undefined ]
[ undefined, undefined ]
当然,很明显它无法推送数据本身,所以你可能想调试并检查你的实际猫鼬连接中发生了什么,为什么数据undefined
【参考方案1】:
将const welcomeChannelId, welcomeText = results
替换为const welcomeChannelId, welcomeText = results[0]
,因为结果是一个数组
或
使用const results = await schema.findOne( _id: member.guild.id )
让results
只是一个对象
【讨论】:
【参考方案2】:这可能是因为 data 是一个数组/对象并且没有发送方法。您需要先找到频道,然后再发送类似
的内容const channel = await client.channels.fetch(welcomeChannelId);
【讨论】:
但我确实这样做了,我使用 id 获取频道并将 频道 存储在data[0]
可以,但不能发送到字符串。您需要在 discord.js 中获取频道才能发送给它【参考方案3】:
这意味着message
是nullish。确保论点确实存在。有3种方式:
-
使斜线命令选项必需(推荐)
如果找不到参数,则提前返回
if (!message) return; //after the 'message' declaration
-
设置默认值,这里使用logical OR operator(nullish coalescing operator 也可以)
const message = await interaction.options.getString('message') || "Welcome to the server!"
【讨论】:
但是channel
和message
都是必需的,那么为什么会出现错误?
您是否正确设置了标签?
wdym by "label"?
你能展示一下你是如何创建斜杠命令而不是架构的吗?
我提供了setwelcome.js
文件,这是我的斜杠cmd文件以上是关于我的 Discord 机器人的可自定义欢迎频道功能不起作用,它看起来像是 MongoDB 的问题,但我无法弄清楚的主要内容,如果未能解决你的问题,请参考以下文章
使用 tweepy 和 discord.py 将推文发布到特定频道
使用 Discord.js 使用 Discord Bot 将语音频道中的所有人静音