From 70becfc32ec98084067686bd456971a4cb76082c Mon Sep 17 00:00:00 2001 From: Igor Tolmachov Date: Sat, 3 Dec 2022 02:03:05 +0900 Subject: Beta 2.0 --- shared/__init__.py | 3 ++- shared/commands.py | 23 +++++++++++------- shared/config.py | 28 ---------------------- shared/database.py | 17 +++++++++++++ shared/instances.py | 17 +++++++++++-- shared/settings.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 117 insertions(+), 40 deletions(-) delete mode 100644 shared/config.py create mode 100644 shared/database.py create mode 100644 shared/settings.py (limited to 'shared') diff --git a/shared/__init__.py b/shared/__init__.py index 9153c94..f708bfe 100644 --- a/shared/__init__.py +++ b/shared/__init__.py @@ -1,4 +1,5 @@ # isort: skip_file -from . import config +from . import settings from . import instances +from . import database from . import commands diff --git a/shared/commands.py b/shared/commands.py index 136f782..684997c 100644 --- a/shared/commands.py +++ b/shared/commands.py @@ -1,19 +1,24 @@ from aiogram.types import BotCommand as cmd +from aiogram.types import BotCommandScopeAllChatAdministrators as admin from aiogram.types import BotCommandScopeAllGroupChats as group from aiogram.types import BotCommandScopeAllPrivateChats as private commands = { group(): [ - cmd("gen", "Покакать текстом"), - cmd("del", "Убрать говно"), - cmd("void", "Лоботомия"), - cmd("pin", "Закрепить говно"), - cmd("chance", "Установить шанс покакать в туалет"), + cmd("gen", "Сгенерировать сообщение"), + cmd("del", "Удалить сообщение бота"), + cmd("pin", "Создать опрос для закрепления сообщения"), + ], + admin(): [ + cmd("gen", "Сгенерировать сообщение"), + cmd("del", "Удалить сообщение бота"), + cmd("pin", "Создать опрос для закрепления сообщения"), + cmd("void", "Отчистить связи для генерации сообщений"), + cmd("config", "Открыть настройки чата"), ], private(): [ - cmd("gen", "Покакать текстом"), - cmd("del", "Убрать говно"), - cmd("void", "Лоботомия"), - cmd("chance", "Установить шанс покакать в туалет"), + cmd("gen", "Сгенерировать сообщение"), + cmd("del", "Удалить сообщение бота"), + cmd("void", "Отчистить связи для генерации сообщений"), ], } diff --git a/shared/config.py b/shared/config.py deleted file mode 100644 index 09ced45..0000000 --- a/shared/config.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging -from copy import deepcopy -from json import dump, load -from os import environ as env -from os import path -from typing import Any - -logging.info("Load configs") - -if not path.exists("data/settings.json"): - with open("data/settings.json", "w") as f: - f.write("{}") -fields: dict[str, Any] = { - "chances": {}, -} - -settings: dict[str, Any] = load(open("data/settings.json", "r")) -for key, default in fields.items(): - settings[key] = settings.get(key, deepcopy(default)) - - -def save(): - dump(settings, open("data/settings.json", "w")) - - -# Configs -token = env["TOKEN"] -chances: dict[str, int] = settings["chances"] diff --git a/shared/database.py b/shared/database.py new file mode 100644 index 0000000..9dfe868 --- /dev/null +++ b/shared/database.py @@ -0,0 +1,17 @@ +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column + +from shared.instances import engine + + +class Base(DeclarativeBase): + pass + + +class Message(Base): + __tablename__ = "messages" + chat_id: Mapped[int] = mapped_column(primary_key=True) + message_id: Mapped[int] = mapped_column(primary_key=True) + message: Mapped[str] + + +Base.metadata.create_all(engine) diff --git a/shared/instances.py b/shared/instances.py index 9ca0b2c..fb511b3 100644 --- a/shared/instances.py +++ b/shared/instances.py @@ -1,6 +1,19 @@ +from os.path import exists + from aiogram import Bot, Dispatcher +from sqlalchemy import create_engine +from sqlalchemy.orm import Session, sessionmaker + +from shared.settings import Chats, Settings -from shared.config import token +settings = Settings() +config = Chats() +if not exists("data/config.json"): + config.save("data/config.json") +config.load("data/config.json") -bot = Bot(token=token) +bot = Bot(token=settings.token) dp = Dispatcher(bot) + +engine = create_engine("sqlite:///data/database.sqlite") +session = sessionmaker(engine, Session) diff --git a/shared/settings.py b/shared/settings.py new file mode 100644 index 0000000..20f3f76 --- /dev/null +++ b/shared/settings.py @@ -0,0 +1,69 @@ +from json import dump, load + +from pydantic import BaseModel, BaseSettings, Field + + +class Settings(BaseSettings): + token: str + + +class GenConfig(BaseModel): + chance: int = Field( + 10, + description="Шанс с которым бот ответит на сообщение", + ge=1, + le=100, + ) + min_word_count: int | str | None = Field( + None, + description="Минимальное количество слов в сгенерированном предложении", + ge=1, + ) + max_word_count: int | None = Field( + None, + description="Максимальное количество слов в сгенерированном предложении", + ge=1, + ) + + +class CommandsConfig(BaseModel): + pin_answers_count: int = Field( + 4, + description="Минимальное количество голосов для проверки опроса на закрепление сообщения", + ) + accept_member_answers_count: int = Field( + 5, + description="Минимальное количество голосов для проверки опроса на принятия человека в группу", + ) + + +class Config(BaseModel): + gen: GenConfig = Field( + GenConfig(), + description="Настройки генерации сообщений", + ) + commands: CommandsConfig = Field( + CommandsConfig(), + description="Настройки команд бота", + ) + + +class Chats(BaseModel): + chats: dict[int, Config] = {} + + @classmethod + def load(cls, file_name: str) -> "Chats": + with open(file_name, "r") as file: + return cls.parse_obj(load(file)) + + def save(self, file_name: str) -> None: + with open(file_name, "w") as file: + dump(self.schema(), file) + + def get_config(self, chat_id: int) -> Config: + if chat_id not in self.chats: + self.chats[chat_id] = Config() + return self.chats[chat_id] + + def set_config(self, chat_id: int, config: Config) -> None: + self.chats[chat_id] = config -- cgit v1.2.3