aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar scragly <[email protected]>2018-12-01 22:51:47 +1000
committerGravatar scragly <[email protected]>2018-12-03 09:18:50 +1000
commitb036c9aa23099a6d3eb74bb1b548277cfbdb5edd (patch)
tree490facf40e2788e75a6920c7f103deaedf2c2b3b
parentAllow Admin role env setting when debugging (diff)
Add season element set methods, add server icon change support
-rw-r--r--bot/constants.py2
-rw-r--r--bot/resources/avatars/christmas.pngbin44843 -> 0 bytes
-rw-r--r--bot/resources/avatars/spooky.pngbin37202 -> 0 bytes
-rw-r--r--bot/resources/avatars/standard.pngbin52156 -> 0 bytes
-rw-r--r--bot/seasons/christmas/__init__.py4
-rw-r--r--bot/seasons/halloween/__init__.py2
-rw-r--r--bot/seasons/season.py141
7 files changed, 118 insertions, 31 deletions
diff --git a/bot/constants.py b/bot/constants.py
index 6db8c68f..52da161e 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -51,7 +51,7 @@ class Hacktoberfest(NamedTuple):
class Roles(NamedTuple):
- admin = int(environ.get('SEASONALBOT_DEBUG', 267628507062992896))
+ admin = int(environ.get('SEASONALBOT_ADMIN', 267628507062992896))
announcements = 463658397560995840
champion = 430492892331769857
contributor = 295488872404484098
diff --git a/bot/resources/avatars/christmas.png b/bot/resources/avatars/christmas.png
deleted file mode 100644
index 55b72fac..00000000
--- a/bot/resources/avatars/christmas.png
+++ /dev/null
Binary files differ
diff --git a/bot/resources/avatars/spooky.png b/bot/resources/avatars/spooky.png
deleted file mode 100644
index 4ab33188..00000000
--- a/bot/resources/avatars/spooky.png
+++ /dev/null
Binary files differ
diff --git a/bot/resources/avatars/standard.png b/bot/resources/avatars/standard.png
deleted file mode 100644
index c14ff42a..00000000
--- a/bot/resources/avatars/standard.png
+++ /dev/null
Binary files differ
diff --git a/bot/seasons/christmas/__init__.py b/bot/seasons/christmas/__init__.py
index 8eb78251..796dd895 100644
--- a/bot/seasons/christmas/__init__.py
+++ b/bot/seasons/christmas/__init__.py
@@ -5,5 +5,5 @@ class Christmas(SeasonBase):
name = "christmas"
start_date = "01/12"
end_date = "31/12"
- bot_name = "Santabot"
- bot_avatar = "christmas.png"
+ bot_name = "Merrybot"
+ icon = "/logos/logo_seasonal/christmas/festive.png"
diff --git a/bot/seasons/halloween/__init__.py b/bot/seasons/halloween/__init__.py
index 4dd195fb..1f776c03 100644
--- a/bot/seasons/halloween/__init__.py
+++ b/bot/seasons/halloween/__init__.py
@@ -6,4 +6,4 @@ class Halloween(SeasonBase):
start_date = "01/10"
end_date = "31/10"
bot_name = "Spookybot"
- bot_avatar = "spooky.png"
+ icon = "/logos/logo_seasonal/halloween/spooky.png"
diff --git a/bot/seasons/season.py b/bot/seasons/season.py
index a86330e9..95367fd2 100644
--- a/bot/seasons/season.py
+++ b/bot/seasons/season.py
@@ -74,7 +74,7 @@ class SeasonBase:
start_date = None
end_date = None
bot_name: str = "SeasonalBot"
- bot_avatar: str = "standard.png"
+ icon: str = "/logos/logo_full/logo_full.png"
@staticmethod
def current_year():
@@ -96,39 +96,101 @@ class SeasonBase:
def is_between_dates(cls, date):
return cls.start() <= date <= cls.end()
- def get_avatar(self):
- avatar_path = Path("bot", "resources", "avatars", self.bot_avatar)
- with open(avatar_path, "rb") as avatar_file:
- return bytearray(avatar_file.read())
+ async def get_icon(self):
+ base_url = "https://raw.githubusercontent.com/python-discord/branding/master"
+ async with bot.http_session.get(base_url + self.icon) as resp:
+ avatar = await resp.read()
+ return bytearray(avatar)
- async def load(self):
+ async def apply_username(self, *, debug: bool = False):
"""
- Loads in the bot name, the bot avatar, and the extensions that are relevant to that season.
+ Applies the username for the current season. Returns if it was successful.
"""
guild = bot.get_guild(Client.guild)
+ result = None
# Change only nickname if in debug mode due to ratelimits for user edits
- if Client.debug:
+ if debug:
if guild.me.display_name != self.bot_name:
log.debug(f"Changing nickname to {self.bot_name}")
await guild.me.edit(nick=self.bot_name)
+
else:
if bot.user.name != self.bot_name:
# attempt to change user details
log.debug(f"Changing username to {self.bot_name}")
- await bot.user.edit(username=self.bot_name, avatar=self.get_avatar())
+ await bot.user.edit(username=self.bot_name)
# fallback on nickname if failed due to ratelimit
if bot.user.name != self.bot_name:
- log.info(f"User details failed to change: Changing nickname to {self.bot_name}")
+ log.info(f"Username failed to change: Changing nickname to {self.bot_name}")
await guild.me.edit(nick=self.bot_name)
+ result = False
+ else:
+ result = True
# remove nickname if an old one exists
if guild.me.nick and guild.me.nick != self.bot_name:
log.debug(f"Clearing old nickname of {guild.me.nick}")
await guild.me.edit(nick=None)
+ return result
+
+ async def apply_avatar(self):
+ """
+ Applies the avatar for the current season. Returns if it was successful.
+ """
+
+ # track old avatar hash for later comparison
+ old_avatar = bot.user.avatar
+
+ # attempt the change
+ log.debug(f"Changing avatar to {self.icon}")
+ avatar = await self.get_icon()
+ await bot.user.edit(avatar=avatar)
+
+ if bot.user.avatar != old_avatar:
+ log.debug(f"Avatar changed to {self.icon}")
+ return True
+ else:
+ log.debug(f"Changing avatar failed: {self.icon}")
+ return False
+
+ async def apply_server_icon(self):
+ """
+ Applies the server icon for the current season. Returns if it was successful.
+ """
+
+ guild = bot.get_guild(Client.guild)
+
+ # track old icon hash for later comparison
+ old_icon = guild.icon
+
+ # attempt the change
+ log.debug(f"Changing server icon to {self.icon}")
+ avatar = await self.get_icon()
+ await guild.edit(icon=avatar, reason=f"Seasonbot Season Change: {self.__name__}")
+
+ new_icon = bot.get_guild(Client.guild).icon
+ if new_icon != old_icon:
+ log.debug(f"Server icon changed to {self.icon}")
+ return True
+ else:
+ log.debug(f"Changing server icon failed: {self.icon}")
+ return False
+
+ async def load(self):
+ """
+ Loads in the bot name, the bot avatar, and the extensions that are relevant to that season.
+ """
+
+ await self.apply_username(debug=Client.debug)
+ await self.apply_avatar()
+
+ if not Client.debug:
+ await self.apply_server_icon()
+
# Prepare all the seasonal cogs, and then the evergreen ones.
extensions = []
for ext_folder in {self.name, "evergreen"}:
@@ -248,62 +310,87 @@ class SeasonManager:
Re-applies the bot avatar for the currently loaded season.
"""
- # track old avatar hash for later comparison
- old_avatar = bot.user.avatar
-
# attempt the change
- await bot.user.edit(avatar=self.season.get_avatar())
+ is_changed = await self.season.apply_avatar()
- if bot.user.avatar != old_avatar:
- log.debug(f"Avatar changed to {self.season.bot_avatar}")
+ if is_changed:
colour = ctx.guild.me.colour
title = "Avatar Refreshed"
else:
- log.debug(f"Changing avatar failed: {self.season.bot_avatar}")
colour = discord.Colour.red()
title = "Avatar Failed to Refresh"
# report back details
season_name = type(self.season).__name__
embed = discord.Embed(
- description=f"**Season:** {season_name}\n**Avatar:** {self.season.bot_avatar}",
+ description=f"**Season:** {season_name}\n**Avatar:** {self.season.icon}",
colour=colour
)
embed.set_author(name=title)
embed.set_thumbnail(url=bot.user.avatar_url_as(format="png"))
await ctx.send(embed=embed)
+ @refresh.command(name="icon")
+ async def refresh_server_icon(self, ctx):
+ """
+ Re-applies the server icon for the currently loaded season.
+ """
+
+ # attempt the change
+ is_changed = await self.season.apply_server_icon()
+
+ if is_changed:
+ colour = ctx.guild.me.colour
+ title = "Server Icon Refreshed"
+ else:
+ colour = discord.Colour.red()
+ title = "Server Icon Failed to Refresh"
+
+ # report back details
+ season_name = type(self.season).__name__
+ embed = discord.Embed(
+ description=f"**Season:** {season_name}\n**Icon:** {self.season.icon}",
+ colour=colour
+ )
+ embed.set_author(name=title)
+ embed.set_thumbnail(url=bot.get_guild(Client.guild).icon_url_as(format='png'))
+ await ctx.send(embed=embed)
+
@refresh.command(name="username", aliases=("name",))
async def refresh_username(self, ctx):
"""
Re-applies the bot username for the currently loaded season.
"""
- # track old username for later comparison
old_username = str(bot.user)
+ old_display_name = ctx.guild.me.display_name
# attempt the change
- await bot.user.edit(username=self.season.bot_name)
+ is_changed = await self.season.apply_username()
- if str(bot.user) != old_username:
- log.debug(f"Username changed to {self.season.bot_name}")
+ if is_changed:
colour = ctx.guild.me.colour
title = "Username Refreshed"
changed_element = "Username"
+ old_name = old_username
new_name = str(bot.user)
else:
- log.debug(f"Changing username failed: Changing nickname to {self.season.bot_name}")
- new_name = self.season.bot_name
- await ctx.guild.me.edit(nick=new_name)
colour = discord.Colour.red()
- title = "Username Failed to Refresh"
+
+ # if None, it's because it wasn't meant to change username
+ if is_changed is None:
+ title = "Nickname Refreshed"
+ else:
+ title = "Username Failed to Refresh"
changed_element = "Nickname"
+ old_name = old_display_name
+ new_name = self.season.bot_name
# report back details
season_name = type(self.season).__name__
embed = discord.Embed(
description=f"**Season:** {season_name}\n"
- f"**Old Username:** {old_username}\n"
+ f"**Old {changed_element}:** {old_name}\n"
f"**New {changed_element}:** {new_name}",
colour=colour
)