#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)