From 77cb214276f2d924a0d89029309ed273da99c653 Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Wed, 11 Dec 2024 15:37:19 +0000 Subject: [PATCH] debug mode var and ingame_channel shorthand getter --- bot.py | 25 ++++++++++++++++--------- cogs/players.py | 35 ++++++++++++++++------------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/bot.py b/bot.py index 56668d7..2db1a88 100644 --- a/bot.py +++ b/bot.py @@ -11,7 +11,7 @@ import logging.config from os import getenv from pathlib import Path -from discord import Intents +from discord import Intents, TextChannel from discord.ext import commands from dotenv import load_dotenv from tortoise import Tortoise @@ -28,12 +28,9 @@ class DiscordBot(commands.Bot): Represents a Discord bot. Contains controls to interact with the bot via the Discord API. """ - in_game_channel_id: int - steam_api_key: str - rcon_details: dict - - def __init__(self): + def __init__(self, debug_mode: bool): super().__init__(command_prefix="-", intents=Intents.all()) + self.debug_mode = debug_mode self.in_game_channel_id = int(getenv("SPIFFO__DISCORD_CHANNEL_ID")) self.steam_api_key = getenv("SPIFFO__STEAM_API_KEY") self.rcon_details = { @@ -75,6 +72,12 @@ class DiscordBot(commands.Bot): if path.suffix == ".py": await self.load_extension(f"cogs.{path.stem}") + async def get_ingame_channel(self) -> TextChannel: + """ + """ + channel = self.bot.get_channel(self.bot.in_game_channel_id) + return channel or await self.bot.fetch_channel(self.bot.in_game_channel_id) + def get_bot_token() -> str: """ @@ -87,7 +90,7 @@ def get_bot_token() -> str: return bot_token -def setup_logging_config(): +def setup_logging_config(debug_mode: bool): """ Loads the logging configuration and creates an asynchronous queue handler. """ @@ -101,6 +104,9 @@ def setup_logging_config(): # Ensure the logging directory exists (BASE_DIR / "logs").mkdir(exist_ok=True) + # update the log level dependent on debug mode + log_config["loggers"]["root"]["level"] = "DEBUG" if debug_mode else "INFO" + # Load the config logging.config.dictConfig(log_config) # This 'logging.config' path is jank. @@ -114,10 +120,11 @@ async def main(): """ The entrypoint function, initialises the application. """ - setup_logging_config() + debug_mode = getenv("SPIFFO__DEBUG").lower() == "true" + setup_logging_config(debug_mode) bot_token = get_bot_token() - async with DiscordBot() as bot: + async with DiscordBot(debug_mode) as bot: await bot.load_cogs() await bot.start(bot_token, reconnect=True) diff --git a/cogs/players.py b/cogs/players.py index 11fa4aa..c0ca59c 100644 --- a/cogs/players.py +++ b/cogs/players.py @@ -16,11 +16,7 @@ from utils.models import Player ZOMBOID_FOLDER_PATH = Path(getenv("SPIFFO__ZOMBOID_FOLDER_PATH")) LOGS_FOLDER_PATH = ZOMBOID_FOLDER_PATH / "Logs" -USER_LOG_FILE_PATH = None -for path in LOGS_FOLDER_PATH.iterdir(): - if path.name.endswith("_user.txt"): - USER_LOG_FILE_PATH = path - break +USER_LOG_FILE_PATH = next(LOGS_FOLDER_PATH.glob("*_user.txt"), None) log = logging.getLogger(__name__) @@ -38,6 +34,8 @@ class PlayersCog(commands.Cog): @tasks.loop(seconds=3) async def listen_for_changes(self): + """ + """ log.debug("listening for changes") for line in await self.file_handler.read(): await self.process_log_line(line) @@ -52,7 +50,7 @@ class PlayersCog(commands.Cog): elif "disconnected player" in line: await self.process_disconnected_player(line) - async def process_player_death(self, line: str): + async def process_player_death(self, line: str, alert: bool = False): log.debug("processing player death") re_pattern = r"\[(?P[\d\- :\.]+)\] user (?P.+?) died at \((?P\d+),(?P\d+),(?P\d+)\) \((?P.+?)\)" re_match = re.search(re_pattern, line) @@ -78,19 +76,19 @@ class PlayersCog(commands.Cog): ) await player.save() - channel = self.bot.get_channel(self.bot.in_game_channel_id) - channel = channel or await self.bot.fetch_channel(self.bot.in_game_channel_id) + log.debug("successfully registered player death to %s", re_match.group("username")) + if not alert: + return + + channel = await self.bot.get_ingame_channel() embed = await player.get_embed() embed.title = "Player Has Died" embed.colour = Colour.dark_orange() await channel.send(embed=embed) - log.debug("successfully registered player death to %s", re_match.group("username")) - - - async def process_connected_player(self, line: str): + async def process_connected_player(self, line: str, alert: bool = False): """ """ log.debug("processing connected player") @@ -115,16 +113,17 @@ class PlayersCog(commands.Cog): await player.save() return - channel = self.bot.get_channel(self.bot.in_game_channel_id) - channel = channel or await self.bot.fetch_channel(self.bot.in_game_channel_id) + if not alert: + return + channel = await self.bot.get_ingame_channel() embed = await player.get_embed() embed.title = "Player Has Connected" embed.colour = Colour.brand_green() await channel.send(embed=embed) - async def process_disconnected_player(self, line: str): + async def process_disconnected_player(self, line: str, alert: bool = False): """ """ log.debug("processing disconnected player") @@ -143,12 +142,10 @@ class PlayersCog(commands.Cog): await player.update_steam_summary(re_match.group("steam_id"), self.bot.steam_api_key) await player.save() - if player.is_dead: + if player.is_dead or not alert: return - channel = self.bot.get_channel(self.bot.in_game_channel_id) - channel = channel or await self.bot.fetch_channel(self.bot.in_game_channel_id) - + channel = await self.bot.get_ingame_channel() embed = await player.get_embed() embed.title = "Player Has Disconnected" embed.colour = Colour.brand_red()