aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/bot.py21
-rw-r--r--bot/constants.py2
-rw-r--r--bot/seasons/season.py20
3 files changed, 35 insertions, 8 deletions
diff --git a/bot/bot.py b/bot/bot.py
index 24d099ad..2df550dc 100644
--- a/bot/bot.py
+++ b/bot/bot.py
@@ -4,8 +4,11 @@ from traceback import format_exc
from typing import List
from aiohttp import AsyncResolver, ClientSession, TCPConnector
+from discord import Embed
from discord.ext.commands import Bot
+from bot import constants
+
log = logging.getLogger(__name__)
__all__ = ('SeasonalBot',)
@@ -40,3 +43,21 @@ class SeasonalBot(Bot):
log.info(f'Successfully loaded extension: {cog}')
except Exception as e:
log.error(f'Failed to load extension {cog}: {repr(e)} {format_exc()}')
+
+ async def send_log(self, title: str, details: str = None, *, icon: str = None):
+ """
+ Send an embed message to the devlog channel
+ """
+ devlog = self.get_channel(constants.Channels.devlog)
+
+ if not devlog:
+ log.warning("Log failed to send. Devlog channel not found.")
+ return
+
+ if not icon:
+ icon = self.user.avatar_url_as(format="png")
+
+ embed = Embed(description=details)
+ embed.set_author(name=title, icon_url=icon)
+
+ await devlog.send(embed=embed)
diff --git a/bot/constants.py b/bot/constants.py
index 71bdbf5f..b57eb714 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -29,7 +29,7 @@ class Channels(NamedTuple):
bot = 267659945086812160
checkpoint_test = 422077681434099723
devalerts = 460181980097675264
- devlog = 409308876241108992
+ devlog = int(environ.get('CHANNEL_DEVLOG', 409308876241108992))
devtest = 414574275865870337
help_0 = 303906576991780866
help_1 = 303906556754395136
diff --git a/bot/seasons/season.py b/bot/seasons/season.py
index f1d570e0..a189eea3 100644
--- a/bot/seasons/season.py
+++ b/bot/seasons/season.py
@@ -37,7 +37,8 @@ def get_season_class(season_name: str) -> Type["SeasonBase"]:
"""
season_lib = importlib.import_module(f"bot.seasons.{season_name}")
- return getattr(season_lib, season_name.capitalize())
+ class_name = season_name.replace("_", " ").title().replace(" ", "")
+ return getattr(season_lib, class_name)
def get_season(season_name: str = None, date: datetime.datetime = None) -> "SeasonBase":
@@ -135,6 +136,10 @@ class SeasonBase:
return cls.start() <= date <= cls.end()
@property
+ def name_clean(self) -> str:
+ return self.name.replace("_", " ").title()
+
+ @property
def greeting(self) -> str:
"""
Provides a default greeting based on the season name if one wasn't
@@ -144,8 +149,7 @@ class SeasonBase:
normal attribute in the inhertiting class.
"""
- season_name = " ".join(self.name.split("_")).title()
- return f"New Season, {season_name}!"
+ return f"New Season, {self.name_clean}!"
async def get_icon(self) -> bytes:
"""
@@ -326,7 +330,7 @@ class SeasonBase:
# Apply seasonal elements after extensions successfully load
username_changed = await self.apply_username(debug=Client.debug)
- # Avoid heavy API ratelimited elements when debugging
+ # Avoid major changes and annoucements if debug mode
if not Client.debug:
log.info("Applying avatar.")
await self.apply_avatar()
@@ -338,6 +342,8 @@ class SeasonBase:
else:
log.info(f"Skipping season announcement due to username not being changed.")
+ await bot.send_log("SeasonalBot Loaded!", f"Active Season: **{self.name_clean}**")
+
class SeasonManager:
"""
@@ -371,7 +377,7 @@ class SeasonManager:
# If the season has changed, load it.
new_season = get_season(date=datetime.datetime.utcnow())
- if new_season != self.season:
+ if new_season.name != self.season.name:
await self.season.load()
@with_role(Roles.moderator, Roles.admin, Roles.owner)
@@ -393,8 +399,8 @@ class SeasonManager:
"""
# sort by start order, followed by lower duration
- def season_key(season: SeasonBase):
- return season.start(), season.end() - datetime.datetime.max
+ def season_key(season_class: Type[SeasonBase]):
+ return season_class.start(), season_class.end() - datetime.datetime.max
current_season = self.season.name