aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/constants.py4
-rw-r--r--bot/exts/info/patreon.py163
-rw-r--r--config-default.yml5
3 files changed, 172 insertions, 0 deletions
diff --git a/bot/constants.py b/bot/constants.py
index e3846fb3d..25ecda5bc 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -507,6 +507,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..027fb9dfb
--- /dev/null
+++ b/bot/exts/info/patreon.py
@@ -0,0 +1,163 @@
+import datetime
+import logging
+
+import discord
+from discord.ext import commands, tasks
+
+from bot import constants
+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 = bot
+
+ self.current_supporters_monthly.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: discord.Guild = await self.bot.fetch_guild(constants.Guild.id)
+
+ await guild.fetch_channels()
+ await guild.fetch_roles()
+
+ patreon_tier_1_role: discord.Role = guild.get_role(constants.Roles.patreon_tier_1)
+ patreon_tier_2_role: discord.Role = guild.get_role(constants.Roles.patreon_tier_2)
+ patreon_tier_3_role: discord.Role = guild.get_role(constants.Roles.patreon_tier_3)
+
+ sending_channel = discord.utils.get(self.bot.get_all_channels(), id=constants.Channels.meta)
+
+ current_patreon_tier: int = 0
+ new_patreon_tier: int = 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"
+ f"[Support us on Patreon](https://pydis.com/patreon)"
+ )
+
+ 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: discord.Guild = self.bot.get_guild(constants.Guild.id)
+
+ tier_1_patrons: set[discord.Member] = set(guild.get_role(constants.Roles.patreon_tier_1).members)
+ tier_2_patrons: set[discord.Member] = set(guild.get_role(constants.Roles.patreon_tier_2).members)
+ tier_3_patrons: set[discord.Member] = set(guild.get_role(constants.Roles.patreon_tier_3).members)
+
+ tier_1_patrons = tier_1_patrons - tier_2_patrons - tier_3_patrons
+ tier_2_patrons = tier_2_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: list[discord.Embed] = []
+
+ embed: discord.Embed = discord.Embed(
+ title="Patreon Supporters",
+ description=(
+ "Here is a full list of this months Python Discord patrons!\n\nWe use the money from Patreon to offer "
+ "excellent prizes for all of our events. Stuff like t-shirts, stickers, microcontrollers that support "
+ "CircuitPython, or maybe even a mechanical keyboard.\n\nYou can read more about how Patreon supports "
+ "us, or even support us yourself, on our Patreon page [here](https://www.patreon.com/python_discord)!"
+ )
+ )
+
+ embed_list.append(embed)
+
+ if tier_1_patrons:
+ embed: discord.Embed = 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)
+
+ if tier_2_patrons:
+ embed: discord.Embed = 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)
+
+ if tier_3_patrons:
+ embed: discord.Embed = 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)
+
+ await channel.send(embeds=embed_list)
+
+ @commands.command("patrons")
+ async def current_supporters_command(self, ctx: commands.context) -> None:
+ """A command to activate self.send_current_supporters()."""
+ await self.send_current_supporters(ctx.channel)
+
+ @tasks.loop(time=datetime.time(hour=17))
+ async def current_supporters_monthly(self) -> None:
+ """A loop running every day to see if it's the first of the month, if so call self.send_current_supporters()."""
+ date: datetime.date = datetime.date.today().day
+
+ if date == 1:
+ await self.send_current_supporters(
+ discord.utils.get(self.bot.get_all_channels(), id=constants.Channels.meta)
+ )
+
+ @commands.command("patreon")
+ async def patreon_info(self, ctx: commands.context) -> None:
+ """A command to send patreon info."""
+ await ctx.channel.send(embeds=[discord.Embed(
+ title="Patreon",
+ description=(
+ "We use the money from Patreon to offer excellent prizes for all of our events. Stuff like t-shirts, "
+ "stickers, microcontrollers that support CircuitPython, or maybe even a mechanical keyboard.\n\nYou can"
+ " read more about how Patreon supports us, or even support us yourself, on our Patreon page "
+ "[here](https://www.patreon.com/python_discord)!"
+ )
+ )])
+
+
+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 4a85ccc56..2abc66bec 100644
--- a/config-default.yml
+++ b/config-default.yml
@@ -291,6 +291,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