diff --git a/Dockerfile b/Dockerfile index 7f71e69..7610b1c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM python:3 WORKDIR /usr/src/moderation-bot +RUN apt update && apt install -y postgresql-client COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt diff --git a/src/CoreMod.py b/src/CoreMod.py index 9ebe0b5..b989175 100644 --- a/src/CoreMod.py +++ b/src/CoreMod.py @@ -12,6 +12,7 @@ from fnmatch import fnmatch import traceback import json import re +import logging from constants.global_constants import * from libs.tokens_formatter import TOKENS @@ -26,7 +27,11 @@ from sqlalchemy.schema import CreateTable import tldextract + +logging.basicConfig(level=logging.INFO, force=True, format="%(asctime)s %(name)s %(levelname)s: %(message)s", datefmt="%H:%M:%S") + class AnyBots(commands.Bot): + logger = logging.getLogger(__name__) ''' @@ -44,7 +49,7 @@ class AnyBots(commands.Bot): async def on_ready(self): self.krekchat = await self.fetch_guild(constants["krekchat"]) - print(self.krekchat.name) + self.logger.info(self.krekchat.name) self.sponsors = [disnake.utils.get(self.krekchat.roles, id=i) for i in constants["sponsors"]] self.text_mute = disnake.utils.get(self.krekchat.roles, id=constants["mutes"][0]) self.voice_mute = disnake.utils.get(self.krekchat.roles, id=constants["mutes"][1]) @@ -62,7 +67,7 @@ class AnyBots(commands.Bot): self.hierarchy = [disnake.utils.get(self.krekchat.roles, id=i) for i in constants["hierarchy"]] # /lists await self.change_presence(status=disnake.Status.online, activity=disnake.Game("Работаю")) - print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: KrekModBot activated") + self.logger.info(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: KrekModBot activated") def TimeFormater(self, time_str: str = "", *, years: float = 0, months: float = 0, weeks: float = 0, days: float = 0, hours: float = 0, minutes: float = 0, seconds: float = 0, @@ -308,7 +313,7 @@ class MainBot(AnyBots): # if self.stop_event.is_set(): # pass # else: - # print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Соединение с дискордом разорвано") + # self.logger.error(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Соединение с дискордом разорвано") # await self.BotOff() @staticmethod @@ -319,7 +324,7 @@ class MainBot(AnyBots): try: return await func(*args, **kwargs) except Exception: - print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: [ERROR] {func.__name__}:\n{traceback.format_exc()}") + logging.exception(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: [ERROR] {func.__name__}:\n{traceback.format_exc()}") return wrapper @tasks.loop(seconds=30) @@ -331,7 +336,7 @@ class MainBot(AnyBots): continue if not loop.is_running(): - print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Обнаружено падение {loop.coro.__name__}, перезапуск цикла...") + self.logger.error(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Обнаружено падение {loop.coro.__name__}, перезапуск цикла...") loop.cancel() @@ -640,19 +645,19 @@ async def run_bot(bot, token, stop_event): try: await bot.start(token) except Exception as e: - print(f"Бот {bot.user.name if hasattr(bot, 'user') else 'Unknown'} упал с ошибкой: {e}") + logging.exception(f"Бот {bot.user.name if hasattr(bot, 'user') else 'Unknown'} упал с ошибкой: {e}") stop_event.set() # Сигнализируем об остановке async def monitor_stop(stop_event, bots): await stop_event.wait() - print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Получен сигнал остановки, завершаю всех ботов...") + logging.info(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Получен сигнал остановки, завершаю всех ботов...") for bot in bots: if not bot.is_closed(): try: await bot.close() except Exception as e: - print(f"Ошибка при закрытии бота: {e}") + logging.exception(f"Ошибка при закрытии бота: {e}") await asyncio.sleep(0.1) @@ -684,9 +689,9 @@ async def main(): await asyncio.gather(*bot_tasks, monitor_task) except KeyboardInterrupt: - print("Боты остановлены по запросу пользователя") + logging.info("Боты остановлены по запросу пользователя") except Exception as e: - print(f"Произошла критическая ошибка: {e}") + logging.exception(f"Произошла критическая ошибка: {e}") finally: if bot is not None: await bot.BotOff() diff --git a/src/cogs/administrators.py b/src/cogs/administrators.py index 7348e31..433d51a 100644 --- a/src/cogs/administrators.py +++ b/src/cogs/administrators.py @@ -26,7 +26,7 @@ class AdminModule(commands.Cog): @commands.Cog.listener() async def on_ready(self): - print(f'KrekModBot admin module activated') + self.client.logger.info(f'KrekModBot admin module activated') @commands.slash_command(name="bot_mod_off") async def BotModOff(self, ctx: disnake.ApplicationCommandInteraction): diff --git a/src/cogs/moderators.py b/src/cogs/moderators.py index 7b8c73f..bda9d1e 100644 --- a/src/cogs/moderators.py +++ b/src/cogs/moderators.py @@ -29,7 +29,7 @@ class ModerModule(commands.Cog): @commands.Cog.listener() async def on_ready(self): - print(f'KrekModBot moderation module activated') + self.client.logger.info(f'KrekModBot moderation module activated') @commands.slash_command(name="действие") async def action_slash(self, ctx: disnake.AppCmdInter, member: disnake.Member): diff --git a/src/cogs/users.py b/src/cogs/users.py index d176edb..f059212 100644 --- a/src/cogs/users.py +++ b/src/cogs/users.py @@ -24,7 +24,7 @@ class UIModule(commands.Cog): @commands.Cog.listener() async def on_ready(self): - print(f'KrekModBot UI module activated') + self.client.logger.info(f'KrekModBot UI module activated') @commands.slash_command(description="Показывает действительные наказания пользователя", name="наказания") async def penalties(self, ctx: disnake.AppCmdInter, input_member: disnake.Member | None= None):