Parse project fields from the message
This commit is contained in:
parent
781d3c04ef
commit
7376de2d13
5
bot.py
5
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))
|
||||
|
|
64
handlers/projects.py
Normal file
64
handlers/projects.py
Normal 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
|
||||
)
|
Reference in a new issue