From 84b42b495039218d3c221c4df7bb3d79df00676e Mon Sep 17 00:00:00 2001 From: def Date: Tue, 10 Jan 2023 04:48:55 +0400 Subject: [PATCH] THIS IS REFACTOR MOTHER FUCKER --- config.yaml | 2 + mirrortea/__main__.py | 56 ++----------------- .../abstract_source_platform/__init__.py | 3 + .../abstact_source_platform.py | 9 +++ .../telegram.py | 14 ++++- mirrortea/config_dataclass.py | 32 +++++++++++ mirrortea/matrix.py | 3 + mirrortea/models/user.py | 15 +++++ mirrortea/repository/__init__.py | 5 ++ .../repository/abstract_db_repository.py | 7 +++ .../sqlite_init_tables.py} | 1 + mirrortea/repository/sqlite_repository.py | 31 ++++++++++ requirements.txt | 1 + 13 files changed, 128 insertions(+), 51 deletions(-) create mode 100644 config.yaml create mode 100644 mirrortea/abstract_source_platform/__init__.py create mode 100644 mirrortea/abstract_source_platform/abstact_source_platform.py rename mirrortea/{ => abstract_source_platform}/telegram.py (57%) create mode 100644 mirrortea/config_dataclass.py create mode 100644 mirrortea/models/user.py create mode 100644 mirrortea/repository/__init__.py create mode 100644 mirrortea/repository/abstract_db_repository.py rename mirrortea/{init_db.py => repository/sqlite_init_tables.py} (96%) create mode 100644 mirrortea/repository/sqlite_repository.py diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..a5c0786 --- /dev/null +++ b/config.yaml @@ -0,0 +1,2 @@ +matrix_owner_id: "@dettlaff:inex.rocks" +db_path: "data/database.sqlite3" diff --git a/mirrortea/__main__.py b/mirrortea/__main__.py index 2db6e70..ebc1718 100644 --- a/mirrortea/__main__.py +++ b/mirrortea/__main__.py @@ -1,51 +1,25 @@ import asyncio import os -import sqlite3 -import sys - -import aiogram as telegram -import nio as matrix from matrix import MatrixLoop -from telegram import TelegramLoop +from mirrortea.abstract_source_platform.telegram import Telegram -from mirrortea.init_db import ( - MATRIX_ROOMS_SQL, - TELEGRAM_USER_MATRIX_CHATS_SQL, - TELEGRAM_USERS_SQL, -) +from config_dataclass import Config + +CONFIG_FILE_NAME = "config.yaml" def main(): - config = Config( - db_path=os.environ["DB_PATH"], - matrix_bot_id=os.environ["MATRIX_BOT_ID"], - matrix_homeserver_url=os.environ["MATRIX_HOMESERVER_URL"], - matrix_owner_id=os.environ["MATRIX_OWNER_ID"], - matrix_password=os.environ["MATRIX_PASSWORD"], - telegram_bot_token=os.environ["TELEGRAM_BOT_TOKEN"], - ) + config = Config.from_yaml_config(CONFIG_FILE_NAME) asyncio.run(Application(config).run()) -class Config: - def __init__(self, **kwargs): - self.db_path = kwargs["db_path"] - self.matrix_bot_id = kwargs["matrix_bot_id"] - self.matrix_homeserver_url = kwargs["matrix_homeserver_url"] - self.matrix_owner_id = kwargs["matrix_owner_id"] - self.matrix_password = kwargs["matrix_password"] - self.telegram_bot_token = kwargs["telegram_bot_token"] - # выглядит ужасно :( - - class Application: def __init__(self, config): self.config = config - self.sqlite_adapter = SqliteAdapter(self, config.db_path) self.matrix_loop = MatrixLoop(self) - self.telegram_loop = TelegramLoop(self) + self.telegram = Telegram(self) async def run(self): try: @@ -59,23 +33,5 @@ class Application: await self.matrix_loop.finish() -class SqliteAdapter: - def __init__(self, app, path): - self.app = app - self.path = path - self.conn = sqlite3.connect(path) - self._create_tables() - - def _create_tables(self): - for table in [ - TELEGRAM_USER_MATRIX_CHATS_SQL, - TELEGRAM_USERS_SQL, - MATRIX_ROOMS_SQL, - ]: - self.conn.execute(table) - - self.conn.commit() - - if __name__ == "__main__": main() diff --git a/mirrortea/abstract_source_platform/__init__.py b/mirrortea/abstract_source_platform/__init__.py new file mode 100644 index 0000000..f3ea23b --- /dev/null +++ b/mirrortea/abstract_source_platform/__init__.py @@ -0,0 +1,3 @@ +from mirrortea.abstract_source_platform.telegram import Telegram + +platforms = [Telegram] diff --git a/mirrortea/abstract_source_platform/abstact_source_platform.py b/mirrortea/abstract_source_platform/abstact_source_platform.py new file mode 100644 index 0000000..35cec3b --- /dev/null +++ b/mirrortea/abstract_source_platform/abstact_source_platform.py @@ -0,0 +1,9 @@ +from abc import ABC, abstractmethod + +from mirrortea.models.user import User + + +class AbstractSourcePlatform(ABC): + @abstractmethod + def get_user_information(self) -> User: + """Init tables in database""" diff --git a/mirrortea/telegram.py b/mirrortea/abstract_source_platform/telegram.py similarity index 57% rename from mirrortea/telegram.py rename to mirrortea/abstract_source_platform/telegram.py index a00f027..a8dcb44 100644 --- a/mirrortea/telegram.py +++ b/mirrortea/abstract_source_platform/telegram.py @@ -1,4 +1,13 @@ -class TelegramLoop: +import sys +import aiogram as telegram + +from mirrortea.abstract_source_platform.abstact_source_platform import ( + AbstractSourcePlatform, +) +from mirrortea.models.user import User + + +class Telegram(AbstractSourcePlatform): def __init__(self, app): self.app = app self.bot = telegram.Bot(token=app.config.telegram_bot_token) @@ -10,3 +19,6 @@ class TelegramLoop: async def on_message(self, msg): print(msg, file=sys.stderr) + + async def get_user_information(self) -> User: + pass diff --git a/mirrortea/config_dataclass.py b/mirrortea/config_dataclass.py new file mode 100644 index 0000000..8d87eda --- /dev/null +++ b/mirrortea/config_dataclass.py @@ -0,0 +1,32 @@ +import os +import yaml +from pathlib import Path +from dataclasses import dataclass + +from jinja2 import BaseLoader, Environment + + +def render_env_template(raw_config: str) -> dict: + template = Environment(loader=BaseLoader).from_string(raw_config) + conf = template.render(**os.environ) + return yaml.safe_load(conf) + + +@dataclass +class Config: + db_path: Path + + matrix_bot_id: str + matrix_homeserver_url: str + matrix_password: str + matrix_owner_id: str + telegram_bot_token: str + + @classmethod + def from_dict(config_class, dict): + return config_class(**dict) + + @classmethod + def from_yaml_config(config_class, path: Path): + with open(path) as raw: + return config_class.from_dict(render_env_template(raw.read())) diff --git a/mirrortea/matrix.py b/mirrortea/matrix.py index cf31b5f..7777e20 100644 --- a/mirrortea/matrix.py +++ b/mirrortea/matrix.py @@ -1,3 +1,6 @@ +import nio as matrix + + class MatrixLoop: def __init__(self, app): self.app = app diff --git a/mirrortea/models/user.py b/mirrortea/models/user.py new file mode 100644 index 0000000..e8315e5 --- /dev/null +++ b/mirrortea/models/user.py @@ -0,0 +1,15 @@ +from typing import Optional +from pydantic import BaseModel + + +class User(BaseModel): + """ + Bridge user from platform source + """ + + first_name: str + last_named: Optional[str] + + id: str + username: Optional[str] + avatar_hash: Optional[str] diff --git a/mirrortea/repository/__init__.py b/mirrortea/repository/__init__.py new file mode 100644 index 0000000..4c46a48 --- /dev/null +++ b/mirrortea/repository/__init__.py @@ -0,0 +1,5 @@ +from mirrortea.repository.sqlite_repository import ( + SQLiteDatabaseRepository, +) + +repository = SQLiteDatabaseRepository() diff --git a/mirrortea/repository/abstract_db_repository.py b/mirrortea/repository/abstract_db_repository.py new file mode 100644 index 0000000..a0fd9fc --- /dev/null +++ b/mirrortea/repository/abstract_db_repository.py @@ -0,0 +1,7 @@ +from abc import ABC, abstractmethod + + +class AbstractDatabaseRepository(ABC): + @abstractmethod + def create_tables(self) -> None: + """Init tables in database""" diff --git a/mirrortea/init_db.py b/mirrortea/repository/sqlite_init_tables.py similarity index 96% rename from mirrortea/init_db.py rename to mirrortea/repository/sqlite_init_tables.py index 0d6e762..be530c6 100644 --- a/mirrortea/init_db.py +++ b/mirrortea/repository/sqlite_init_tables.py @@ -15,6 +15,7 @@ CREATE TABLE IF NOT EXISTS telegram_users first_name TEXT NOT NULL (50), last_name TEXT (50), username TEXT (50), + avatar_hash BLOB, ); """ diff --git a/mirrortea/repository/sqlite_repository.py b/mirrortea/repository/sqlite_repository.py new file mode 100644 index 0000000..18ccd81 --- /dev/null +++ b/mirrortea/repository/sqlite_repository.py @@ -0,0 +1,31 @@ +import sqlite3 +from pathlib import Path +from typing import Optional + +from mirrortea.repository.abstract_db_repository import AbstractDatabaseRepository + +from mirrortea.repository.sqlite_init_tables import ( + TELEGRAM_USER_MATRIX_CHATS_SQL, + TELEGRAM_USERS_SQL, + MATRIX_ROOMS_SQL, +) + +TABLES_LIST = [ + TELEGRAM_USER_MATRIX_CHATS_SQL, + TELEGRAM_USERS_SQL, + MATRIX_ROOMS_SQL, +] + + +class SQLiteDatabaseRepository(AbstractDatabaseRepository): + def __init__(self, app, path: Path): + self.path = path + self.conn = sqlite3.connect(path) + + @staticmethod + def create_tables(self) -> None: + """Init tables in database""" + + for table in TABLES_LIST: + self.conn.execute(table) + self.conn.commit() diff --git a/requirements.txt b/requirements.txt index 3f3c37f..9dc2e6d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ aiogram==2.24 matrix-nio==0.20.1 +jinja2 \ No newline at end of file