import re from typing import Union import discord from discord.ext.commands.converter import IDConverter from discord.ext.commands.errors import BadArgument from redbot.core import commands from redbot.core.i18n import Translator _ = Translator("Translate", __file__) class ChannelUserRole(IDConverter): """ This will check to see if the provided argument is a channel, user, or role Guidance code on how to do this from: https://github.com/Rapptz/discord.py/blob/rewrite/discord/ext/commands/converter.py#L85 https://github.com/Cog-Creators/Red-DiscordBot/blob/V3/develop/redbot/cogs/mod/mod.py#L24 """ async def convert( self, ctx: commands.Context, argument: str ) -> Union[discord.TextChannel, discord.Role, discord.Member]: guild = ctx.guild result = None id_match = self._get_id_match(argument) channel_match = re.match(r"<#([0-9]+)>$", argument) member_match = re.match(r"<@!?([0-9]+)>$", argument) role_match = re.match(r"<@&([0-9]+)>$", argument) for converter in ["channel", "role", "member"]: if converter == "channel": match = id_match or channel_match if match: channel_id = match.group(1) result = guild.get_channel(int(channel_id)) else: result = discord.utils.get(guild.text_channels, name=argument) if converter == "member": match = id_match or member_match if match: member_id = match.group(1) result = guild.get_member(int(member_id)) else: result = guild.get_member_named(argument) if converter == "role": match = id_match or role_match if match: role_id = match.group(1) result = guild.get_role(int(role_id)) else: result = discord.utils.get(guild._roles.values(), name=argument) if result: break if not result: msg = _("{arg} is not a valid channel, user or role.").format(arg=argument) raise BadArgument(msg) return result