Отправлять приветственные DM только пользователям определенного сервера в discord.py

#python #discord

#python #Discord

Вопрос:

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

 @client.event #Send new members of the server a message
async def on_member_join(member): #Run when a member joins
    await member.create_dm() #Create a DM chat with the new user
    await member.dm_channel.send(f"Heya, {member.name}! [ETC OF WELCOME MESSAGE]")
    print(f'User DM sent:n----------nUser: {member.name}n----------')
  

Согласно документации, единственным параметром on_member_join является member , так что это невозможно?
Я пытался отправить DM на основе идентификаторов сервера.
После некоторых исследований я увидел ctx.author.send , но это не сработало:

   File "REDACTED", line 312, in _run_event
    await coro(*args, **kwargs)
  File "REDACTED", line 34, in on_member_join
    await ctx.author.send(f"Heya, {member.name}! REDACTED")
AttributeError: 'Member' object has no attribute 'author'
  

Вот полный код в его текущем виде.

 @client.event
async def on_member_join(ctx):
    current_server = ctx.guild.id
    if current_server == server_id:
        await ctx.author.send(f"Heya, {member.name}! REDACTED")
        print(f'User DM sent:n----------nUser: {member.name}n----------')
  

Комментарии:

1. Почему вы не можете объединить код if из последнего примера с кодом DM из первого примера, чтобы отправлять приветственные сообщения только на один сервер?

2. @mousetail Я попробовал это, это создает ошибку, которую я написал выше.

3. Какую ошибку вы получаете в этом случае? У участника нет «автора», поэтому второй пример не имеет смысла.

Ответ №1:

В документах здесь указана подпись для события on_member_join. Таким образом, вы можете использовать объект member, предоставляемый событием, чтобы получить идентификатор присоединенного сервера и сравнить его с сохраненным идентификатором гильдии.

Для одного сервера:

 # stored_guild_id must be defined before this code appears

@client.event
async def on_member_join(member: discord.Member):
    if member.guild.id == stored_guild_id:
        await member.send(f"Welcome to the server!")
  

Если у вас есть несколько серверов, вы можете использовать список серверов:

 # stored_guild_ids must be defined above this code. For example:
# stored_guild_ids = [id1, id2]
# where id1 and id2 are guild ids

@client.event
async def on_member_join(member: discord.Member):
    if member.guild.id in stored_guild_ids:
        await member.send(f"Welcome to the server!")
  

Вы также можете сохранить его как словарь и иметь отдельное приветствие для каждого сервера.

 # welcome_messages must be defined. For example:
# welcome_messages = {
#    guild_id: "Welcome there!", 
#    guild_id2: 'Hello there!'
#  }
# Again guild_id and guild_id2 are actual guild ids

@client.event
async def on_member_join(member: discord.Member):
    if member.guild.id in welcome_messages.keys():
        await member.send(welcome_messages[member.guild.id])
  

В зависимости от варианта использования это также может быть расширено для хранения приветственных сообщений в файлах и иметь команду для редактирования приветственных сообщений из discord с помощью команды. Вы также можете задать для сообщения такое поле, как:
welcome_messages = {my_guild_id: "Hello {0}! Welcome to server")
и использовать
await member.send(welcome_messages[guild_id].format(member.mention))
который 0 заменит упоминание нового пользователя.

Комментарии:

1. Надеюсь, этот комментарий не беспокоит, но, похоже, предложенный вами код перестал работать? Я просмотрел документы, но не вижу никаких изменений, которые могли бы это объяснить. Знаете ли вы, почему?

2. Что вы имеете в виду, что он перестал работать? Сообщение не отправляется / упоминание не работает / есть ли какие-либо ошибки? Возможно, было бы лучше задать новый вопрос с приведенной выше информацией.