开发者问题收集

discord.js 发送消息到特定频道

2019-12-10
5605

我一直在寻找,似乎无法找到使用 Typescript 制作的 discord 机器人所遇到的这个问题的答案。我将所有命令放在自己的文件夹中,每个命令使用一个单独的文件。有助于保持井然有序。

我见过有人说 client.channels.get(`channelID`).send(`Text`)

但这给了我 对象可能“未定义”。属性“send”在类型“Channel”上不存在。

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

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

在此处输入图像描述

在此处输入图像描述

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 ,我认为这就是 Cynthia 说要将变量转换为 TextChannel 的原因。

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

FTWGaming
2019-12-11

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

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

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

编辑:抱歉,我有点急了,我认为问题出在类型转换上,如果您知道它是一个文本通道,请尝试将 Channel 转换为 TextChannel

Cynthia
2019-12-10

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

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);
        }

    }

});
Gavin
2019-12-10