我正在 VSC 中使用 Discord.js 编写一个 Discord 机器人,除了一个命令之外的所有命令都在响应,这是我正在尝试创建的票证命令

2023-12-29

我目前正在编写一个完整的 AIO Discord 机器人,例如您看到的“Dyno Bot”或“Carl Bot”,并且我已经完成了基本命令的制作,例如ping, avatar, etc.

我将继续讨论更复杂的命令,例如票证系统命令。我已经完成了整个代码,终端可以正常登录机器人,但由于某种原因,该命令没有响应。我检查了其他命令只是为了确保这只是这个特定的命令。我确信该解决方案可能是一个愚蠢的解决方案,但我们将不胜感激。

index.js:

// Require the necessary discord.js classes
const fs = require('fs');
const { Client, Collection, Intents, DiscordAPIError } = require('discord.js');
const { token } = require('./config.json');
const prefex = '/';

const memberCounter = require('./counters/member-counter');

const client = new Client({
  intents: [
    Intents.FLAGS.GUILDS,
    Intents.FLAGS.GUILD_MESSAGES,
    Intents.FLAGS.GUILD_MESSAGE_REACTIONS,
  ],
});

client.commands = new Collection();
client.events = new Collection();
const commandFiles = fs
  .readdirSync('./commands')
  .filter((file) => file.endsWith('.js'));

for (const file of commandFiles) {
  const command = require(`./commands/${file}`);
  client.commands.set(command.name, command);
}

// When the client is ready, run this code (only once)
client.once('ready', () => {
  console.log("You are now connected to Boombap's Cookout!");
  memberCounter(client);
});

client.on('interactionCreate', async (interaction) => {
  if (!interaction.isCommand()) return;

  const command = client.commands.get(interaction.commandName);

  if (!command) return;

  try {
    await command.execute(interaction);
  } catch (error) {
    console.error(error);
    return interaction.reply({
      content: 'There was an error while executing this command!',
      ephemeral: true,
    });
  }
});

// Login to Discord with your client's token
client.login(token);

ticket.js

module.exports = {
  name: 'ticket',
  aliases: [],
  permissions: [],
  description: 'open a ticket!',
  async execute(message, args, cmd, client, discord) {
    const channel = await message.guild.channels.create(
      `ticket: ${message.author.tag}`,
    );

    channel.setParent('932184344011898890');

    channel.updateOverwrite(message.guild.id, {
      SEND_MESSAGE: false,
      VIEW_CHANNEL: false,
    });
    channel.updateOverwrite(message.author, {
      SEND_MESSAGE: true,
      VIEW_CHANNEL: true,
    });

    const reactionMessage = await channel.send(
      'Thank you for contacting support!',
    );

    try {
      await reactionMessage.react('????');
      await reactionMessage.react('⛔');
    } catch (err) {
      channel.send('Error sending emojis!');
      throw err;
    }

    const collector = reactionMessage.createReactionCollector(
      (reaction, user) =>
        message.guild.members.cache
          .find((member) => member.id === user.id)
          .hasPermission('ADMINISTRATOR'),
      { dispose: true },
    );

    collector.on('collect', (reaction, user) => {
      switch (reaction.emoji.name) {
        case '????':
          channel.updateOverwrite(message.author, { SEND_MESSAGES: false });
          break;
        case '⛔':
          channel.send('Deleting this channel in 5 seconds!');
          setTimeout(() => channel.delete(), 5000);
          break;
      }
    });

    message.channel
      .send(`We will be right with you! ${channel}`)
      .then((msg) => {
        setTimeout(() => msg.delete(), 7000);
        setTimeout(() => message.delete(), 3000);
      })
      .catch((err) => {
        throw err;
      });
  },
};

看来您正在使用 discord.js 的 v13,并且仍然具有一些 v12 语法。

First, channel.updateOverwrite() is channel.permissionOverwrites.edit() https://discord.js.org/#/docs/main/stable/class/PermissionOverwriteManager?scrollTo=edit现在。第二,member.hasPermission() became member.permissions.has() https://discord.js.org/#/docs/main/stable/class/Permissions?scrollTo=has与最新的主要更新。您可以阅读有关这些更改的更多信息Discordjs. 指南 https://discordjs.guide/additional-info/changes-in-v13.html.

另一个错误是您正在使用SEND_MESSAGE标志,但它是SEND_MESSAGES。还有一个,你正在使用filter for createReactionCollector https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=createReactionCollector错误地。

查看下面的代码,它对我来说效果很好:

module.exports = {
  name: 'ticket',
  aliases: [],
  permissions: [],
  description: 'open a ticket!',
  async execute(message, args, cmd, client, discord) {
    const channel = await message.guild.channels.create(
      `ticket: ${message.author.tag}`,
    );

    channel.setParent('932184344011898890');

    channel.permissionOverwrites.edit(message.guild.id, {
      SEND_MESSAGES: false,
      VIEW_CHANNEL: false,
    });
    channel.permissionOverwrites.edit(message.author, {
      SEND_MESSAGES: true,
      VIEW_CHANNEL: true,
    });

    const reactionMessage = await channel.send(
      'Thank you for contacting support!',
    );

    try {
      await reactionMessage.react('????');
      await reactionMessage.react('⛔');
    } catch (err) {
      channel.send('Error sending emojis!');
      throw err;
    }

    const filter = (reaction, user) =>
      message.guild.members.cache
        .find((member) => member.id === user.id)
        .permissions.has('ADMINISTRATOR');

    const collector = reactionMessage.createReactionCollector({
      dispose: true,
      filter,
    });

    collector.on('collect', (reaction, user) => {
      switch (reaction.emoji.name) {
        case '????':
          channel.permissionOverwrites.edit(message.author, { SEND_MESSAGES: false });
          break;
        case '⛔':
          channel.send('Deleting this channel in 5 seconds!');
          setTimeout(() => channel.delete(), 5000);
          break;
      }
    });

    message.channel
      .send(`We will be right with you! ${channel}`)
      .then((msg) => {
        setTimeout(() => msg.delete(), 7000);
        setTimeout(() => message.delete(), 3000);
      })
      .catch((err) => {
        throw err;
      });
  },
};

清理原始代码后,我注意到您正在使用斜杠命令。这意味着你必须做出很多小改变。还有你原来的execute()接收多个参数的方法(async execute(message, args, cmd, client, discord)) 只收到一个;intereaction.

这是用作斜杠命令的代码,我添加了一些注释来解释更改:

module.exports = {
  name: 'ticket',
  aliases: [],
  permissions: [],
  description: 'open a ticket!',
  async execute(interaction) {
    // message.guild is now interaction.guild
    const channel = await interaction.guild.channels.create(
      // message.author.tag is now interaction.user.tag
      `ticket: ${interaction.user.tag}`,
    );

    channel.setParent('932184344011898890');

    // message.guild is now interaction.guild
    channel.permissionOverwrites.edit(interaction.guild.id, {
      SEND_MESSAGES: false,
      VIEW_CHANNEL: false,
    });

    // message.author is now interaction.member
    channel.permissionOverwrites.edit(interaction.member, {
      SEND_MESSAGES: true,
      VIEW_CHANNEL: true,
    });

    // we're sending a reply with interaction.reply
    // and use fetchReply so we can delete it after 7 seconds
    const reply = await interaction.reply({
      content: `We will be right with you! ${channel}`,
      fetchReply: true,
    });

    setTimeout(() => {
      reply.delete();
    }, 7000);

    const reactionMessage = await channel.send(
      'Thank you for contacting support!',
    );

    try {
      await reactionMessage.react('????');
      await reactionMessage.react('⛔');
    } catch (err) {
      channel.send('Error sending emojis!');
      throw err;
    }
    // you should also check if the user reacted is a bot
    const filter = (reaction, user) =>
      !user.bot &&
      interaction.guild.members.cache
        .get(user.id)
        .permissions.has('ADMINISTRATOR');

    const collector = reactionMessage.createReactionCollector({
      dispose: true,
      filter,
    });

    collector.on('collect', (reaction, user) => {
      switch (reaction.emoji.name) {
        case '????':
          channel.permissionOverwrites.edit(interaction.member, {
            SEND_MESSAGES: false,
          });
          break;
        case '⛔':
          channel.send('Deleting this channel in 5 seconds!');
          setTimeout(() => channel.delete(), 5000);
          break;
      }
    });
  },
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我正在 VSC 中使用 Discord.js 编写一个 Discord 机器人,除了一个命令之外的所有命令都在响应,这是我正在尝试创建的票证命令 的相关文章

随机推荐

  • 安装 APK 时出现 DELETE_FAILED_INTERNAL_ERROR 错误

    I am using Android Studio 2 2 Preview I am facing the issue 失败 安装失败无效的apk 错误 安装 apk 时 我已经在 build gradle 中进行了更改 但无法重新跟踪它
  • ng-grid 支持虚拟滚动吗?

    我想在我的应用程序中使用 Slickgrid 来实现网格功能 但由于我大部分时间都使用 AngularJS 我认为 ng grid 是可行的方法 但不确定它是否支持虚拟滚动 我尝试查看他们的文档和没有找到任何有关虚拟滚动支持的信息 如果可能
  • 如何在一定时间限制后调用另一个活动

    如何为将一项活动调用另一项活动设定时间限制 我想在给定的时间限制内调用另一个活动 例如 将 A 类呼叫到 B 类 我使用了alarmManager 但我的应用程序不可能也使用线程 每当我给出Thread sleep时 它都不会执行操作 直到
  • 为什么使用单例而不是静态方法?

    对于这些有关帮助器 实用程序类的简单问题 我从未找到好的答案 为什么我要创建一个单例 无状态 而不是使用静态方法 如果对象没有状态 为什么还需要对象实例 通常 单例用于引入某种全局状态到一个应用程序 老实说 这种情况经常超出真正必要的范围
  • 函数声明中缺少“虚拟”限定符

    在搜寻一些旧代码时 我遇到了类似于以下内容的内容 class Base public virtual int Func class Derived public Base public int Func Missing virtual qu
  • 使用 Apache CXF 的 JAX-RS 文件上传

    我正在尝试使用 JAX RS 和 TomEE 的 Apache CXF 实现 2 6 14 上传文件 但上传的文件始终为空 这是代码 POST Path upload Consumes MediaType MULTIPART FORM DA
  • 使用 XAML 将故事板完成时元素的可见性设置为折叠

    我有一个故事板动画 它使用不透明度属性使控件淡出视图 完成后 我想将控件的可见性设置为折叠 我也希望能够执行相反的操作 将可见性设置为可见 然后使用故事板将控件淡入视图中 我知道我可以连接事件 但我想在 XAML 中完成这一切 是否可以 你
  • 如何从 git 存储库加载最新的 Clojure 库

    我想使用最新的开发版本clojure data xml 我正在使用 Leiningen 来管理依赖项 但是 存储库中没有 SNAPSHOT 版本Central http search maven org search 7Cgav 7C1 7
  • Common Lisp 双反引号、反引号、引号、反引号序列?

    我正在阅读 Let Over Lambda 它涉及一些非常深入的分层宏创作 这很有趣 我基本上都能跟上它的步伐 在第 4 章中 Hoyte 为 CL PPCRE 匹配和替换功能实现了读取器宏 这样您就可以执行以下操作 m foo bar d
  • 如何围绕 Web Workers API 编写 Promise 包装器?

    我正在编写一个使用 Web Workers 的库 库的使用者不应该看到任何 Web Worker 的内容 而应该从该库的公共方法返回一个 Promise 如下所示 consumer js const api new Api api doCa
  • timer_create() : -1 EAGAIN(资源暂时不可用)

    我在运行 ARM 的嵌入式 Linux 下创建计时器时遇到问题 我正在使用自制的 C 库来管理计时器 我自己没有编写代码 尽管我可以访问源代码 但我并不深入了解其实现 它工作了一段时间 然后我收到错误 EAGAIN 使用 strace 我注
  • 在急切加载中过滤导航属性

    我一直在使用软删除 现在我想加载未 删除 的实体的导航属性 我找到了一种方法 这种方法的问题对我来说并不清晰 还有另一种方法可以做到这一点 Context CreateSet Include Salary Select u gt new U
  • java.util.MissingResourceException:找不到基本名称 javax.servlet.LocalStrings、区域设置 es_ES 的包

    我试图在我的一个 servlet 中执行一些 jUnit 测试 但每当我尝试运行它时 我都会收到 ExceptionInInitializerError 我读到此错误是由于在评估静态初始值设定项或静态变量的初始值设定项期间发生的异常所致 问
  • Adobe Air mobile - 使用 SkinClass 允许滚动时,softKeyboardType 不起作用?

    我正在尝试将 softKeyboardType 设置为电子邮件 但当我使用 SkinClass spark skins mobile TextAreaSkin 时 它不会改变它 但当我脱掉 SkinClass spark skins mob
  • 摘要不适用于 OLS 估计

    我的 statsmodels OLS 估计有问题 该模型运行没有任何问题 但是当我尝试调用摘要以便我可以看到实际结果时 当 a 的形状和权重不同时 我得到需要指定的轴的 TypeError 我的代码如下所示 from future impo
  • iOS 协议/委托混淆?

    这一切都是我的第一篇文章 我会尽力做到尽可能准确 我读过很多关于 iOS 协议 委托实现的文章 但所有示例都失败了 让我们说 我有 A 和 B 控制器 想将数据从 A 发送到 B 啊 protocol exampleprot
  • 修改Python 2中的URL组件

    在 Python 2 中是否有更简洁的方法来修改 URL 的某些部分 例如 http foo bar gt http foo yah 目前 我正在这样做 import urlparse url http foo bar Modify pat
  • 在栈上创建一个指针

    我正在学习 C 我有一个关于指针的问题 我有这个代码 int max new int max 0 我想 我已经在堆上创建了一个指针 如果我不对 请告诉我 一个问题 有没有一种方法可以用一条指令创建一个初始化指针 现在 我使用两条指令 另一个
  • 为什么“stackalloc”关键字不适用于属性?

    我最近用 C 编写了一些不安全的代码 注意到这会产生语法错误 public unsafe class UnsafeByteStream public UnsafeByteStream int capacity this Buffer sta
  • 我正在 VSC 中使用 Discord.js 编写一个 Discord 机器人,除了一个命令之外的所有命令都在响应,这是我正在尝试创建的票证命令

    我目前正在编写一个完整的 AIO Discord 机器人 例如您看到的 Dyno Bot 或 Carl Bot 并且我已经完成了基本命令的制作 例如ping avatar etc 我将继续讨论更复杂的命令 例如票证系统命令 我已经完成了整个