Вопрос по поводу снятия ролей
У меня появился такой вопрос, есть у меня в боте одна такая команда, которая снимает все перечисленные роли, но сделана она в очень большом размере, сама команда, и действует чутка медленно, вопрос вообщем-то состоит в том, можно ли как-то сделать в одну строку перечисление ролей или же легче данную команду?
Сама команда:
@client.command()
@commands.has_any_role( 703596629923725334, 703596629911142433, 703596629894365211, 703596629894365210 )
async def unfrac(ctx, member: discord.Member, *,reason = None):
thhchannel = ctx.message.channel
ttttt = client.get_channel(703596630892478508)
if thhchannel == ttttt:
unfrac_role = discord.utils.get(ctx.message.guild.roles, name = 'test1')
unfrac_role1 = discord.utils.get(ctx.message.guild.roles, name = 'test2')
unfrac_role2 = discord.utils.get(ctx.message.guild.roles, name = 'test3')
unfrac_role3 = discord.utils.get(ctx.message.guild.roles, name = 'test4')
unfrac_role4 = discord.utils.get(ctx.message.guild.roles, name = 'test5')
unfrac_role5 = discord.utils.get(ctx.message.guild.roles, name = 'test6')
unfrac_role6 = discord.utils.get(ctx.message.guild.roles, name = 'test7')
unfrac_role7 = discord.utils.get(ctx.message.guild.roles, name = 'test8')
unfrac_role8 = discord.utils.get(ctx.message.guild.roles, name = 'test9')
unfrac_role9 = discord.utils.get(ctx.message.guild.roles, name = 'test10')
unfrac_role10 = discord.utils.get(ctx.message.guild.roles, name = 'test11')
unfrac_role11 = discord.utils.get(ctx.message.guild.roles, name = 'test12')
unfrac_role12 = discord.utils.get(ctx.message.guild.roles, name = 'test13')
unfrac_role13 = discord.utils.get(ctx.message.guild.roles, name = 'test14')
unfrac_role14 = discord.utils.get(ctx.message.guild.roles, name = 'test15')
unfrac_role15 = discord.utils.get(ctx.message.guild.roles, name = 'test16')
unfrac_role16 = discord.utils.get(ctx.message.guild.roles, name = 'test17')
unfrac_role17 = discord.utils.get(ctx.message.guild.roles, name = 'test18')
unfrac_role18 = discord.utils.get(ctx.message.guild.roles, name = 'test19')
unfrac_role19 = discord.utils.get(ctx.message.guild.roles, name = 'test20')
unfrac_role20 = discord.utils.get(ctx.message.guild.roles, name = 'test21')
unfrac_role21 = discord.utils.get(ctx.message.guild.roles, name = 'test22')
emb = discord.Embed(title = 'Снятие ролей', colour = discord.Color.purple())
emb.add_field(name = 'Роль снята.', value = f'Роль снята с пользователя {member.mention}')
message = await ctx.send(embed = emb)
await member.remove_roles(unfrac_role)
await member.remove_roles(unfrac_role1)
await member.remove_roles(unfrac_role2)
await member.remove_roles(unfrac_role3)
await member.remove_roles(unfrac_role4)
await member.remove_roles(unfrac_role5)
await member.remove_roles(unfrac_role6)
await member.remove_roles(unfrac_role7)
await member.remove_roles(unfrac_role8)
await member.remove_roles(unfrac_role9)
await member.remove_roles(unfrac_role10)
await member.remove_roles(unfrac_role11)
await member.remove_roles(unfrac_role12)
await member.remove_roles(unfrac_role13)
await member.remove_roles(unfrac_role14)
await member.remove_roles(unfrac_role15)
await member.remove_roles(unfrac_role16)
await member.remove_roles(unfrac_role17)
await member.remove_roles(unfrac_role18)
await member.remove_roles(unfrac_role19)
await member.remove_roles(unfrac_role20)
await member.remove_roles(unfrac_role21)
await message.add_reaction('✅')
else:
await stx.channel.purge(limit = 1)
channel = stx.message.channel(703596630892478508)
Ответы (1 шт):
Автор решения: Fixator10
→ Ссылка
Используйте "списковые включения" (PEP 202) для построения списка ролей и снятия ролей через remove_roles поддерживающий несколько аргументов-ролей.
@client.command()
@commands.has_any_role(703596629923725334, 703596629911142433, 703596629894365211, 703596629894365210)
async def unfrac(ctx, member: discord.Member, *, reason: str = None):
thhchannel = ctx.channel
ttttt = client.get_channel(703596630892478508)
if thhchannel == ttttt:
roles = ['test1', 'test2', 'test3', 'test4', 'test5', 'test6', 'test7', 'test8', 'test9', 'test10', 'test11', 'test12', 'test13', 'test14', 'test15', 'test16', 'test17', 'test18', 'test19', 'test20', 'test21', 'test22']
roles = [discord.utils.get(ctx.guild.roles, name = role) for role in roles]
emb = discord.Embed(title = 'Снятие ролей', colour = discord.Color.purple())
emb.add_field(name = 'Роль снята.', value = f'Роль снята с пользователя {member.mention}')
message = await ctx.send(embed = emb)
await member.remove_roles(*roles)
await message.add_reaction('✅')
else:
await ctx.message.delete() # лучше удалять сообщение напрямую, во избежание "racing condition"