Skip to content
Snippets Groups Projects
Commit f7dd2b0a authored by Frederic Aust's avatar Frederic Aust
Browse files

Die Funktionalität der Events ist nun implementiert und funktioniert analaog...

Die Funktionalität der Events ist nun implementiert und funktioniert analaog zum Modul Birthdayreminder.
parent c549ea66
Branches
No related tags found
1 merge request!4Die Funktionalität der Events ist nun implementiert und funktioniert analaog...
......@@ -96,23 +96,30 @@
},
{
"Names": [
".createEvent"
".saveEvent"
],
"Description": "Syntax: .createEvent <Date> <Headline> <Description>. Create an event. (Coming soon)",
"Description": "Syntax: .saveEvent <Headline>; <Date>; <optional description>. Save an event. The bot will remind you one day before the event and at the actual day, each at 9 o'clock. To delete an event use .request!",
"_Func": "yesno"
},
{
"Names": [
".nextEvent"
],
"Description": "Display an upcoming event. (Coming soon)",
"Description": "Display an upcoming event.",
"_Func": "yesno"
},
{
"Names": [
".createBirthday"
".allEvents"
],
"Description": "Syntax: .createBirthday <Name>, <Date>. Create a birthday. The bot will congratulate on that day.",
"Description": "Get a list of all events.",
"_Func": "yesno"
},
{
"Names": [
".saveBirthday"
],
"Description": "Syntax: .saveBirthday <Name>, <Date>. Save a birthday. The bot will congratulate on that day. To delete a birthday use .request!",
"_Func": "yesno"
},
{
......
......@@ -96,24 +96,20 @@ class ModuleBirthdayReminder:
def interpret_birthday_line(self, line):
splitted = line.strip().split(",")
if len(splitted) != 2:
raise SyntaxError(
"Invalid birthday syntax! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
raise SyntaxError("Invalid birthday syntax! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
person = splitted[0].strip()
if len(person) == 0:
raise SyntaxError(
"No name given! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
raise SyntaxError("No name given! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
splittedDate = splitted[1].strip().split(".")
if len(splitted) != 2:
raise SyntaxError(
"Invalid date! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
raise SyntaxError("Invalid date! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
day = splittedDate[0].strip()
month = splittedDate[1].strip()
if len(day) > 2 or len(month) > 2 or len(day) == 0 or len(month) == 0:
raise SyntaxError(
"Invalid date! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
raise SyntaxError("Invalid date! Needs to be: person, date(Day.Month) eg.: Karl, 02.09")
if len(day) == 1:
day = f"0{day}"
if len(month) == 1:
......
......@@ -16,15 +16,14 @@ class Event:
def get_event_msg(self):
msg = f'## {self.headline} ##\nDatum: {self.date}\n'
if self.description:
msg += f'Beschreibung:{self.description}\n'
msg += f'########################'
msg += f'Beschreibung:\n{self.description}\n'
return msg
def get_csv_line(self):
return f"{self.headline},{self.date},{self.description}" # Kommata sind vllt in diesem Modul nicht die beste Idee. Würde auf was anderes ausweichen
return f"{self.headline};{self.date};{self.description}" # Kommata sind vllt in diesem Modul nicht die beste Idee. Würde auf was anderes ausweichen
class ModuleBirthdayReminder:
class ModuleEventReminder:
def __init__(self, filename, receiver, send, log):
self.tag = "%20s - " % "mEventReminder"
self.log = log
......@@ -49,11 +48,16 @@ class ModuleBirthdayReminder:
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting event line:{line}; Error: {exc}")
def check_for_birthdays(self):
def check_for_events(self):
today = date.today()
dm = today.strftime("%d.%m")
dm = today.strftime("%d.%m.%Y")
for event in self.events:
if dm == event.DATE: # hier minus einen tag und am gleichen tag?
if dm == event.date:
self.send(event.get_event_msg(), self.receiver)
else:
# Nächster Tag
tomorrow = date.today() + relativedelta(day=1)
if tomorrow == event.date:
self.send(event.get_event_msg(), self.receiver)
def get_next_event(self):
......@@ -61,42 +65,30 @@ class ModuleBirthdayReminder:
format = "%d.%m.%Y"
delta = 800
next_event = None
event_next_year_string = ""
for event in self.events:
# Dieses Jahr
event_string = f"{event.date}.{date.today().strftime('%Y')}"
event_dt = datetime.strptime(event_string, format)
event_dt = datetime.strptime(event.date, format)
delta_temp = (event_dt - today).days
if 0 < delta_temp < delta:
next_event = event
delta = delta_temp
else:
# Nächstes Jahr (Für den Jahresüberlauf)
next_year = date.today() + relativedelta(years=1)
event_next_year_string = f"{event.DATE}.{next_year.strftime('%Y')}"
event_next_year = datetime.strptime(event_next_year_string, format)
delta_temp = (event_next_year - today).days
if delta_temp < delta:
next_event = event
delta = delta_temp
return f"Nächstes Event:\n{next_event.get_event_msg}\nNoch {delta} Tage!"
return f"Nächstes Event:\n{next_event.get_event_msg()}\nNoch {delta} Tage!"
def get_events(self):
def get_eventlist(self):
message = "Alle Events:\n"
for event in self.events: # Dieses For geht bestimmt in einer Teile, so wie in signalbot.py
message += f"{event.headline}, {event.date}\n"
return message
def interpret_event_line(self, line):
splitted = line.strip().split(",")
if len(splitted) != 2 or len(splitted) != 3:
splitted = line.strip().split(";")
if not (1 < len(splitted) <= 3):
raise SyntaxError("Invalid event syntax! Needs to be: "
"headline, date(Day.Month.Year) with optional description.")
"headline ; date(Day.Month.Year) ; optional description.")
headline = splitted[0].strip()
if len(headline) == 0:
raise SyntaxError("No headline given! Needs to be: "
"headline, date(Day.Month.Year) with optional description.")
"headline; date(Day.Month.Year) ; optional description.")
splittedDate = splitted[1].strip().split(".")
if len(splitted) != 3:
......@@ -106,16 +98,18 @@ class ModuleBirthdayReminder:
month = splittedDate[1].strip()
year = splittedDate[2].strip()
if len(day) > 2 or len(month) > 2 or len(year) != 2 or len(day) == 0 or len(month) == 0:
if not (0 < len(day) < 3 and 0 < len(month) < 3 and 1 < len(year) < 5):
raise SyntaxError("Invalid date! Needs to be: Day.Month.Year eg.: 02.09.21")
if len(day) == 1:
day = f"0{day}"
if len(month) == 1:
month = f"0{month}"
if len(year) < 4:
year = f"20{year[-2:]}"
return Event(headline, f"{day}.{month}.{year}", " ".join(str(x) for x in splitted[2:]))
def save_birthday(self, message):
def save_event(self, message):
event: Event = None
try:
......@@ -134,7 +128,7 @@ class ModuleBirthdayReminder:
f.write(f"{event.get_csv_line()}\n")
return "Successfully added event"
except IOError as exc:
self.log.error(f"{self.tag}Adding new birthday'{event.get_csv_line()}' to file failed: {exc}")
self.log.error(f"{self.tag}Adding new event'{event.get_csv_line()}' to file failed: {exc}")
return "Saving event failed"
def load_events_from_csv(self):
......@@ -149,4 +143,4 @@ class ModuleBirthdayReminder:
event = self.interpret_event_line(line)
self.events.append(event)
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting birthday line:{line}; Error: {exc}")
self.log.warning(f"{self.tag}Error while interpreting event line:{line}; Error: {exc}")
......@@ -21,17 +21,12 @@ from mod_genderneutral import ModuleGenderneutral
from mod_help import ModuleHelp
from mod_quotes import ModuleQuotes
from mod_tex import ModuleTex
from mod_eventreminder import ModuleEventReminder
# @TODO README Schreiben mit signal-cli Raspberry Pi Installationsanleitung + signal-cli Systembus Einrichtung + Systemd für den Signalbot
# @TODO Dummyfunktionen ausprogrammieren
# @TODO Try-Catch mit Log einbauen
# @TODO MQTT einbauen
# @TODO Einfacher Wrapper zum senden von Nachrichten per shell
# @TODO EPIC-Game Benachrichtigung https://epicstore-api.readthedocs.io/en/latest/api.html
# @TODO Wetter API?
# @TODO Funktionen in Module auslagern, welche eingeschaltet werden können
# @TODO Bot umbenennen evtl in den Bot Emoji
# @TODO Config Programm bot-config.py mit dem allgemeine Einstellungen wie Profilname oder Profilbild angepasst werden können
# --> Bot umbenennen evtl in den Bot Emoji
# create logger
log = logging.getLogger('signalbot')
......@@ -65,6 +60,7 @@ challenges = None
birthday_reminder = None
tex = None
help = None
event_reminder = None
CONFIG = {}
FUN_DICT = {}
......@@ -146,8 +142,6 @@ def handle_action(timestamp, source, groupID, message, attachments):
help_func(receiver, " ".join(str(x) for x in msg_splitted[1:]).strip())
elif action == "remusfeinste":
remus_feinste(receiver)
elif action == "nextevent":
next_event(receiver)
elif action == "yesno" or action == "yn":
yes_no_wtf(receiver, action)
elif action == "dadjoke":
......@@ -159,14 +153,10 @@ def handle_action(timestamp, source, groupID, message, attachments):
links(password, receiver)
elif action in FUN_DICT:
send(FUN_DICT[action], receiver)
elif action == "poll":
poll(receiver)
elif action == "savequote":
save_quote(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "randomquote":
random_quote(receiver)
elif action == "createevent":
create_event(receiver)
elif action == "credits":
credits(receiver)
elif action == "freegames":
......@@ -187,6 +177,12 @@ def handle_action(timestamp, source, groupID, message, attachments):
get_all_birthdays(receiver)
elif action == "nextbirthday":
get_next_birthday(receiver)
elif action == "saveevent":
save_event(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "allevents":
get_all_events(receiver)
elif action == "nextevent":
get_next_event(receiver)
elif action == "tex":
get_tex_formula(receiver, " ".join(str(x) for x in msg_splitted[1:]))
else:
......@@ -252,7 +248,7 @@ def dadjoke(receiver):
def next_event(receiver):
send("##TI Public Viewing##\n15.08.2021\nJugendkirche\nKruppstraße 13\n\n#Demo", receiver)
send("", receiver)
def links(password, receiver):
......@@ -278,10 +274,6 @@ def links(password, receiver):
send(message, receiver)
def poll(receiver):
send("Coming soon!", receiver)
def save_quote(receiver, quote_line):
send(quotes.save_quote(quote_line), receiver)
......@@ -290,10 +282,6 @@ def random_quote(receiver):
send(quotes.get_random_quote(), receiver)
def create_event(receiver):
send("Coming soon!", receiver)
def credits(receiver):
message = "Made with ☕ and ❤️\n" \
"by Frederic Aust & Philip Maas\n" \
......@@ -390,6 +378,27 @@ def get_next_birthday(receiver):
send(message, receiver)
def save_event(receiver, event_line):
message = "Du besitzt nicht die notwendigen Zugriffsrechte!"
if receiver == GROUPS["ntp"] or receiver == GROUPS["Testung"]:
message = event_reminder.save_event(event_line)
send(message, receiver)
def get_all_events(receiver):
message = "Du besitzt nicht die notwendigen Zugriffsrechte!"
if receiver == GROUPS["ntp"] or receiver == GROUPS["Testung"]:
message = event_reminder.get_eventlist()
send(message, receiver)
def get_next_event(receiver):
message = "Du besitzt nicht die notwendigen Zugriffsrechte!"
if receiver == GROUPS["ntp"] or receiver == GROUPS["Testung"]:
message = event_reminder.get_next_event()
send(message, receiver)
def unknown_command(receiver, message):
log.debug("Unknown action: " + message)
send(f"Das habe ich nicht verstanden:'{message}'", receiver)
......@@ -423,6 +432,7 @@ def init_schedule_jobs():
schedule.every().monday.at("06:00").do(run_threaded, gn.update_db)
schedule.every().hour.do(run_threaded, games.auto_newsletter)
schedule.every().day.at("00:01").do(run_threaded, birthday_reminder.check_for_birthdays)
schedule.every().day.at("09:00").do(run_threaded, event_reminder.check_for_events)
# schedule.every(10).seconds.do(run_threaded, birthday_reminder.check_for_birthdays)
......@@ -447,6 +457,7 @@ if __name__ == "__main__":
birthday_reminder = ModuleBirthdayReminder('birthdays.csv', GROUPS["ntp"], send, log)
tex = ModuleTex(log)
help = ModuleHelp('/home/pi/signalbot/betterhelp.json', log)
event_reminder = ModuleEventReminder('events.csv', GROUPS["ntp"], send, log)
loop = GLib.MainLoop()
bus = SystemBus()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment