#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. Что вы имеете в виду, что он перестал работать? Сообщение не отправляется / упоминание не работает / есть ли какие-либо ошибки? Возможно, было бы лучше задать новый вопрос с приведенной выше информацией.