【问题标题】:Sending a message the first channel with discord.js使用 discord.js 在第一个频道发送消息
【发布时间】:2018-12-29 02:02:53
【问题描述】:

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

例如:

bot 加入公会

机器人:嘿!谢谢邀请!

我现在的代码真的很简单:

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

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

【问题讨论】:

    标签: javascript discord discord.js


    【解决方案1】:

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

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

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

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

    B:发送到允许机器人发送到的第一个通道。 (这很好用,除非机器人被赋予管理员权限);

    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 分钟内发送消息最多的频道)

    【讨论】:

    • 使用 B 方法我得到这个错误:“ReferenceError: message is not defined”
    • 哦,我从message 事件中复制了一些代码...忘记将其转换为guildCreate 事件...;应该修复...现在
    • 运行固定代码时出现此错误:“TypeError: guild.channels.sort(...).first(...).send is not a function”
    • 我刚刚在我的机器人上运行了代码......它运行良好。我只能想象guild 没有定义。你是否将代码放在guildCreate 事件中?如果是这样,您介意在 JS-Fiddle 中分享整个 guildCreate 事件吗?
    • 和/或它可能加入了一个没有允许发送到的通道的服务器。
    【解决方案2】:

    编辑:截至 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,所以我更新了代码以搜索第一个文本通道并将其用于初始消息。

    【讨论】:

    • 在新的编辑中,示例代码在语法上对于 Javascript 是不正确的。 channelLoop: 的行应该被删除,break 应该只是break;,频道类型和ID 应该通过c.idc.type 访问。
    • 没有错。 channelLoop:for 循环的标签,非常方便,特别是如果您需要使用嵌套的for 循环。使用c.idc.type 会破坏这一点,因为guild.channels 是一个数组数组。每个内部数组的第一个索引是通道 id,即c[0],第二个索引是有关该通道的信息,即c[1]。所以,不,它在语法上一点也不错误。
    • 我关于标签的错误,老实说我不知道​​这样的事情存在。但是,我确实相信我的后半部分是正确的。 guildCreate 事件传入一个Guild 对象,而Guild#channels 实际上是GuildChannel 对象的Collection(从Channel 扩展而来),而不是数组数组。 discord.js.org/#/docs/main/stable/class/… | discord.js.org/#/docs/main/stable/class/Guild?scrollTo=channels | discord.js.org/#/docs/main/stable/class/GuildChannel
    【解决方案3】:

    我知道迟到了,但这是我在 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")
    })
    

    【讨论】:

    • 我不知道为什么,但这只是最近停止工作
    • @SkykidFelix 认为是关于意图更新的东西,猜猜必须检查一下
    【解决方案4】:

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

    所以你需要找这样的公会

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

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 2021-10-19
      • 2021-08-21
      • 2020-04-04
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多