From 36d63e0240c521c0734c5858e5b1aa3c77b57a0d Mon Sep 17 00:00:00 2001 From: profitroll Date: Tue, 17 Dec 2024 22:14:06 +0100 Subject: [PATCH] Changed the Client structure --- classes/holo_bot.py | 18 +++++++++++++ cogs/admin.py | 8 +++--- cogs/analytics.py | 8 +++--- cogs/custom_channels.py | 8 +++--- cogs/data.py | 11 ++++---- cogs/fun.py | 8 +++--- cogs/logger.py | 8 +++--- cogs/utility.py | 57 +++++++++++++++++++++++++++++++++++++++ main.py | 60 +++++++++++------------------------------ modules/client.py | 10 ------- 10 files changed, 117 insertions(+), 79 deletions(-) create mode 100644 classes/holo_bot.py create mode 100644 cogs/utility.py delete mode 100644 modules/client.py diff --git a/classes/holo_bot.py b/classes/holo_bot.py new file mode 100644 index 0000000..182cff8 --- /dev/null +++ b/classes/holo_bot.py @@ -0,0 +1,18 @@ +from libbot.pycord.classes import PycordBot + + +class HoloBot(PycordBot): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + async def start(self, *args, **kwargs) -> None: + if self.scheduler is not None: + self.scheduler.start() + + await super().start(*args, **kwargs) + + async def close(self) -> None: + if self.scheduler is not None: + self.scheduler.shutdown() + + await super().close() diff --git a/cogs/admin.py b/cogs/admin.py index a8adbdf..d305ff7 100644 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -14,9 +14,9 @@ from discord import ( from discord import utils as ds_utils from discord.ext import commands from libbot import config_get -from libbot.pycord.classes import PycordBot from libbot.sync import config_get as sync_config_get +from classes.holo_bot import HoloBot from enums import Color from modules.scheduler import scheduler from modules.utils_sync import guild_name @@ -28,8 +28,8 @@ logger = logging.getLogger(__name__) class Admin(commands.Cog): """Cog with utility commands for admins.""" - def __init__(self, client: PycordBot): - self.client: PycordBot = client + def __init__(self, client: HoloBot): + self.client: HoloBot = client # Disabled because warning functionality is temporarily not needed # @slash_command( @@ -236,5 +236,5 @@ class Admin(commands.Cog): ) -def setup(client: PycordBot) -> None: +def setup(client: HoloBot) -> None: client.add_cog(Admin(client)) diff --git a/cogs/analytics.py b/cogs/analytics.py index 1849e5d..1ca2068 100644 --- a/cogs/analytics.py +++ b/cogs/analytics.py @@ -3,16 +3,16 @@ from typing import Dict, List, Any from discord import Cog, Message from discord.ext import commands -from libbot.pycord.classes import PycordBot +from classes.holo_bot import HoloBot from modules.database import col_analytics logger = logging.getLogger(__name__) class Analytics(commands.Cog): - def __init__(self, client: PycordBot): - self.client: PycordBot = client + def __init__(self, client: HoloBot): + self.client: HoloBot = client @Cog.listener() async def on_message(self, message: Message) -> None: @@ -60,5 +60,5 @@ class Analytics(commands.Cog): ) -def setup(client: PycordBot) -> None: +def setup(client: HoloBot) -> None: client.add_cog(Analytics(client)) diff --git a/cogs/custom_channels.py b/cogs/custom_channels.py index e55053a..56746c6 100644 --- a/cogs/custom_channels.py +++ b/cogs/custom_channels.py @@ -7,9 +7,9 @@ from discord.abc import GuildChannel from discord.commands import SlashCommandGroup from discord.ext import commands from libbot import config_get -from libbot.pycord.classes import PycordBot from libbot.sync import config_get as sync_config_get +from classes.holo_bot import HoloBot from classes.holo_user import HoloUser from enums import Color from modules.database import col_users @@ -19,8 +19,8 @@ logger = logging.getLogger(__name__) class CustomChannels(commands.Cog): - def __init__(self, client: PycordBot): - self.client: PycordBot = client + def __init__(self, client: HoloBot): + self.client: HoloBot = client @commands.Cog.listener() async def on_guild_channel_delete(self, channel: GuildChannel) -> None: @@ -234,5 +234,5 @@ class CustomChannels(commands.Cog): ) -def setup(client: PycordBot) -> None: +def setup(client: HoloBot) -> None: client.add_cog(CustomChannels(client)) diff --git a/cogs/data.py b/cogs/data.py index 716f1b0..e5a68f2 100644 --- a/cogs/data.py +++ b/cogs/data.py @@ -1,4 +1,5 @@ import logging +from logging import Logger from os import makedirs from pathlib import Path from typing import Union, List, Dict, Any @@ -9,21 +10,21 @@ from discord import utils as ds_utils from discord.commands import SlashCommandGroup from discord.ext import commands from libbot import config_get -from libbot.pycord.classes import PycordBot from libbot.sync import config_get as sync_config_get from libbot.sync import json_write as sync_json_write +from classes.holo_bot import HoloBot from classes.holo_user import HoloUser from enums import Color from modules.database import col_users from modules.utils_sync import guild_name -logger = logging.getLogger(__name__) +logger: Logger = logging.getLogger(__name__) class Data(commands.Cog): - def __init__(self, client: PycordBot): - self.client: PycordBot = client + def __init__(self, client: HoloBot): + self.client: HoloBot = client data: SlashCommandGroup = SlashCommandGroup("data", "Керування даними користувачів") @@ -179,5 +180,5 @@ class Data(commands.Cog): ) -def setup(client: PycordBot) -> None: +def setup(client: HoloBot) -> None: client.add_cog(Data(client)) diff --git a/cogs/fun.py b/cogs/fun.py index a32adcd..f317114 100644 --- a/cogs/fun.py +++ b/cogs/fun.py @@ -3,9 +3,9 @@ import logging from discord import ApplicationContext, Embed, User, option, slash_command from discord.ext import commands from libbot import config_get -from libbot.pycord.classes import PycordBot from libbot.sync import config_get as sync_config_get +from classes.holo_bot import HoloBot from modules.utils_sync import guild_name from modules.waifu_pics import waifu_pics @@ -13,8 +13,8 @@ logger = logging.getLogger(__name__) class Fun(commands.Cog): - def __init__(self, client: PycordBot): - self.client: PycordBot = client + def __init__(self, client: HoloBot): + self.client: HoloBot = client @slash_command( name="action", @@ -54,5 +54,5 @@ class Fun(commands.Cog): await ctx.respond(embed=embed) -def setup(client: PycordBot) -> None: +def setup(client: HoloBot) -> None: client.add_cog(Fun(client)) diff --git a/cogs/logger.py b/cogs/logger.py index 7070188..c6fabbf 100644 --- a/cogs/logger.py +++ b/cogs/logger.py @@ -4,14 +4,14 @@ from discord import Member, Message, TextChannel from discord import utils as ds_utils from discord.ext import commands from libbot import config_get -from libbot.pycord.classes import PycordBot +from classes.holo_bot import HoloBot from modules.database import col_users class Logger(commands.Cog): - def __init__(self, client: PycordBot): - self.client: PycordBot = client + def __init__(self, client: HoloBot): + self.client: HoloBot = client @commands.Cog.listener() async def on_message(self, message: Message): @@ -65,5 +65,5 @@ class Logger(commands.Cog): await col_users.insert_one(document=user) -def setup(client: PycordBot) -> None: +def setup(client: HoloBot) -> None: client.add_cog(Logger(client)) diff --git a/cogs/utility.py b/cogs/utility.py new file mode 100644 index 0000000..a454392 --- /dev/null +++ b/cogs/utility.py @@ -0,0 +1,57 @@ +import logging +from logging import Logger + +from discord import Activity, ActivityType +from discord.ext import commands +from libbot import config_get + +from classes.holo_bot import HoloBot + +logger: Logger = logging.getLogger(__name__) + + +class Utility(commands.Cog): + def __init__(self, client: HoloBot): + self.client: HoloBot = client + + @commands.Cog.listener() + async def on_ready(self) -> None: + logger.info("Logged in as %s", self.client.user) + + activity_type: str = await config_get("type", "status") + activity_message: str = await config_get("message", "status") + + if activity_type == "playing": + await self.client.change_presence( + activity=Activity(type=ActivityType.playing, name=activity_message) + ) + elif activity_type == "watching": + await self.client.change_presence( + activity=Activity(type=ActivityType.watching, name=activity_message) + ) + elif activity_type == "listening": + await self.client.change_presence( + activity=Activity(type=ActivityType.listening, name=activity_message) + ) + elif activity_type == "streaming": + await self.client.change_presence( + activity=Activity(type=ActivityType.streaming, name=activity_message) + ) + elif activity_type == "competing": + await self.client.change_presence( + activity=Activity(type=ActivityType.competing, name=activity_message) + ) + elif activity_type == "custom": + await self.client.change_presence( + activity=Activity(type=ActivityType.custom, name=activity_message) + ) + else: + return + + logger.info( + "Set activity type to %s with message %s", activity_type, activity_message + ) + + +def setup(client: HoloBot) -> None: + client.add_cog(Utility(client)) diff --git a/main.py b/main.py index 50b4093..5beb79d 100644 --- a/main.py +++ b/main.py @@ -1,12 +1,12 @@ import logging import sys from logging import Logger +from pathlib import Path -from discord import Activity, ActivityType -from libbot import config_get +from discord import LoginFailure, Intents from libbot.sync import config_get as sync_config_get -from modules.client import client +from classes.holo_bot import HoloBot from modules.scheduler import scheduler logging.basicConfig( @@ -25,53 +25,25 @@ except ImportError: pass -@client.event -async def on_ready() -> None: - logger.info("Logged in as %s", client.user) - - activity_type: str = await config_get("type", "status") - activity_message: str = await config_get("message", "status") - - if activity_type == "playing": - await client.change_presence( - activity=Activity(type=ActivityType.playing, name=activity_message) - ) - elif activity_type == "watching": - await client.change_presence( - activity=Activity(type=ActivityType.watching, name=activity_message) - ) - elif activity_type == "listening": - await client.change_presence( - activity=Activity(type=ActivityType.listening, name=activity_message) - ) - elif activity_type == "streaming": - await client.change_presence( - activity=Activity(type=ActivityType.streaming, name=activity_message) - ) - elif activity_type == "competing": - await client.change_presence( - activity=Activity(type=ActivityType.competing, name=activity_message) - ) - elif activity_type == "custom": - await client.change_presence( - activity=Activity(type=ActivityType.custom, name=activity_message) - ) - else: - return - - logger.info( - "Set activity type to %s with message %s", activity_type, activity_message - ) - - def main() -> None: + if not Path("config.json").exists(): + logger.error( + "Config file is missing: Make sure the configuration file 'config.json' is in place." + ) + sys.exit() + + intents: Intents = Intents().all() + client: HoloBot = HoloBot(intents=intents, scheduler=scheduler) + client.load_extension("cogs") try: - scheduler.start() client.run(sync_config_get("bot_token", "bot")) + except LoginFailure as exc: + logger.error("Provided bot token is invalid: %s", exc) except KeyboardInterrupt: - scheduler.shutdown() + logger.info("KeyboardInterrupt received: Shutting down gracefully.") + finally: sys.exit() diff --git a/modules/client.py b/modules/client.py deleted file mode 100644 index 926632b..0000000 --- a/modules/client.py +++ /dev/null @@ -1,10 +0,0 @@ -from discord import Intents -from libbot.pycord.classes import PycordBot - -from modules.scheduler import scheduler - -intents: Intents = Intents().all() - -intents.members = True - -client: PycordBot = PycordBot(intents=intents, scheduler=scheduler)