diff options
-rw-r--r-- | bot/constants.py | 4 | ||||
-rw-r--r-- | bot/exts/info/patreon.py | 162 | ||||
-rw-r--r-- | config-default.yml | 5 |
3 files changed, 171 insertions, 0 deletions
diff --git a/bot/constants.py b/bot/constants.py index db98e6f47..6fa5df1fc 100644 --- a/bot/constants.py +++ b/bot/constants.py @@ -513,6 +513,10 @@ class Roles(metaclass=YAMLGetter): jammers: int + patreon_tier_1: int + patreon_tier_2: int + patreon_tier_3: int + class Guild(metaclass=YAMLGetter): section = "guild" diff --git a/bot/exts/info/patreon.py b/bot/exts/info/patreon.py new file mode 100644 index 000000000..9a61885a4 --- /dev/null +++ b/bot/exts/info/patreon.py @@ -0,0 +1,162 @@ +import datetime +import logging + +import discord +from discord.ext import commands, tasks + +from bot import constants, utils +from bot.bot import Bot + +log = logging.getLogger(__name__) + + +class Patreon(commands.Cog): + """Cog that shows patreon supporters.""" + + def __init__(self, bot: Bot) -> None: + self.bot = bot + + self.current_monthly_supporters.start() + + @commands.Cog.listener() + async def on_member_update(self, before: discord.Member, after: discord.Member) -> None: + """Send a message when someone receives a patreon role.""" + # Ensure the caches are up to date + await self.bot.wait_until_guild_available() + + guild = after.guild + + patreon_tier_1_role = guild.get_role(constants.Roles.patreon_tier_1) + patreon_tier_2_role = guild.get_role(constants.Roles.patreon_tier_2) + patreon_tier_3_role = guild.get_role(constants.Roles.patreon_tier_3) + + current_patreon_tier = 0 + new_patreon_tier = 0 + + # Both of these go from top to bottom to give the user their highest patreon role if they have multiple + + if patreon_tier_3_role in before.roles: + current_patreon_tier = 3 + elif patreon_tier_2_role in before.roles: + current_patreon_tier = 2 + elif patreon_tier_1_role in before.roles: + current_patreon_tier = 1 + + if patreon_tier_3_role in after.roles: + new_patreon_tier = 3 + colour = patreon_tier_3_role.colour + elif patreon_tier_2_role in after.roles: + new_patreon_tier = 2 + colour = patreon_tier_2_role.colour + elif patreon_tier_1_role in after.roles: + new_patreon_tier = 1 + colour = patreon_tier_1_role.colour + + if not new_patreon_tier > current_patreon_tier: + return + + message = ( + f":tada: {after.mention} just became a **tier {new_patreon_tier}** patron!\n" + "[Support us on Patreon](https://pydis.com/patreon)" + ) + + sending_channel = utils.channel.get_or_fetch_channel(constants.Channels.meta) + + await sending_channel.send( + embed=discord.Embed( + description=message, + colour=colour + ) + ) + + async def send_current_supporters(self, channel: discord.TextChannel) -> None: + """Send the current list of patreon supporters, sorted by tier level.""" + await self.bot.wait_until_guild_available() + + guild = self.bot.get_guild(constants.Guild.id) + + tier_1_or_above_patrons = set(guild.get_role(constants.Roles.patreon_tier_1).members) + tier_2_or_above_patrons = set(guild.get_role(constants.Roles.patreon_tier_2).members) + tier_3_patrons = set(guild.get_role(constants.Roles.patreon_tier_3).members) + + tier_1_patrons = tier_1_or_above_patrons - tier_2_or_above_patrons - tier_3_patrons + tier_2_patrons = tier_2_or_above_patrons - tier_3_patrons + + tier_1_patrons = {f"{patron.mention} ({patron.name}#{patron.discriminator})" for patron in tier_1_patrons} + tier_2_patrons = {f"{patron.mention} ({patron.name}#{patron.discriminator})" for patron in tier_2_patrons} + tier_3_patrons = {f"{patron.mention} ({patron.name}#{patron.discriminator})" for patron in tier_3_patrons} + + embed_list = [] + + embed_patron_info = discord.Embed( + title="Patreon Supporters", + description=( + "We use the money from Patreon to offer excellent prizes for all of our events. Prizes like t-shirts, " + "stickers, microcontrollers that support CircuitPython, or maybe even a mechanical keyboard.\n\n" + + "You can read more about how Patreon supports us, or even support us yourself, on our Patreon page " + "[here](https://pydis.com/patreon)!" + ) + ) + + embed_list.append(embed_patron_info) + + if tier_1_patrons: + embed_tier_1 = discord.Embed( + title="Tier 1 patrons", + description="\n".join(tier_1_patrons), + colour=guild.get_role(constants.Roles.patreon_tier_1).colour + ) + embed_list.append(embed_tier_1) + + if tier_2_patrons: + embed_tier_2 = discord.Embed( + title="Tier 2 patrons", + description="\n".join(tier_2_patrons), + colour=guild.get_role(constants.Roles.patreon_tier_2).colour + ) + embed_list.append(embed_tier_2) + + if tier_3_patrons: + embed_tier_3 = discord.Embed( + title="Tier 3 patrons", + description="\n".join(tier_3_patrons), + colour=guild.get_role(constants.Roles.patreon_tier_3).colour + ) + embed_list.append(embed_tier_3) + + await channel.send(embeds=embed_list) + + @commands.command("patrons") + async def current_supporters_command(self, ctx: commands.Context) -> None: + """Sends the current list of patreon supporters, sorted by tier level.""" + await self.send_current_supporters(ctx.channel) + + @tasks.loop(time=datetime.time(hour=17)) + async def current_monthly_supporters(self) -> None: + """A loop running daily to see if it's the first of the month. If so call `self.send_current_supporters()`.""" + date = datetime.date.today().day + + if date == 1: + await self.send_current_supporters( + utils.channels.get_or_fetch_channel(constants.Channels.meta) + ) + + @commands.command("patreon") + async def patreon_info(self, ctx: commands.Context) -> None: + """Send information about how Python Discord uses Patreon.""" + await ctx.send(embed=discord.Embed( + title="Patreon", + description=( + "We use the money from Patreon to offer excellent prizes for all of our events. Prizes like t-shirts, " + "stickers, microcontrollers that support CircuitPython, or maybe even a mechanical keyboard.\n\n" + + "You can read more about how Patreon supports us, or even support us yourself, on our Patreon page " + "[here](https://pydis.com/patreon)!" + ) + )) + + +def setup(bot: Bot) -> None: + """Load the Patreon cog.""" + bot.add_cog(Patreon(bot)) diff --git a/config-default.yml b/config-default.yml index a12b680e1..604555783 100644 --- a/config-default.yml +++ b/config-default.yml @@ -298,6 +298,11 @@ guild: # Streaming video: 764245844798079016 + # Patreon + patreon_tier_1: 505040943800516611 + patreon_tier_2: 743399725914390631 + patreon_tier_3: 743400204367036520 + moderation_roles: - *ADMINS_ROLE - *MOD_TEAM_ROLE |