繁体   English   中英

使用 discord.js 向第一个频道发送消息

[英]Sending a message the first channel with discord.js

我见过很多机器人在加入时都有问候语。 它通常发送到服务器的第一个通道。

例如:

机器人加入公会

机器人:喂! 谢谢你邀请我!

我现在的代码非常简单:

client.on("guildCreate", guild => {
    the code goes here
});

我不知道如何向随机(第一个)频道发送消息。 如果有人能告诉我其他机器人是如何做到的,我会非常感激。

编辑:截至 2020 年 9 月 27 日,使用 Discord.js 版本 12.3.1,我只需要添加对cache的引用即可获得正确的通道并确保迭代正确进行。

我使用的是 Discord.js 版本 11.4.2,并且能够使用以下代码向#general 频道发送默认消息。 将下面的bot替换为您的client名称。

const Discord = require('discord.js');
const bot = new Discord.Client();

bot.on("guildCreate", guild => {
    let channelID;
    let channels = guild.channels.cache;

    channelLoop:
    for (let key in channels) {
        let c = channels[key];
        if (c[1].type === "text") {
            channelID = c[0];
            break channelLoop;
        }
    }

    let channel = guild.channels.cache.get(guild.systemChannelID || channelID);
    channel.send(`Thanks for inviting me into this server!`);
});

编辑:我发现guild.systemChannelID可以为null因此我更新了代码以搜索第一个文本频道并将其用于初始消息。

我知道已经晚了,但这是我使用的方式,适用于 12.x 版本

client.on('guildCreate', guild => {
    const channel = guild.channels.cache.find(channel => channel.type === 'text' && channel.permissionsFor(guild.me).has('SEND_MESSAGES'))
    channel.send("Thanks for invite me")
})

坦率地说,没有“好方法”可以做到这一点......以前有,直到不和谐删除它。 (曾经是: guild.defaultChannel
现在,bot 开发人员会做一些测试来找出他们将消息发送到哪里......

有多种方法可以找到一个好的频道(这里有一些):

答:找到一个名为welcomegeneral的频道,无论您希望机器人将其发送到哪个频道。

guild.channels.find(`name`,`welcome`).send(`Thx for invite`);

B:发送到允许机器人发送到的第一个频道。 (除非给 bot 管理员权限,否则这很有效);

guild.channels.sort(function(chan1,chan2){
    if(chan1.type!==`text`) return 1;
    if(!chan1.permissionsFor(guild.me).has(`SEND_MESSAGES`)) return -1;
    return chan1.position < chan2.position ? -1 : 1;
}).first().send(`Thx! for invite`);

上面的代码是这样做的:

  1. 获取所有频道并让它们排序
  2. 如果不是文本频道return -1
  3. 如果机器人被禁止发送return -1
  4. 然后根据他们的位置对频道进行排序

C:尝试其他方式:

查找服务器中大多数成员可以发送到的频道
找到一个@everyone 角色可以发送到guild.roles.first()的频道
查找活动最多的频道(检查过去 5-10 分钟内发送消息最多的频道)

我一直在努力寻找公会。 还有其他代码对我不起作用。

所以你需要找到这样的公会

const guild = client.guilds.cache.first();

然后你想要像这样获得第一个通道(可能只有“文本通道”,如果不是只是删除 filter() )

const channel = guild.channels.cache.filter(c => c.type === 'text').find(x => x.position === 0);

然后一切都取决于你想要做什么......例如,我想向频道发送消息,所以我只是这样做了

channel.send('Hello world');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM