Распределение ролей по алфавиту
Привет! Я пытаюсь составить список ролей в алфавитном порядке. Я могу перечислить роли на своем сервере раздора. Я не уверен, как их перечислить в алфавитном порядке в.py. Я искал везде безуспешно.
Вот с чем я работаю.
import re
import discord
from .utils import checks
from discord.ext import commands
from __main__ import send_cmd_help
class Roles:
def __init__(self, bot):
self.bot = bot
@commands.command(pass_context=True, no_pm=True, name='add', aliases=['iam','iplay'])
async def add(self, context, *role_name):
"""Add a role"""
server = context.message.server
author = context.message.author
name = ' '.join(role_name)
roles = [role.name.lower() for role in server.roles]
if name.lower() in roles:
for role in server.roles:
if role.name.lower() == name.lower():
if role.permissions.value < 1:
try:
await self.bot.add_roles(author, role)
message = '{} added the role **{}**.'.format(author.display_name, role.name)
embed = discord.Embed(description=message.format(author.display_name, role.name), colour=0x00ff00)
embed.set_footer(text="Tip: type the command !roles or !list to list all roles.")
break
except discord.Forbidden:
message = 'I have no permissions to do that. Please give me role managing permissions.'
embed = discord.Embed(description=message)
else:
message = 'You cannot use this role'
embed = discord.Embed(description=message)
else:
message = 'No such role'
embed = discord.Embed(description=message)
else:
message = 'I cannot find that role :frowning2:'
embed = discord.Embed(description=message)
embed.set_footer(text="Tip: type the command !list to list all roles.")
await self.bot.say(embed=embed)
@commands.command(pass_context=True, no_pm=True, name='remove')
async def remove(self, context, *role_name):
"""Remove a role"""
server = context.message.server
author = context.message.author
name = ' '.join(role_name)
roles = [role.name.lower() for role in server.roles]
if name.lower() in roles:
for role in server.roles:
if role.name.lower() == name.lower():
try:
await self.bot.remove_roles(author, role)
message = '{} removed the role **{}**'.format(author.display_name, role.name)
embed = discord.Embed(description=message.format(author.display_name, role.name), colour=0xff0000)
break
except discord.Forbidden:
message = 'I have no permissions to do that. Please give me role managing permissions.'
embed = discord.Embed(description=message)
else:
message = '`Something went wrong...`'
embed = discord.Embed(description=message)
else:
message = 'There is no such role on this server'
embed = discord.Embed(description=message)
await self.bot.say(embed=embed)
@commands.command(pass_context=True, no_pm=True, name='list', aliases=['roles', 'role'])
async def _list(self, context):
"""List of all available roles """
server = context.message.server
author = context.message.author
message = '\n**Hey {}, here is a list of roles you can add:**\n'.format(author.display_name)
for role in server.roles:
if role.permissions.value < 1:
message += '\n{} **({})**'.format(role.name, len([member for member in server.members if ([r for r in member.roles if r.name == role.name])]))
message += ''
embed = discord.Embed(description=message.format(), colour=0x0080c0)
embed.set_footer(text="Tip: to add a role from the list type the command !add/remove followed by the role.")
await self.bot.say(embed=embed)
def setup(bot):
n = Roles(bot)
bot.add_cog(n)
Если бы кто-нибудь мог помочь мне в том, как это работает, это было бы очень признательно.
1 ответ
Все дело в охоте за тем, что тебе нужно.
Вы хотите что-то изменить, когда вы перечислите роли, поэтому вы должны проверить под def _list()
функция. Там мы видим, что он перебирает все роли внутри for role in server.roles:
,
Это, вероятно, то, что вы хотите изменить. Сортировав список непосредственно перед тем, как выполнить их итерацию, вы сможете выполнить его по мере необходимости:
for role in sorted(server.roles, key=lambda r: r.name):
Если вы настроите свой код в соответствии с вышеизложенным, вы в основном будете использовать встроенный sorted()
функция сортировки списка. Используя key
параметр, вы можете дать функции основу сортировки, которая будет names
атрибут вложенного объекта.