Parse project fields from the message

This commit is contained in:
LoRiot 2022-10-16 22:57:44 +03:00
parent 781d3c04ef
commit 7376de2d13
2 changed files with 68 additions and 1 deletions

5
bot.py
View file

@ -4,10 +4,12 @@ import os
import asyncio import asyncio
from aiogram import Bot, Dispatcher from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import asyncpg import asyncpg
from middlewares.db import DbMiddleware from middlewares.db import DbMiddleware
from handlers.commands import register_command_handlers from handlers.commands import register_command_handlers
from handlers.projects import register_projects_handlers
async def main(): async def main():
@ -19,10 +21,11 @@ async def main():
pool = await asyncpg.create_pool(DB_URL) pool = await asyncpg.create_pool(DB_URL)
bot = Bot(API_TOKEN) bot = Bot(API_TOKEN)
dp = Dispatcher(bot) dp = Dispatcher(bot, storage=MemoryStorage())
# Register handlers # Register handlers
register_command_handlers(dp) register_command_handlers(dp)
register_projects_handlers(dp)
# Register middlewares # Register middlewares
dp.middleware.setup(DbMiddleware(pool)) dp.middleware.setup(DbMiddleware(pool))

64
handlers/projects.py Normal file
View file

@ -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
)