【问题标题】:如何向特定频道发送消息
【发布时间】:2018-12-09 17:33:00
【问题描述】:

我正在尝试使用我的 Discord 机器人向特定频道发送消息,该频道位于多个服务器中。我希望机器人在特定频道中从一台服务器接收消息并将消息发送到我的个人服务器,但我无法让它“找到”该频道。 API是否发生了变化?我也试过npm install discord.js更新。

代码:

if (message.author.id == 'XXXXX' && !mess.includes("Dank") && message.channel.id != 'XXXXX') {
  bot.channels.get('XXXXX').send('memes');
}

我尝试了一些方法,但都没有成功。

TypeError: Cannot read property 'send' of undefined
    at decideIfMention (C:\Users\XXXX\Desktop\Coding Crud\Discord Bot 2\bot.js:80:45)
    at Client.bot.on (C:\Users\XXXX\Desktop\Coding Crud\Discord Bot 2\bot.js:68:3)
    at emitOne (events.js:116:13)
    at Client.emit (events.js:211:7)
    at MessageCreateHandler.handle (C:\Users\XXXX\Desktop\Coding Crud\Discord Bot 2\node_modules\discord.js\src\client\websocket\packets\handlers\MessageCreate.js:9:34)
    at WebSocketPacketManager.handle (C:\Users\XXXX\Desktop\Coding Crud\Discord Bot 2\node_modules\discord.js\src\client\websocket\packets\WebSocketPacketManager.js:103:65)
    at WebSocketConnection.onPacket (C:\Users\XXXX\Desktop\Coding Crud\Discord Bot 2\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:333:35)
    at WebSocketConnection.onMessage (C:\Users\XXXX\Desktop\Coding Crud\Discord Bot 2\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:296:17)
    at WebSocket.onMessage (C:\Users\XXXX\Desktop\Coding Crud\Discord Bot 2\node_modules\ws\lib\event-target.js:120:16)
    at emitOne (events.js:116:13)

【问题讨论】:

  • 问题正如它所说,.send() 未定义。我建议调试,首先尝试查看是否所有节点模块都已实际加载。然后,我建议实际上以某种方式记录 .send 的值。
  • 假设你有client 尝试做const channel = client.channels.find('name', channelName) 然后channel.send(message)
  • @GMaiolo 我不想使用它,因为在创建两个同名通道的情况下,它可能会出现故障,尽管我相信有一种方法可以指定“公会”。无论哪种方式,我都会在不和谐服务器重新上线时尝试一下。 >.

标签: javascript bots channel discord.js


【解决方案1】:

如果您使用的是 typescript,则需要在 Channel 上进行类型转换。所以你可以在 TextChannel 中转换它并发送消息

const channel = client.channels.cache.find(ch => ch.name === 'compras');

if (channel.isText() {
    (<TextChannel> channel).send('message')
}

【讨论】:

  • 你需要投吗? isText() 不是类型守卫吗?该守卫检查的所有类型都实现了send 函数。
  • @Gibbo 正确。演员阵容是不必要的。 const channel = client.channels.cache.get('xxxx') if (channel?.isText()) { channel.send(/* ... */) }
  • 在我的情况下,即使使用 isText 我也收到一条错误消息,说频道没有发送。唯一可行的方法是使用演员表:(
【解决方案2】:

好吧,如果你有 Discord.Client() 的“client”实例,那么使用这个:

解决方案已更新以使用较新的 discordjs 版本

client.channels.cache.get(`channelID`).send(`Text`)

不要忘记 channeID 参数是字符串类型,而不是数字。它非常简单而精确。

【讨论】:

  • “频道”类型上不存在属性“发送”.ts(2339)
【解决方案3】:

假设您有client(这将是Discord.Client 的一个实例)尝试使用Client.find 找到所需的频道:

const channel = client.channels.cache.find(channel => channel.name === channelName)
channel.send(message)

如果您没有直接拥有client,但拥有message 实例,则始终可以从Message.client 属性中访问它。

【讨论】:

  • 目前收到此错误Property 'send' does not exist on type 'Channel'.
  • 您需要TextChannel 才能发送。
猜你喜欢
  • 2021-01-01
  • 2021-08-09
  • 2020-07-02
  • 2021-08-21
  • 2020-04-04
  • 2022-01-08
  • 2021-01-26
相关资源
最近更新 更多