Итак, вы хотите знать, кто пригласил конкретного пользователя на ваш дискорд-сервер? Не волнуйтесь, это довольно просто сделать. К концу урока вы должны понять это.

Это можно легко сделать, сравнив использование каждого приглашения до того, как пользователь присоединился, и после того, как он присоединился, и посмотрите, какое из них увеличилось — это будет элемент приглашения, который вы ищете.

К счастью, это действительно легко сделать, но проблема в том, что по мере того, как ваш бот размещается на все большем количестве серверов, он становится все более неэффективным — можно использовать базу данных, чтобы сделать его более эффективным, хотя Я не буду обсуждать, как это сделать сегодня.

Итак, прежде всего, чтобы сделать это, нам нужно будет хранить все приглашения, которые у нас есть в каждой гильдии, когда бот будет готов, во временном словаре.

from discord.ext import commands
bot = commands.Bot(command_prefix="&")
invites = {}
@bot.event
async def on_ready(): 
    # Getting all the guilds our bot is in
    for guild in bot.guilds:
        # Adding each guild's invites to our dict
        invites[guild.id] = await guild.invites()

Это довольно прямолинейно, мы зацикливаемся на каждой гильдии, в которой находится наш бот, получаем элемент приглашения и сохраняем его в нашем списке приглашений.

После этого нам нужно будет создать функцию для поиска приглашения в списке guilds.invites(), нам нужно будет сделать это, чтобы найти определенный код приглашения после того, как пользователь присоединился — причина должна стать понятной позже.

def find_invite_by_code(invite_list, code):
    
    # Simply looping through each invite in an
    # invite list which we will get using guild.invites()
    
    for inv in invite_list:
        
        # Check if the invite code in this element
        # of the list is the one we're looking for
        
        if inv.code == code:
            
            # If it is, we return it.
            
            return inv

Хорошо, мы закончили. Теперь пришло время выяснить, какой код приглашения был использован.

Мы собираемся использовать событие on_member_join — эта функция интегрирована в discord.py и будет автоматически запускаться, когда пользователь присоединяется к гильдии.

Теперь есть довольно много документации о том, что я делаю, поэтому убедитесь, что вы прочитали все комментарии.

@bot.event
async def on_member_join(member):

    # Getting the invites before the user joining
    # from our cache for this specific guild

    invites_before_join = invites[member.guild.id]

    # Getting the invites after the user joining
    # so we can compare it with the first one, and
    # see which invite uses number increased

    invites_after_join = await member.guild.invites()

    # Loops for each invite we have for the guild
    # the user joined.

    for invite in invites_before_join:

        # Now, we're using the function we created just
        # before to check which invite count is bigger
        # than it was before the user joined.
        
        if invite.uses < find_invite_by_code(invites_after_join, invite.code).uses:
            
            # Now that we found which link was used,
            # we will print a couple things in our console:
            # the name, invite code used the the person
            # who created the invite code, or the inviter.
            
            print(f"Member {member.name} Joined")
            print(f"Invite Code: {invite.code}")
            print(f"Inviter: {invite.inviter}")
            
            # We will now update our cache so it's ready
            # for the next user that joins the guild

            invites[member.guild.id] = invites_after_join
            
            # We return here since we already found which 
            # one was used and there is no point in
            # looping when we already got what we wanted
            return

Теперь, когда это сделано и вы прочитали комментарии, просто на всякий случай, хотя и не совсем обязательно, мы также будем обновлять кеш, когда пользователь удаляется (или уходит).

Мы собираемся использовать событие, противоположное тому, которое мы использовали раньше — оно сработает, когда пользователь покинет сервер.

@bot.event
async def on_member_remove(member):
    
    # Updates the cache when a user leaves to make sure
    # everything is up to date
    
    invites[member.guild.id] = await member.guild.invites()

Вы почти закончили. Вы должны получить код приглашения и приглашение, напечатанное на вашей консоли, когда пользователь присоединяется к гильдии с вашим ботом. Очевидно, что мы не можем забыть запустить вашего бота, поэтому, если у вас есть токен под рукой, поместите его в конец файла.

bot.run("YOUR TOKEN HERE")

И это все! Если у вас есть какие-либо вопросы, не стесняйтесь присоединиться к моему дискорд-серверу здесь: https://discord.gg/c4fqNzN