Skip to content
Merged

Dev #49

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 11 additions & 14 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,29 @@ jobs:
with:
python-version: ${{ matrix.python-version }}

- name: Install Poetry
uses: snok/install-poetry@v1
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: 2.1.1
virtualenvs-create: true
virtualenvs-in-project: true
# Install a specific version or omit to install the latest version
version: "latest"

- name: Setup Poetry cache
- name: Setup uv cache
uses: actions/cache@v3
with:
path: |
~/.cache/pypoetry
~/.cache/pip
.venv
key: ${{ runner.os }}-poetry-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }}
~/.cache/uv
key: ${{ runner.os }}-uv-${{ matrix.python-version }}-${{ hashFiles('**/uv.lock') }}
restore-keys: |
${{ runner.os }}-poetry-${{ matrix.python-version }}-
${{ runner.os }}-poetry-
${{ runner.os }}-uv-${{ matrix.python-version }}-
${{ runner.os }}-uv-

- name: Install dependencies
run: |
poetry install --only main,test,extras
uv sync --group test --group extras

- name: Test with pytest
run: |
poetry run pytest tests/
uv run pytest tests/
# env:
# GITHUB_API_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
# env:
Expand Down
2 changes: 1 addition & 1 deletion botspot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import toml

path = Path(__file__).parent.parent / "pyproject.toml"
__version__ = toml.load(path)["tool"]["poetry"]["version"]
__version__ = toml.load(path)["project"]["version"]
del toml, Path, path

from . import commands_menu, llm_provider, trial_mode, user_data, user_interactions
Expand Down
6 changes: 3 additions & 3 deletions botspot/components/features/user_interactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,14 +129,14 @@ async def _ask_user_base(

try:
await asyncio.wait_for(request.event.wait(), timeout=timeout)
# Remove buttons after getting response
if sent_message.reply_markup:
await sent_message.edit_text(text=sent_message.text, reply_markup=None)
if cleanup:
# Delete both the question and the answer
await sent_message.delete()
if request.raw_response:
await request.raw_response.delete()
elif sent_message.reply_markup:
# Remove buttons after getting response
await sent_message.edit_text(text=sent_message.text, reply_markup=None)
return (
request.raw_response
if (return_raw and (request.raw_response is not None))
Expand Down
6 changes: 3 additions & 3 deletions botspot/components/middlewares/simple_user_cache.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional, Any, Awaitable, Callable, Dict
from pydantic import BaseModel
from typing import Any, Awaitable, Callable, Dict, Optional

from aiogram.types import Update, Message
from aiogram.types import Message, Update
from pydantic import BaseModel


class SimpleUserRecord(BaseModel):
Expand Down
1 change: 0 additions & 1 deletion botspot/components/new/llm_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
from pydantic import BaseModel
from pydantic_settings import BaseSettings


from botspot.utils.internal import get_logger
from botspot.utils.unsorted import Attachment, download_telegram_file, get_attachment_format
from botspot.utils.user_ops import UserLike, compare_users_async
Expand Down
17 changes: 11 additions & 6 deletions botspot/components/new/queue_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
from datetime import datetime
from typing import Any, Dict, Generic, List, Optional, Type, TypeVar

from bson import ObjectId
from pydantic import BaseModel, Field
from pydantic_settings import BaseSettings
from bson import ObjectId

# Placeholder for database connection (adjust as needed)

Expand Down Expand Up @@ -70,8 +70,7 @@ def projection(self):
projection["user_id"] = 0
return projection

def enrich_item(self, item: T, user_id: Optional[int] = None) -> dict:
doc = item.model_dump()
def enrich_doc(self, doc: dict, user_id: Optional[int] = None) -> dict:
# doc["queue_id"] = self.key
if self.use_timestamp:
doc["timestamp"] = datetime.now()
Expand All @@ -88,9 +87,15 @@ async def add_item(self, item: T, user_id: Optional[int] = None):
from botspot.core.errors import QueuePermissionError

raise QueuePermissionError("user_id is required unless single_user_mode is enabled")
doc = self.enrich_item(item, user_id)
# Use by_alias for MongoDB compatibility
await self.collection.insert_one(item.model_dump(by_alias=True, exclude_none=True))

# Todo: do I need the mode="json" here?
doc = item.model_dump(by_alias=True, exclude_none=True)
logger.debug(f"Item before enrichment: {doc}")

mongo_doc = self.enrich_doc(doc, user_id)
logger.debug(f"Adding item to the queue: {mongo_doc}")

await self.collection.insert_one(mongo_doc)

async def get_items(
self,
Expand Down
5 changes: 5 additions & 0 deletions botspot/core/botspot_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@


class BotspotSettings(BaseSettings):
debug: bool = Field(
default=False,
description="Enable debug mode",
)

admins_str: str = Field(
default="",
description="Comma-separated list of admin usernames (e.g., '@abc,@def')",
Expand Down
8 changes: 3 additions & 5 deletions botspot/core/dependency_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from botspot.core.botspot_settings import BotspotSettings
from botspot.core.errors import BotspotError
from botspot.utils.deps_getters import get_dependency_manager
from botspot.utils.internal import Singleton

if TYPE_CHECKING:
Expand All @@ -13,13 +14,13 @@

from botspot.components.data.user_data import UserManager
from botspot.components.main.telethon_manager import TelethonManager
from botspot.components.middlewares.simple_user_cache import SimpleUserCache
from botspot.components.new.auto_archive import AutoArchive
from botspot.components.new.chat_binder import ChatBinder
from botspot.components.new.chat_fetcher import ChatFetcher
from botspot.components.new.llm_provider import LLMProvider
from botspot.components.new.queue_manager import QueueManager
from botspot.components.new.s3_storage import S3StorageProvider
from botspot.components.middlewares.simple_user_cache import SimpleUserCache


class DependencyManager(metaclass=Singleton):
Expand Down Expand Up @@ -198,7 +199,4 @@ def is_initialized(cls) -> bool:
return cls in cls._instances


def get_dependency_manager() -> DependencyManager:
if not DependencyManager.is_initialized():
raise ValueError("Dependency manager is not initialized")
return DependencyManager()
__all__ = ["DependencyManager", "get_dependency_manager"]
21 changes: 20 additions & 1 deletion botspot/utils/deps_getters.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
from botspot.components.data.mongo_database import get_database, get_mongo_client
from botspot.components.data.user_data import get_user_manager
from botspot.components.main.event_scheduler import get_scheduler
from botspot.components.middlewares.simple_user_cache import get_simple_user_cache
from botspot.components.main.single_user_mode import get_single_user, is_single_user_mode_enabled
from botspot.components.main.telethon_manager import get_telethon_manager
from botspot.components.middlewares.simple_user_cache import get_simple_user_cache
from botspot.components.new.chat_binder import get_chat_binder
from botspot.components.new.chat_fetcher import get_chat_fetcher
from botspot.components.new.llm_provider import get_llm_provider
Expand All @@ -26,6 +26,17 @@
from aiogram.fsm.context import FSMContext
from telethon import TelegramClient

from botspot.core.bot_manager import BotspotSettings
from botspot.core.dependency_manager import DependencyManager


def get_dependency_manager() -> "DependencyManager":
from botspot.core.dependency_manager import DependencyManager

if not DependencyManager.is_initialized():
raise ValueError("Dependency manager is not initialized")
return DependencyManager()


# Core getters for bot and dispatcher
def get_bot() -> "Bot":
Expand Down Expand Up @@ -85,6 +96,12 @@ def get_s3_storage() -> Optional[S3StorageProvider]:
return get_dependency_manager().s3_storage


def get_botspot_settings() -> "BotspotSettings":
from botspot.core.dependency_manager import get_dependency_manager

return get_dependency_manager().botspot_settings


# Re-export all for convenience
__all__ = [
"get_bot",
Expand All @@ -101,4 +118,6 @@ def get_s3_storage() -> Optional[S3StorageProvider]:
"get_llm_provider",
"get_s3_storage",
"get_simple_user_cache",
"get_dependency_manager",
"get_botspot_settings",
]
2 changes: 1 addition & 1 deletion botspot/utils/send_safe.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

from aiogram import Bot
from aiogram.enums import ParseMode
from aiogram.types import BufferedInputFile, Chat, Message, User
from aiogram.exceptions import TelegramBadRequest
from aiogram.types import BufferedInputFile, Chat, Message, User
from loguru import logger

from botspot.utils.text_utils import MAX_TELEGRAM_MESSAGE_LENGTH, escape_md, split_long_message
Expand Down
Loading