GalaxyCogs/issues/issues.py

148 lines
7.6 KiB
Python
Raw Normal View History

2023-08-17 02:50:25 -04:00
from typing import Union
from redbot.core import commands, Config, app_commands
2023-08-17 02:50:25 -04:00
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(
2023-08-17 02:50:25 -04:00
channel = None,
gitea_url = None
2023-08-17 02:50:25 -04:00
)
@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)
2023-08-17 02:50:25 -04:00
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):
2023-08-17 02:50:25 -04:00
super().__init__()
self.passed_info: discord.Interaction = passed_info
2023-08-17 02:50:25 -04:00
@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"))
2023-08-17 02:50:25 -04:00
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)
2023-08-17 02:50:25 -04:00
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)