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): passed_info = interaction await interaction.response.send_message(content="Hello world!", view=self.IssueButtons(passed_info), 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, passed_info): super().__init__() self.passed_info: discord.Interaction = passed_info @discord.ui.button(label="Bot Bug", style=discord.ButtonStyle.danger, row=0) async def issue_button_bot_bug(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_modal(Issues.IssuesModal(button_id="bug")) @discord.ui.button(label="Cog Bug", style=discord.ButtonStyle.danger, row=1) async def issue_button_cog_bug(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_modal(Issues.IssuesModal(button_id="bug")) @discord.ui.button(label="Bot Suggestion", style=discord.ButtonStyle.blurple, row=0) async def issue_button_bot_suggestion(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_modal(Issues.IssuesModal(button_id="bot_suggestion")) @discord.ui.button(label="Cog Suggestion", style=discord.ButtonStyle.blurple, row=1) async def issue_button_cog_suggestion(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_modal(Issues.IssuesModal(button_id="cog_suggestion")) class IssuesModal(discord.ui.Modal, title="Creating issue..."): def __init__(self, button_id): super().__init__() self.button_id = button_id self.input_list = [] if self.button_id == "cog_suggestion": self.cog_name = discord.ui.TextInput( label="What cog is your feature request for?", placeholder="If unsure, input 'GalaxyCogs'", style=discord.TextStyle.short, max_length=100 ) self.input_list.append(self.cog_name) if self.button_id == "cog_suggestion" or self.button_id == "bot_suggestion": self.feature_request_description = discord.ui.TextInput( label="Is your feature request related to a problem?", placeholder="A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]", style=discord.TextStyle.paragraph, max_length=2048 ) self.solution = discord.ui.TextInput( label="Solution", placeholder="Provide a clear and concise description of the solution you'd like.", style=discord.TextStyle.paragraph, required=True, max_length=2048 ) self.alternatives = discord.ui.TextInput( label="Alternatives", placeholder="Describe alternatives you've considered.", style=discord.TextStyle.paragraph, required=True, max_length=2048 ) self.input_list.append(self.feature_request_description) self.input_list.append(self.solution) self.input_list.append(self.alternatives) if self.button_id == "bot": self.bug_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 ) self.reproduction_steps = discord.ui.TextInput( label="To Reproduce", placeholder="What caused the bug?", style=discord.TextStyle.paragraph, required=True, max_length=2048 ) self.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 ) self.input_list.append(self.bug_description) self.input_list.append(self.reproduction_steps) self.input_list.append(self.expected_behavior) self.additional_context = discord.ui.TextInput( label="Additional Context", placeholder=f"Add any other context about the {'problem' if self.button_id == 'bug' else 'feature request'} here.", style=discord.TextStyle.paragraph, required=False, max_length=2048 ) self.screenshots = discord.ui.TextInput( label="Screenshots", placeholder=f"Add screenshots to help explain your {'problem' if self.button_id == 'bug' else 'feature request'}. Seperate each screenshot with a newline.", style=discord.TextStyle.paragraph, required=False, max_length=2048 ) self.input_list.append(self.additional_context) self.input_list.append(self.screenshots) async def on_submit(self, interaction: discord.Interaction): embed = discord.Embed(title="Issue Request", color=await Issues.bot.get_embed_color(None)) for item in self.input_list: title = item.label value = item.value if value is not None: embed.add_field(title, value) await interaction.response.send_message(embed=embed)