make_events.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import asyncio
  2. from aiogram import types, Dispatcher
  3. from bot import database, sql
  4. from bot.keyboards import register_kb, make_calendar, events_kb, cancel_booking, main_kb
  5. from bot.functions import make_date, time_validator, normalize_time, to_quotes, check_overlap, beauty_booked_time
  6. from handlers.user.states import BookingState
  7. from aiogram.dispatcher.storage import FSMContext
  8. from bot import messages
  9. from handlers.admin.notifications import new_event
  10. import datetime
  11. async def make_event(message: types.message):
  12. db = database.Database()
  13. if not db.sql_fetchone(f"select tg_id from user_table where tg_id ={message.from_user.id}") or \
  14. not db.sql_fetchone(f"select approved from user_table where tg_id={message.from_user.id}"):
  15. await message.delete()
  16. await message.answer(messages.non_register, reply_markup=register_kb)
  17. else:
  18. if message.text == "🎯 Запланировать мероприятие":
  19. await message.delete()
  20. # TODO: Добавить переход на следующий месяц
  21. msg = await message.answer(messages.events_welcome(make_date()), reply_markup=make_calendar())
  22. await asyncio.sleep(60)
  23. await msg.delete()
  24. async def select_date(call: types.CallbackQuery, state: FSMContext):
  25. db = database.Database()
  26. date = call.data.split("_")[1]
  27. booked = db.sql_fetchall(sql.sql_booked_time(date))
  28. today = datetime.datetime.now()
  29. if date >= datetime.datetime.strftime(today, '%Y-%m-%d'):
  30. if len(booked) == 0:
  31. await BookingState.start.set()
  32. await state.update_data(date=to_quotes(date))
  33. await state.update_data(owner=call.from_user.id)
  34. msg = await call.message.edit_text(f"Вы выбрали дату: {date}\n"
  35. f"На этот день мероприятий не запланированно", reply_markup=events_kb())
  36. await asyncio.sleep(30)
  37. await msg.delete()
  38. else:
  39. await BookingState.start.set()
  40. await state.update_data(date=to_quotes(date))
  41. await state.update_data(owner=call.from_user.id)
  42. msg = await call.message.edit_text(f"Вы выбрали дату: {date}\n\n"
  43. f"Занятое время\n\n"
  44. f"{beauty_booked_time(sorted(booked, key=lambda t: t['e_start'], reverse=False))}",
  45. reply_markup=events_kb())
  46. await asyncio.sleep(60)
  47. await msg.delete()
  48. else:
  49. msg = await call.message.answer("Нельзя выбрать дату позже сегодняшней")
  50. await asyncio.sleep(5)
  51. await msg.delete()
  52. async def edit_date(call: types.CallbackQuery, state: FSMContext):
  53. msg = await call.message.edit_text(f"выберите дату чтобы увидеть список мероприятий\n\n"
  54. f"Так же календарь мероприятий можно посмотреть в "
  55. f"<a href=moodle.tomtit-tomsk.ru>Moodle</a>\n\n"
  56. f"Сегодняшняя дата <b>{make_date()}</b>", reply_markup=make_calendar())
  57. await call.message.delete()
  58. await state.finish()
  59. await asyncio.sleep(30)
  60. await msg.delete()
  61. async def booking_date(call: types.CallbackQuery):
  62. msg = await call.message.answer("Введите диапазон времени\n"
  63. "Возможные форматы\n\n"
  64. "13.00 15.30\n"
  65. "13.00-15.30\n"
  66. "13:00 15:30\n"
  67. "13.00-15.30\n", reply_markup=cancel_booking())
  68. await BookingState.time.set()
  69. await asyncio.sleep(20)
  70. await msg.delete()
  71. async def get_time(message: types.Message, state: FSMContext):
  72. # Парсим то что ввел пользователь
  73. time = normalize_time(message.text)
  74. await message.delete()
  75. # Забираем текущую дату
  76. date = await state.get_data()
  77. # Проверяем валидность времени
  78. if time_validator(message.text):
  79. # Проверяем что старт не позже конца
  80. if time[0] > time[1]:
  81. msg = await message.answer("Начало не может быть раньше конца")
  82. await asyncio.sleep(5)
  83. await msg.delete()
  84. elif not check_overlap(time[0], time[1], date['date']):
  85. print(time[0],time[1])
  86. msg = await message.answer("Указанное время пеерсекается")
  87. await asyncio.sleep(5)
  88. await msg.delete()
  89. else:
  90. await state.update_data(t_start=time[0])
  91. await state.update_data(t_end=time[1])
  92. print(time)
  93. await BookingState.description.set()
  94. msg = await message.answer("Введите краткое описание мероприятия", reply_markup=cancel_booking())
  95. await asyncio.sleep(10)
  96. await msg.delete()
  97. else:
  98. msg = await message.answer("Неверный формат времени")
  99. await asyncio.sleep(5)
  100. await msg.delete()
  101. async def send_event(message: types.Message, state: FSMContext):
  102. db = database.Database()
  103. if len(message.text) > 100:
  104. msg = await message.answer("Описание слишком длинное")
  105. await asyncio.sleep(5)
  106. await msg.delete()
  107. await message.delete()
  108. else:
  109. await state.update_data(description=message.text)
  110. await state.update_data(approved=0)
  111. data = await state.get_data()
  112. await message.delete()
  113. msg = await message.answer("Заявка принята", reply_markup=main_kb)
  114. await state.finish()
  115. db.sql_query_send(sql.sql_send_event(data))
  116. await asyncio.sleep(5)
  117. await msg.delete()
  118. await new_event()
  119. def events_register(dp: Dispatcher):
  120. dp.register_message_handler(make_event, text="🎯 Запланировать мероприятие")
  121. dp.register_callback_query_handler(select_date, text_startswith='date_')
  122. dp.register_callback_query_handler(edit_date, text=['change', 'cancel_booking'], state=[BookingState.start,
  123. BookingState.time,
  124. BookingState.description])
  125. dp.register_callback_query_handler(booking_date, text='booking', state=BookingState.start)
  126. dp.register_message_handler(get_time, state=BookingState.time)
  127. dp.register_message_handler(send_event, state=BookingState.description)