Telegram version of schneiderbot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
3.7 KiB

5 years ago
5 years ago
5 years ago
  1. import datetime
  2. from telegram import ParseMode, Update
  3. import requests
  4. from telegram.ext import CallbackContext
  5. DISABLED_GROUPS = [-1001301570558]
  6. DIETS = {
  7. "veggy": ["Vegetarisch", "Vegan"],
  8. "vegan": ["Vegan"]
  9. }
  10. WEEKDAYS = {
  11. "montag": 1,
  12. "dienstag": 2,
  13. "mittwoch": 3,
  14. "donnerstag": 4,
  15. "freitag": 5,
  16. "samstag": 6,
  17. "sonntag": 7
  18. }
  19. MENSA_URL = {
  20. "zentral": "goe1",
  21. "turm": "goe2",
  22. "linux": "goe2",
  23. "nord": "goe3",
  24. "italia": "goe4",
  25. "fasthochschule": "goe5"
  26. }
  27. MENSA_NAME = {
  28. "zentral": "Zentralmensa",
  29. "nord": "Nordmensa",
  30. "turm": "Turmmensa",
  31. "linux": "Linuxmensa",
  32. "italia": "Mensa Italia",
  33. "fasthochschule": "Bistro Fasthochschule"
  34. }
  35. HIDE_CATEGORIES_LIGHT = {
  36. "CampusCurry",
  37. "natürlich fit",
  38. "Fitnesscenter",
  39. "Salatbuffet",
  40. "Studentenfutter",
  41. "Süße Versuchung",
  42. "Süße Spezial Tagesangebot",
  43. "Vollwert & Co. Stärke",
  44. "Vollwert & Co. Gemüse",
  45. "Bio-Beilagen",
  46. "Dessertbuffet",
  47. "Last Minute ab 14:30 Uhr",
  48. ## Nordmensa:
  49. "Salatbuffet/Pastapoint",
  50. "Last Minute ab 13:30 Uhr",
  51. ## Turmmensa:
  52. "Beilagen",
  53. "Last Minute ab 14:00Uhr"
  54. }
  55. HIDE_CATEGORIES_FULL = {
  56. "Last Minute ab 14:30 Uhr",
  57. "Last Minute ab 13:30 Uhr",
  58. "Last Minute ab 14:00Uhr"
  59. }
  60. MODES = {
  61. "light": HIDE_CATEGORIES_LIGHT,
  62. "full": HIDE_CATEGORIES_FULL
  63. }
  64. def linux_mensa(update: Update, context: CallbackContext):
  65. context.args = ["linux"]
  66. mensa(update, context)
  67. def mensa(update: Update, context: CallbackContext):
  68. if update.message.chat_id in DISABLED_GROUPS:
  69. return
  70. which = "zentral"
  71. filter_categories = MODES["light"]
  72. diet = [""]
  73. auto_next_day = True
  74. today = datetime.datetime.now().date()
  75. for arg in context.args:
  76. arg = arg.lower()
  77. if arg in MENSA_NAME:
  78. which = arg
  79. elif arg in MODES:
  80. filter_categories = MODES[arg]
  81. elif arg in WEEKDAYS:
  82. date_offset = (6 - today.weekday() + WEEKDAYS[arg])
  83. today += datetime.timedelta(days=date_offset)
  84. auto_next_day = False
  85. elif arg in DIETS:
  86. diet = DIETS[arg]
  87. else:
  88. update.message.reply_text("Falscher Aufruf! RTFM und versuchs nochmal.")
  89. return
  90. if auto_next_day and datetime.datetime.now().time() > datetime.time(hour=16):
  91. today += datetime.timedelta(days=1)
  92. if today.weekday() == 6:
  93. update.message.reply_text("Sonntags hat die Mensa zu")
  94. return
  95. url = "https://app.mensaplan.de/api/11102/de.mensaplan.app.android.goettingen/%s.json" % MENSA_URL[which]
  96. request = requests.get(url)
  97. request.encoding = 'utf-8'
  98. data = request.json()
  99. today_data = get_data_for_day(today, data)
  100. if not today_data:
  101. message = today.strftime("Kein Speiseplan für den %d.%m.%Y vorhanden")
  102. else:
  103. message = "Das Essen für %s in der %s \n\n" % (today_data["date"], MENSA_NAME[which])
  104. for cat in today_data['categories']:
  105. label = cat['name']
  106. meals = cat['meals']
  107. if label not in filter_categories and (
  108. any(filtered in label for filtered in diet) or
  109. [item['name'].replace('\xad', '') for item in meals if
  110. any(filtered in item['name'].replace('\xad', '') for filtered in diet)]): # TODO: simplify
  111. meal_line = "*%s*\n" % label
  112. for meal in meals:
  113. meal_line += meal['name'].strip() + "\n"
  114. message += meal_line + '\n'
  115. update.message.reply_text(message, ParseMode.MARKDOWN)
  116. def get_data_for_day(day, complete_data):
  117. for data in complete_data['days']:
  118. if day.isoformat() == data['iso-date']:
  119. return data