Improved caching and utils structure

This commit is contained in:
2025-04-22 23:22:01 +02:00
parent ec094f9a98
commit 5230ac9ace
15 changed files with 65 additions and 40 deletions

View File

@@ -7,8 +7,8 @@ from libbot.cache.classes import CacheMemcached, CacheRedis
from libbot.cache.manager import create_cache_client
from libbot.pycord.classes import PycordBot as LibPycordBot
from classes import PycordEvent, PycordGuild, PycordUser, PycordEventStage
from modules.logging_utils import get_logger
from classes import PycordEvent, PycordEventStage, PycordGuild, PycordUser
from modules.utils import get_logger
logger: Logger = get_logger(__name__)

View File

@@ -10,7 +10,7 @@ from libbot.cache.classes import Cache
from pymongo.results import InsertOneResult
from modules.database import col_events
from modules.logging_utils import get_logger
from modules.utils import get_logger, restore_from_cache
logger: Logger = get_logger(__name__)
@@ -59,11 +59,10 @@ class PycordEvent:
Raises:
EventNotFoundError: Event was not found
"""
if cache is not None:
cached_entry: Dict[str, Any] | None = cache.get_json(f"{cls.__short_name__}_{event_id}")
cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, event_id, cache=cache)
if cached_entry is not None:
return cls(**cached_entry)
if cached_entry is not None:
return cls(**cached_entry)
db_entry = await cls.__collection__.find_one(
{"_id": event_id if isinstance(event_id, ObjectId) else ObjectId(event_id)}
@@ -326,3 +325,11 @@ class PycordEvent:
await self._set(cache, stage_ids=self.stage_ids)
await self._update_event_stage_order(bot, old_stage_ids, cache=cache)
# # TODO Add documentation
# def get_localized_start_date(self, tz: str | timezone | ZoneInfo) -> datetime:
# return self.starts.replace(tzinfo=tz)
#
# # TODO Add documentation
# def get_localized_end_date(self, tz: str | timezone | ZoneInfo) -> datetime:
# return self.ends.replace(tzinfo=tz)

View File

@@ -1,7 +1,7 @@
from dataclasses import dataclass
from datetime import datetime
from logging import Logger
from typing import List, Dict, Any, Optional
from typing import Any, Dict, List, Optional
from zoneinfo import ZoneInfo
from bson import ObjectId
@@ -9,7 +9,7 @@ from libbot.cache.classes import Cache
from pymongo.results import InsertOneResult
from modules.database import col_stages
from modules.logging_utils import get_logger
from modules.utils import get_logger, restore_from_cache
logger: Logger = get_logger(__name__)
@@ -54,11 +54,10 @@ class PycordEventStage:
Raises:
EventStageNotFoundError: Event stage was not found
"""
if cache is not None:
cached_entry: Dict[str, Any] | None = cache.get_json(f"{cls.__short_name__}_{stage_id}")
cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, stage_id, cache=cache)
if cached_entry is not None:
return cls(**cached_entry)
if cached_entry is not None:
return cls(**cached_entry)
db_entry = await cls.__collection__.find_one(
{"_id": stage_id if isinstance(stage_id, ObjectId) else ObjectId(stage_id)}

View File

@@ -8,7 +8,7 @@ from pymongo.results import InsertOneResult
from classes.errors import GuildNotFoundError
from modules.database import col_guilds
from modules.logging_utils import get_logger
from modules.utils import get_logger, restore_from_cache
logger: Logger = get_logger(__name__)
@@ -45,11 +45,10 @@ class PycordGuild:
Raises:
GuildNotFoundError: User was not found and creation was not allowed
"""
if cache is not None:
cached_entry: Dict[str, Any] | None = cache.get_json(f"{cls.__short_name__}_{guild_id}")
cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, guild_id, cache=cache)
if cached_entry is not None:
return cls(**cached_entry)
if cached_entry is not None:
return cls(**cached_entry)
db_entry = await cls.__collection__.find_one({"id": guild_id})

View File

@@ -8,7 +8,7 @@ from pymongo.results import InsertOneResult
from classes.errors.pycord_user import UserNotFoundError
from modules.database import col_users
from modules.logging_utils import get_logger
from modules.utils import get_logger, restore_from_cache
logger: Logger = get_logger(__name__)
@@ -41,11 +41,10 @@ class PycordUser:
Raises:
UserNotFoundError: User was not found and creation was not allowed
"""
if cache is not None:
cached_entry: Dict[str, Any] | None = cache.get_json(f"{cls.__short_name__}_{user_id}")
cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, user_id, cache=cache)
if cached_entry is not None:
return cls(**cached_entry)
if cached_entry is not None:
return cls(**cached_entry)
db_entry = await cls.__collection__.find_one({"id": user_id})

View File

@@ -12,7 +12,7 @@ from discord.utils import basic_autocomplete
from classes import PycordGuild
from classes.pycord_bot import PycordBot
from modules.utils import autocomplete_timezones, autocomplete_languages
from modules.utils import autocomplete_languages, autocomplete_timezones
class Config(Cog):

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Dict, Any
from typing import Any, Dict
from zoneinfo import ZoneInfo
from bson import ObjectId

View File

@@ -1,4 +1,4 @@
from discord import Cog, slash_command, option, ApplicationContext
from discord import ApplicationContext, Cog, option, slash_command
from classes.pycord_bot import PycordBot

View File

@@ -10,9 +10,9 @@ from discord import LoginFailure
from libbot.utils import config_get
from classes.pycord_bot import PycordBot
from modules.logging_utils import get_logger, get_logging_config
from modules.migrator import migrate_database
from modules.scheduler import scheduler
from modules.utils import get_logger, get_logging_config
makedirs(Path("logs/"), exist_ok=True)

1
modules/__init__.py Normal file
View File

@@ -0,0 +1 @@
from . import utils, database, migrator, scheduler

View File

@@ -0,0 +1,8 @@
from .autocomplete_utils import (
autocomplete_active_events,
autocomplete_event_stages,
autocomplete_languages,
autocomplete_timezones,
)
from .cache_utils import restore_from_cache
from .logging_utils import get_logger, get_logging_config

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import List, Dict, Any
from typing import Any, Dict, List
from zoneinfo import ZoneInfo, available_timezones
from bson import ObjectId
@@ -9,28 +9,23 @@ from pymongo import ASCENDING
from modules.database import col_events, col_stages
def hex_to_int(hex_color: str) -> int:
return int(hex_color.lstrip("#"), 16)
def int_to_hex(integer_color: int) -> str:
return "#" + format(integer_color, "06x")
# TODO Maybe move to a separate module
async def autocomplete_timezones(ctx: AutocompleteContext) -> List[str]:
"""Return available timezones"""
return sorted(list(available_timezones()))
# TODO Maybe move to a separate module
async def autocomplete_languages(ctx: AutocompleteContext) -> List[str]:
"""Return locales supported by the bot"""
# TODO Discord normally uses a different set of locales.
# For example, "en" being "en-US", etc. This will require changes to locale handling later.
return ctx.bot.locales.keys()
# TODO Maybe move to a separate module
async def autocomplete_active_events(ctx: AutocompleteContext) -> List[OptionChoice]:
"""Return list of active events"""
query: Dict[str, Any] = {
"ended": None,
"ends": {"$gt": datetime.now(tz=ZoneInfo("UTC"))},
@@ -45,8 +40,9 @@ async def autocomplete_active_events(ctx: AutocompleteContext) -> List[OptionCho
return event_names
# TODO Maybe move to a separate module
async def autocomplete_event_stages(ctx: AutocompleteContext) -> List[OptionChoice]:
"""Return list of stages of the event"""
event_id: str | None = ctx.options["event"]
if event_id is None:

View File

@@ -0,0 +1,10 @@
from typing import Any, Dict, Optional
from bson import ObjectId
from libbot.cache.classes import Cache
def restore_from_cache(
cache_prefix: str, cache_key: str | int | ObjectId, cache: Optional[Cache] = None
) -> Dict[str, Any] | None:
return None if cache is None else cache.get_json(f"{cache_prefix}_{cache_key}")

6
modules/utils/color.py Normal file
View File

@@ -0,0 +1,6 @@
def hex_to_int(hex_color: str) -> int:
return int(hex_color.lstrip("#"), 16)
def int_to_hex(integer_color: int) -> str:
return "#" + format(integer_color, "06x")