会员有10个邀请时如何添加角色?

时间:2020-10-21 16:35:15

标签: discord discord.js

我使用discord.js v12制作了Discord机器人,并在成员有10条邀请时尝试提供角色

我从here找到了邀请代码,并对其进行了修改:

if(message.channel.type != "dm" && message.channel.id === '768475421953915093') {
message.delete();
var user = message.author;

    message.guild.fetchInvites()
    .then

    (invites =>
        {
            const userInvites = invites.array().filter(o => o.inviter.id === user.id);
            var userInviteCount = 0;
            for(var i=0; i < userInvites.length; i++)
            {
                var invite = userInvites[i];
                userInviteCount += invite['uses'];
            }
                if(userInviteCount >= 10){
                const guildMember = message.member;
                guildMember.addRole('767542365812886656');
                message.author.send(`you have access now`)
            }else {
              message.author.send(`sry u have ${userInviteCount} invitations. u need at least five`)
            }
    }
    )
 }

是的,它可以工作,但是您可以轻松地欺骗系统。如果您继续从服务器重新加入,则邀请计数器将增加。我该如何阻止?

1 个答案:

答案 0 :(得分:1)

为此,您将需要一个外部数据库,因为Discord API不会提供有关用于邀请以及多少次的任何信息。

ALERT:这是一个简单的功能,但是对于没有任何编码经验的人来说可能很难,因此,如果这是您的第一个项目,请不要放弃并继续尝试! :D

您可以使用MongoDB Atlas,它非常简单而且免费。

逻辑将非常简单:

1-创建一个集合来存储邀请数据,您可以在this example

中进行类似操作

2-创建一个集合(您可以输入任何名称,但是在本示例中,我将这个集合称为new_members)来存储新成员数据,它应该具有字段serverId (用于存储行会ID),userId(用于存储用户ID)和inviteCode(用于存储邀请代码或网址)

3-当用户加入discord服务器时,它将触发“ guildMemberAdd”事件,您将获得使用的邀请(与我在第一步中给出的示例一样),并在其中创建一个新文档new_members集合。

4-创建新数据后,您将在同一邀请中搜索所有文档,并按userId进行过滤(有多种方法可以使用this is one of them)。

5-使用这一系列文档,您可以利用他的长短来确定邀请了多少人并指定职位。

非常简单的示例,不应使用:

DiscordClient.on("guildMemberAdd", async (member) => {
  /**
   * https://github.com/AnIdiotsGuide/discordjs-bot-guide/blob/master/coding-guides/tracking-used-invites.md
   * Here you will get the invite that was used, and store in the "inviteCode" variable
   */
  const inviteCode = await getInviteUsed()

  await NewMemberRepository.insert({
    serverId: member.guild.id,
    userId: member.id,
    inviteCode: inviteCode
  });

  const joinedMembersFromTheInvite = await NewMemberRepository.find({
    inviteCode: inviteCode
  });

  /**
   * https://stackoverflow.com/questions/43374112/filter-unique-values-from-an-array-of-objects
   * Here you will filter the results by userId
   */
  const invitesWithUniqueUsers = filterJoinedMembersByUserId(joinedMembers)

  if (invitesWithUniqueUsers >= REQUIRED_INVITES_QTD) {
    /**
     * Gives the role to the creator of the invite
     */
  }
});

希望有帮助,祝您好运! :D


OBS:

  • 是的,Discord API提供了使用邀请的次数,但没有提供特定人员使用此邀请的次数。
  • 在示例中,我使用了类似TypeORM的方法,但是如果您使用JavaScript而不是TypeScript,则可以使用Mongoose