diff --git a/.gitignore b/.gitignore index dddca8d..c747ee6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,6 @@ env .venv venv __pycache__ -OCAB.db +Karkas.db config.yaml dist diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..39b759d --- /dev/null +++ b/AUTHORS @@ -0,0 +1,8 @@ +Руководитель проекта: + - Семен Фомченков (@Armatik), e-mail: armatik@alt-gnome.ru + +Ведущие разработчики: + - Максим Слипенко (@Maks1m_S), e-mail: maxim@slipenko.com + +Участники проекта: + - Илья Женецкий (@ilyazheprog) diff --git a/AUTHORS_EN b/AUTHORS_EN new file mode 100644 index 0000000..3db4115 --- /dev/null +++ b/AUTHORS_EN @@ -0,0 +1,8 @@ +Project manager: + - Semen Fomchenkov (@Armatik), e-mail: armatik@alt-gnome.ru + +Leading developers: + - Maxim Slipenko (@Maks1m_S), e-mail: maxim@slipenko.com + +Project participants: + - Ilya Zhenetsky (@ilyazheprog) diff --git a/README.md b/README.md index b9f8cd9..ffa7e91 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,23 @@ -# OCAB - Open Chat Ai Bot +# Karkas -## Что такое OCAB? +## Что такое Karkas? -OCAB - это платформа для разработки модульных Telegram-ботов, которая призвана упростить взаимодействие с чатами. -OCAB предоставляет возможность расширять функциональность бота с помощью интеграции различных модулей. +Karkas - это платформа для разработки модульных Telegram-ботов, которая призвана упростить взаимодействие с чатами. +Karkas предоставляет возможность расширять функциональность бота с помощью интеграции различных модулей. Код платформы и набор стандартных модулей находятся в этом монорепозитории. ## Структура монорепозитория -Монорепозиторий OCAB включает в себя: -* **Ядро OCAB (src/ocab_core):** Содержит основные компоненты платформы, такие как система управления модулями, +Монорепозиторий Karkas включает в себя: +* **Ядро Karkas (src/karkas_core):** Содержит основные компоненты платформы, такие как система управления модулями, логирование и утилиты. -* **Модули OCAB (src/ocab_modules):** Содержит стандартные и дополнительные модули, которые расширяют - функциональность ботов OCAB. -* **Пример бота (src/gnomik):** Пример реализации бота на платформе OCAB. +* **Модули Karkas (src/karkas_blocks):** Содержит стандартные и дополнительные модули, которые расширяют + функциональность ботов Karkas. +* **Пример бота (src/gnomik):** Пример реализации бота на платформе Karkas. ## Модули -Модули OCAB - это независимые компоненты, которые добавляют функциональность к боту. +Модули Karkas - это независимые компоненты, которые добавляют функциональность к боту. ### Структура модуля @@ -26,19 +26,19 @@ OCAB предоставляет возможность расширять фун ### Стандартные модули Стандартные модули предоставляют базовые функции для работы бота: -* [admin](src/ocab_modules/ocab_modules/standard/admin/README.md) - модуль для модерирования чата. -* [roles](src/ocab_modules/ocab_modules/standard/roles/README.md) - модуль ролей пользователей. -* [config](src/ocab_modules/ocab_modules/standard/config/README.md) - модуль управления конфигурацией бота. -* [database](src/ocab_modules/ocab_modules/standard/database/README.md) - модуль для работы с базой данных. -* [fsm_database_storage](src/ocab_modules/ocab_modules/standard/fsm_database_storage/README.md) - модуль для хранения состояний FSM в базе данных. -* [filters](src/ocab_modules/ocab_modules/standard/filters/README.md) - модуль, предоставляющий фильтры для aiogram. -* [message_processing](src/ocab_modules/ocab_modules/standard/message_processing/README.md) - модуль обработки входящих сообщений. -* [miniapp](src/ocab_modules/ocab_modules/standard/miniapp/README.md) - модуль для реализации веб-интерфейса бота. -* [command_helper](src/ocab_modules/ocab_modules/standard/command_helper/README.md) - модуль для упрощения регистрации команд бота. -* [info](src/ocab_modules/ocab_modules/standard/info/README.md) - модуль предоставления информации о пользователях и чатах. +* [admin](src/karkas_blocks/karkas_blocks/standard/admin/README.md) - модуль для модерирования чата. +* [roles](src/karkas_blocks/karkas_blocks/standard/roles/README.md) - модуль ролей пользователей. +* [config](src/karkas_blocks/karkas_blocks/standard/config/README.md) - модуль управления конфигурацией бота. +* [database](src/karkas_blocks/karkas_blocks/standard/database/README.md) - модуль для работы с базой данных. +* [fsm_database_storage](src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/README.md) - модуль для хранения состояний FSM в базе данных. +* [filters](src/karkas_blocks/karkas_blocks/standard/filters/README.md) - модуль, предоставляющий фильтры для aiogram. +* [message_processing](src/karkas_blocks/karkas_blocks/standard/message_processing/README.md) - модуль обработки входящих сообщений. +* [miniapp](src/karkas_blocks/karkas_blocks/standard/miniapp/README.md) - модуль для реализации веб-интерфейса бота. +* [command_helper](src/karkas_blocks/karkas_blocks/standard/command_helper/README.md) - модуль для упрощения регистрации команд бота. +* [info](src/karkas_blocks/karkas_blocks/standard/info/README.md) - модуль предоставления информации о пользователях и чатах. ### Дополнительные официальные модули -Дополнительные официальные модули разработаны командой OCAB и предоставляют расширенные возможности для бота: -* [yandexgpt](src/ocab_modules/ocab_modules/external/yandexgpt/README.md) - модуль для интеграции с нейросетью YandexGPT. -* [create_report_apps](src/ocab_modules/ocab_modules/external/create_report_apps/README.md) - модуль для создания отчетов об ошибках. +Дополнительные официальные модули разработаны командой Karkas и предоставляют расширенные возможности для бота: +* [yandexgpt](src/karkas_blocks/karkas_blocks/external/yandexgpt/README.md) - модуль для интеграции с нейросетью YandexGPT. +* [create_report_apps](src/karkas_blocks/karkas_blocks/external/create_report_apps/README.md) - модуль для создания отчетов об ошибках. diff --git a/docs/DEV.md b/docs/DEV.md index 5962e19..9db59a5 100644 --- a/docs/DEV.md +++ b/docs/DEV.md @@ -1,10 +1,10 @@ ## Настройка рабочего окружения -Данная инструкция поможет вам настроить рабочее окружение для разработки OCAB. +Данная инструкция поможет вам настроить рабочее окружение для разработки Karkas. ### Предварительные требования -* **Python 3.12:** OCAB требует Python 3.12. +* **Python 3.12:** Karkas требует Python 3.12. * **VSCode:** Рекомендуется использовать VSCode для разработки. * **Git:** У вас должен быть установлен Git для клонирования репозитория. @@ -12,18 +12,18 @@ 1. **Клонируйте репозиторий:** ```bash - git clone https://gitflic.ru/project/armatik/ocab.git + git clone https://gitflic.ru/project/alt-gnome/karkas.git ``` 2. **Откройте проект в VSCode:** - * Откройте папку `ocab` в VSCode. - * VSCode автоматически предложит открыть проект как workspace, используя файл `ocab.code-workspace`. + * Откройте папку `karkas` в VSCode. + * VSCode автоматически предложит открыть проект как workspace, используя файл `karkas.code-workspace`. Нажмите "Открыть Workspace", чтобы принять предложение. 3. **Настройте Poetry:** * Установите Poetry, следуя инструкциям на официальном сайте: [https://python-poetry.org/docs/](https://python-poetry.org/docs/). * **Для каждого пакета:** - * Перейдите в папку пакета (например, `src/ocab_core`). + * Перейдите в папку пакета (например, `src/karkas_core`). * Выполните команду `poetry install`, чтобы установить зависимости пакета. * Poetry создаст виртуальное окружение внутри папки пакета (`.venv`). diff --git a/docs/MODULES-SPEC.md b/docs/MODULES-SPEC.md index 561e822..3445dd3 100644 --- a/docs/MODULES-SPEC.md +++ b/docs/MODULES-SPEC.md @@ -16,7 +16,7 @@ "id": "standard.info", "name": "Info", "description": "Модуль с информацией", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": false, "dependencies": { @@ -50,7 +50,7 @@ - `author`: Автор модуля. - `version`: Версия модуля в формате [SemVer](https://semver.org/). - `privileged`: Булево значение, указывающее, является ли модуль привилегированным. -- `dependencies`: Объект, описывающий зависимости модуля от других **OCAB** модулей. +- `dependencies`: Объект, описывающий зависимости модуля от других **Karkas** модулей. - `required`: Обязательные зависимости. Ключ - идентификатор модуля, значение - версия или объект `DependencyInfo`. - `optional`: Необязательные зависимости. Ключ - идентификатор модуля, значение - версия или объект `DependencyInfo`. - `pythonDependencies`: Объект, описывающий зависимости модуля от внешних Python пакетов. @@ -80,7 +80,7 @@ - Модуль выполняется в доверенной среде на основе RestrictedPython (это накладывает ряд ограничений). - Может импортировать только явно разрешенные модули, указанные в `pythonDependencies`, а также несколько стандартных модулей, необходимых для работы. -- Имеет доступ к пакету `ocab_core.modules_system.public_api` для взаимодействия с ботом. +- Имеет доступ к пакету `karkas_core.modules_system.public_api` для взаимодействия с ботом. **Привилегированный режим** (`privileged: true`): - Модуль выполняется без ограничений. @@ -100,7 +100,7 @@ ## Взаимодействие между модулями -Модули могут взаимодействовать друг с другом через [API](../src/ocab_core/ocab_core/modules_system/public_api/__init__.py), +Модули могут взаимодействовать друг с другом через [API](../src/karkas_core/karkas_core/modules_system/public_api/__init__.py), предоставляемое системой управления модулями. Например, есть функция `get_module`. Она позволяет получить модуль или предоставляемые им объекты по его diff --git a/gitflic-ci.yaml b/gitflic-ci.yaml new file mode 100644 index 0000000..8cc9912 --- /dev/null +++ b/gitflic-ci.yaml @@ -0,0 +1,33 @@ +stages: + - lint + - build + +lint-pre-commit: + stage: lint + image: python:3.12-bullseye + before_script: + - pip install pre-commit + scripts: + - pre-commit run --all-files + cache: + paths: + - .cache/pip + - .cache/pre-commit + +build-altlinux: + stage: build + image: docker:27.1.2 + variables: + CI_REGISTRY: registry.gitflic.ru + IMAGE_NAME: registry.gitflic.ru/project/alt-gnome/karkas/altlinux + before_script: + - docker info + - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} + scripts: + - | + cd ./src/altlinux + export IMAGE_COMMIT=${IMAGE_NAME}:${CI_COMMIT_SHA} + export IMAGE_BRANCH=${IMAGE_NAME}:$(echo $CI_COMMIT_REF_NAME | sed 's/[^a-zA-Z0-9]/-/g') + docker build -t ${IMAGE_COMMIT} -t ${IMAGE_BRANCH} -f Dockerfile ../.. + docker push ${IMAGE_COMMIT} + docker push ${IMAGE_BRANCH} diff --git a/karkas.code-workspace b/karkas.code-workspace new file mode 100644 index 0000000..3aad916 --- /dev/null +++ b/karkas.code-workspace @@ -0,0 +1,29 @@ +{ + "folders": [ + { + "name": "Karkas Monorepo Root", + "path": ".", + }, + { + "name": "Karkas Blocks", + "path": "src/karkas_blocks" + }, + { + "name": "Karkas Core", + "path": "src/karkas_core" + }, + { + "name": "Gnomik", + "path": "src/gnomik" + }, + { + "name": "ALT Linux", + "path": "src/altlinux" + } + ], + "extensions": { + "recommendations": [ + "ms-python.python" + ] + }, +} diff --git a/ocab.code-workspace b/ocab.code-workspace deleted file mode 100644 index 2b34c84..0000000 --- a/ocab.code-workspace +++ /dev/null @@ -1,25 +0,0 @@ -{ - "folders": [ - { - "name": "OCAB Monorepo Root", - "path": ".", - }, - { - "name": "OCAB Modules", - "path": "src/ocab_modules" - }, - { - "name": "OCAB Core", - "path": "src/ocab_core" - }, - { - "name": "Gnomik", - "path": "src/gnomik" - } - ], - "extensions": { - "recommendations": [ - "ms-python.python" - ] - }, -} diff --git a/pyproject.toml b/pyproject.toml index f8cb63c..d35c7d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] -name = "ocab-monorepo" +name = "karkas-monorepo" version = "2.0.0" -description = "OCAB is a modular Telegram bot" +description = "Karkas is a modular Telegram bot" license = "GPL-3.0-only" authors = ["Семён Фомченков "] maintainers = [ @@ -11,13 +11,13 @@ maintainers = [ "Максим Слипенко " ] readme = "README.md" -repository = "https://gitflic.ru/project/armatik/ocab" +repository = "https://gitflic.ru/project/alt-gnome/karkas" packages = [ { include = "scripts" } ] [tool.poetry.urls] -"Bug Tracker" = "https://gitflic.ru/project/armatik/ocab/issue?status=OPEN" +"Bug Tracker" = "https://gitflic.ru/project/alt-gnome/karkas/issue?status=OPEN" [tool.poetry.scripts] test = 'scripts.test:main' diff --git a/scripts/init.py b/scripts/init.py index 362e4da..c4d9382 100644 --- a/scripts/init.py +++ b/scripts/init.py @@ -4,9 +4,9 @@ from pathlib import Path def main(): pwd = Path().cwd() - dir_core = pwd / "src" / "ocab_core" - dir_modules_standard = pwd / "src" / "ocab_modules" / "standard" - dir_modules_external = pwd / "src" / "ocab_modules" / "external" + dir_core = pwd / "src" / "karkas_core" + dir_modules_standard = pwd / "src" / "karkas_blocks" / "standard" + dir_modules_external = pwd / "src" / "karkas_blocks" / "external" json = { "core": str(dir_core), diff --git a/scripts/module.py b/scripts/module.py index 88e13c3..2e9522b 100644 --- a/scripts/module.py +++ b/scripts/module.py @@ -4,14 +4,14 @@ import os DEFAULTS = { "description": "Очень полезный модуль", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": "false", } def create_module(args): - module_dir = os.path.join("src/ocab_modules/standard", args.module_name) + module_dir = os.path.join("src/karkas_blocks/standard", args.module_name) os.makedirs(module_dir, exist_ok=True) module_info = { diff --git a/src/altlinux/Dockerfile b/src/altlinux/Dockerfile new file mode 100644 index 0000000..8a1f469 --- /dev/null +++ b/src/altlinux/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.12-slim as builder + +RUN pip install poetry +RUN mkdir -p /app +COPY . /app + +# Фикс + +RUN sed -i '/karkas-core = {/{s/, develop = true//}' /app/src/altlinux/pyproject.toml && \ + sed -i '/karkas-blocks = {/{s/, develop = true//}' /app/src/altlinux/pyproject.toml && \ + sed -i '/karkas-core = {/{s/, develop = true//}' /app/src/karkas_blocks/pyproject.toml + +WORKDIR /app/src/altlinux + +RUN poetry lock && poetry install + +FROM python:3.12-slim as base + +COPY --from=builder /app/src/altlinux /app + +WORKDIR /app +ENV PATH="/app/.venv/bin:$PATH" +CMD ["python", "-m", "altlinux"] diff --git a/src/gnomik/Dockerfile.dockerignore b/src/altlinux/Dockerfile.dockerignore similarity index 100% rename from src/gnomik/Dockerfile.dockerignore rename to src/altlinux/Dockerfile.dockerignore diff --git a/src/gnomik/README.md b/src/altlinux/README.md similarity index 56% rename from src/gnomik/README.md rename to src/altlinux/README.md index d3d784f..8bee95a 100644 --- a/src/gnomik/README.md +++ b/src/altlinux/README.md @@ -1,24 +1,15 @@ -# Gnomик - -![Логотип](./docs/gnomik.jpg) - -Чат-бот помощник в [ALT Gnome Chat](https://t.me/alt_gnome_chat). - - -ALT Regular Gnome Community - открытое сообщество пользователей операционной системы ALT Regular Gnome. - -- [Канал](https://t.me/alt_gnome) -- [Wiki](https://alt-gnome.wiki) +# ALT Linux ## Описание -Gnomик - это чат-бот, разработанный на платформе Open Chat AI Bot (OCAB) для Telegram. Он предоставляет различные функции и возможности, помогающие пользователям операционной системы ALT Regular Gnome. +Подготовленная версия Karkas Lite для интеграции в чат [Альт Линукс](https://t.me/alt_linux) ## Функционал +Список OCAB-модулей используемых в боте: - +* report - Вызов администрации чата одной командой +* welcome - Автоматическая вариативная проверка пользователей на признаки бота или другой автоматической рекламной системы +* help - Получение информации об Karkas Lite ## Запуск diff --git a/src/gnomik/gnomik/__init__.py b/src/altlinux/altlinux/__init__.py similarity index 100% rename from src/gnomik/gnomik/__init__.py rename to src/altlinux/altlinux/__init__.py diff --git a/src/altlinux/altlinux/__main__.py b/src/altlinux/altlinux/__main__.py new file mode 100644 index 0000000..76a5b6a --- /dev/null +++ b/src/altlinux/altlinux/__main__.py @@ -0,0 +1,25 @@ +import asyncio +from importlib.metadata import version + +from karkas_blocks import block_loader +from karkas_core import Karkas + + +async def main(): + karkas = Karkas() + await karkas.init_app( + [ + block_loader("standard", "config", safe=False), + block_loader("standard", "command_helper"), + # safe=False из-за super().__init__() + block_loader("standard", "filters", safe=False), + block_loader("standard", "report"), + block_loader("standard", "welcome", safe=False), + block_loader("standard", "help"), + ], + metainfo={"app_version": version("altlinux")}, + ) + await karkas.start() + + +asyncio.run(main()) diff --git a/src/altlinux/config-example.yaml b/src/altlinux/config-example.yaml new file mode 100644 index 0000000..a294ec7 --- /dev/null +++ b/src/altlinux/config-example.yaml @@ -0,0 +1,7 @@ +core: + mode: LONG_POLLING + token: xxx + +filters: + approved_chat_id: + - -111111 diff --git a/src/gnomik/docker-compose.yml b/src/altlinux/docker-compose.yml similarity index 52% rename from src/gnomik/docker-compose.yml rename to src/altlinux/docker-compose.yml index 1914a43..47c8c01 100644 --- a/src/gnomik/docker-compose.yml +++ b/src/altlinux/docker-compose.yml @@ -4,9 +4,6 @@ services: app: build: context: ../.. - dockerfile: src/gnomik/Dockerfile - ports: - - 9000:9000 + dockerfile: src/altlinux/Dockerfile volumes: - ./config.yaml:/app/config.yaml - - ./database:/app/database diff --git a/src/gnomik/poetry.lock b/src/altlinux/poetry.lock similarity index 99% rename from src/gnomik/poetry.lock rename to src/altlinux/poetry.lock index 5224dc3..69d1016 100644 --- a/src/gnomik/poetry.lock +++ b/src/altlinux/poetry.lock @@ -1210,7 +1210,7 @@ files = [ ] [[package]] -name = "ocab-core" +name = "karkas-core" version = "0.1.0" description = "" optional = false @@ -1232,10 +1232,10 @@ webhook = ["fastapi (>=0.111.1,<0.112.0)", "hypercorn (>=0.17.3,<0.18.0)"] [package.source] type = "directory" -url = "../ocab_core" +url = "../karkas_core" [[package]] -name = "ocab-modules" +name = "karkas-blocks" version = "0.1.0" description = "" optional = false @@ -1247,13 +1247,13 @@ develop = true dash = "^2.17.1" dash-bootstrap-components = "^1.6.0" dash-extensions = "^1.0.18" -ocab-core = {path = "../ocab_core", develop = true} +karkas-core = {path = "../karkas_core", develop = true} peewee = "^3.17.6" pyyaml = "^6.0.1" [package.source] type = "directory" -url = "../ocab_modules" +url = "../karkas_blocks" [[package]] name = "packaging" diff --git a/src/gnomik/poetry.toml b/src/altlinux/poetry.toml similarity index 100% rename from src/gnomik/poetry.toml rename to src/altlinux/poetry.toml diff --git a/src/altlinux/pyproject.toml b/src/altlinux/pyproject.toml new file mode 100644 index 0000000..e63ca9e --- /dev/null +++ b/src/altlinux/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "altlinux" +version = "0.1.0" +description = "" +authors = [ + "Максим Слипенко " +] +readme = "README.md" + +[tool.poetry.dependencies] +python = "~3.12" +karkas-core = { extras=["webhook"], path = "../karkas_core", develop = true } +karkas-blocks = { path = "../karkas_blocks", develop = true } + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/src/gnomik/Dockerfile b/src/gnomik/Dockerfile deleted file mode 100644 index a031138..0000000 --- a/src/gnomik/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM python:3.12-slim as builder - -RUN pip install poetry -RUN mkdir -p /app -COPY . /app - -# Фикс - -RUN sed -i '/ocab-core = {/{s/, develop = true//}' /app/src/gnomik/pyproject.toml && \ - sed -i '/ocab-modules = {/{s/, develop = true//}' /app/src/gnomik/pyproject.toml && \ - sed -i '/ocab-core = {/{s/, develop = true//}' /app/src/ocab_modules/pyproject.toml - -WORKDIR /app/src/gnomik - -RUN poetry lock && poetry install - -FROM python:3.12-slim as base - -COPY --from=builder /app/src/gnomik /app - -WORKDIR /app -ENV PATH="/app/.venv/bin:$PATH" -CMD ["python", "-m", "gnomik"] diff --git a/src/gnomik/config-example.yaml b/src/gnomik/config-example.yaml deleted file mode 100644 index 8dce5ef..0000000 --- a/src/gnomik/config-example.yaml +++ /dev/null @@ -1,18 +0,0 @@ -core: - mode: WEBHOOK - token: xxx - webhook: - public_url: xxx -filters: - approved_chat_id: -4128011756 | -4128011756 - default_chat_tag: '@alt_gnome_chat' -miniapp: - public_url: xxx -yandexgpt: - catalogid: xxx - inword: помогите | не работает - prompt: Ты чат-бот ... - startword: Бот| Бот, | бот | бот, - token: xxx - token_for_answer: 2000 - token_for_request: 8000 diff --git a/src/gnomik/database/.gitkeep b/src/gnomik/database/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/gnomik/docs/gnomik.jpg b/src/gnomik/docs/gnomik.jpg deleted file mode 100644 index a0a834f..0000000 Binary files a/src/gnomik/docs/gnomik.jpg and /dev/null differ diff --git a/src/gnomik/gnomik/__main__.py b/src/gnomik/gnomik/__main__.py deleted file mode 100644 index 65209ce..0000000 --- a/src/gnomik/gnomik/__main__.py +++ /dev/null @@ -1,29 +0,0 @@ -import asyncio - -from ocab_core import OCAB -from ocab_modules import module_loader - - -async def main(): - ocab = OCAB() - await ocab.init_app( - [ - module_loader("standard", "config", safe=False), - module_loader("standard", "database", safe=False), - module_loader("standard", "fsm_database_storage", safe=False), - module_loader("standard", "roles", safe=False), - module_loader("external", "yandexgpt", safe=False), - # - module_loader("standard", "command_helper"), - module_loader("standard", "info"), - module_loader("standard", "filters"), - module_loader("external", "create_report_apps"), - module_loader("standard", "admin"), - module_loader("standard", "message_processing"), - module_loader("standard", "miniapp", safe=False), - ] - ) - await ocab.start() - - -asyncio.run(main()) diff --git a/src/gnomik/pyproject.toml b/src/gnomik/pyproject.toml deleted file mode 100644 index 5bb5a75..0000000 --- a/src/gnomik/pyproject.toml +++ /dev/null @@ -1,15 +0,0 @@ -[tool.poetry] -name = "gnomik" -version = "0.1.0" -description = "" -authors = ["Максим Слипенко "] -readme = "README.md" - -[tool.poetry.dependencies] -python = "~3.12" -ocab-core = { extras=["webhook"], path = "../ocab_core", develop = true } -ocab-modules = { path = "../ocab_modules", develop = true } - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/src/karkas_blocks/README.md b/src/karkas_blocks/README.md new file mode 100644 index 0000000..a9de353 --- /dev/null +++ b/src/karkas_blocks/README.md @@ -0,0 +1,12 @@ +# Karkas Blocks + +Karkas Blocks содержит набор модулей для платформы Open Chat AI Bot (Karkas). + +## Описание + +Karkas - это платформа для создания чат-ботов Telegram. Модули - это расширения, которые добавляют функциональность ботам Karkas. + +## Типы модулей + +* **Стандартные модули (standard.*):** Предоставляют основные функции, такие как управление пользователями, ролями и настройками. +* **Дополнительные официальные модули (external.*):** Разработаны командой Karkas и предоставляют расширенные возможности, такие как интеграция с нейросетями, внешними сервисами и API. diff --git a/src/karkas_blocks/karkas_blocks/__init__.py b/src/karkas_blocks/karkas_blocks/__init__.py new file mode 100644 index 0000000..d143f8a --- /dev/null +++ b/src/karkas_blocks/karkas_blocks/__init__.py @@ -0,0 +1 @@ +from .lib import block_loader diff --git a/src/karkas_blocks/karkas_blocks/lib.py b/src/karkas_blocks/karkas_blocks/lib.py new file mode 100644 index 0000000..af7bcdb --- /dev/null +++ b/src/karkas_blocks/karkas_blocks/lib.py @@ -0,0 +1,25 @@ +import importlib +import os + +from karkas_core.modules_system.loaders.fs_loader import FSLoader +from karkas_core.modules_system.loaders.unsafe_fs_loader import UnsafeFSLoader + + +def get_module_directory(module_name): + spec = importlib.util.find_spec(module_name) + if spec is None: + raise ImportError(f"Module {module_name} not found") + module_path = spec.origin + if module_path is None: + raise ImportError(f"Module {module_name} has no origin path") + return os.path.dirname(module_path) + + +karkas_blocks_path = get_module_directory("karkas_blocks") + + +def block_loader(namespace: str, module_name: str, safe=True): + if not safe: + return UnsafeFSLoader(f"{karkas_blocks_path}/{namespace}/{module_name}") + else: + return FSLoader(f"{karkas_blocks_path}/{namespace}/{module_name}") diff --git a/src/ocab_modules/ocab_modules/standard/admin/README.md b/src/karkas_blocks/karkas_blocks/standard/admin/README.md similarity index 100% rename from src/ocab_modules/ocab_modules/standard/admin/README.md rename to src/karkas_blocks/karkas_blocks/standard/admin/README.md diff --git a/src/ocab_modules/ocab_modules/external/create_report_apps/__init__.py b/src/karkas_blocks/karkas_blocks/standard/admin/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/external/create_report_apps/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/admin/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/admin/handlers.py b/src/karkas_blocks/karkas_blocks/standard/admin/handlers.py similarity index 95% rename from src/ocab_modules/ocab_modules/standard/admin/handlers.py rename to src/karkas_blocks/karkas_blocks/standard/admin/handlers.py index 9440eda..368cb2b 100644 --- a/src/ocab_modules/ocab_modules/standard/admin/handlers.py +++ b/src/karkas_blocks/karkas_blocks/standard/admin/handlers.py @@ -4,10 +4,10 @@ from typing import TYPE_CHECKING from aiogram import Bot from aiogram.types import Message -from ocab_core.modules_system.public_api import get_module +from karkas_core.modules_system.public_api import get_module if TYPE_CHECKING: - from ocab_modules.standard.config import IConfig + from karkas_blocks.standard.config import IConfig config: "IConfig" = get_module("standard.config", "config") diff --git a/src/ocab_modules/ocab_modules/standard/admin/info.json b/src/karkas_blocks/karkas_blocks/standard/admin/info.json similarity index 69% rename from src/ocab_modules/ocab_modules/standard/admin/info.json rename to src/karkas_blocks/karkas_blocks/standard/admin/info.json index b2d01d3..fd54142 100644 --- a/src/ocab_modules/ocab_modules/standard/admin/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/admin/info.json @@ -2,12 +2,13 @@ "id": "standard.admin", "name": "Admin", "description": "Модуль для работы с админкой", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": false, "dependencies": { "required": { - "standard.filters": "^1.0.0" + "standard.filters": "^1.0.0", + "standard.roles": "^1.0.0" } } } diff --git a/src/ocab_modules/ocab_modules/standard/admin/main.py b/src/karkas_blocks/karkas_blocks/standard/admin/main.py similarity index 56% rename from src/ocab_modules/ocab_modules/standard/admin/main.py rename to src/karkas_blocks/karkas_blocks/standard/admin/main.py index 0dffedb..1f67729 100644 --- a/src/ocab_modules/ocab_modules/standard/admin/main.py +++ b/src/karkas_blocks/karkas_blocks/standard/admin/main.py @@ -1,4 +1,4 @@ -from ocab_core.modules_system.public_api import register_router +from karkas_core.modules_system.public_api import register_router from .routers import router diff --git a/src/ocab_modules/ocab_modules/standard/admin/routers.py b/src/karkas_blocks/karkas_blocks/standard/admin/routers.py similarity index 93% rename from src/ocab_modules/ocab_modules/standard/admin/routers.py rename to src/karkas_blocks/karkas_blocks/standard/admin/routers.py index b2dc7a5..326de75 100644 --- a/src/ocab_modules/ocab_modules/standard/admin/routers.py +++ b/src/karkas_blocks/karkas_blocks/standard/admin/routers.py @@ -2,7 +2,7 @@ from aiogram import F, Router from aiogram.filters import Command -from ocab_core.modules_system.public_api import get_module, log +from karkas_core.modules_system.public_api import get_module, log from .handlers import ( chat_not_in_approve_list, diff --git a/src/ocab_modules/ocab_modules/standard/command_helper/README.md b/src/karkas_blocks/karkas_blocks/standard/command_helper/README.md similarity index 93% rename from src/ocab_modules/ocab_modules/standard/command_helper/README.md rename to src/karkas_blocks/karkas_blocks/standard/command_helper/README.md index afb3deb..97a614f 100644 --- a/src/ocab_modules/ocab_modules/standard/command_helper/README.md +++ b/src/karkas_blocks/karkas_blocks/standard/command_helper/README.md @@ -16,7 +16,7 @@ ## Пример ```python -from ocab_core.modules_system.public_api import get_module +from karkas_core.modules_system.public_api import get_module register_command = get_module("standard.command_helper", "register_command") diff --git a/src/karkas_blocks/karkas_blocks/standard/command_helper/__init__.py b/src/karkas_blocks/karkas_blocks/standard/command_helper/__init__.py new file mode 100644 index 0000000..3461e7b --- /dev/null +++ b/src/karkas_blocks/karkas_blocks/standard/command_helper/__init__.py @@ -0,0 +1 @@ +from .main import get_user_commands, module_late_init, register_command diff --git a/src/ocab_modules/ocab_modules/standard/command_helper/info.json b/src/karkas_blocks/karkas_blocks/standard/command_helper/info.json similarity index 59% rename from src/ocab_modules/ocab_modules/standard/command_helper/info.json rename to src/karkas_blocks/karkas_blocks/standard/command_helper/info.json index dda6c9e..8d41e24 100644 --- a/src/ocab_modules/ocab_modules/standard/command_helper/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/command_helper/info.json @@ -2,13 +2,8 @@ "id": "standard.command_helper", "name": "Command helper", "description": "Модуль для отображения команд при вводе '/'", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": false, - "dependencies": { - "required": { - "standard.roles": "^1.0.0", - "standard.database": "^1.0.0" - } - } + "dependencies": {} } diff --git a/src/karkas_blocks/karkas_blocks/standard/command_helper/main.py b/src/karkas_blocks/karkas_blocks/standard/command_helper/main.py new file mode 100644 index 0000000..91d0209 --- /dev/null +++ b/src/karkas_blocks/karkas_blocks/standard/command_helper/main.py @@ -0,0 +1,42 @@ +from aiogram.types import BotCommand + +from karkas_core.modules_system.public_api import set_my_commands + +commands = dict() + + +def register_command(command, description, role="USER"): + if role not in commands: + commands[role] = dict() + commands[role][command] = { + "description": description, + } + + +async def set_user_commands(): + bot_commands = [] + if "USER" in commands: + user_commands = commands["USER"] + for command in user_commands: + bot_commands.append( + BotCommand( + command=command, + description=user_commands[command]["description"], + ) + ) + + # log(bot_commands) + + await set_my_commands( + bot_commands, + ) + + +def get_user_commands(): + if "USER" in commands: + return commands["USER"].copy() + return {} + + +async def module_late_init(): + await set_user_commands() diff --git a/src/ocab_modules/ocab_modules/standard/config/README.md b/src/karkas_blocks/karkas_blocks/standard/config/README.md similarity index 93% rename from src/ocab_modules/ocab_modules/standard/config/README.md rename to src/karkas_blocks/karkas_blocks/standard/config/README.md index 784757b..9094efe 100644 --- a/src/ocab_modules/ocab_modules/standard/config/README.md +++ b/src/karkas_blocks/karkas_blocks/standard/config/README.md @@ -18,7 +18,7 @@ ## Пример ```python -from ocab_core.modules_system.public_api import get_module +from karkas_core.modules_system.public_api import get_module config = get_module("standard.config", "config") diff --git a/src/ocab_modules/ocab_modules/standard/config/__init__.py b/src/karkas_blocks/karkas_blocks/standard/config/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/config/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/config/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/config/config.py b/src/karkas_blocks/karkas_blocks/standard/config/config.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/config/config.py rename to src/karkas_blocks/karkas_blocks/standard/config/config.py diff --git a/src/ocab_modules/ocab_modules/standard/config/config_manager.py b/src/karkas_blocks/karkas_blocks/standard/config/config_manager.py similarity index 96% rename from src/ocab_modules/ocab_modules/standard/config/config_manager.py rename to src/karkas_blocks/karkas_blocks/standard/config/config_manager.py index b6b1a1c..d8951ab 100644 --- a/src/ocab_modules/ocab_modules/standard/config/config_manager.py +++ b/src/karkas_blocks/karkas_blocks/standard/config/config_manager.py @@ -66,7 +66,7 @@ class ConfigManager: def _get_module_id(self): caller_frame = inspect.currentframe().f_back.f_back caller_globals = caller_frame.f_globals - module_id = caller_globals.get("__ocab_module_id__") + module_id = caller_globals.get("__karkas_block_id__") return module_id def mass_set(self, updates: Dict[str, Any]): @@ -84,6 +84,7 @@ class ConfigManager: key: str, value_type: str, options: List[Any] = None, + multiple: bool = False, default_value=None, editable: bool = True, shared: bool = False, @@ -101,6 +102,7 @@ class ConfigManager: self._metadata[key] = { "type": value_type, + "multiple": multiple, "options": options, "default_value": default_value, "visible": visible, diff --git a/src/ocab_modules/ocab_modules/standard/config/info.json b/src/karkas_blocks/karkas_blocks/standard/config/info.json similarity index 93% rename from src/ocab_modules/ocab_modules/standard/config/info.json rename to src/karkas_blocks/karkas_blocks/standard/config/info.json index 9d6b7ef..e9e7b2c 100644 --- a/src/ocab_modules/ocab_modules/standard/config/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/config/info.json @@ -2,7 +2,7 @@ "id": "standard.config", "name": "Config YAML", "description": "Модуль для работы с конфигурационным файлом бота (YAML)", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": true, "dependencies": { diff --git a/src/ocab_modules/ocab_modules/standard/config/main.py b/src/karkas_blocks/karkas_blocks/standard/config/main.py similarity index 89% rename from src/ocab_modules/ocab_modules/standard/config/main.py rename to src/karkas_blocks/karkas_blocks/standard/config/main.py index 89096a0..8f1b835 100644 --- a/src/ocab_modules/ocab_modules/standard/config/main.py +++ b/src/karkas_blocks/karkas_blocks/standard/config/main.py @@ -1,4 +1,4 @@ -from ocab_core.modules_system.public_api import get_module, log +from karkas_core.modules_system.public_api import get_module, log from .config import config from .miniapp_ui import get_miniapp_blueprint diff --git a/src/ocab_modules/ocab_modules/standard/config/miniapp_ui.py b/src/karkas_blocks/karkas_blocks/standard/config/miniapp_ui.py similarity index 98% rename from src/ocab_modules/ocab_modules/standard/config/miniapp_ui.py rename to src/karkas_blocks/karkas_blocks/standard/config/miniapp_ui.py index cd6fabd..799be60 100644 --- a/src/ocab_modules/ocab_modules/standard/config/miniapp_ui.py +++ b/src/karkas_blocks/karkas_blocks/standard/config/miniapp_ui.py @@ -12,10 +12,10 @@ try: except ImportError: DASH_AVAILABLE = False -from ocab_core.modules_system.public_api import get_module +from karkas_core.modules_system.public_api import get_module if TYPE_CHECKING: - from ocab_modules.standard.roles import Roles as IRoles + from karkas_blocks.standard.roles import Roles as IRoles def create_control(key: str, config: ConfigManager): diff --git a/src/ocab_modules/ocab_modules/standard/config/tests/test_config.py b/src/karkas_blocks/karkas_blocks/standard/config/tests/test_config.py similarity index 95% rename from src/ocab_modules/ocab_modules/standard/config/tests/test_config.py rename to src/karkas_blocks/karkas_blocks/standard/config/tests/test_config.py index cf17556..d704201 100644 --- a/src/ocab_modules/ocab_modules/standard/config/tests/test_config.py +++ b/src/karkas_blocks/karkas_blocks/standard/config/tests/test_config.py @@ -1,6 +1,6 @@ import unittest -from src.ocab_modules.standard.config.config import get_config +from src.karkas_blocks.standard.config.config import get_config yaml_load = get_config(is_test=True) diff --git a/src/ocab_modules/ocab_modules/standard/database/README.md b/src/karkas_blocks/karkas_blocks/standard/database/README.md similarity index 98% rename from src/ocab_modules/ocab_modules/standard/database/README.md rename to src/karkas_blocks/karkas_blocks/standard/database/README.md index 769e793..6553172 100644 --- a/src/ocab_modules/ocab_modules/standard/database/README.md +++ b/src/karkas_blocks/karkas_blocks/standard/database/README.md @@ -1,6 +1,6 @@ ## Модуль DataBase -Модуль DataBase предназначен для ведения и работы с базами данных OCAB. +Модуль DataBase предназначен для ведения и работы с базами данных Karkas. Модуль содержит в себе следующие таблицы: diff --git a/src/ocab_modules/ocab_modules/standard/database/__init__.py b/src/karkas_blocks/karkas_blocks/standard/database/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/database/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/database/db_api.py b/src/karkas_blocks/karkas_blocks/standard/database/db_api.py similarity index 98% rename from src/ocab_modules/ocab_modules/standard/database/db_api.py rename to src/karkas_blocks/karkas_blocks/standard/database/db_api.py index 855a673..fca29b3 100644 --- a/src/ocab_modules/ocab_modules/standard/database/db_api.py +++ b/src/karkas_blocks/karkas_blocks/standard/database/db_api.py @@ -16,12 +16,12 @@ def connect_database(is_test: bool = False, module: str | None = None): raise NotExpectedModuleName() db_path = "database" - database = pw.SqliteDatabase(f"{db_path}/OCAB.db") + database = pw.SqliteDatabase(f"{db_path}/Karkas.db") database_proxy.initialize(database) database.connect() create_tables(database) - return database, f"{db_path}/OCAB.db" + return database, f"{db_path}/Karkas.db" def create_tables(db: pw.SqliteDatabase): diff --git a/src/ocab_modules/ocab_modules/standard/database/exceptions.py b/src/karkas_blocks/karkas_blocks/standard/database/exceptions.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/exceptions.py rename to src/karkas_blocks/karkas_blocks/standard/database/exceptions.py diff --git a/src/ocab_modules/ocab_modules/standard/database/info.json b/src/karkas_blocks/karkas_blocks/standard/database/info.json similarity index 87% rename from src/ocab_modules/ocab_modules/standard/database/info.json rename to src/karkas_blocks/karkas_blocks/standard/database/info.json index 1a5060e..3534496 100644 --- a/src/ocab_modules/ocab_modules/standard/database/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/database/info.json @@ -2,7 +2,7 @@ "id": "standard.database", "name": "Database", "description": "Модуль для работы с БД", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": true, "dependencies": {} diff --git a/src/ocab_modules/ocab_modules/standard/database/models/__init__.py b/src/karkas_blocks/karkas_blocks/standard/database/models/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/database/models/chat_stats.py b/src/karkas_blocks/karkas_blocks/standard/database/models/chat_stats.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/chat_stats.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/chat_stats.py diff --git a/src/ocab_modules/ocab_modules/standard/database/models/chats.py b/src/karkas_blocks/karkas_blocks/standard/database/models/chats.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/chats.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/chats.py diff --git a/src/ocab_modules/ocab_modules/standard/database/models/db.py b/src/karkas_blocks/karkas_blocks/standard/database/models/db.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/db.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/db.py diff --git a/src/ocab_modules/ocab_modules/standard/database/models/fsm_data.py b/src/karkas_blocks/karkas_blocks/standard/database/models/fsm_data.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/fsm_data.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/fsm_data.py diff --git a/src/ocab_modules/ocab_modules/standard/database/models/messages.py b/src/karkas_blocks/karkas_blocks/standard/database/models/messages.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/messages.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/messages.py diff --git a/src/ocab_modules/ocab_modules/standard/database/models/user_stats.py b/src/karkas_blocks/karkas_blocks/standard/database/models/user_stats.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/user_stats.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/user_stats.py diff --git a/src/ocab_modules/ocab_modules/standard/database/models/users.py b/src/karkas_blocks/karkas_blocks/standard/database/models/users.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/models/users.py rename to src/karkas_blocks/karkas_blocks/standard/database/models/users.py diff --git a/src/ocab_modules/ocab_modules/standard/database/repositories/__init__.py b/src/karkas_blocks/karkas_blocks/standard/database/repositories/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/repositories/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/database/repositories/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/database/repositories/fsm_data.py b/src/karkas_blocks/karkas_blocks/standard/database/repositories/fsm_data.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/repositories/fsm_data.py rename to src/karkas_blocks/karkas_blocks/standard/database/repositories/fsm_data.py diff --git a/src/ocab_modules/ocab_modules/legacy/welcome/__init__.py b/src/karkas_blocks/karkas_blocks/standard/database/tests/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/legacy/welcome/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/database/tests/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/database/tests/database/file b/src/karkas_blocks/karkas_blocks/standard/database/tests/database/file similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/tests/database/file rename to src/karkas_blocks/karkas_blocks/standard/database/tests/database/file diff --git a/src/ocab_modules/ocab_modules/standard/database/tests/test_db.py b/src/karkas_blocks/karkas_blocks/standard/database/tests/test_db.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/database/tests/test_db.py rename to src/karkas_blocks/karkas_blocks/standard/database/tests/test_db.py diff --git a/src/ocab_modules/ocab_modules/standard/filters/README.md b/src/karkas_blocks/karkas_blocks/standard/filters/README.md similarity index 94% rename from src/ocab_modules/ocab_modules/standard/filters/README.md rename to src/karkas_blocks/karkas_blocks/standard/filters/README.md index 2166390..1cc0a49 100644 --- a/src/ocab_modules/ocab_modules/standard/filters/README.md +++ b/src/karkas_blocks/karkas_blocks/standard/filters/README.md @@ -16,7 +16,7 @@ ```python from aiogram import Router -from ocab_core.modules_system.public_api import get_module +from karkas_core.modules_system.public_api import get_module ChatModerOrAdminFilter = get_module("standard.filters", "ChatModerOrAdminFilter") diff --git a/src/ocab_modules/ocab_modules/standard/filters/__init__.py b/src/karkas_blocks/karkas_blocks/standard/filters/__init__.py similarity index 87% rename from src/ocab_modules/ocab_modules/standard/filters/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/filters/__init__.py index 7b423c4..254b877 100644 --- a/src/ocab_modules/ocab_modules/standard/filters/__init__.py +++ b/src/karkas_blocks/karkas_blocks/standard/filters/__init__.py @@ -1,4 +1,5 @@ from .filters import ( + ChatIDFilter, ChatModerOrAdminFilter, ChatNotInApproveFilter, chat_not_in_approve, diff --git a/src/karkas_blocks/karkas_blocks/standard/filters/filters.py b/src/karkas_blocks/karkas_blocks/standard/filters/filters.py new file mode 100644 index 0000000..dfe98bd --- /dev/null +++ b/src/karkas_blocks/karkas_blocks/standard/filters/filters.py @@ -0,0 +1,84 @@ +from typing import TYPE_CHECKING + +from aiogram import Bot +from aiogram.filters import BaseFilter +from aiogram.types import Message +from typing_extensions import deprecated + +from karkas_core.modules_system.public_api import get_module + +if TYPE_CHECKING: + from karkas_blocks.standard.config import IConfig + from karkas_blocks.standard.roles import Roles as IRoles + + +config: "IConfig" = get_module("standard.config", "config") + +try: + Roles: "type[IRoles]" = get_module("standard.roles", "Roles") + ROLES_MODULE_LOADED = True +except Exception: + ROLES_MODULE_LOADED = False + pass + + +def module_init(): + config.register( + "filters::approved_chat_id", "int", multiple=True, shared=True, default_value=[] + ) + config.register("filters::default_chat_tag", "string", shared=True) + + +def get_approved_chat_id() -> list: + return config.get("filters::approved_chat_id") + + +@deprecated("Use ChatIDFilter or own implementation") +def chat_not_in_approve(message: Message) -> bool: + chat_id = message.chat.id + if chat_id in get_approved_chat_id(): + # log(f"Chat in approve list: {chat_id}") + return False + else: + # log(f"Chat not in approve list: {chat_id}") + return True + + +class ChatIDFilter(BaseFilter): + def __init__(self, blacklist=False, approved_chats=None) -> None: + self.blacklist = blacklist + self.approved_chats = approved_chats + super().__init__() + + async def __call__(self, message: Message, bot: Bot) -> bool: + chat_id = message.chat.id + + approved_chats = self.approved_chats or get_approved_chat_id() + + # Если список для фильтрации пуст - разрешаем всем. + if len(approved_chats) == 0: + return True + + res = chat_id in approved_chats + + return res ^ (self.blacklist) + + +class ChatNotInApproveFilter(ChatIDFilter): + def __init__(self) -> None: + super().__init__(allow=False) + + +class ChatModerOrAdminFilter(BaseFilter): + async def __call__(self, message: Message, bot: Bot) -> bool: + if not ROLES_MODULE_LOADED: + raise Exception("Roles module not loaded") + + user_id = message.from_user.id + roles = Roles() + admins = await bot.get_chat_administrators(message.chat.id) + return ( + await roles.check_admin_permission(user_id) + or await roles.check_moderator_permission(user_id) + or any(user_id == admin.user.id for admin in admins) + ) diff --git a/src/ocab_modules/ocab_modules/standard/filters/info.json b/src/karkas_blocks/karkas_blocks/standard/filters/info.json similarity index 66% rename from src/ocab_modules/ocab_modules/standard/filters/info.json rename to src/karkas_blocks/karkas_blocks/standard/filters/info.json index 205b829..aabb3fe 100644 --- a/src/ocab_modules/ocab_modules/standard/filters/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/filters/info.json @@ -2,13 +2,15 @@ "id": "standard.filters", "name": "Filters", "description": "Модуль с фильтрами", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", - "privileged": false, + "privileged": true, "dependencies": { "required": { - "standard.roles": "^1.0.0", "standard.config": "^1.0.0" + }, + "optional": { + "standard.roles": "^1.0.0" } } } diff --git a/src/ocab_modules/ocab_modules/standard/fsm_database_storage/README.md b/src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/README.md similarity index 100% rename from src/ocab_modules/ocab_modules/standard/fsm_database_storage/README.md rename to src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/README.md diff --git a/src/ocab_modules/ocab_modules/standard/fsm_database_storage/__init__.py b/src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/fsm_database_storage/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/fsm_database_storage/fsm.py b/src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/fsm.py similarity index 94% rename from src/ocab_modules/ocab_modules/standard/fsm_database_storage/fsm.py rename to src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/fsm.py index 4b71145..1716158 100644 --- a/src/ocab_modules/ocab_modules/standard/fsm_database_storage/fsm.py +++ b/src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/fsm.py @@ -4,11 +4,11 @@ from typing import TYPE_CHECKING, Any, Dict, Optional from aiogram.fsm.state import State from aiogram.fsm.storage.base import BaseStorage, StorageKey -from ocab_core.modules_system.public_api import get_module, log -from ocab_core.modules_system.public_api.public_api import set_fsm +from karkas_core.modules_system.public_api import get_module, log +from karkas_core.modules_system.public_api.public_api import set_fsm if TYPE_CHECKING: - from ocab_modules.standard.database.repositories import ( + from karkas_blocks.standard.database.repositories import ( FSMDataRepository as IFSMDataRepository, ) diff --git a/src/ocab_modules/ocab_modules/standard/fsm_database_storage/info.json b/src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/info.json similarity index 90% rename from src/ocab_modules/ocab_modules/standard/fsm_database_storage/info.json rename to src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/info.json index 58c05b4..1302a34 100644 --- a/src/ocab_modules/ocab_modules/standard/fsm_database_storage/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/fsm_database_storage/info.json @@ -2,7 +2,7 @@ "id": "standard.fsm_database_storage", "name": "FSM Database Storage", "description": "Очень полезный модуль", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": false, "dependencies": { diff --git a/src/ocab_modules/ocab_modules/standard/admin/__init__.py b/src/karkas_blocks/karkas_blocks/standard/help/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/admin/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/help/__init__.py diff --git a/src/karkas_blocks/karkas_blocks/standard/help/info.json b/src/karkas_blocks/karkas_blocks/standard/help/info.json new file mode 100644 index 0000000..75df4ed --- /dev/null +++ b/src/karkas_blocks/karkas_blocks/standard/help/info.json @@ -0,0 +1,21 @@ +{ + "id": "standard.help", + "name": "Help", + "description": "Модуль для вывода /help сообщения", + "author": "Karkas Team", + "version": "1.0.0", + "privileged": false, + "dependencies": { + "required": { + "standard.config": "^1.0.0" + }, + "optional": { + "standard.command_helper": "^1.0.0" + } + }, + "pythonDependencies": { + "required": { + "string": "*" + } + } +} diff --git a/src/karkas_blocks/karkas_blocks/standard/help/main.py b/src/karkas_blocks/karkas_blocks/standard/help/main.py new file mode 100644 index 0000000..a5e1de0 --- /dev/null +++ b/src/karkas_blocks/karkas_blocks/standard/help/main.py @@ -0,0 +1,81 @@ +import string +from typing import TYPE_CHECKING + +from aiogram import Router +from aiogram.filters import Command +from aiogram.types import Message + +from karkas_core.modules_system.public_api import ( + get_metainfo, + get_module, + register_router, +) + +if TYPE_CHECKING: + from karkas_blocks.standard.config import IConfig + +config: "IConfig" = get_module("standard.config", "config") + +try: + (register_command, get_user_commands) = get_module( + "standard.command_helper", ["register_command", "get_user_commands"] + ) + COMMAND_HELPER_MODULE_LOADED = True +except Exception: + COMMAND_HELPER_MODULE_LOADED = False + pass + +FOOTER = """=== + +Разработано командой ALT Gnome Infrastructure в рамках проекта Каркас. + +Исходный код: https://gitflic.ru/project/alt-gnome/karkas +Оставить репорт: https://gitflic.ru/project/alt-gnome/karkas/issue/create + +Руководитель проекта: Семен Фомченков +Ведущий разработчик: Максим Слипенко + +Версия: $version +""" + + +def format_commands(commands_dict): + formatted_commands = [] + for command, details in commands_dict.items(): + formatted_commands.append(f"/{command} - {details['description']}") + return "\n".join(formatted_commands) + + +async def help(message: Message): + commands = "" + version = "" + + if COMMAND_HELPER_MODULE_LOADED: + commands = format_commands(get_user_commands()) + + metainfo = get_metainfo() + if "app_version" in metainfo: + version = metainfo["app_version"] + + await message.reply( + string.Template(config.get("help::message") + "\n\n" + FOOTER).substitute( + commands=commands, version=version or "не указана" + ) + ) + + +async def module_init(): + config.register( + "help::message", + "string", + default_value="$commands", + ) + + router = Router() + + router.message.register(help, Command("help")) + + register_router(router) + + if COMMAND_HELPER_MODULE_LOADED: + register_command("help", "Cправка") diff --git a/src/ocab_modules/ocab_modules/standard/info/README.md b/src/karkas_blocks/karkas_blocks/standard/info/README.md similarity index 100% rename from src/ocab_modules/ocab_modules/standard/info/README.md rename to src/karkas_blocks/karkas_blocks/standard/info/README.md diff --git a/src/ocab_modules/ocab_modules/standard/info/__init__.py b/src/karkas_blocks/karkas_blocks/standard/info/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/info/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/info/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/info/handlers.py b/src/karkas_blocks/karkas_blocks/standard/info/handlers.py similarity index 94% rename from src/ocab_modules/ocab_modules/standard/info/handlers.py rename to src/karkas_blocks/karkas_blocks/standard/info/handlers.py index eb369c9..8c18816 100644 --- a/src/ocab_modules/ocab_modules/standard/info/handlers.py +++ b/src/karkas_blocks/karkas_blocks/standard/info/handlers.py @@ -5,11 +5,11 @@ from typing import TYPE_CHECKING from aiogram import Bot from aiogram.types import Message -from ocab_core.modules_system.public_api import get_module, log +from karkas_core.modules_system.public_api import get_module, log if TYPE_CHECKING: - from ocab_modules.standard.database import db_api as IDbApi - from ocab_modules.standard.roles import Roles as IRoles + from karkas_blocks.standard.database import db_api as IDbApi + from karkas_blocks.standard.roles import Roles as IRoles db_api: "IDbApi" = get_module( "standard.database", diff --git a/src/ocab_modules/ocab_modules/standard/info/info.json b/src/karkas_blocks/karkas_blocks/standard/info/info.json similarity index 92% rename from src/ocab_modules/ocab_modules/standard/info/info.json rename to src/karkas_blocks/karkas_blocks/standard/info/info.json index 3a37f73..454f1c7 100644 --- a/src/ocab_modules/ocab_modules/standard/info/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/info/info.json @@ -2,7 +2,7 @@ "id": "standard.info", "name": "Info", "description": "Модуль с информацией", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": false, "dependencies": { diff --git a/src/ocab_modules/ocab_modules/standard/info/main.py b/src/karkas_blocks/karkas_blocks/standard/info/main.py similarity index 87% rename from src/ocab_modules/ocab_modules/standard/info/main.py rename to src/karkas_blocks/karkas_blocks/standard/info/main.py index 8893a44..4756851 100644 --- a/src/ocab_modules/ocab_modules/standard/info/main.py +++ b/src/karkas_blocks/karkas_blocks/standard/info/main.py @@ -1,7 +1,7 @@ from aiogram import Router from aiogram.filters import Command -from ocab_core.modules_system.public_api import get_module, register_router +from karkas_core.modules_system.public_api import get_module, register_router from .handlers import get_chat_info, get_user_info diff --git a/src/ocab_modules/ocab_modules/standard/message_processing/README.md b/src/karkas_blocks/karkas_blocks/standard/message_processing/README.md similarity index 100% rename from src/ocab_modules/ocab_modules/standard/message_processing/README.md rename to src/karkas_blocks/karkas_blocks/standard/message_processing/README.md diff --git a/src/ocab_modules/ocab_modules/standard/message_processing/__init__.py b/src/karkas_blocks/karkas_blocks/standard/message_processing/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/message_processing/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/message_processing/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/message_processing/info.json b/src/karkas_blocks/karkas_blocks/standard/message_processing/info.json similarity index 92% rename from src/ocab_modules/ocab_modules/standard/message_processing/info.json rename to src/karkas_blocks/karkas_blocks/standard/message_processing/info.json index 8fbeb1a..6c72bed 100644 --- a/src/ocab_modules/ocab_modules/standard/message_processing/info.json +++ b/src/karkas_blocks/karkas_blocks/standard/message_processing/info.json @@ -2,7 +2,7 @@ "id": "standard.message_processing", "name": "Info", "description": "Модуль с информацией", - "author": "OCAB Team", + "author": "Karkas Team", "version": "1.0.0", "privileged": false, "dependencies": { diff --git a/src/ocab_modules/ocab_modules/standard/message_processing/message_api.py b/src/karkas_blocks/karkas_blocks/standard/message_processing/message_api.py similarity index 97% rename from src/ocab_modules/ocab_modules/standard/message_processing/message_api.py rename to src/karkas_blocks/karkas_blocks/standard/message_processing/message_api.py index 834bbc5..496f454 100644 --- a/src/ocab_modules/ocab_modules/standard/message_processing/message_api.py +++ b/src/karkas_blocks/karkas_blocks/standard/message_processing/message_api.py @@ -4,10 +4,10 @@ from typing import TYPE_CHECKING from aiogram import Bot, F, Router, types -from ocab_core.modules_system.public_api import get_module, log, register_router +from karkas_core.modules_system.public_api import get_module, log, register_router if TYPE_CHECKING: - from ocab_modules.standard.config import IConfig + from karkas_blocks.standard.config import IConfig config: "IConfig" = get_module("standard.config", "config") diff --git a/src/ocab_modules/ocab_modules/standard/miniapp/README.md b/src/karkas_blocks/karkas_blocks/standard/miniapp/README.md similarity index 92% rename from src/ocab_modules/ocab_modules/standard/miniapp/README.md rename to src/karkas_blocks/karkas_blocks/standard/miniapp/README.md index 5d47f17..0fd1008 100644 --- a/src/ocab_modules/ocab_modules/standard/miniapp/README.md +++ b/src/karkas_blocks/karkas_blocks/standard/miniapp/README.md @@ -15,7 +15,7 @@ ## Пример ```python -from ocab_core.modules_system.public_api import get_module +from karkas_core.modules_system.public_api import get_module register_page = get_module("standard.miniapp", "register_page") diff --git a/src/ocab_modules/ocab_modules/standard/miniapp/__init__.py b/src/karkas_blocks/karkas_blocks/standard/miniapp/__init__.py similarity index 100% rename from src/ocab_modules/ocab_modules/standard/miniapp/__init__.py rename to src/karkas_blocks/karkas_blocks/standard/miniapp/__init__.py diff --git a/src/ocab_modules/ocab_modules/standard/miniapp/dash_telegram_auth.py b/src/karkas_blocks/karkas_blocks/standard/miniapp/dash_telegram_auth.py similarity index 99% rename from src/ocab_modules/ocab_modules/standard/miniapp/dash_telegram_auth.py rename to src/karkas_blocks/karkas_blocks/standard/miniapp/dash_telegram_auth.py index 5137770..2d5a928 100644 --- a/src/ocab_modules/ocab_modules/standard/miniapp/dash_telegram_auth.py +++ b/src/karkas_blocks/karkas_blocks/standard/miniapp/dash_telegram_auth.py @@ -12,7 +12,7 @@ WEBAPP_LOADER_TEMPLATE = """ - OCAB + Karkas