发送包含多种信息的消息

时间:2019-06-25 22:27:44

标签: node.js discord.js

晚上好,尝试过建立一个系统来知道谁邀请了某人,这个邀请有多少用途(但是我没有成功,所以我打电话给您)...当新成员到达Discord时。 我希望通过邮件发送此邮件。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

跟踪新成员。

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

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

通过客户端发送消息。

1。。要发送消息,您首先必须获取将所述消息发送给的渠道。 Collection中有GuildChannelGuild.channels中的一个。除非您在下一步中使用通道的ID,否则应过滤集合以仅包含TextChannelCollection.filter的集合。

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

2。。假设您具有频道ID,则可以使用Map.get()(集合是地图,而地图不是集合)来检索频道。否则,您可以使用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,请导航至频道的选项,依次单击WebhooksCreate Webhook。根据需要自定义Webhook,然后复制链接。

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

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

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

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

3。。然后,您只需通过Webhook的send方法将消息直接发送到渠道即可。

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 s。

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

2。。循环浏览客户协会,并将每个邀请添加到对象中。您可以使用Guild.fetchInvites()(返回承诺)在公会中获取邀请。

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