首页 > 解决方案 > 发送包含多个信息的消息

问题描述

晚上好,已经尝试建立一个系统来知道谁邀请了某人,这个邀请有多少用途(但我没有成功,所以我打电话给你)......一旦有新成员到达 Discord。我希望在消息中发送此消息。

先感谢您 !

标签: node.jsdiscord.js

解决方案


跟踪新成员。

要跟踪新成员何时加入服务器,您可以监听客户端的guildMemberAdd事件。

client.on('guildMemberAdd', member => {
  // Code in here is executed whenever
  // someone joins a server the bot is
  // also in.
});

通过您的客户端发送消息。

1.为了发送消息,您首先必须获取发送该消息的通道GuildChannel集合可用于. 除非您在下一步中使用频道 ID,否则您应该过滤 Collection 以仅包含TextChannel和.Guild.channelsCollection.filter

const channels = member.guild.channels.filter(channel => channel.type === 'text');

2.假设你有频道的ID,你可以使用Map.get()(一个Collection是一个Map,但一个Map不是一个Collection)来检索频道。否则,您可以使用 找到它Collection.find(),或者只需使用 选择第一个Collection.first()

const channel = channels.get('someID');

或者

const channel = channels.find(channel => channel.name === 'welcome');

或者

const channel = channels.first();

3.要向频道发送消息,您可以使用TextChannel.send()。请记住,它返回一个Promise

channel.send(`Hello, ${member}!`)
  .catch(console.error);

把两者放在一起。

client.on('guildMemberAdd', member => {
  const channels = member.guild.channels.filter(channel => channel.type === 'text');
  const channel = channels.get('someID');

  if (!channel) return console.error('Unable to find specified welcome channel!');

  channel.send(`Hello, ${member}!`)
    .catch(console.error);
});

通过 Webhook 发送消息。

或者,您可以创建一个更高效的 Webhook。

1.要在 Discord 中创建 Webhook,请导航至频道选项,单击Webhooks,然后单击Create Webhook。根据需要自定义 Webhook,然后复制链接。

https://discordapp.com/api/webhooks/THIS_IS_THE_ID/THIS_IS_THE_TOKEN

2.回到您的代码,您可以通过其构造函数创建一个Webhook 客户端。

const webhookID = 'pasteTheIDHere';
const webhookToken = 'pasteTheTokenHere';

const webhook = new Discord.WebhookClient(webhookID, webhookToken);

3.send然后,您可以简单地通过 Webhook 的方法直接向频道发送消息。

webhook.send(`Hello ${member}!`)
  .catch(console.error);

执行。

client.on('guildMemberAdd', member => {
  const webhookID = 'pasteIDHere';
  const webhookToken = 'pasteTokenHere';

  const webhook = new Discord.WebhookClient(webhookID, webhookToken);

  webhook.send(`Hello, ${member}!`)
    .catch(console.error);
});

如果您没有直接访问 Discord 服务器的权限,则可以使用TextChannel.createWebhook()为您创建 Webhook。然后,您将存储每个公会的“欢迎”Webhook 的 ID 和令牌,并使用上面的代码。


跟踪邀请。

要跟踪用于加入服务器的邀请,您必须自己跟踪邀请。

1.在客户端的ready事件中,创建一个新的对象来保存Invite

client.on('ready', () => {
  client.invites = {};
});

2.循环访问客户的公会,并将来自每个公会的邀请添加到对象中。Guild.fetchInvites()您可以使用(returns a Promise)获取公会内的邀请。

for (const [id, guild] of client.guilds) {
  guild.fetchInvites()
    .then(invites => client.invites[id] = invites)
    .catch(console.error);
}

3.回到guildMemberAdd活动,你需要查看使用了哪个邀请。您可以通过检查它是否存在,或者使用哪一个来做到这一点(Invite.uses)。

member.guild.fetchInvites()
  .then(invites => {
    const existing = client.invites[member.guild.id];

    client.invites[member.guild.id] = invites;

    const invite = invites.find(invite => !existing.get(invite.code) || existing.get(invite.code).uses < invite.uses); 
  })
  .catch(console.error);

把所有东西放在一起。

client.on('ready', () => {
  client.invites = {};

  for (const [id, guild] of client.guilds) {
    guild.fetchInvites()
      .then(invites => client.invites[id] = invites)
      .catch(console.error);
  }
});
// Any time the client joins a guild, you should also add their invites to the cache.

client.on('guildCreate', guild => {
  guild.fetchInvites()
    .then(invites => client.invites[id] = invites)
    .catch(console.error);
});
client.on('guildMemberAdd', member => {
  member.guild.fetchInvites()
    .then(invites => {
      const existing = client.invites[member.guild.id];

      client.invites[member.guild.id] = invites;

      const inviteUsed = invites.find(invite => !existing.get(invite.code) || existing.get(invite.code).uses < invite.uses); 

      const channels = member.guild.channels.filter(channel => channel.type === 'text');
      const channel = channels.get('someID');

      if (!channel) return console.error('Unable to find specified welcome channel!');

      channel.send(`${member} joined, using an invite from ${inviteUsed.inviter} (${inviteUsed.uses} use${inviteUsed.uses !== 1 ? 's' : '')!`);
  })
  .catch(console.error);
});

推荐阅读