让机器人为它所在的每个公会创建邀请

Posted

技术标签:

【中文标题】让机器人为它所在的每个公会创建邀请【英文标题】:Make bot create invite for every guild it is in 【发布时间】:2019-11-14 22:48:06 【问题描述】:

我想知道如何制作它,以便机器人所在的每个公会都会发出邀请并将其放入控制台。它一直给我所有这些烦人的打字机。 TypeError: Cannot read property 'first' of undefined

我尝试改变和弄乱变量。

  doopliss.on('ready', guild => 
    doopliss.guilds.channels.first().createInvite()
    .then(invite => console.log(invite.url))
    .catch(err => console.error());
  );

expect : 为它所在的每个服务器发出邀请并将其发布到控制台中的机器人 实际结果:机器人死亡并发出恼人的类型错误

【问题讨论】:

【参考方案1】:

您可以使用forEach() 循环来获取所有公会邀请。比如……

doopliss.guilds.forEach(guild => 
  guild.channels.first().createInvite()
    .then(inv => console.log(`$guild.name | $inv.url`));
    // Outputs the guild name + the invite URL
);

Map.forEach()

【讨论】:

您收到未定义错误的唯一原因是您没有指定从哪个公会接受邀请。 我不得不稍微修改一下代码以摆脱一些渠道(因为我的机器人创建了 2 个服务器),然后运行此代码以使其工作。控制台发出了无效的控制台错误,但代码按原样运行 小心forEach():由于它的同步行为,即使循环完成,GuildChannel.createInvite() 返回的承诺仍然处于未决状态。即使您使用await,循环也只是进行这些调用并继续前进。在这种特殊情况下,这应该不会影响任何事情,但值得注意。【参考方案2】:

2020 年更新

在使用foreach() ofc 之前,您需要使用.cache

doopliss.guilds.cache.forEach(guild => 
         let channel = guild.channels.cache.last();
         createLink(channel,guild,message);
);


async function createLink(chan,guild,message) 
    let invite = await chan.createInvite().catch(console.error);
    try
        message.channel.send(guild.name + '|' + invite);
    catch (e) 
        message.channel.send(guild.name + '|' + 'no link available');
    

【讨论】:

以上是关于让机器人为它所在的每个公会创建邀请的主要内容,如果未能解决你的问题,请参考以下文章

公会加入事件打印机器人被邀请 - Discord.py

如果特定公会不存在,则数据库错误

你如何添加一个新的斜杠命令,而不必踢并重新邀请机器人到它所在的每个服务器?

如何找到我的机器人所在的公会数量?

从公会 1 向公会 2 发送邀请

从公会 1 向公会 2 发送邀请