diff --git a/src/app/bot.py b/src/app/bot.py index ca22ee4..c518c16 100644 --- a/src/app/bot.py +++ b/src/app/bot.py @@ -7,6 +7,7 @@ from src.handlers import ( legacy_route, common, + info, create_room, room_admin, wishes, @@ -32,6 +33,7 @@ async def run_bot(token: str) -> None: dp.include_routers( legacy_route.router, common.router, + info.router, wishes.router, room_admin.router, create_room.router, diff --git a/src/db/db.py b/src/db/db.py index ed1abc7..a89f9a7 100644 --- a/src/db/db.py +++ b/src/db/db.py @@ -12,36 +12,7 @@ ROOM_DEFAULT_EXCHANGE_TYPE = "централизованый" -async def start_db(): - cur.execute( - "CREATE TABLE IF NOT EXISTS rooms(" - "room_iden TEXT PRIMARY KEY," - "status BOOLEAN DEFAULT FALSE," - "admin INTEGER," - "gift_price_range TEXT DEFAULT 'не установлен'," - "event_time TEXT DEFAULT 'не установлено'," - "exchange_type TEXT DEFAULT 'централизованый'" - ")" - ) - cur.execute( - "CREATE TABLE IF NOT EXISTS users(tg_id INTEGER PRIMARY KEY,first_name TEXT,last_name TEXT,username TEXT)" - ) - cur.execute( - """ - CREATE TABLE IF NOT EXISTS user_rooms( - tg_id INTEGER, - room_iden TEXT, - is_member BOOLEAN DEFAULT FALSE, - is_admin BOOLEAN DEFAULT FALSE, - PRIMARY KEY (tg_id, room_iden) - ) - """ - ) - await migrate_rooms_table() - db.commit() - - -async def create_room(room_name, user_id): +def is_valid_name(name) -> bool: disvalid = [ "_saint", "_mem", @@ -76,11 +47,41 @@ async def create_room(room_name, user_id): "{", "}", ] - if ( - all([a not in room_name for a in disvalid]) - and room_name[0] not in "0123456789" - and len(room_name) <= 30 - ): + return True if ( + all([a not in name for a in disvalid]) and name[0] not in "0123456789" and len(name) <= 30) else False + + +async def start_db(): + cur.execute( + "CREATE TABLE IF NOT EXISTS rooms(" + "room_iden TEXT PRIMARY KEY," + "status BOOLEAN DEFAULT FALSE," + "admin INTEGER," + "gift_price_range TEXT DEFAULT 'не установлен'," + "event_time TEXT DEFAULT 'не установлено'," + "exchange_type TEXT DEFAULT 'централизованый'" + ")" + ) + cur.execute( + "CREATE TABLE IF NOT EXISTS users(tg_id INTEGER PRIMARY KEY,first_name TEXT,last_name TEXT,username TEXT)" + ) + cur.execute( + """ + CREATE TABLE IF NOT EXISTS user_rooms( + tg_id INTEGER, + room_iden TEXT, + is_member BOOLEAN DEFAULT FALSE, + is_admin BOOLEAN DEFAULT FALSE, + PRIMARY KEY (tg_id, room_iden) + ) + """ + ) + await migrate_rooms_table() + db.commit() + + +async def create_room(room_name, user_id): + if is_valid_name(room_name): while True: room_id = f"{random.randint(1, 9999):04}" room_iden = f"{room_name}{room_id}" @@ -141,7 +142,7 @@ async def connect2room(raw_data, user_id): _room = cur.execute( "SELECT * FROM rooms WHERE room_iden = ?", (room_iden,) ).fetchone() - if not _room: + if not _room or not is_valid_name(room_name): return "room_error" if _room[1] == True: return "joined late" diff --git a/src/handlers/info.py b/src/handlers/info.py new file mode 100644 index 0000000..0d728ae --- /dev/null +++ b/src/handlers/info.py @@ -0,0 +1,13 @@ +from aiogram import Router +from aiogram.filters import Command +from aiogram.types import Message + +from src.texts import messages + + +router = Router(name=__name__) + + +@router.message(Command("info")) +async def say_about_santa(msg: Message): + await msg.answer(messages.about_santa()) diff --git a/src/texts/messages.py b/src/texts/messages.py index fe2aa43..ab28e5e 100644 --- a/src/texts/messages.py +++ b/src/texts/messages.py @@ -56,7 +56,7 @@ def event_started_before_join(room_name: str) -> str: def gift_target(user_info: str) -> str: - return f"Вы дарите {user_info}" + return f"Вы дарите {user_info}" def left_room() -> str: @@ -170,3 +170,15 @@ def room_not_exists_retry() -> str: def id_info(user_id: int, chat_id: int) -> str: return f"ID: user_id - {user_id}\n chat_id - {chat_id}" + +def about_santa(): + return ( + "🎅 Тайный Санта — игра, в которой каждый участник случайно становится дарителем для кого-то другого. " + "Бот помогает провести обмен анонимно и без лишней организации." + "\n\nКак проходит игра:\n" + "1. Админ создаёт комнату и делится кодом или приглашением.\n" + "2. Участники присоединяются, заполняют пожелания и смотрят настройки: бюджет, дата, тип обмена.\n" + "3. Когда все готовы, админ нажимает «Старт» — бот случайно распределяет пары.\n" + "4. Каждый получает сообщение, кому дарить, а его имя остаётся секретом для остальных." + "\n\nПодготовьте подарок в указанном бюджете и времени, и оставайтесь Тайным Сантой 🎁" + )