【问题标题】:discord.js sending message to specific channeldiscord.js 向特定频道发送消息
【发布时间】:2020-04-04 00:27:49
【问题描述】:

我一直在环顾四周,似乎无法找到我在使用 Typescript 制作的不和谐机器人时遇到的这个问题的答案。我将所有命令都放在他们自己的文件夹中,每个命令使用一个单独的文件。有助于使事情井井有条。

我看到有人说client.channels.get(`channelID`).send(`Text`)

但这给了我 Object is possibly 'undefined'.Property 'send' does not exist on type 'Channel'.

每当有人运行重新启动命令时,我实际上试图在每个文本频道(从列表中给出)发送一条机器人消息,因为无论出于何种原因人们不断重新启动机器人。如果有人需要使用它,我会时不时地把它作为一件有趣的事情来做。该机器人离线 3 分钟,但我不喜欢有人向它发送垃圾邮件,而且该机器人几乎无法使用。

我正在使用client.channels.get(channels.channelnames[5]).send("This is a message.")

【问题讨论】:

  • channels.channelnames[5]的内容肯定是频道ID而不是名字吗?
  • 我尝试同时使用名称和 ID。无论我放在那里,它都会作为字符串变量给出。
  • 我输入了client.channels.get(channels.channelids[1]);它不会返回错误,但我无法向它发送消息,因为它注册为 Discord.Channel 而不是 Discord.TextChannel
  • TextChannel 是 Channel 的子级,如果合适的话应该能够发送消息。例如,您应该能够回显.type 属性以检查您获得的是类似文本的频道,而不是语音频道。您的问题中的示例应该工作,只要它是一个类似文本的频道并且您使用的 ID 是一个实际的频道 ID。
  • 我通过右键单击我的文本频道并点击“复制 ID”获得了频道 ID,它给出了“651560565080195122”,我认为这是字符串格式。

标签: javascript typescript discord.js channels


【解决方案1】:

根据https://discord.js.org/#/docs/main/stable/class/Collection好像没有get方法。

试试client.channels[channels.channelnames[5]].send("This is a message.")

换句话说,尝试用方括号替换 .get。

编辑:对不起,我有点快,我认为问题是类型转换,如果您知道这是一个文本通道,请尝试将 Channel 转换为 TextChannel

【讨论】:

  • 问题:“元素隐式具有 'any' 类型,因为类型 'Collection' 没有索引签名。你的意思是调用 'get' 吗?”
  • 是的,对不起,我读错了,我进行了编辑,请尝试一下。
  • 我的主要问题是我不知道如何将 Discord.Channel 转换为 Discord.TextChannel...
【解决方案2】:

假设您的频道是文本频道,这应该可以工作。

client.on('ready',(e)=>{


    let channel_ids = ['123','456','789'];

    // loop through the list of channel ids.
    for(let i=0, l=channel_ids.length; i<l; i++){
        let channel_id = channel_ids[i];

        let this_channel = client.channels.get( channel_id );

        // if exists, and type in list send message
        if(this_channel && ['dm', 'group', 'text'].indexOf( this_channel.type ) != -1){
            this_channel.send('a cool message')
            .then(message => console.log(`Sent message: ${message.content}`))
            .catch(console.error);
        }

    }

});

【讨论】:

  • 错误 (3): - 参数 'e' 隐含地具有 'any' 类型。 ts(7006) [24. 24] - 类型“通道”上不存在属性“发送”。 ts(2339) [37,30] - 参数 'message' 隐含地具有 'any' 类型。
【解决方案3】:

解决方案:

if(msgObject.member.guild.channels.find(channel => channel.name === channels.channelnames[5]) as Discord.TextChannel) {
    var txtchannel = msgObject.member.guild.channels.find(channel => channel.name === channels.channelnames[5]) as Discord.TextChannel
    txtchannel.send("This is a message in a channel. Don't know why you read this.")
}

所以我大部分时间都在正确的轨道上。只需要做as Discord.TextChannel,我认为这就是辛西娅说将变量转换为TextChannel的原因

此代码有效。感谢大家的帮助!

【讨论】:

  • 我从 2 个多小时以来一直在寻找的东西。即使是 Discord JS 指南也没有这个.. 或者我错过了.. 无论如何,谢谢:p
猜你喜欢
  • 2021-08-21
  • 2021-08-09
  • 2020-05-22
  • 2022-01-25
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多