Add new table and middleware

This commit is contained in:
Zakhar Izmaylov
2024-11-17 14:05:31 +03:00
parent 7c93c8cc31
commit 69f880af2b
3 changed files with 91 additions and 0 deletions
+4
View File
@@ -2,6 +2,7 @@ from aiogram import Bot, Dispatcher, Router
from aiogram.fsm.storage.memory import MemoryStorage
from config import API_TOKEN, CRYPTO_BOT_ENABLE, FREEKASSA_ENABLE, ROBOKASSA_ENABLE, STARS_ENABLE, YOOKASSA_ENABLE
from middlewares.user import UserMiddleware
from middlewares.admin import AdminMiddleware
from middlewares.database import DatabaseMiddleware
from middlewares.logging import LoggingMiddleware
@@ -51,3 +52,6 @@ dp.callback_query.middleware(DatabaseMiddleware())
dp.message.middleware(AdminMiddleware())
dp.callback_query.middleware(AdminMiddleware())
dp.message.middleware(UserMiddleware())
dp.callback_query.middleware(UserMiddleware())
+59
View File
@@ -9,6 +9,22 @@ from logger import logger
async def init_db():
conn = await asyncpg.connect(DATABASE_URL)
# Таблица для хранения основной информации о пользователях из Telegram
await conn.execute(
"""
CREATE TABLE IF NOT EXISTS users (
tg_id BIGINT PRIMARY KEY NOT NULL,
username TEXT,
first_name TEXT,
last_name TEXT,
language_code TEXT,
is_bot BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
)
"""
)
# Таблица для хранения информации о пользователях
await conn.execute(
"""
@@ -420,3 +436,46 @@ async def get_tg_id_by_client_id(client_id: str):
return result["tg_id"] if result else None
finally:
await conn.close()
async def upsert_user(tg_id: int, username: str = None, first_name: str = None, last_name: str = None, language_code: str = None, is_bot: bool = False):
"""
Создает или обновляет информацию о пользователе в базе данных.
Args:
tg_id (int): Уникальный идентификатор пользователя в Telegram
username (str, optional): Никнейм пользователя
first_name (str, optional): Имя пользователя
last_name (str, optional): Фамилия пользователя
language_code (str, optional): Код языка пользователя
is_bot (bool, optional): Флаг, указывающий является ли пользователь ботом
"""
conn = await asyncpg.connect(DATABASE_URL)
try:
await conn.execute(
"""
INSERT INTO users (tg_id, username, first_name, last_name, language_code, is_bot, created_at, updated_at)
VALUES ($1, $2, $3, $4, $5, $6, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
ON CONFLICT (tg_id) DO UPDATE
SET
username = COALESCE(EXCLUDED.username, users.username),
first_name = COALESCE(EXCLUDED.first_name, users.first_name),
last_name = COALESCE(EXCLUDED.last_name, users.last_name),
language_code = COALESCE(EXCLUDED.language_code, users.language_code),
is_bot = EXCLUDED.is_bot,
updated_at = CURRENT_TIMESTAMP
""",
tg_id, username, first_name, last_name, language_code, is_bot
)
# Создаем запись в connections, если ее еще нет
await conn.execute(
"""
INSERT INTO connections (tg_id, balance, trial)
VALUES ($1, 0.0, 0)
ON CONFLICT (tg_id) DO NOTHING
""",
tg_id
)
finally:
await conn.close()
+28
View File
@@ -0,0 +1,28 @@
from typing import Any, Awaitable, Callable, Dict
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject, User
from database import upsert_user
class UserMiddleware(BaseMiddleware):
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any],
) -> Any:
user: User = data.get("event_from_user")
if user:
await upsert_user(
tg_id=user.id,
username=user.username,
first_name=user.first_name,
last_name=user.last_name,
language_code=user.language_code,
is_bot=user.is_bot
)
return await handler(event, data)