make_events.py 8.1 KB

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