diff options
author | lexicade <jasonnlelong@gmail.com> | 2023-01-27 21:06:30 +0000 |
---|---|---|
committer | lexicade <jasonnlelong@gmail.com> | 2023-01-27 21:06:30 +0000 |
commit | 52801b4de1d63cd01191acf7fcee137977140ec0 (patch) | |
tree | 08271a1f1e3e8060486b6651c67c9934867c648e /cogs/Starboard.py | |
parent | 8df873808c86805624851356f5dea76ec621de23 (diff) |
Diffstat (limited to 'cogs/Starboard.py')
-rw-r--r-- | cogs/Starboard.py | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/cogs/Starboard.py b/cogs/Starboard.py new file mode 100644 index 0000000..9195d87 --- /dev/null +++ b/cogs/Starboard.py @@ -0,0 +1,183 @@ +import re + +from discord.ext import commands +import discord +import importlib +import utils +importlib.reload(utils) +colours = {"default": 0, + "teal": 0x1abc9c, + "dark teal": 0x11806a, + "green": 0x2ecc71, + "dark green": 0x1f8b4c, + "blue": 0x3498db, + "dark blue": 0x206694, + "purple": 0x9b59b6, + "dark purple": 0x71368a, + "magenta": 0xe91e63, + "dark magenta": 0xad1457, + "gold": 0xf1c40f, + "dark gold": 0xc27c0e, + "orange": 0xe67e22, + "dark orange": 0xa84300, + "red": 0xe74c3c, + "dark red": 0x992d22, + "lighter grey": 0x95a5a6, + "dark grey": 0x607d8b, + "light grey": 0x979c9f, + "darker grey": 0x546e7a, + "blurple": 0x7289da, + "greyple": 0x99aab5} + + +class Starboard(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_raw_reaction_add(self, payload): + if payload.user_id == self.bot.user: + return + + if payload.emoji.name == "⭐": + sql_star = await utils.sql('SELECT min_stars, sb_channel FROM starboard WHERE guild_id = %s', (payload.guild_id,)) + if sql_star is None: + return + + obj_channel: discord.TextChannel = self.bot.get_channel(payload.channel_id) + obj_message: discord.Message = await obj_channel.fetch_message(payload.message_id) + obj_chnl_sb = self.bot.get_channel(int(sql_star[0]['sb_channel'])) + + for reaction in obj_message.reactions: + if reaction.emoji == "⭐" and reaction.count >= int(sql_star[0]['min_stars']): + + # Check if message exists in Starboard + async for sb_msg in obj_chnl_sb.history(limit=100, before=None, after=None): + for embed in sb_msg.embeds: + if embed.description == discord.embeds.EmptyEmbed: + continue + + matches = re.findall(r'[[A-Za-z]+!]\(https?://[\w./]+\)', embed.description) + for match in matches: + match_message_id = match.rsplit("/", 1)[1].replace(")", "") + + if str(match_message_id) == str(payload.message_id): + return + + # Create the embed + url = f"https://discordapp.com/channels/{payload.guild_id}/{payload.channel_id}/{payload.message_id}" + + msg = f"**Quoted from: {obj_channel.mention}**\n\n" \ + f"**{obj_message.author.mention} wrote:**\n" \ + f"{obj_message.content}\n" \ + f"[Jump to message!]({url})" + + if obj_message.reference: + msg_reply: discord.Message = await obj_channel.fetch_message(obj_message.reference.message_id) + msg = msg + f"\n\n**Replied to {msg_reply.author.mention}**\n" \ + f"{msg_reply.content}\n" \ + f"[Jump to reply!]({obj_message.reference.jump_url})" + + sb_emb = discord.Embed(description=msg, color=colours["gold"]) + sb_emb.set_author(name=obj_message.author.display_name, icon_url=obj_message.author.display_avatar) + + # Get attachment and add as embed image + if len(obj_message.attachments) > 0: + im = obj_message.attachments[0] + sb_emb.set_image(url=im.url) + + # Paste to channel + await obj_chnl_sb.send(embed=sb_emb) + + @commands.Cog.listener() + async def on_raw_reaction_remove(self, payload): + if payload.user_id == self.bot.user: + return + + if payload.emoji.name == "⭐": + sql_star = await utils.sql('SELECT min_stars, sb_channel FROM starboard WHERE guild_id = %s', (payload.guild_id,)) + + obj_channel = self.bot.get_channel(payload.channel_id) + obj_message = await obj_channel.fetch_message(payload.message_id) + obj_chnl_sb = self.bot.get_channel(int(sql_star[0]['sb_channel'])) + + async for sb_msg in obj_chnl_sb.history(limit=100, before=None, after=None): + for i in sb_msg.embeds: + if str(i.footer.text) == str(payload.message_id): + + # If message has star reactions: + if "'⭐'" in str(obj_message.reactions): + for reaction in obj_message.reactions: + if reaction.emoji == "⭐" and reaction.count < int(sql_star[0]['min_stars']): + await sb_msg.delete() + + @commands.group( + invoke_without_command=True, + aliases=[], + application_command_meta=commands.ApplicationCommandMeta( + options=[ + discord.ApplicationCommandOption( + name="channel", + description="Set the Staboard channel", + type=discord.ApplicationCommandOptionType.string, + required=True, + ), + discord.ApplicationCommandOption( + name="stars", + description="Set the minimum stars to post to the Starboard channel", + type=discord.ApplicationCommandOptionType.integer, + required=True, + ), + ] + ) + ) + async def starboard(self, ctx): + """Let your community star it's best comments.""" + + @commands.defer(ephemeral=True) + @starboard.command(aliases=[], application_command_meta=commands.ApplicationCommandMeta(options=[])) + @commands.has_permissions(administrator=True) + async def channel(self, ctx): + await utils.sql('INSERT INTO starboard (guild_id, sb_channel) VALUES (%s, %s) ON CONFLICT (guild_id) DO UPDATE SET sb_channel = %s', (ctx.guild.id, ctx.channel.id, ctx.channel.id,)) + await ctx.send(f"The Starboard channel has been set to #{ctx.channel.mention}.") + + @commands.defer(ephemeral=True) + @starboard.command( + aliases=[], + application_command_meta=commands.ApplicationCommandMeta( + options=[ + discord.ApplicationCommandOption( + name="stars", + description="Set the minimum stars to post to the Starboard channel", + type=discord.ApplicationCommandOptionType.integer, + required=True, + ) + ], + ) + ) + @commands.has_permissions(administrator=True) + async def stars(self, ctx, stars: int): + try: + arg_int = int(stars) + + except Exception as e: + await ctx.send(f"Please provide a valid number.") + print(f"Starboard - stars - Error: {e}") + return + + if arg_int <= 0: + await ctx.send(f"The minimum stars must be at least 1`.") + return + + await utils.sql('INSERT INTO starboard (guild_id, min_stars) VALUES (%s, %s) ON CONFLICT (guild_id) DO UPDATE SET min_stars = %s', (ctx.guild.id, arg_int, arg_int,)) + await ctx.send(f"The minimum stars required has been set to {arg_int}.") + + +def setup(bot): + print("INFO: Loading [Starboard]... ", end="") + bot.add_cog(Starboard(bot)) + print("Done!") + + +def teardown(bot): + print("INFO: Unloading [Starboard]") |