diff options
-rw-r--r-- | bot/constants.py | 2 | ||||
-rw-r--r-- | bot/resources/avatars/christmas.png | bin | 44843 -> 0 bytes | |||
-rw-r--r-- | bot/resources/avatars/spooky.png | bin | 37202 -> 0 bytes | |||
-rw-r--r-- | bot/resources/avatars/standard.png | bin | 52156 -> 0 bytes | |||
-rw-r--r-- | bot/seasons/christmas/__init__.py | 4 | ||||
-rw-r--r-- | bot/seasons/halloween/__init__.py | 2 | ||||
-rw-r--r-- | bot/seasons/season.py | 141 |
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 Binary files differdeleted file mode 100644 index 55b72fac..00000000 --- a/bot/resources/avatars/christmas.png +++ /dev/null diff --git a/bot/resources/avatars/spooky.png b/bot/resources/avatars/spooky.png Binary files differdeleted file mode 100644 index 4ab33188..00000000 --- a/bot/resources/avatars/spooky.png +++ /dev/null diff --git a/bot/resources/avatars/standard.png b/bot/resources/avatars/standard.png Binary files differdeleted file mode 100644 index c14ff42a..00000000 --- a/bot/resources/avatars/standard.png +++ /dev/null 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 ) |