使用打字稿将消息发送到特定频道

时间:2018-11-30 19:40:09

标签: node.js typescript discord.js

每当新用户加入服务器(行会)时,我都希望向“欢迎”文本频道发送问候消息。

我面临的问题是,当我找到所需的频道时,我将收到类型为GuildChannel的频道。

由于GuildChannel没有send()功能,因此无法发送消息。但是我找不到找到TextChannel的方法,所以我被困在这里。

如何到达TextChannel,以便能够使用send()消息?在我目前正在使用的代码下方:

// Get the log channel (change to your liking) 
const logChannel = guild.channels.find(123456); 
if (!logChannel) return;

// A real basic message with the information we need. 
logChannel.send('Hello there!'); // Property 'send' does not exist on type 'GuildChannel'

我正在使用discord.js的11.3.0版本

5 个答案:

答案 0 :(得分:3)

感谢GitHub issue,我找到了解决问题的方法。

我需要使用Type Guard来缩小正确的类型。

我的代码现在是这样:

// Get the log channel
const logChannel = member.guild.channels.find(channel => channel.id == 123456);

if (!logChannel) return;

// Using a type guard to narrow down the correct type
if (!((logChannel): logChannel is TextChannel => logChannel.type === 'text')(logChannel)) return;

logChannel.send(`Hello there! ${member} joined the server.`);

答案 1 :(得分:0)

我这样做:

let channel = client.guilds.get('your-guild-id').channels.get('your-channel-id');
channel.send("it worked");

(客户端是不和谐的客户端)。如果将find更改为get并将频道ID放在一些单引号中,则您的代码应该可以正常工作。好吧,它对我有用。

答案 2 :(得分:0)

也许这可以帮助您?

代码:

client.on('guildMemberAdd', member => {
    let channel = member.guild.channels.find('name', 'welcome');
    let memberavatar = member.user.avatarURL
        if (!channel) return;
        let embed = new Discord.RichEmbed()
            .setColor('RANDOM')
            .setThumbnail(memberavatar)
            .addField(':bust_in_silhouette: | name : ', `${member}`)
            .addField(':microphone2: | Welcome!', `Welcome to the server, ${member}`)
            .addField(':id: | User :', "**[" + `${member.id}` + "]**")
            .addField(':family_mwgb: | Your are the member', `${member.guild.memberCount}`)
            .addField("Name", `<@` + `${member.id}` + `>`, true)
            .addField('Server', `${member.guild.name}`, true )
            .setFooter(`**${member.guild.name}**`)
            .setTimestamp()
        channel.sendEmbed(embed);
});

答案 3 :(得分:0)

也许对于仍在寻找对我有用的答案的后来者来说

class User:
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay

    def email(self):
        return '{}.{}@company.com'.format(self.first, self.last)

    def fullname(self):
        return '{} {}'.format(self.first, self.last)


user1 = User


def add_user():
    first = input('First name: ')
    user1.first = first
    last = input('Last name: ')
    user1.last = last
    pay = int(input('Pay: '))
    user1.pay = pay


add_user()
print(user1.fullname(User))

答案 4 :(得分:0)

您可以在调用 send 之前使用 GuildChannel#isText() 方法键入 guard。

示例:

if (channel.isText()) {
   await channel.send('...');
}

或者:

if (!channel.isText()) return;
await channel.send('...');