Почему в discord.py не отображается ник человека, который пригласил другого пользователя на сервер?

Как можно при помощи discord.py сделать так, чтобы при заходе человека на сервер, бот отправлял сообщение в определенный канал с данными о регистрации нового пользователя, его упоминанием (mention), информацией о том, кто его пригласил, и, если возможно, ссылкой, по которой он вступил на сервер?
Изображение к вопросу
  • 24 декабря 2023 г. 18:27
Ответы на вопрос 2
В discord.py вы не можете напрямую получить информацию о том, кто пригласил пользователя на сервер, потому что это не является непосредственным событием. Однако вы можете использовать аудит-логи сервера, чтобы получить информацию о приглашении пользователя.

Вот пример кода, который отправляет сообщение в определенный канал при заходе нового пользователя на сервер:

```python
import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.members = True

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event
async def on_member_join(member):
    channel = bot.get_channel(1234567890)  # Замените на ID канала, куда хотите отправлять сообщения
    inviter = await get_inviter(member)
    
    message = f"Привет, {member.mention}! Добро пожаловать на сервер!"
    if inviter:
        message += f" Тебя пригласил {inviter.mention}"
    
    await channel.send(message)

async def get_inviter(member):
    guild = member.guild
    async for entry in guild.audit_logs(limit=1, action=discord.AuditLogAction.invite_create):
        if entry.target.code == member.guild.me.avatar.guild.invite.code:  # Замените на код бота
            return entry.user
    
    return None

bot.run('YOUR_BOT_TOKEN')
```

Здесь `get_inviter` использует аудит-логи сервера для получения информации о создании приглашения и ищет приглашение, которое совпадает с кодом вашего бота. Затем он возвращает пользователя, создавшего приглашение (inviter).

Обратите внимание, что вам необходимо заменить `1234567890` на ID канала, в который вы хотите отправлять сообщения, и `YOUR_BOT_TOKEN` на токен вашего бота.
Давайте пройдем пошагово по алгоритму: 
1) Вы смотрите в какой канал зашел пользователь
- На нем отвалятся те, у кого нет доступа к этому каналу и те кто заходят без конкретного канала

2) Ищите первого человека, кто создавал для этого канала
- Тут отвалятся несколько приглашений на один канал

3) Ожидаете что будет пригласивший
- Хотя это опциональное поле .

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

Теперь правильный алгоритм:
1) Заводите команду, например /invite, которой генерируете приглашения за пользователя.
2) При генерации сохраняете в БД кто команду вызвал, в формате вроде (user_id, url)
3) При заходите смотрите обязательное поле url и смотрите какой пользователь его генерировал - он и будет пригласившим.
Похожие вопросы