当前位置: 首页 > 知识库问答 >
问题:

我为我的不和谐机器人定制的欢迎频道功能不起作用,它看起来像是MongoDB的问题,但我无法解决

宇文兴言
2023-03-14

我的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)

请帮帮我,提前感谢!

共有3个答案

宋和颂
2023-03-14

将const{WelcomChannelId, WelcomText}=结果替换为const{WelcomChannelId, WelcomText}=结果[0],因为结果是一个数组

使用constresults=wait模式。findOne({u id:member.guild.id})只有一个对象才能有结果

党宇定
2023-03-14

这可能是因为数据是数组/对象,没有发送方法。您需要先找到频道,然后再发送类似的内容

js prettyprint-override">const channel = await client.channels.fetch(welcomeChannelId);
滕项明
2023-03-14

这意味着消息无效。确保论点确实存在。有3种方法:

  1. 使斜杠命令选项必需(推荐)
  2. 如果没有找到参数,则提前返回
if (!message) return; //after the 'message' declaration
const message = await interaction.options.getString('message') || "Welcome to the server!"
 类似资料:
  • 当成员加入服务器时,bot不会以消息响应。有什么问题吗?

  • 我试图向任何使用此机器人加入我的不和谐服务器的人发出欢迎消息,但当有人加入时,不会发生任何事情。我得到一个错误:引用错误:通道名称未定义在C:\用户\Vir\桌面\DiscBot\index.js:13: 71在Map.find(C:\用户\Vir\桌面\DiscBot\node_modules\discord.js\src\util\Collection.js:506: 11)在客户端。(C:\

  • 当有人加入语音频道时,如何制作一个标记为@角色的discord机器人?示例:@role{user}已加入

  • 我希望我的不和谐机器人在特定的频道上发送消息,并在每次新用户加入服务器时提供特定的角色 但是我的机器人什么也没做,我也没有出错

  • 我正在努力解决Leetcode问题489。机器人房间清洁器使用回溯。具体来说,我尝试在四个方向中的每一个方向移动机器人,如果四个方向都被阻塞或清理,则返回。 下面的代码不起作用,我正试图用这个简单的示例对其进行调试: 其中1表示机器人可以访问单元,0表示单元被阻止。机器人从这个初始位置开始: 在我运行代码后,机器人只清洁了网格的右侧部分(c-清洁,d-左脏): 它似乎正确地返回到单元格[0,1],

  • 因此,我的discord机器人有一个数组,字符串形式的对象可以通过我发出的discord命令推送到该数组中,然后将该数组导出到另一个事件文件中,该文件将检查数组中的这些单词是否存在于消息中。 但是我遇到了一个问题,如果我添加一个单词,让我们从服务器1说“a”,然后从服务器2说“b”,然后对机器人所在的每一台服务器都检查单词a和b,这绝对不是我所说的通缉。 我尝试使用maps(),但由于某些原因,我