Итак, вы хотите знать, кто пригласил конкретного пользователя на ваш дискорд-сервер? Не волнуйтесь, это довольно просто сделать. К концу урока вы должны понять это.
Это можно легко сделать, сравнив использование каждого приглашения до того, как пользователь присоединился, и после того, как он присоединился, и посмотрите, какое из них увеличилось — это будет элемент приглашения, который вы ищете.
К счастью, это действительно легко сделать, но проблема в том, что по мере того, как ваш бот размещается на все большем количестве серверов, он становится все более неэффективным — можно использовать базу данных, чтобы сделать его более эффективным, хотя Я не буду обсуждать, как это сделать сегодня.
Итак, прежде всего, чтобы сделать это, нам нужно будет хранить все приглашения, которые у нас есть в каждой гильдии, когда бот будет готов, во временном словаре.
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