diff --git a/bot.py b/bot.py index f9a8a2b..098df59 100644 --- a/bot.py +++ b/bot.py @@ -4,10 +4,12 @@ import os import asyncio from aiogram import Bot, Dispatcher +from aiogram.contrib.fsm_storage.memory import MemoryStorage import asyncpg from middlewares.db import DbMiddleware from handlers.commands import register_command_handlers +from handlers.projects import register_projects_handlers async def main(): @@ -19,10 +21,11 @@ async def main(): pool = await asyncpg.create_pool(DB_URL) bot = Bot(API_TOKEN) - dp = Dispatcher(bot) + dp = Dispatcher(bot, storage=MemoryStorage()) # Register handlers register_command_handlers(dp) + register_projects_handlers(dp) # Register middlewares dp.middleware.setup(DbMiddleware(pool)) diff --git a/handlers/projects.py b/handlers/projects.py new file mode 100644 index 0000000..c9fdcc1 --- /dev/null +++ b/handlers/projects.py @@ -0,0 +1,64 @@ +from loguru import logger +import re + +from aiogram import types, Dispatcher +from aiogram.dispatcher import FSMContext +from aiogram.dispatcher.filters import Text +from asyncpg import BitString + + +from states.project import ProjectStates +from services.repositories import Repos, ProjectRepo + + +async def create_project( + message: types.Message, state: FSMContext +): + await state.set_state(ProjectStates.set_fields) + await message.reply( + "Название проекта: Превращение песиков в котиков\n\n" + "Описание: Наши цели прямы и понятны! Мы хотим написать" + "алгоритм конвертации песиков в котиков.\n\n" + "Создатель: @создатель\n\n" + "Кол-во участников: 2 " + "(пожалуйста напишите число участников не раскрывая личные данные)\n\n" + "Статус: 1 (1 - проект ищет людей, 2 - в работе, " + "3 - проект завершен, 0 - отменен)\n\n" + "Теги: #python\n\n" + "Категория: написание алгоритма" + ) + await message.reply( + "Пожалуйста отправьте анкету вашего проекта по шаблону " + "из сообщения выше (скопируйте сообщение и замените данные)" + ) + + +async def get_project_fields( + message: types.Message, repo: Repos, state: FSMContext +): + # TODO: для тегов и категорий вытаскивать из таблиц индексы, + # значением для creator должен быть user_id. + field_patterns = { + "Название проекта": str, "Описание": str, "Кол-во участников": int, + "Статус": BitString + } + field_values = [] + + for pattern, field_type in field_patterns.items(): + try: + field_values.append( + field_type(re.findall(rf"(?<={pattern}: ).*", message.text)[0]) + ) + except IndexError: + pass + + logger.debug(field_values) + await state.reset_state() + await repo.get_repo(ProjectRepo).add(*field_values) + + +def register_projects_handlers(dp: Dispatcher): + dp.register_message_handler(create_project, Text("Создать проект")) + dp.register_message_handler( + get_project_fields, state=ProjectStates.set_fields + )