2023-09-01 19:37:50 -04:00
|
|
|
import discord
|
2023-09-01 22:02:15 -04:00
|
|
|
from discord import ui
|
2023-09-01 19:37:50 -04:00
|
|
|
from redbot.core import Config, checks, commands
|
|
|
|
|
|
|
|
|
|
|
|
class Forums(commands.Cog):
|
|
|
|
"""Custom cog intended for use on the Galaxy discord server.
|
|
|
|
Developed by SeaswimmerTheFsh."""
|
|
|
|
|
|
|
|
def __init__(self, bot):
|
|
|
|
self.bot = bot
|
|
|
|
self.config = Config.get_conf(self, identifier=2352711325)
|
|
|
|
self.config.register_guild(
|
2023-09-01 19:56:41 -04:00
|
|
|
request_roles = [],
|
2023-09-01 22:02:15 -04:00
|
|
|
forum_channel = "",
|
|
|
|
forum_tag = ""
|
2023-09-01 19:37:50 -04:00
|
|
|
)
|
|
|
|
|
2023-09-01 19:42:11 -04:00
|
|
|
@commands.command()
|
2023-09-01 22:02:15 -04:00
|
|
|
async def resolved(self, ctx: commands.Context, reason: str = None):
|
2023-09-01 19:37:50 -04:00
|
|
|
"""Marks a thread as resolved."""
|
2023-09-01 22:02:15 -04:00
|
|
|
if isinstance(ctx.channel, discord.Thread) and ctx.channel.parent_id == await self.config.guild(ctx.guild).forum_channel():
|
|
|
|
match = any(role_id in ctx.author.roles for role_id in await self.config.guild(ctx.guild).request_roles())
|
|
|
|
passed_info = {
|
|
|
|
"ctx": ctx,
|
|
|
|
"match": match
|
|
|
|
}
|
|
|
|
if match and reason:
|
|
|
|
passed_info.update({"reason": reason})
|
|
|
|
if match or ctx.author.id == ctx.channel.owner_id:
|
|
|
|
msg = await ctx.send("Are you sure you'd like to mark this thread as resolved?")
|
|
|
|
passed_info.update({"msg": msg})
|
|
|
|
await msg.edit(view=self.ResolvedButtons(timeout=180, passed_info=passed_info))
|
|
|
|
await ctx.message.add_reaction("❌")
|
|
|
|
|
|
|
|
class ResolvedButtons(ui.View):
|
|
|
|
def __init__(self, timeout, passed_info: dict):
|
|
|
|
super().__init__()
|
|
|
|
self.timeout = timeout
|
|
|
|
self.ctx: commands.Context = passed_info['ctx']
|
|
|
|
self.match: bool = passed_info['match']
|
|
|
|
self.msg: discord.Message = passed_info['msg']
|
|
|
|
if passed_info['reason']:
|
|
|
|
self.reason: str = passed_info['reason']
|
|
|
|
self.config = Config.get_conf(None, cog_name='Forums', identifier=2352711325)
|
|
|
|
|
|
|
|
@ui.button(label="Yes", style=discord.ButtonStyle.success, emoji="✅")
|
|
|
|
async def resolved_button_yes(self, button: ui.Button, interaction: discord.Interaction):
|
|
|
|
channel = self.ctx.channel
|
|
|
|
await channel.edit(locked=True, archived=True, applied_tags=channel.applied_tags + await self.config.guild(channel.guild).forum_tag())
|
|
|
|
|
|
|
|
@commands.group(name='forumconfig', invoke_without_command=True, aliases=['forumsset'])
|
|
|
|
@commands.guild_only()
|
|
|
|
@commands.admin()
|
|
|
|
async def forumsconfig(self, ctx: commands.Context):
|
|
|
|
"""Manages the request roles list."""
|
|
|
|
current_list = await self.config.guild(ctx.guild).request_roles()
|
|
|
|
already_in_list = []
|
|
|
|
for role_id in current_list:
|
|
|
|
role_obj = ctx.guild.get_role(role_id)
|
|
|
|
if role_obj:
|
|
|
|
already_in_list.append(role_obj.mention)
|
|
|
|
if already_in_list:
|
|
|
|
await ctx.send("Roles already in the request roles list:\n" + "\n".join(already_in_list), allowed_mentions = discord.AllowedMentions(roles=False))
|
|
|
|
else:
|
|
|
|
await ctx.send("No roles are currently in the request roles list.")
|
|
|
|
|
|
|
|
@forumsconfig.command(name='add')
|
|
|
|
@commands.guild_only()
|
|
|
|
@commands.admin()
|
|
|
|
async def forumsconfig_add(self, ctx: commands.Context, role: discord.Role = None):
|
|
|
|
"""Adds roles to the request roles list."""
|
|
|
|
current_list = await self.config.guild(ctx.guild).request_roles()
|
|
|
|
if role:
|
|
|
|
if role.id in current_list:
|
|
|
|
await ctx.send("This role is already in the request roles list!")
|
|
|
|
return
|
|
|
|
else:
|
|
|
|
current_list.append(role.id)
|
|
|
|
await self.config.guild(ctx.guild).request_roles.set(current_list)
|
|
|
|
await ctx.send(f"{role.mention} has been added to the request roles list.", allowed_mentions = discord.AllowedMentions(roles=False))
|
|
|
|
else:
|
|
|
|
await ctx.send("Please provide a valid role.")
|
|
|
|
|
|
|
|
@forumsconfig.command(name='remove')
|
|
|
|
@commands.guild_only()
|
|
|
|
@commands.admin()
|
|
|
|
async def forumsconfig_remove(self, ctx: commands.Context, role: discord.Role = None):
|
|
|
|
"""Removes roles from the request roles list."""
|
|
|
|
current_list = await self.config.guild(ctx.guild).request_roles()
|
|
|
|
if role.id in current_list:
|
|
|
|
current_list.remove(role.id)
|
|
|
|
await self.config.guild(ctx.guild).request_roles.set(current_list)
|
|
|
|
await ctx.send(f"{role.mention} has been removed from the request roles list.", allowed_mentions = discord.AllowedMentions(roles=False))
|
2023-09-01 19:56:41 -04:00
|
|
|
else:
|
2023-09-01 22:02:15 -04:00
|
|
|
await ctx.send("Please provide a valid role that exists in the request roles list.")
|
|
|
|
|
|
|
|
# Function to create select options
|
2023-09-01 22:04:59 -04:00
|
|
|
def create_select_options(self, ctx: commands.Context, data):
|
2023-09-01 22:02:15 -04:00
|
|
|
options = []
|
|
|
|
for tag in data:
|
2023-09-01 22:04:59 -04:00
|
|
|
emoji = ctx.guild.get_emoji(tag.emoji.id) if tag.emoji.id else str(tag.emoji.name)
|
2023-09-01 22:02:15 -04:00
|
|
|
options.append(discord.SelectOption(label=tag.name, emoji=emoji, description=""))
|
|
|
|
return options
|
|
|
|
|
2023-09-01 22:05:32 -04:00
|
|
|
@forumsconfig.command(name="tagset")
|
2023-09-01 22:13:26 -04:00
|
|
|
async def forumsconfig_tag_set(self, ctx: commands.Context, channel: discord.ForumChannel):
|
2023-09-01 22:02:15 -04:00
|
|
|
# Create select options from the proxy data
|
2023-09-01 22:04:59 -04:00
|
|
|
options = self.create_select_options(ctx, channel.available_tags)
|
2023-09-01 22:13:26 -04:00
|
|
|
config = Config.get_conf(None, cog_name='Forums', identifier=2352711325)
|
|
|
|
tag = config.guild(ctx.guild).forum_tag()
|
2023-09-01 22:15:42 -04:00
|
|
|
msg = await ctx.send(f"Forum tag is currently set to `{tag}`.")
|
|
|
|
await msg.edit(view=SelectView(msg, options))
|
2023-09-01 22:02:15 -04:00
|
|
|
|
|
|
|
class Select(ui.Select):
|
2023-09-01 22:13:26 -04:00
|
|
|
def __init__(self, message, options):
|
|
|
|
self.message = message
|
2023-09-01 22:02:15 -04:00
|
|
|
super().__init__(placeholder="Select an option", max_values=1, min_values=1, options=options)
|
|
|
|
|
|
|
|
async def callback(self, interaction: discord.Interaction):
|
2023-09-01 22:13:26 -04:00
|
|
|
msg: discord.Message = self.message
|
|
|
|
await interaction.response.defer()
|
|
|
|
config = Config.get_conf(None, cog_name='Forums', identifier=2352711325)
|
|
|
|
config.guild(msg.guild).set.forum_tag(self.values[0])
|
|
|
|
await msg.edit(f"Set resolved tag to {self.values[0]}", view=None)
|
2023-09-01 22:02:15 -04:00
|
|
|
|
|
|
|
class SelectView(ui.View):
|
2023-09-01 22:15:42 -04:00
|
|
|
def __init__(self, msg, options, *, timeout=180):
|
2023-09-01 22:02:15 -04:00
|
|
|
super().__init__(timeout=timeout)
|
2023-09-01 22:15:42 -04:00
|
|
|
self.add_item(Select(msg, options))
|