from typing import Union from redbot.core import commands, Config, app_commands import discord class Issues(commands.Cog): """This cog allows you to create Gitea issues through a Discord modal. Developed by SeaswimmerTheFsh.""" def __init__(self, bot): self.bot = bot self.config = Config.get_conf(self, identifier=4285273314713, force_registration=True) self.config.register_global( channel = None, gitea_url = None ) @app_commands.command() async def issuestest(self, interaction: discord.Interaction): await interaction.response.send_message(content="Hello world!", view=self.IssueButtons(), ephemeral=True) async def send_to_target(self, target: Union[discord.Member, discord.TextChannel], interaction: discord.Interaction, message: str, secondary_message: str = None): if isinstance(target, discord.Member): target_type = "member" elif isinstance(target, discord.TextChannel): target_type = "textchannel" try: await target.send(message) if secondary_message is not None: await target.send(secondary_message) await interaction.response.send_message(content=f"Message sent to {target.mention}!\nMessage contents:\n```{message}```\n```{secondary_message}```", ephemeral=True) else: await interaction.response.send_message(content=f"Message sent to {target.mention}!\nMessage contents:\n```{message}```", ephemeral=True) except (discord.HTTPException, discord.Forbidden) as error: if target_type == "member": await interaction.response.send_message(content="That user has their direct messages closed!", ephemeral=True) elif target_type == "textchannel": await interaction.response.send_message(content="I cannot access that channel!", ephemeral=True) class IssueButtons(discord.ui.View): def __init__(self, timeout): super().__init__() self.timeout = timeout @discord.ui.button(label="Yes", style=discord.ButtonStyle.success) async def issue_button_bot(self, button: discord.ui.Button, interaction: discord.Interaction): await interaction.response.send_modal(Issues.BotModal()) class BotModal(discord.ui.Modal, title="Creating issue..."): def __init__(self): super().__init__() description = discord.ui.TextInput( label="Describe the bug", placeholder="A clear and concise description of what the bug is.", style=discord.TextStyle.paragraph, max_length=2048 ) reproduction_steps = discord.ui.TextInput( label="To Reproduce", placeholder="What caused the bug?", style=discord.TextStyle.paragraph, required=True, max_length=2048 ) expected_behavior = discord.ui.TextInput( label="Expected Behavior", placeholder="A clear and concise description of what you expected to happen.", style=discord.TextStyle.paragraph, required=True, max_length=2048 ) additional_context = discord.ui.TextInput( label="Additional Context", placeholder="Add any other context about the problem here.", style=discord.TextStyle.paragraph, required=False, max_length=2048 ) screenshots = discord.ui.TextInput( label="Screenshots", placeholder="If applicable, add screenshots to help explain your problem. Seperate each screenshot with a newline.", style=discord.TextStyle.paragraph, required=False, max_length=2048 ) async def on_submit(self, interaction: discord.Interaction): embed = discord.Embed(title="Issue Request", color=await Issues.bot.get_embed_color(None)) fields = [self.description, self.reproduction_steps, self.expected_behavior, self.additional_context, self.screenshots] await Issues.send_to_target(self, self.target, interaction, self.message, self.secondary_message)