make_events.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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, normalize_time, to_quotes, check_overlap
  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. date = call.data.split("_")[1]
  24. booked = db.sql_fetchall(
  25. 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(f"Вы выбрали дату: {date}\n"
  31. f"На этот день мероприятий не заплпнированно", reply_markup=events_kb())
  32. else:
  33. await call.message.edit_text(sorted(booked, key=lambda t: t['e_start'], reverse=True), reply_markup=events_kb())
  34. async def edit_date(call: types.CallbackQuery, state: FSMContext):
  35. await call.message.edit_text(f"выберите дату чтобы увидеть список мероприятий\n\n"
  36. f"Так же календарь мероприятий можно посмотреть в "
  37. f"<a href=moodle.tomtit-tomsk.ru>Moodle</a>\n\n"
  38. f"Сегодняшняя дата <b>{make_date()}</b>", reply_markup=make_calendar())
  39. await state.finish()
  40. async def booking_date(call: types.CallbackQuery):
  41. await call.message.edit_text("Введите диапазон времени\n"
  42. "Возможные форматы\n\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. await BookingState.time.set()
  48. async def get_date(message: types.Message, state: FSMContext):
  49. # Парсим то что ввел пользователь
  50. time = normalize_time(message.text)
  51. # Забираем текущую дату
  52. date = await state.get_data()
  53. # Проверяем валидность времени
  54. if time_validator(message.text):
  55. # Проверяем пересечения
  56. if not check_overlap(time[0], time[1], date['date']):
  57. await message.answer("Указанное время пеерсекается")
  58. else:
  59. await state.update_data(t_start=time[0])
  60. await state.update_data(t_end=time[1])
  61. await BookingState.description.set()
  62. await message.answer("Введите краткое описание мероприятия", reply_markup=cancel_booking())
  63. else:
  64. await message.answer("Неверный формат времени")
  65. # TODO: огран по длине текста
  66. async def send_event(message: types.Message, state: FSMContext):
  67. db = database.Database()
  68. if len(message.text) > 100:
  69. await message.answer("Описание слишком длинное")
  70. else:
  71. await state.update_data(description=message.text)
  72. await state.update_data(approved=0)
  73. data = await state.get_data()
  74. await message.answer("Заявка принята", reply_markup=main_kb)
  75. await state.finish()
  76. await message.answer(data)
  77. db.sql_query_send(sql.sql_send_event(data))
  78. def events_register(dp: Dispatcher):
  79. dp.register_message_handler(make_event, text="🎯 Запланировать мероприятие")
  80. dp.register_callback_query_handler(select_date, text_startswith='date_')
  81. dp.register_callback_query_handler(edit_date, text=['change', 'cancel_booking'], state=[BookingState.start,
  82. BookingState.time,
  83. BookingState.description])
  84. dp.register_callback_query_handler(booking_date, text='booking', state=BookingState.start)
  85. dp.register_message_handler(get_date, state=BookingState.time)
  86. dp.register_message_handler(send_event, state=BookingState.description)