chio_plugin.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. """
  2. Плагин Чио для отправки школьного расписания.
  3. Обёртка для ScheduleParser
  4. Author: Milinuri Nirvalen
  5. Ver: sp 3.1
  6. Пожалуйста, переместите меня в папку packages/ вашей сборки Чио.
  7. И переименуйте меня во что-то более логичное.. например "schedule.py"
  8. """
  9. from core import Plugin, Config
  10. from sparser.sparser import SPMessages
  11. from datetime import datetime
  12. p = Plugin("Расписание", desc="Отправляет вам расписание уроков")
  13. days_str = ["понедельник", "вторник", "сред", "четверг", "пятниц", "суббот"]
  14. set_class_message = f"""\n\n⚠️ Поажлуйста, укажите класс по умолчанию: /класс [Ваш класс]"""
  15. config_path = "data/sparser_autopost.toml"
  16. user_base = {"autopost_hour":17, "hour":0, "day":0}
  17. @p.eventHandler("after")
  18. async def _(event, ctx):
  19. p.log("Check sparser_autopost")
  20. c = Config(filepath=config_path)
  21. day = int(datetime.today().strftime("%j"))
  22. hour = datetime.now().hour
  23. updated = False
  24. autopost_targets = []
  25. # Проверка таймеров
  26. # -----------------
  27. for k, v in c.file_data.items():
  28. if day != v["day"] and hour >= v["autopost_hour"]:
  29. updated = True
  30. autopost_targets.append(k)
  31. v["day"] = day
  32. v["hour"] = hour
  33. c.file_data[k] = v
  34. if updated:
  35. c.save()
  36. p.log("Save autopost file")
  37. # Отправка расписания
  38. # ===================
  39. for x in autopost_targets:
  40. sp = ScheduleParser(x)
  41. await ctx.message(sp.print_today_lessons(), peer_id=x)
  42. # Настройка автопоста
  43. # ===================
  44. @p.command("автопост", usage="настроить автопост")
  45. async def autopost(event, ctx):
  46. uid = str(event.get("to.id"))
  47. c = Config(filepath=config_path)
  48. res = "Автопост: "
  49. if ctx.sargs.lower().startswith("выкл"):
  50. if uid in c.file_data:
  51. del c.file_data[uid]
  52. c.save()
  53. elif ctx.sargs.isdigit():
  54. user = c.file_data.get(uid, user_base)
  55. user["autopost_hour"] = min(max(int(ctx.sargs), 0), 23)
  56. c.file_data[uid] = user
  57. c.save()
  58. autopost_status = ""
  59. autopost_command = ""
  60. if uid not in c.file_data:
  61. res += f"🔕 Выключен"
  62. autopost_command = "\n🔷 /автопост [час] - включить автопост"
  63. else:
  64. res += f"🔔 В {c.file_data[uid]['autopost_hour']}:00"
  65. autopost_command = "\n🔶 /автопост выкл - выключить автопост"
  66. res += "\n\nВ указанное вами время вы получите расписание автоматически."
  67. res += "\n⚠️ Уведомления приходят с запозданием (могут и не придти), не полагайтесь сильно на них."
  68. res += autopost_command
  69. await ctx.message(res)
  70. # Основные команды
  71. # ================
  72. @p.command("класс", usage="[class_let] сменить класс по умолчанию")
  73. async def setClass(event, ctx):
  74. sp = SPMessages(str(event.get("to.id")))
  75. await ctx.message(sp.set_class(ctx.sargs.lower()))
  76. @p.command("уроки", usage="[class_let; day] расписание на день")
  77. async def lessons(event, ctx):
  78. uid = str(event.get("to.id"))
  79. sp = SPMessages(uid)
  80. # Обновление данных автопоста
  81. # ---------------------------
  82. c = Config(filepath=config_path)
  83. if uid in c.file_data:
  84. c.file_data[uid]["day"] = int(datetime.today().strftime("%j"))
  85. c.file_data[uid]["hour"] = datetime.now().hour
  86. c.save()
  87. # Обработка аргументов
  88. # --------------------
  89. class_let = None
  90. lesson = None
  91. cabinet = None
  92. days = []
  93. for x in ctx.args:
  94. x = x.lower()
  95. if x in sp.lessons:
  96. class_let = x
  97. if x in sp.l_index:
  98. lesson = x
  99. if x in sp.c_index:
  100. cabinet = x
  101. for i, d in enumerate(days_str):
  102. if x.startswith(d) and i not in days:
  103. days.append(i)
  104. if x == "сегодня":
  105. days.append(datetime.today().weekday())
  106. if x == "завтра":
  107. days.append(datetime.today().weekday()+1)
  108. # Сборка сообщения
  109. # ----------------
  110. if lesson or cabinet:
  111. if cabinet:
  112. res = sp.search_cabinet(cabinet, lesson, days, class_let)
  113. else:
  114. res = sp.search_lesson(lesson, days, class_let)
  115. elif days:
  116. res = sp.send_lessons(days, class_let)
  117. else:
  118. res = sp.send_today_lessons(class_let)
  119. if not class_let and not sp.user["set_class"]:
  120. res += set_class_message
  121. await ctx.message(res)
  122. @p.command("расписание", usage= "[class_let] расписание на неделю")
  123. async def schedule(event, ctx):
  124. uid = str(event.get("to.id"))
  125. sp = SPMessages(uid)
  126. # Обновление данных автопоста
  127. # ---------------------------
  128. c = Config(filepath=config_path)
  129. if uid in c.file_data:
  130. c.file_data[uid]["day"] = int(datetime.today().strftime("%j"))
  131. c.file_data[uid]["hour"] = datetime.now().hour
  132. c.save()
  133. if ctx.sargs.lower() in ["changes", "изменения"]:
  134. res = sp.send_sc_changes()
  135. else:
  136. res = sp.send_lessons([0, 1, 2, 3, 4, 5], ctx.sargs.lower())
  137. res += f"\n\n/расписание изменения - что нового в расписании"
  138. if not ctx.sargs and not sp.user["set_class"]:
  139. res += set_class_message
  140. await ctx.message(res)
  141. # Расширенные команды
  142. # ===================
  143. @p.command("sparser", usage="Статус парсера расписания")
  144. async def sparserStatus(event, ctx):
  145. sp = SPMessages(str(event.get("to.id")))
  146. await ctx.message(sp.send_status())
  147. @p.command("<lesson(s) c(ount)>", usage="[class_let] самые частые уроки")
  148. async def countLessons(event, ctx):
  149. sp = SPMessages(str(event.get("to.id")))
  150. await ctx.message(sp.count_lessons(ctx.sargs or None))
  151. @p.command("<cabinet(s) c(ount)>", "кабинеты",
  152. usage="[class_let] самые частые кабинеты")
  153. async def countCabinets(event, ctx):
  154. sp = SPMessages(str(event.get("tp.id")))
  155. await ctx.message(sp.count_cabinets(ctx.sargs or None))