async def list(self, ctx): """ Get all roles for current server :param ctx: Context :return: """ embed = Embed() embed.set_author(name=self.__bot.user.name, url=settings.URL, icon_url=self.__bot.user.avatar_url) async with session_lock: with Session() as session: # Get server data server = get_create_ctx(ctx, session, server_crud) # Get roles for server roles = role_crud.get_multi_by_server_uuid( session, server.uuid ) embed.title = f"Roles for *{ctx.guild.name}*" embed.colour = Colors.success # List all roles for current server for role in roles: embed.add_field( name=role.name, value=role.description, inline=False ) embed.timestamp = datetime.utcnow() await ctx.send(embed=embed)
async def add(self, ctx, name: str): """ Assign role for author :param ctx: Context :param name: Role name :return: """ embed = Embed() embed.set_author(name=self.__bot.user.name, url=settings.URL, icon_url=self.__bot.user.avatar_url) async with session_lock: with Session() as session: db_member = get_create_ctx(ctx, session, member_crud) found, d_id = add_to_role( session, db_member.uuid, role_name=name ) # If role is not found if not found: embed.title = "This role is not assignable!" embed.colour = Colors.error embed.description = "This role doesn't exists or " \ "it is not assignable." else: try: role = ctx.guild.get_role(int(d_id)) await ctx.author.add_roles( role, reason="Added through role add command." ) embed.title = f"*{ctx.author.name}* has been " \ f"added to *{name}*!" embed.colour = Colors.success except Forbidden: embed.title = "I don't have a permission to do that :(" embed.colour = Colors.unauthorized embed.description = "Give me a permission to manage" \ " roles or give me a higher role." except HTTPException: embed.title = "Something happened, didn't succeed :/" embed.colour = Colors.error embed.timestamp = datetime.utcnow() await ctx.send(embed=embed)
async def init(self, ctx): """ Initialize role message for current channel :param ctx: Context :return: """ async with session_lock: with Session() as session: db_server = get_create_ctx(ctx, session, server_crud) embed = Embed() embed.title = f"Assignable roles for **{ctx.guild.name}**" embed.description = "Use reactions inorder to get " \ "roles assigned to you, or use " \ "`!role add roleName`" converter = commands.EmojiConverter() pconverter = commands.PartialEmojiConverter() # Get all roles on the server roles = role_crud.get_multi_by_server_uuid( session, get_create_ctx(ctx, session, server_crud).uuid ) # Gather all used emojis for future reactions emojis = [] for r in roles: emoji = emoji_crud.get_by_role( session, r.uuid ) if emoji is not None: try: # Convert into actual emoji e = await converter.convert( ctx, emoji.identifier ) except commands.EmojiNotFound: # Try partial emoji instead try: e = await pconverter.convert( ctx, emoji.identifier ) except commands.PartialEmojiConversionFailure: # Assume that it is an unicode emoji e = emoji.identifier # Add to message embed.add_field( name=f"{str(e)} == {r.name}", value=r.description, inline=False ) emojis.append(e) # Send message role_message = await ctx.send(embed=embed) # Add reaction to message with all used emojis for e in emojis: await role_message.add_reaction(e) # Update server object to include role message data server_update = UpdateServer(**{ "role_message": str(role_message.id), "role_channel": str(ctx.channel.id) }) server_crud.update( session, db_obj=db_server, obj_in=server_update )
async def create( self, ctx, discord_id: int, description: str, emoji: str = None ): """ Create assignable role :param ctx: Context :param discord_id: Role Discord ID :param description: Description of role usage :param emoji: Emoji for assignment via reactions :return: """ embed = Embed() embed.set_author(name=self.__bot.user.name, url=settings.URL, icon_url=self.__bot.user.avatar_url) async with session_lock: with Session() as session: d_role = ctx.guild.get_role(discord_id) db_role = role_crud.get_by_discord(session, discord_id) # TODO Add emoji parsing if d_role is None: embed.title = "Role not found." embed.colour = Colors.error elif db_role is not None: embed.title = "Role already exists!" embed.colour = Colors.other else: role = CreateRole(**{ "discord_id": discord_id, "name": d_role.name, "description": description, "server_uuid": get_create_ctx( ctx, session, server_crud ).uuid }) db_role = role_crud.create(session, obj_in=role) if emoji is not None: converter = commands.EmojiConverter() pconverter = commands.PartialEmojiConverter() try: # Convert into actual emoji e = await converter.convert( ctx, emoji ) except commands.EmojiNotFound: # Try partial emoji instead try: e = await pconverter.convert( ctx, emoji ) except commands.PartialEmojiConversionFailure: # Assume that it is an unicode emoji e = emoji else: e = None if e is not None and not isinstance(e, discord.partial_emoji.PartialEmoji): if hasattr(e, 'name'): e = e.name db_e = CreateRoleEmoji(**{ "identifier": e, "role_uuid": db_role.uuid }) emoji_crud.create(session, obj_in=db_e) elif isinstance(emoji, discord.partial_emoji.PartialEmoji): embed.description = "**Note**: Role was created" \ " without an emoji, because the bot " \ "cannot use provided emoji..." else: embed.description = "**Note**: Role was created" \ " without an emoji, so it " \ "cannot be assigned with " \ "reactions!" embed.title = f"Role *{db_role.name}* created." embed.colour = Colors.success embed.timestamp = datetime.utcnow() await ctx.send(embed=embed)