From 2208bbf566e07535e0de4f1fe9fb3fe459de296b Mon Sep 17 00:00:00 2001 From: dj Date: Fri, 1 Dec 2023 18:17:58 +0300 Subject: [PATCH] Update --- dj_bot.conf | 7 +- main.py | 10 +- requirements.txt | 8 +- tgbot/database/__init__.py | 0 tgbot/database/db_helper.py | 88 ++++++++++++ tgbot/database/db_settings.py | 36 +++++ tgbot/database/db_users.py | 133 ++++++++++++++++++ tgbot/middlewares/__init__.py | 4 +- ...throttling.py => middleware_throttling.py} | 3 + .../{exists_user.py => middleware_user.py} | 24 ++-- tgbot/routers/admin/admin_menu.py | 56 +++++--- tgbot/routers/main_errors.py | 11 +- tgbot/routers/main_missed.py | 11 +- tgbot/routers/main_start.py | 7 +- tgbot/routers/user/user_menu.py | 13 +- tgbot/services/api_session.py | 4 +- tgbot/services/api_sqlite.py | 124 ---------------- tgbot/utils/misc/bot_models.py | 4 +- 18 files changed, 353 insertions(+), 190 deletions(-) create mode 100644 tgbot/database/__init__.py create mode 100644 tgbot/database/db_helper.py create mode 100644 tgbot/database/db_settings.py create mode 100644 tgbot/database/db_users.py rename tgbot/middlewares/{throttling.py => middleware_throttling.py} (96%) rename tgbot/middlewares/{exists_user.py => middleware_user.py} (61%) delete mode 100644 tgbot/services/api_sqlite.py diff --git a/dj_bot.conf b/dj_bot.conf index 967f359..cf8b6ba 100644 --- a/dj_bot.conf +++ b/dj_bot.conf @@ -1,5 +1,4 @@ # supervisorctl - [program:dj_bot] directory=/root/djimbo_template/ command=python3.9 main.py @@ -7,5 +6,7 @@ command=python3.9 main.py autostart=True autorestart=True -stderr_logfile=/root/djimbo_template/tgbot/data/sv_log_err.log -stdout_logfile=/root/djimbo_template/tgbot/data/sv_log_out.log \ No newline at end of file +stderr_logfile=/root/autoshopDjimbo/tgbot/data/sv_log_err.log +; stderr_logfile_maxbytes=10MB +stdout_logfile=/root/autoshopDjimbo/tgbot/data/sv_log_out.log +; stdout_logfile_maxbytes=10MB \ No newline at end of file diff --git a/main.py b/main.py index 37b4d69..fd79822 100644 --- a/main.py +++ b/main.py @@ -7,10 +7,10 @@ import colorama from aiogram import Bot, Dispatcher from tgbot.data.config import BOT_TOKEN, scheduler, get_admins +from tgbot.database.db_helper import create_dbx from tgbot.middlewares import register_all_middlwares from tgbot.routers import register_all_routers -from tgbot.services.api_session import RequestSession -from tgbot.services.api_sqlite import create_dbx +from tgbot.services.api_session import AsyncRequestSession from tgbot.utils.misc.bot_commands import set_commands from tgbot.utils.misc.bot_logging import bot_logger from tgbot.utils.misc_functions import autobackup_admin, startup_notify @@ -28,7 +28,7 @@ async def scheduler_start(bot): async def main(): scheduler.start() # Запуск Шедулера dp = Dispatcher() # Образ Диспетчера - rSession = RequestSession() # Пул асинхронной сессии запросов + arSession = AsyncRequestSession() # Пул асинхронной сессии запросов bot = Bot(token=BOT_TOKEN, parse_mode="HTML") # Образ Бота register_all_middlwares(dp) # Регистрация всех мидлварей @@ -52,10 +52,10 @@ async def main(): await dp.start_polling( bot, allowed_updates=dp.resolve_used_update_types(), - rSession=rSession, + arSession=arSession, ) finally: - await rSession.close() + await arSession.close() await bot.session.close() diff --git a/requirements.txt b/requirements.txt index 7018df4..9e5b4f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,10 @@ APScheduler~=3.9.1 -aiogram~=3.0.0 +aiogram~=3.2.0 colorlog~=6.7.0 pytz~=2022.6 typing~=3.7.4.3 -aiohttp~=3.8.5 +aiohttp~=3.9.1 cachetools~=4.2.4 -colorama~=0.4.5 \ No newline at end of file +colorama~=0.4.5 +aiofiles~=23.2.1 +pydantic~=2.5.2 \ No newline at end of file diff --git a/tgbot/database/__init__.py b/tgbot/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tgbot/database/db_helper.py b/tgbot/database/db_helper.py new file mode 100644 index 0000000..f8c0620 --- /dev/null +++ b/tgbot/database/db_helper.py @@ -0,0 +1,88 @@ +# - *- coding: utf- 8 - *- +import sqlite3 + +from tgbot.data.config import PATH_DATABASE +from tgbot.utils.const_functions import ded + + +# Преобразование полученного списка в словарь +def dict_factory(cursor, row) -> dict: + save_dict = {} + + for idx, col in enumerate(cursor.description): + save_dict[col[0]] = row[idx] + + return save_dict + + +# Форматирование запроса без аргументов +def update_format(sql, parameters: dict) -> tuple[str, list]: + values = ", ".join([ + f"{item} = ?" for item in parameters + ]) + sql += f" {values}" + + return sql, list(parameters.values()) + + +# Форматирование запроса с аргументами +def update_format_where(sql, parameters: dict) -> tuple[str, list]: + sql += " WHERE " + + sql += " AND ".join([ + f"{item} = ?" for item in parameters + ]) + + return sql, list(parameters.values()) + + +################################################################################ +# Создание всех таблиц для БД +def create_dbx(): + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + + ############################################################ + # Создание таблицы с хранением - пользователей + if len(con.execute("PRAGMA table_info(storage_users)").fetchall()) == 7: + print("DB was found(1/2)") + else: + con.execute( + ded(f""" + CREATE TABLE storage_users( + increment INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER, + user_login TEXT, + user_name TEXT, + user_surname TEXT, + user_fullname TEXT, + user_unix INTEGER + ) + """) + ) + print("DB was not found(1/2) | Creating...") + + # Создание таблицы с хранением - настроек + if len(con.execute("PRAGMA table_info(storage_settings)").fetchall()) == 1: + print("DB was found(2/2)") + else: + con.execute( + ded(f""" + CREATE TABLE storage_settings( + status_work TEXT + ) + """) + ) + + con.execute( + ded(f""" + INSERT INTO storage_settings( + status_work + ) + VALUES (?) + """), + [ + 'True', + ] + ) + print("DB was not found(2/2) | Creating...") diff --git a/tgbot/database/db_settings.py b/tgbot/database/db_settings.py new file mode 100644 index 0000000..293344b --- /dev/null +++ b/tgbot/database/db_settings.py @@ -0,0 +1,36 @@ +# - *- coding: utf- 8 - *- +import sqlite3 + +from pydantic import BaseModel + +from tgbot.data.config import PATH_DATABASE +from tgbot.database.db_helper import dict_factory, update_format + + +# Модель таблицы +class SettingsModel(BaseModel): + status_work: str + + +# Работа с настройками +class Settingsx: + storage_name = "storage_settings" + + # Получение записи + @staticmethod + def get() -> SettingsModel: + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"SELECT * FROM {Settingsx.storage_name}" + + return SettingsModel(**con.execute(sql).fetchone()) + + # Редактирование записи + @staticmethod + def update(**kwargs): + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"UPDATE {Settingsx.storage_name} SET" + sql, parameters = update_format(sql, kwargs) + + con.execute(sql, parameters) diff --git a/tgbot/database/db_users.py b/tgbot/database/db_users.py new file mode 100644 index 0000000..123540d --- /dev/null +++ b/tgbot/database/db_users.py @@ -0,0 +1,133 @@ +# - *- coding: utf- 8 - *- +import sqlite3 + +from pydantic import BaseModel + +from tgbot.data.config import PATH_DATABASE +from tgbot.database.db_helper import dict_factory, update_format_where, update_format +from tgbot.utils.const_functions import get_unix, ded + + +# Модель таблицы +class UserModel(BaseModel): + increment: int + user_id: int + user_login: str + user_name: str + user_surname: str + user_fullname: str + user_unix: int + + +# Работа с юзером +class Userx: + storage_name = "storage_users" + + # Добавление записи + @staticmethod + def add( + user_id: int, + user_login: str, + user_name: str, + user_surname: str, + user_fullname: str, + ): + user_unix = get_unix() + + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + + con.execute( + ded(f""" + INSERT INTO {Userx.storage_name} ( + user_id, + user_login, + user_name, + user_surname, + user_fullname, + user_unix + ) VALUES (?, ?, ?, ?, ?, ?) + """), + [ + user_id, + user_login, + user_name, + user_surname, + user_fullname, + user_unix, + ], + ) + + # Получение записи + @staticmethod + def get(**kwargs) -> UserModel: + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"SELECT * FROM {Userx.storage_name}" + sql, parameters = update_format_where(sql, kwargs) + + response = con.execute(sql, parameters).fetchone() + + if response is not None: + response = UserModel(**response) + + return response + + # Получение записей + @staticmethod + def gets(**kwargs) -> list[UserModel]: + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"SELECT * FROM {Userx.storage_name}" + sql, parameters = update_format_where(sql, kwargs) + + response = con.execute(sql, parameters).fetchall() + + if len(response) >= 1: + response = [UserModel(**cache_object) for cache_object in response] + + return response + + # Получение всех записей + @staticmethod + def get_all() -> list[UserModel]: + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"SELECT * FROM {Userx.storage_name}" + + response = con.execute(sql).fetchall() + + if len(response) >= 1: + response = [UserModel(**cache_object) for cache_object in response] + + return response + + # Редактирование записи + @staticmethod + def update(user_id, **kwargs): + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"UPDATE {Userx.storage_name} SET" + sql, parameters = update_format(sql, kwargs) + parameters.append(user_id) + + con.execute(sql + "WHERE user_id = ?", parameters) + + # Удаление записи + @staticmethod + def delete(**kwargs): + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"DELETE FROM {Userx.storage_name}" + sql, parameters = update_format_where(sql, kwargs) + + con.execute(sql, parameters) + + # Очистка всех записей + @staticmethod + def clear(): + with sqlite3.connect(PATH_DATABASE) as con: + con.row_factory = dict_factory + sql = f"DELETE FROM {Userx.storage_name}" + + con.execute(sql) diff --git a/tgbot/middlewares/__init__.py b/tgbot/middlewares/__init__.py index 636f5ae..7602a1d 100644 --- a/tgbot/middlewares/__init__.py +++ b/tgbot/middlewares/__init__.py @@ -1,8 +1,8 @@ # - *- coding: utf- 8 - *- from aiogram import Dispatcher -from tgbot.middlewares.exists_user import ExistsUserMiddleware -from tgbot.middlewares.throttling import ThrottlingMiddleware +from tgbot.middlewares.middleware_user import ExistsUserMiddleware +from tgbot.middlewares.middleware_throttling import ThrottlingMiddleware # Регистрация всех миддлварей diff --git a/tgbot/middlewares/throttling.py b/tgbot/middlewares/middleware_throttling.py similarity index 96% rename from tgbot/middlewares/throttling.py rename to tgbot/middlewares/middleware_throttling.py index eff89da..4aa814a 100644 --- a/tgbot/middlewares/throttling.py +++ b/tgbot/middlewares/middleware_throttling.py @@ -21,6 +21,9 @@ class ThrottlingMiddleware(BaseMiddleware): if get_flag(data, "rate") is not None: self.default_rate = get_flag(data, "rate") + if self.default_rate == 0: + return await handler(event, data) + if this_user.id not in self.users: self.users[this_user.id] = { 'last_throttled': int(time.time()), diff --git a/tgbot/middlewares/exists_user.py b/tgbot/middlewares/middleware_user.py similarity index 61% rename from tgbot/middlewares/exists_user.py rename to tgbot/middlewares/middleware_user.py index 27d7abd..ad10d25 100644 --- a/tgbot/middlewares/exists_user.py +++ b/tgbot/middlewares/middleware_user.py @@ -1,7 +1,7 @@ # - *- coding: utf- 8 - *- from aiogram import BaseMiddleware -from tgbot.services.api_sqlite import get_userx, add_userx, update_userx +from tgbot.database.db_users import Userx from tgbot.utils.const_functions import clear_html @@ -11,7 +11,7 @@ class ExistsUserMiddleware(BaseMiddleware): this_user = data.get("event_from_user") if not this_user.is_bot: - get_user = get_userx(user_id=this_user.id) + get_user = Userx.get(user_id=this_user.id) user_id = this_user.id user_login = this_user.username @@ -29,20 +29,20 @@ class ExistsUserMiddleware(BaseMiddleware): if len(user_surname) >= 1: user_fullname += f" {user_surname}" if get_user is None: - add_userx(user_id, user_login.lower(), user_name, user_surname, user_fullname) + Userx.add(user_id, user_login.lower(), user_name, user_surname, user_fullname) else: - if user_name != get_user['user_name']: - update_userx(get_user['user_id'], user_name=user_name) + if user_name != get_user.user_name: + Userx.update(get_user.user_id, user_name=user_name) - if user_surname != get_user['user_surname']: - update_userx(get_user['user_id'], user_surname=user_surname) + if user_surname != get_user.user_surname: + Userx.update(get_user.user_id, user_surname=user_surname) - if user_fullname != get_user['user_fullname']: - update_userx(get_user['user_id'], user_fullname=user_fullname) + if user_fullname != get_user.user_fullname: + Userx.update(get_user.user_id, user_fullname=user_fullname) - if user_login.lower() != get_user['user_login']: - update_userx(get_user['user_id'], user_login=user_login.lower()) + if user_login.lower() != get_user.user_login: + Userx.update(get_user.user_id, user_login=user_login.lower()) - data['my_user'] = get_userx(user_id=user_id) + data['User'] = Userx.get(user_id=user_id) return await handler(event, data) diff --git a/tgbot/routers/admin/admin_menu.py b/tgbot/routers/admin/admin_menu.py index 8f9f7db..3d995f8 100644 --- a/tgbot/routers/admin/admin_menu.py +++ b/tgbot/routers/admin/admin_menu.py @@ -1,20 +1,25 @@ # - *- coding: utf- 8 - *- +import os + +import aiofiles from aiogram import Router, Bot, F from aiogram.filters import Command from aiogram.types import FSInputFile, Message, CallbackQuery +from aiogram.utils.media_group import MediaGroupBuilder from tgbot.data.config import PATH_DATABASE, PATH_LOGS +from tgbot.database.db_users import UserModel from tgbot.keyboards.inline_misc import admin_inl from tgbot.keyboards.reply_misc import admin_rep from tgbot.utils.const_functions import get_date -from tgbot.utils.misc.bot_models import FSM, RS +from tgbot.utils.misc.bot_models import FSM, ARS router = Router(name=__name__) # Кнопка - Admin Inline @router.message(F.text == 'Admin Inline') -async def admin_button_inline(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def admin_button_inline(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() await message.answer("Click Button - Admin Inline", reply_markup=admin_inl) @@ -22,7 +27,7 @@ async def admin_button_inline(message: Message, bot: Bot, state: FSM, rSession: # Кнопка - Admin Reply @router.message(F.text == 'Admin Reply') -async def admin_button_reply(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def admin_button_reply(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() await message.answer("Click Button - Admin Reply", reply_markup=admin_rep) @@ -30,13 +35,13 @@ async def admin_button_reply(message: Message, bot: Bot, state: FSM, rSession: R # Колбэк - Admin X @router.callback_query(F.data == 'admin_inline_x') -async def admin_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, rSession: RS, my_user): +async def admin_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await call.answer(f"Click Admin X") # Колбэк - Admin @router.callback_query(F.data.startswith('admin_inline:')) -async def admin_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, rSession: RS, my_user): +async def admin_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS, User: UserModel): get_data = call.data.split(":")[1] await call.answer(f"Click Admin - {get_data}", True) @@ -44,34 +49,51 @@ async def admin_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, rSess # Получение Базы Данных @router.message(Command(commands=['db', 'database'])) -async def admin_database(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def admin_database(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() await message.answer_document( FSInputFile(PATH_DATABASE), - caption=f"📦 BACKUP\n" - f"🕰 {get_date()}", + caption=f"📦 #BACKUP | {get_date(full=False)}", ) # Получение логов @router.message(Command(commands=['log', 'logs'])) -async def admin_log(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def admin_log(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() - await message.answer_document( - FSInputFile(PATH_LOGS), - caption=f"🖨 LOGS\n" - f"🕰 {get_date()}", + media_group = MediaGroupBuilder( + caption=f"🖨 #LOGS | {get_date(full=False)}", ) + if os.path.isfile(PATH_LOGS): + media_group.add_document(media=FSInputFile(PATH_LOGS)) + + if os.path.isfile("tgbot/data/sv_log_err.log"): + media_group.add_document(media=FSInputFile("tgbot/data/sv_log_err.log")) + + if os.path.isfile("tgbot/data/sv_log_out.log"): + media_group.add_document(media=FSInputFile("tgbot/data/sv_log_out.log")) + + await message.answer_media_group(media=media_group.build()) + # Очистить логи @router.message(Command(commands=['clear_log', 'clear_logs', 'log_clear', 'logs_clear'])) -async def admin_logs_clear(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def admin_logs_clear(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() - with open(PATH_LOGS, "w") as file: - file.write(f"{get_date()} | LOGS WAS CLEAR") + if os.path.isfile(PATH_LOGS): + async with aiofiles.open(PATH_LOGS, "w") as file: + await file.write(f"{get_date()} | LOGS WAS CLEAR") - await message.answer("🖨 Логи были успешно очищены") + if os.path.isfile("tgbot/data/sv_log_err.log"): + async with aiofiles.open("tgbot/data/sv_log_err.log", "w") as file: + await file.write(f"{get_date()} | LOGS WAS CLEAR") + + if os.path.isfile("tgbot/data/sv_log_out.log"): + async with aiofiles.open("tgbot/data/sv_log_out.log", "w") as file: + await file.write(f"{get_date()} | LOGS WAS CLEAR") + + await message.answer("🖨 The logs have been cleared") diff --git a/tgbot/routers/main_errors.py b/tgbot/routers/main_errors.py index a94cbac..556365a 100644 --- a/tgbot/routers/main_errors.py +++ b/tgbot/routers/main_errors.py @@ -1,7 +1,6 @@ # - *- coding: utf- 8 - *- from aiogram import Router -from aiogram.exceptions import TelegramForbiddenError -from aiogram.filters import ExceptionTypeFilter, ExceptionMessageFilter +from aiogram.filters import ExceptionMessageFilter from aiogram.handlers import ErrorHandler from tgbot.utils.misc.bot_logging import bot_logger @@ -10,10 +9,10 @@ router = Router(name=__name__) # Ошибка с блокировкой бота пользователем -@router.errors(ExceptionTypeFilter(TelegramForbiddenError)) -class MyHandler(ErrorHandler): - async def handle(self): - pass +# @router.errors(ExceptionTypeFilter(TelegramForbiddenError)) +# class MyHandler(ErrorHandler): +# async def handle(self): +# pass # Ошибка с редактированием одинакового сообщения diff --git a/tgbot/routers/main_missed.py b/tgbot/routers/main_missed.py index a489deb..d371b1a 100644 --- a/tgbot/routers/main_missed.py +++ b/tgbot/routers/main_missed.py @@ -2,33 +2,34 @@ from aiogram import Router, Bot, F from aiogram.types import CallbackQuery, Message +from tgbot.database.db_users import UserModel from tgbot.utils.const_functions import del_message -from tgbot.utils.misc.bot_models import FSM, RS +from tgbot.utils.misc.bot_models import FSM, ARS router = Router(name=__name__) # Колбэк с удалением сообщения @router.callback_query(F.data == 'close_this') -async def main_callback_close(call: CallbackQuery, bot: Bot, state: FSM, rSession: RS, my_user): +async def main_callback_close(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await del_message(call.message) # Колбэк с обработкой кнопки @router.callback_query(F.data == '...') -async def main_callback_answer(call: CallbackQuery, bot: Bot, state: FSM, rSession: RS, my_user): +async def main_callback_answer(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await call.answer(cache_time=30) # Колбэк с обработкой удаления сообщений потерявших стейт @router.callback_query() -async def main_callback_missed(call: CallbackQuery, bot: Bot, state: FSM, rSession: RS, my_user): +async def main_callback_missed(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await call.answer(f"❗️ Miss callback: {call.data}", True) # Обработка всех неизвестных команд @router.message() -async def main_message_missed(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def main_message_missed(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await message.answer( "♦️ Unknown command.\n" "♦️ Enter /start", diff --git a/tgbot/routers/main_start.py b/tgbot/routers/main_start.py index 06bd89e..f464fb0 100644 --- a/tgbot/routers/main_start.py +++ b/tgbot/routers/main_start.py @@ -3,9 +3,10 @@ from aiogram import Router, Bot, F from aiogram.filters import Command from aiogram.types import Message +from tgbot.database.db_users import UserModel from tgbot.keyboards.reply_main import menu_frep from tgbot.utils.const_functions import ded -from tgbot.utils.misc.bot_models import FSM, RS +from tgbot.utils.misc.bot_models import FSM, ARS router = Router(name=__name__) @@ -13,12 +14,12 @@ router = Router(name=__name__) # Открытие главного меню @router.message(F.text.in_(('🔙 Main menu', '🔙 Return'))) @router.message(Command(commands=['start'])) -async def main_start(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def main_start(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() await message.answer( ded(f""" - 🔸 Hello, {my_user['user_name']} + 🔸 Hello, {User.user_name} 🔸 Enter /start or /inline """), reply_markup=menu_frep(message.from_user.id), diff --git a/tgbot/routers/user/user_menu.py b/tgbot/routers/user/user_menu.py index da141af..a3bc976 100644 --- a/tgbot/routers/user/user_menu.py +++ b/tgbot/routers/user/user_menu.py @@ -3,17 +3,18 @@ from aiogram import Router, Bot, F from aiogram.filters import Command from aiogram.types import Message, CallbackQuery +from tgbot.database.db_users import UserModel from tgbot.keyboards.inline_main import menu_finl from tgbot.keyboards.inline_misc import user_inl from tgbot.keyboards.reply_misc import user_rep -from tgbot.utils.misc.bot_models import FSM, RS +from tgbot.utils.misc.bot_models import FSM, ARS router = Router(name=__name__) # Кнопка - User Inline @router.message(F.text == 'User Inline') -async def user_button_inline(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def user_button_inline(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() await message.answer( @@ -24,7 +25,7 @@ async def user_button_inline(message: Message, bot: Bot, state: FSM, rSession: R # Кнопка - User Reply @router.message(F.text == 'User Reply') -async def user_button_reply(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def user_button_reply(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() await message.answer( @@ -35,7 +36,7 @@ async def user_button_reply(message: Message, bot: Bot, state: FSM, rSession: RS # Команда - /inline @router.message(Command(commands="inline")) -async def user_command_inline(message: Message, bot: Bot, state: FSM, rSession: RS, my_user): +async def user_command_inline(message: Message, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await state.clear() await message.answer( @@ -46,13 +47,13 @@ async def user_command_inline(message: Message, bot: Bot, state: FSM, rSession: # Колбэк - User X @router.callback_query(F.data == 'user_inline_x') -async def user_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, rSession: RS, my_user): +async def user_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS, User: UserModel): await call.answer(f"Click User X") # Колбэк - User @router.callback_query(F.data.startswith('user_inline:')) -async def user_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, rSession: RS, my_user): +async def user_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS, User: UserModel): get_data = call.data.split(":")[1] await call.answer(f"Click User - {get_data}", True) diff --git a/tgbot/services/api_session.py b/tgbot/services/api_session.py index 5a2a2f6..738917b 100644 --- a/tgbot/services/api_session.py +++ b/tgbot/services/api_session.py @@ -5,12 +5,12 @@ import aiohttp # In handler -# session = await rSession.get_session() +# session = await arSession.get_session() # response = await session.get(...) # response = await session.post(...) # Асинхронная сессия для запросов -class RequestSession: +class AsyncRequestSession: def __init__(self) -> None: self._session: Optional[aiohttp.ClientSession] = None diff --git a/tgbot/services/api_sqlite.py b/tgbot/services/api_sqlite.py deleted file mode 100644 index f150b01..0000000 --- a/tgbot/services/api_sqlite.py +++ /dev/null @@ -1,124 +0,0 @@ -# - *- coding: utf- 8 - *- -import sqlite3 - -from tgbot.data.config import PATH_DATABASE -from tgbot.utils.const_functions import get_unix - - -# Преобразование БД словаря -def dict_factory(cursor, row) -> dict: - this_dict = {} - - for idx, col in enumerate(cursor.description): - this_dict[col[0]] = row[idx] - - return this_dict - - -################################################################################ -########################### ФОРМАТИРОВАНИЕ ЗАПРОСОВ ############################ -# Форматирование запроса без аргументов -def update_format(sql, parameters: dict) -> tuple[str, list]: - values = ", ".join([ - f"{item} = ?" for item in parameters - ]) - sql += f" {values}" - - return sql, list(parameters.values()) - - -# Форматирование запроса с аргументами -def update_format_args(sql, parameters: dict) -> tuple[str, list]: - sql += " WHERE " - - sql += " AND ".join([ - f"{item} = ?" for item in parameters - ]) - - return sql, list(parameters.values()) - - -############################# ЗАПРОСЫ К БАЗЕ ДАННЫХ ############################ -################################################################################ -# Добавление пользователя -def add_userx(user_id, user_login, user_name, user_surname, user_fullname): - with sqlite3.connect(PATH_DATABASE) as con: - con.row_factory = dict_factory - con.execute( - "INSERT INTO storage_users " - "(user_id, user_login, user_name, user_surname, user_fullname, user_unix) " - "VALUES (?, ?, ?, ?, ?, ?)", - [user_id, user_login, user_name, user_surname, user_fullname, get_unix()], - ) - - -# Получение пользователя -def get_userx(**kwargs): - with sqlite3.connect(PATH_DATABASE) as con: - con.row_factory = dict_factory - sql = "SELECT * FROM storage_users" - sql, parameters = update_format_args(sql, kwargs) - - return con.execute(sql, parameters).fetchone() - - -# Получение пользователей -def get_usersx(**kwargs) -> list[dict]: - with sqlite3.connect(PATH_DATABASE) as con: - con.row_factory = dict_factory - sql = "SELECT * FROM storage_users" - sql, parameters = update_format_args(sql, kwargs) - - return con.execute(sql, parameters).fetchall() - - -# Получение всех пользователей -def get_all_usersx() -> list[dict]: - with sqlite3.connect(PATH_DATABASE) as con: - con.row_factory = dict_factory - sql = "SELECT * FROM storage_users" - - return con.execute(sql).fetchall() - - -# Редактирование пользователя -def update_userx(user_id, **kwargs): - with sqlite3.connect(PATH_DATABASE) as con: - con.row_factory = dict_factory - sql = f"UPDATE storage_users SET" - sql, parameters = update_format(sql, kwargs) - parameters.append(user_id) - con.execute(sql + "WHERE user_id = ?", parameters) - - -# Удаление пользователя -def delete_userx(**kwargs): - with sqlite3.connect(PATH_DATABASE) as con: - con.row_factory = dict_factory - sql = "DELETE FROM storage_users" - sql, parameters = update_format_args(sql, kwargs) - con.execute(sql, parameters) - - -############################## СОЗДАНИЕ БАЗЫ ДАННЫХ ############################ -# Создание всех таблиц для Базы Данных -def create_dbx(): - with sqlite3.connect(PATH_DATABASE) as con: - con.row_factory = dict_factory - - # Таблица с хранением пользователей - if len(con.execute("PRAGMA table_info(storage_users)").fetchall()) == 7: - print("DB was found(1/1)") - else: - con.execute( - "CREATE TABLE storage_users(" - "increment INTEGER PRIMARY KEY AUTOINCREMENT, " - "user_id INTEGER," - "user_login TEXT," - "user_name TEXT," - "user_surname TEXT," - "user_fullname TEXT," - "user_unix INTEGER" - ")" - ) - print("DB was not found(1/1) | Creating...") diff --git a/tgbot/utils/misc/bot_models.py b/tgbot/utils/misc/bot_models.py index a91bbba..0e726de 100644 --- a/tgbot/utils/misc/bot_models.py +++ b/tgbot/utils/misc/bot_models.py @@ -1,7 +1,7 @@ # - *- coding: utf- 8 - *- from aiogram.fsm.context import FSMContext -from tgbot.services.api_session import RequestSession +from tgbot.services.api_session import AsyncRequestSession FSM = FSMContext -RS = RequestSession +ARS = AsyncRequestSession