modmail init

This commit is contained in:
Ryonia Coruscare 2020-12-21 17:17:04 +13:00
parent 20e19f2521
commit bc5686c893
Signed by: ryonia
GPG key ID: 5040C0F02BC53C5A
3 changed files with 192 additions and 0 deletions

5
modmail/__init__.py Normal file
View file

@ -0,0 +1,5 @@
from .modmail import Modmail
def setup(bot):
bot.add_cog(Modmail(bot))

18
modmail/info.json Normal file
View file

@ -0,0 +1,18 @@
{
"author": [
"Ryonez Coruscare"
],
"description": "Allows users to submit modmail to the moderation team of any server that they share with the bot, that accepts modmail.",
"disabled": false,
"hidden": false,
"install_msg": "Thanks for installing this cog! Please report any issues here: https://codelabs.alteria.xyz/ryonez/ryo-cogs/issues",
"min_python_version": [
3,
7,
0
],
"name": "modmail",
"requirements": [],
"short": "Allows users to submit modmail.",
"tags": []
}

169
modmail/modmail.py Normal file
View file

@ -0,0 +1,169 @@
from redbot.core import commands, Config, checks
from redbot.core.bot import Red
from redbot.core.utils import menus
import discord
class Feedback(commands.Cog):
"""Allows a user to submit modmail to a mod team"""
def __init__(self, red: Red):
self.bot = red
self.config = Config.get_conf(
self, identifier=901101100011101010110111001100001)
default_guild = {
"enabled": False,
"channel": None,
}
self.config.register_guild(**default_guild)
self.guildChooserControls = {
"": self._accept_guild,
"": menus.prev_page,
"": menus.close_menu,
"": menus.next_page
}
self.feedbackConfirmControls = {
"": self._confirm_send,
"": self._cancel_send,
}
self.warning_icon_url = "https://cdn.discordapp.com/attachments/376577301007171584/518911438379548717/notice-yellow.png"
self.confirm_icon_url = "https://cdn.discordapp.com/attachments/376577301007171584/518910666917281813/security-green.png"
self.choosey_icon_url = "https://cdn.discordapp.com/attachments/376577301007171584/518914001929764881/choose-blue.png"
async def _accept_guild(
self,
ctx: commands.Context,
pages: list,
controls: dict,
message: discord.Message,
page: int,
timeout: float,
emoji: str,
):
if message:
guild_id = pages[page].footer.text
await self._process_feedback(ctx, guild_id)
return None
async def _cancel_send(
self,
ctx: commands.Context,
pages: list,
controls: dict,
message: discord.Message,
page: int,
timeout: float,
emoji: str,
):
if message:
await ctx.send("Ok, your feedback has been discarded.")
return None
async def _confirm_send(
self,
ctx: commands.Context,
pages: list,
controls: dict,
message: discord.Message,
page: int,
timeout: float,
emoji: str,
):
if message:
#TODO: relay the message to the configured channel
feedback_embed = discord.Embed(
type="rich",
colour=discord.Colour.from_rgb(r=255, g=0, b=255)
)
feedback_embed.set_author(
name="New anonymous feedback!", icon_url=self.warning_icon_url)
feedback_embed.add_field(name="Message", value=ctx.feedback)
await ctx.target_channel.send(embed=feedback_embed)
await ctx.send("Your anonymous feedback has been sent!")
return None
async def _process_feedback(self, ctx: commands.Context, guild_id: str):
#TODO: check config to be sure the server has feedback enabled
chosen_guild = self.bot.get_guild(int(guild_id))
if not chosen_guild:
await ctx.send(f"Sorry! There was a problem finding that guild...Report this to the bot owner!")
return
g = await self.config.guild(chosen_guild).all()
if not g["enabled"]:
await ctx.send(f"Sorry! {chosen_guild.name} has not enabled anonymous feedback.")
elif not g["channel"]:
await ctx.send(f"Sorry! {chosen_guild.name} has not configured this cog.")
else:
ctx.target_channel = self.bot.get_channel(g["channel"])
#TODO: call another menu to confirm
confirm_embed = discord.Embed(
colour=discord.Colour.from_rgb(r=182, g=82, b=19)
)
confirm_embed.set_author(
name="Confirm your feedback!", icon_url=self.confirm_icon_url)
confirm_embed.add_field(name="Message", value=ctx.feedback)
confirm_embed.set_footer(text=f"Server: {chosen_guild.name}")
await menus.menu(ctx, [confirm_embed], self.feedbackConfirmControls)
def _get_mutual_servers(self, member: discord.Member):
"""Returns a list of server objects in which the bot and member are mutuals"""
return [g for g in self.bot.guilds if g.get_member(member.id)]
@commands.command()
async def feedback(self, ctx: commands.Context, *, the_feedback: str):
#check if we're in tells or not
if type(ctx.message.channel) is not discord.DMChannel:
#if not in tells, delete the invocation and send a tell to the user
#TODO: do we need to make sure the user can receive tells??
await ctx.message.author.send(f"You need to use the <feedback> command here in DMs!")
await ctx.message.delete()
else:
ctx.feedback = the_feedback
#look for mutual servers
mutuals = self._get_mutual_servers(ctx.message.author)
#TODO: interactively ask which server to send to
if len(mutuals) > 1:
embed_pages = []
for mutual in mutuals:
this_embed = discord.Embed(
colour=discord.Colour.from_rgb(r=82, g=182, b=119)
)
this_embed.set_author(
name="Which server do you want to send feedback to?", icon_url=self.choosey_icon_url)
this_embed.add_field(name="Server", value=mutual.name)
this_embed.set_thumbnail(url=mutual.icon_url)
this_embed.set_footer(text=mutual.id)
embed_pages.append(this_embed)
await menus.menu(ctx, embed_pages, self.guildChooserControls)
elif len(mutuals) == 1:
await self._process_feedback(ctx, mutuals[0].id)
else:
await ctx.send("We don't appear to share any servers!")
@commands.group()
@checks.mod()
async def feedbackset(self, ctx: commands.Context):
"""Adjust Feedback settings"""
@feedbackset.command(name="enable")
async def fb_enable(self, ctx: commands.Context):
"""Enable Feedback cog for this server"""
enabled = await self.config.guild(ctx.guild).enabled()
if enabled:
await ctx.send("Feedback cog is already enabled for this server")
else:
await self.config.guild(ctx.guild).enabled.set(True)
await ctx.send("Enabled Feedback cog for this server")
@feedbackset.command(name="channel")
async def fb_channel(self, ctx: commands.Context, new_channel: discord.TextChannel):
old_channel = await self.config.guild(ctx.guild).channel()
if old_channel:
await ctx.send(f"Updating channel from {self.bot.get_channel(old_channel).name} to {new_channel}")
await self.config.guild(ctx.guild).channel.set(new_channel.id)
current_channel = await self.config.guild(ctx.guild).channel()
await ctx.send(f"Feedback will now go to {self.bot.get_channel(current_channel)}")