make_events.py 5.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from aiogram import types, Dispatcher
  2. from bot import database, sql
  3. from bot.keyboards import register_kb, make_calendar, events_kb, cancel_booking, main_kb
  4. from bot.functions import make_date, time_validator, split_time, to_quotes
  5. from handlers.user.states import BookingState
  6. from aiogram.dispatcher.storage import FSMContext
  7. async def make_event(message: types.message):
  8. db = database.Database()
  9. if not db.sql_fetchone(f"select tg_id from user_table where tg_id ={message.from_user.id}") or \
  10. not db.sql_fetchone(f"select approved from user_table where tg_id={message.from_user.id}"):
  11. await message.delete()
  12. await message.answer("Команды станут доступны после регистрации", reply_markup=register_kb)
  13. else:
  14. if message.text == "🎯 Запланировать мероприятие":
  15. await message.delete()
  16. # TODO: Добавить переход на следующий месяц
  17. await message.answer(f"выберите дату чтобы увидеть список мероприятий\n\n"
  18. f"Так же календарь мероприятий можно посмотреть в "
  19. f"<a href=moodle.tomtit.tomsk.ru>Moodle</a>\n\n"
  20. f"Сегодняшняя дата <b>{make_date()}</b>", reply_markup=make_calendar())
  21. async def select_date(call: types.CallbackQuery, state: FSMContext):
  22. db = database.Database()
  23. print(call.data)
  24. date = call.data.split("_")[1]
  25. booked = db.sql_fetchall(f"select events_table.e_start, events_table.e_end from events_table WHERE e_date = {to_quotes(date)}")
  26. await BookingState.start.set()
  27. await state.update_data(date=to_quotes(date))
  28. await state.update_data(owner=call.from_user.id)
  29. if len(booked) == 0:
  30. await call.message.edit_text("На этот день мероприятий не заплпнированно", reply_markup=events_kb())
  31. else:
  32. await call.message.edit_text(sorted(booked, key=lambda t: t['e_start'], reverse=True), reply_markup=events_kb())
  33. async def edit_date(call: types.CallbackQuery, state: FSMContext):
  34. await call.message.edit_text(f"выберите дату чтобы увидеть список мероприятий\n\n"
  35. f"Так же календарь мероприятий можно посмотреть в "
  36. f"<a href=moodle.tomtit.tomsk.ru>Moodle</a>\n\n"
  37. f"Сегодняшняя дата <b>{make_date()}</b>", reply_markup=make_calendar())
  38. print("Отменено")
  39. await state.finish()
  40. async def booking_date(call: types.CallbackQuery):
  41. await call.message.edit_text("Введите диапазон времени\n"
  42. "Возможные форматы\n"
  43. "13.00 15.30\n"
  44. "13.00-15.30\n"
  45. "13:00 15:30\n"
  46. "13.00-15.30\n", reply_markup=cancel_booking())
  47. # TODO: парсер времени
  48. # TODO: Проверка на занятость
  49. await BookingState.time.set()
  50. async def get_date(message: types.Message, state: FSMContext):
  51. if time_validator(message.text):
  52. time = split_time(message.text)
  53. await state.update_data(t_start=time[0])
  54. await state.update_data(t_end=time[1])
  55. await message.answer("Введите краткое описание мероприятия", reply_markup=cancel_booking())
  56. await BookingState.description.set()
  57. else:
  58. await message.answer("Неверный формат времени")
  59. # TODO: огран по длине текста
  60. async def send_event(message: types.Message, state: FSMContext):
  61. db = database.Database()
  62. await state.update_data(description=message.text)
  63. await state.update_data(approved=0)
  64. data = await state.get_data()
  65. await message.answer("Заявка принята", reply_markup=main_kb)
  66. await state.finish()
  67. # await message.answer(data)
  68. db.sql_query_send(sql.sql_send_event(data))
  69. def events_register(dp: Dispatcher):
  70. dp.register_message_handler(make_event, text="🎯 Запланировать мероприятие")
  71. dp.register_callback_query_handler(select_date, text_startswith='date_')
  72. dp.register_callback_query_handler(edit_date, text=['change', 'cancel_booking'], state=[BookingState.start,
  73. BookingState.time,
  74. BookingState.description])
  75. dp.register_callback_query_handler(booking_date, text='booking', state=BookingState.start)
  76. dp.register_message_handler(get_date, state=BookingState.time)
  77. dp.register_message_handler(send_event, state=BookingState.description)