Compare commits
10 commits
ansgar-dev
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
4b7b99103f | ||
|
4dd0e0b1d9 | ||
|
56a66f3c03 | ||
|
9fab537a58 | ||
|
052ad4414c | ||
|
7755536da1 | ||
|
08a4c4d3c1 | ||
|
3f33a13f77 | ||
|
2204bd5d9e | ||
|
44f359ed7f |
4 changed files with 51 additions and 39 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -81,6 +81,7 @@ modules.xml
|
||||||
# End of https://www.gitignore.io/api/pycharm+iml
|
# End of https://www.gitignore.io/api/pycharm+iml
|
||||||
|
|
||||||
*.log
|
*.log
|
||||||
|
__pycache__/
|
||||||
config.json
|
config.json
|
||||||
config-devel.json
|
config-devel.json
|
||||||
bot_test.py
|
bot_test.py
|
|
@ -1,6 +1,15 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# since 3.5: type hints
|
||||||
|
# def <name>(<args) -> <returntype>:
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
# write concurrent code (not threading. not multiprocessing)
|
||||||
|
# it's cooperative multitasking, no parallelism
|
||||||
|
# coroutines: suspend execution before return and pass control to another coroutine
|
||||||
|
# use await only in async functions
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
import signal
|
import signal
|
||||||
|
@ -26,12 +35,34 @@ from telepot.namedtuple import InlineKeyboardMarkup, InlineKeyboardButton
|
||||||
|
|
||||||
|
|
||||||
class Essen:
|
class Essen:
|
||||||
def __init__(self, name, preis, kategorie):
|
"""Class which represents a Essen-Object"""
|
||||||
|
def __init__(self, name, preis, kategorie) -> None:
|
||||||
|
"""
|
||||||
|
Initialize a Essen-Object with given values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
name (string): name of the meal
|
||||||
|
preis (float): price of the meal
|
||||||
|
kategorie (string): category of the meal
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
None
|
||||||
|
"""
|
||||||
self.name = name
|
self.name = name
|
||||||
self.preis = preis
|
self.preis = preis
|
||||||
self.kategorie = kategorie
|
self.kategorie = kategorie
|
||||||
|
return None
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self) -> str:
|
||||||
|
"""
|
||||||
|
Formats the attribute of the Essen-Object to a string
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
None
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
_ (string): formatted String of attributes
|
||||||
|
"""
|
||||||
if self.preis > 0:
|
if self.preis > 0:
|
||||||
return str("*%s*: `%s` (%.2f €)" % (self.kategorie, self.name, self.preis))
|
return str("*%s*: `%s` (%.2f €)" % (self.kategorie, self.name, self.preis))
|
||||||
else:
|
else:
|
||||||
|
@ -45,6 +76,19 @@ class Language(Enum):
|
||||||
|
|
||||||
|
|
||||||
config_filename = "config.json"
|
config_filename = "config.json"
|
||||||
|
|
||||||
|
var_corona_msg_de = "Bitte halten Sie sich an die AHA-Regeln in der Mensa und achten sie auf die "\
|
||||||
|
"vorgegebenen Markierung und Hinweise. Den aktuellen Corona-Status an der HS Mittweida "\
|
||||||
|
"können Sie an der [Corona-Ampel](https://www.hs-mittweida.de/) oder im [Corona-Newsticker]"\
|
||||||
|
"(https://www.hs-mittweida.de/index.php?id=247957) der Hochschule einsehen. Nur *ZUSAMMEN* "\
|
||||||
|
"bewirken wir etwas und bewätigen die Pandemie. Bleiben Sie gesund."
|
||||||
|
|
||||||
|
var_corona_msg_eng = "Please follow the AHA rules in the cafeteria and pay attention to the given markings "\
|
||||||
|
"and instructions. You can see the current Corona status of HS Mittweida at the [Corona"\
|
||||||
|
"traffic light](https://www.hs-mittweida.de/) or in the [Corona news ticker]"\
|
||||||
|
"(https://www.hs-mittweida.de/index.php?id=247957) of the university. Only *TOGETHER* we "\
|
||||||
|
"make a difference and overcome the pandemic. Stay healthy."
|
||||||
|
|
||||||
info_str = "*Inoffizieller Mensa-Bot der Hochschule Mittweida*\nDieser Bot versendet jeden Tag um 10 Uhr den aktuellen " \
|
info_str = "*Inoffizieller Mensa-Bot der Hochschule Mittweida*\nDieser Bot versendet jeden Tag um 10 Uhr den aktuellen " \
|
||||||
"Mensa-Speiseplan. Er wird über /start für den aktuellen Chat oder die aktuelle Gruppe gestartet, " \
|
"Mensa-Speiseplan. Er wird über /start für den aktuellen Chat oder die aktuelle Gruppe gestartet, " \
|
||||||
"/stop beendet ihn wieder. Mit /essen, /mensa und /speiseplan (optional gefolgt von _en_ oder _de_) kann " \
|
"/stop beendet ihn wieder. Mit /essen, /mensa und /speiseplan (optional gefolgt von _en_ oder _de_) kann " \
|
||||||
|
@ -52,6 +96,7 @@ info_str = "*Inoffizieller Mensa-Bot der Hochschule Mittweida*\nDieser Bot verse
|
||||||
"verändert werden.\n\n_Haftungsausschluss: Dieser Bot steht in keiner Verbindung mit der Hochschule " \
|
"verändert werden.\n\n_Haftungsausschluss: Dieser Bot steht in keiner Verbindung mit der Hochschule " \
|
||||||
"Mittweida oder dem Studentenwerk Freiberg. Alle Angaben ohne Gewähr._\n\nGrafik bereitgestellt von [" \
|
"Mittweida oder dem Studentenwerk Freiberg. Alle Angaben ohne Gewähr._\n\nGrafik bereitgestellt von [" \
|
||||||
"vecteezy.com](https://de.vecteezy.com) "
|
"vecteezy.com](https://de.vecteezy.com) "
|
||||||
|
|
||||||
status = ""
|
status = ""
|
||||||
essen = []
|
essen = []
|
||||||
essen_eng = []
|
essen_eng = []
|
||||||
|
@ -223,12 +268,14 @@ async def send_essen(chat_id: int, sprache: Language = Language.GERMAN) -> None:
|
||||||
nachricht = "Speiseplan am %s:\n" % format_date(datum, format="full", locale="de_DE")
|
nachricht = "Speiseplan am %s:\n" % format_date(datum, format="full", locale="de_DE")
|
||||||
for i in essen:
|
for i in essen:
|
||||||
nachricht += "- " + str(i).replace(".", ",") + "\n\n"
|
nachricht += "- " + str(i).replace(".", ",") + "\n\n"
|
||||||
|
nachricht += var_corona_msg_de
|
||||||
await send_message(bot_obj=bot, chat_id=chat_id, msg=nachricht, parse_mode="markdown")
|
await send_message(bot_obj=bot, chat_id=chat_id, msg=nachricht, parse_mode="markdown")
|
||||||
|
|
||||||
if sprache == Language.ENGLISH or sprache == Language.GERMAN_ENGLISH:
|
if sprache == Language.ENGLISH or sprache == Language.GERMAN_ENGLISH:
|
||||||
nachricht = "Menu on %s:\n" % format_date(datum, format="full", locale="en")
|
nachricht = "Menu on %s:\n" % format_date(datum, format="full", locale="en")
|
||||||
for i in essen_eng:
|
for i in essen_eng:
|
||||||
nachricht += "- " + str(i) + "\n\n"
|
nachricht += "- " + str(i) + "\n\n"
|
||||||
|
nachricht += var_corona_msg_eng
|
||||||
await send_message(bot_obj=bot, chat_id=chat_id, msg=nachricht, parse_mode="markdown")
|
await send_message(bot_obj=bot, chat_id=chat_id, msg=nachricht, parse_mode="markdown")
|
||||||
|
|
||||||
|
|
||||||
|
|
20
README.md
20
README.md
|
@ -75,23 +75,3 @@ Konfigurationsdatei könnte so aussehen:
|
||||||
],
|
],
|
||||||
"logging_enabled": false
|
"logging_enabled": false
|
||||||
}
|
}
|
||||||
|
|
||||||
### Start
|
|
||||||
### einfach
|
|
||||||
Der Bot kann über `python3 <Bot.py>` gestartet werden (die aktuelle Version
|
|
||||||
heißt *HSMensaW_botA.py*). Danach sollte er problemlos laufen. *stdout* und
|
|
||||||
*stderr* werden jeweils in eine Datei (*out.log* bzw. *err.log*) umgeleitet,
|
|
||||||
wobei es dort u. U. erst nach dem Beenden des Bots auftaucht.
|
|
||||||
|
|
||||||
### immer
|
|
||||||
Im Projektordner gibt es ein Shellscript (*telebot_watchdog*), welches beim
|
|
||||||
Ausführen dafür sorgt, dass der Bot exakt einmal läuft. Wenn dieses Skript
|
|
||||||
(z. B. per Cron) regelmäßig gestartet wird, wird sichergestellt, dass der
|
|
||||||
Bot immer läuft (auch nach einem Neustart oder Crash).
|
|
||||||
Dafür müssen folgende Zeilen in die [Crontab](https://wiki.ubuntuusers.de/Cron/#Cronjobs-manuell-einrichten) eingetragen werden:
|
|
||||||
|
|
||||||
@reboot /home/pi/scripts/telebot_watchdog
|
|
||||||
* * * * * /home/pi/scripts/telebot_watchdog
|
|
||||||
|
|
||||||
(wobei die erste Zeile eigentlich überflüssig ist). Die Pfade müssen
|
|
||||||
natürlich angepasst werden, genauso im Skript selbst.
|
|
|
@ -1,16 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# zaehle die Prozesse, die den Bot ausfuehren
|
|
||||||
count=$(ps aux | grep HSMensaW_bot.py | grep -c -v grep)
|
|
||||||
# mehr als einer?
|
|
||||||
if [ "$count" -gt 1 ]; then
|
|
||||||
# beende alle
|
|
||||||
kill `ps axo pid,command | grep HSMensaW | grep -v grep | sed -e 's/^[[:space:]]*//' | cut -d ' ' -f1 | tr '\n' ' '`
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ungleich 1 (wenn mehr, wurden sie schon beendet, daher keiner)
|
|
||||||
if [ "$count" -ne 1 ]; then
|
|
||||||
# starte neu
|
|
||||||
cd /home/pi/scripts || exit
|
|
||||||
python3 HSMensaW_bot.py &
|
|
||||||
fi
|
|
||||||
|
|
Loading…
Reference in a new issue