aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/constants.py4
-rw-r--r--bot/exts/info/patreon.py162
-rw-r--r--config-default.yml5
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