Могу ли я изменить команду с помощью ввода из сообщения discord?

#input #discord.py

#ввод #discord.py

Вопрос:

Я хочу создать бота для модерации. В этом боте модерации используется команда автозапуска, но у меня есть один вопрос по этому поводу. Это команда:

 async def on_member_join(ctx):
    role = discord.utils.get(ctx.guild.roles, name = "Member") 
    await ctx.add_roles(role)
  

Но я хочу сделать так, чтобы люди могли вводить!autorole @[Роль], а затем, если кто-то присоединяется, он получает эту роль вместо Member роли. Я не знаю, как получить ввод из discord. И я ничего не мог найти в Интернете. Заранее спасибо! 🙂

Ответ №1:

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

Ваш код может выглядеть примерно так:

 role_to_assign = None

@client.command()
async def autorole(ctx, role: discord.Role):
    global role_to_assign
    role_to_assign = role

@client.event
async def on_member_join(member):
    await member.add_roles(role_to_assign)
  

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

1. Но как это работает, если бот находится на нескольких серверах? Меняется ли роль для всех серверов или только для этого сервера?

2. Если вы хотите, чтобы у каждого сервера была своя роль для автоматического назначения, вы можете создать словарь, где ключами являются серверы, а значениями — роли. Вот как это будет выглядеть: pastebin.com/GQMf6CGW

Ответ №2:

Вы можете сохранить имя роли в json yaml или txt файле. Затем вы можете изменить эту роль, когда захотите.

 @client.command()
async def autorole(ctx, role: discord.Role):
    file = open('autorole.txt', 'w')
    file.write(role.id)
  

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

Кроме того, лучше вызывать параметр member , а ctx on_member_join не событие.

 @client.event
async def on_member_join(member):
    role_id = open('autorole.txt', 'r').read()
    role = discord.utils.get(member.guild.roles, id = int(role_id)) 
    await member.add_roles(role)