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