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

Merge branch 'createEvents' into 'main'

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

See merge request !4
parents 1510250f f7dd2b0a
No related branches found
No related tags found
1 merge request!4Die Funktionalität der Events ist nun implementiert und funktioniert analaog...
......@@ -2,6 +2,9 @@
This project realizes a signal community bot known from other social plattforms like Twitch, Discord & Mumble. It is based on the simple request to automatically remind a groupchat of upcoming birthdays and events.
# Installation
Install required packages: `pip install -r requirements.txt`
# Features
The signalbot listens to commands that start with a dot.
It offers a variety of features (or at least feature-ideas/request) that can be devided into following categories:
......
......@@ -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"
},
{
......
from datetime import date, datetime
from time import strftime
from dateutil.relativedelta import relativedelta # BSD
class Birthday:
def __init__(self, person, date):
person = person.strip()
......@@ -17,14 +16,15 @@ class Birthday:
return self.PERSON == other.PERSON and self.DATE == other.DATE
def get_congratulation(self):
return f"Alles Gute {self.PERSON}"
return f"Alles Gute {self.PERSON}"
def get_csv_line(self):
return f"{self.PERSON},{self.DATE}"
class ModuleBirthdayReminder:
def __init__(self, filename, receiver, send, log):
self.tag = "%20s - " % ("mBirthdayReminder")
self.tag = "%20s - " % "mBirthdayReminder"
self.log = log
self.filename = filename
self.receiver = receiver
......@@ -71,7 +71,7 @@ class ModuleBirthdayReminder:
birthday_string = f"{birthday.DATE}.{date.today().strftime('%Y')}"
birthday_dt = datetime.strptime(birthday_string, format)
delta_temp = (birthday_dt - today).days
if delta_temp > 0 and delta_temp < delta:
if 0 < delta_temp < delta:
next_birthday = birthday
delta = delta_temp
else:
......@@ -84,7 +84,7 @@ class ModuleBirthdayReminder:
next_birthday = birthday
delta = delta_temp
return (f"Als nächstes hat {next_birthday.PERSON} am {next_birthday.DATE} Geburtstag (noch {delta} Tage)")
return f"Als nächstes hat {next_birthday.PERSON} am {next_birthday.DATE} Geburtstag (noch {delta} Tage)"
def get_birthdaylist(self):
message = "Alle Geburtstage:\n"
......@@ -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:
......@@ -157,4 +153,3 @@ class ModuleBirthdayReminder:
self.birthday_list.append(birthday)
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting birthday line:{line}; Error: {exc}")
\ No newline at end of file
import random
import json
class ModuleChallenge:
def __init__(self, filename, log):
self.tag = "%20s - " % ("mChallenge")
self.tag = "%20s - " % "mChallenge"
self.log = log
self.filename = filename
......@@ -15,7 +16,7 @@ class ModuleChallenge:
challenges = ["Keine Challenge verfügbar - bitte melde dich bei uns per .request !"]
try:
CONFIG = json.load(open(self.filename, 'r'))
if("challenges" in CONFIG):
if "challenges" in CONFIG:
challenges = CONFIG["challenges"]
return challenges
......
from datetime import date, datetime
from dateutil.relativedelta import relativedelta # BSD
class Event:
def __init__(self, headline, date, description=''):
self.headline = headline.strip()
self.date = date.strip()
self.description = description.strip()
if not headline or not date:
raise ValueError("Please enter a headline and date!")
def __eq__(self, other):
return self.headline == other.headline and self.date == other.date
def get_event_msg(self):
msg = f'## {self.headline} ##\nDatum: {self.date}\n'
if self.description:
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
class ModuleEventReminder:
def __init__(self, filename, receiver, send, log):
self.tag = "%20s - " % "mEventReminder"
self.log = log
self.filename = filename
self.receiver = receiver
self.send = send
self.events = []
self.load_event_list()
self.log.debug(f"{self.tag}Modul EventReminder geladen")
def load_event_list(self):
lines = []
try:
with open(self.filename, 'r', encoding='utf16') as f:
lines = f.readlines()
except IOError as exc:
self.log.error(
f"{self.tag}Reading events from csv failed: {exc}")
for line in lines:
try:
self.events.append(self.interpret_event_line(line))
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting event line:{line}; Error: {exc}")
def check_for_events(self):
today = date.today()
dm = today.strftime("%d.%m.%Y")
for event in self.events:
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):
today = datetime.today()
format = "%d.%m.%Y"
delta = 800
next_event = None
for event in self.events:
event_dt = datetime.strptime(event.date, format)
delta_temp = (event_dt - today).days
if 0 < delta_temp < delta:
next_event = event
delta = delta_temp
return f"Nächstes Event:\n{next_event.get_event_msg()}\nNoch {delta} Tage!"
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 not (1 < len(splitted) <= 3):
raise SyntaxError("Invalid event syntax! Needs to be: "
"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) ; optional description.")
splittedDate = splitted[1].strip().split(".")
if len(splitted) != 3:
raise SyntaxError("Invalid date! Needs to be: Day.Month.Year eg.: 02.09.21")
day = splittedDate[0].strip()
month = splittedDate[1].strip()
year = splittedDate[2].strip()
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_event(self, message):
event: Event = None
try:
event = self.interpret_event_line(message)
if event in self.events: # TODO TESTEN!11
return "Event is already saved"
self.events.append(event)
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting event line:{message}; Error: {exc}")
return f"{exc}"
try:
with open(self.filename, 'a', encoding='utf16') as f:
f.write(f"{event.get_csv_line()}\n")
return "Successfully added event"
except IOError as 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):
lines = []
try:
with open(self.filename, 'r', encoding='utf16') as f:
lines = f.readlines()
except IOError as exc:
self.log.error(f"{self.tag}Reading events from csv:'{self.filename}' failed: {exc}")
for line in lines:
try:
event = self.interpret_event_line(line)
self.events.append(event)
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting event line:{line}; Error: {exc}")
import requests
from bs4 import BeautifulSoup # MIT
import json
class ModuleFreeGames:
def __init__(self, subscriber, send_a, log):
self.tag = "%20s - " % ("mFreeGames")
self.tag = "%20s - " % "mFreeGames"
self.log = log
self.game_dict = self.crawl_game_list()
......@@ -78,6 +76,3 @@ class ModuleFreeGames:
self.send_newsletter()
else:
self.send_game(receiver)
......@@ -6,7 +6,7 @@ import json
class ModuleGenderneutral:
def __init__(self, filename, log):
self.tag = "%20s - " % ("mGenderneutral")
self.tag = "%20s - " % "mGenderneutral"
self.log = log
self.filename = filename
......@@ -33,7 +33,6 @@ class ModuleGenderneutral:
data = requests.get("https://geschicktgendern.de/").text
soup = BeautifulSoup(data, features="html.parser")
key = ""
key_original = ""
value = ""
......
......@@ -3,7 +3,7 @@ import json
class ModuleHelp:
def __init__(self, filename, log):
self.tag = "%20s - " % ("mhelp")
self.tag = "%20s - " % "mhelp"
self.log = log
self.filename = filename
......
#!/usr/bin/python3
import json
import random
# Input
......@@ -9,6 +8,7 @@ import random
# "Lorem ipsum dolor sit amet!"
# - Philip, 2021
class Quote:
def __init__(self, quote, person, year):
quote = quote.strip()
......@@ -34,7 +34,7 @@ class Quote:
class ModuleQuotes:
def __init__(self,filename, log):
self.tag = "%20s - " % ("mQuotes")
self.tag = "%20s - " % "mQuotes"
self.log = log
self.filename = filename
self.quotes = []
......
......@@ -4,7 +4,7 @@ import matplotlib.pyplot as plt
class ModuleTex:
def __init__(self, log):
self.tag = "%20s - " % ("mTex")
self.tag = "%20s - " % "mTex"
self.log = log
self.log.debug(f"{self.tag}Modul Tex geladen")
......@@ -41,4 +41,3 @@ class ModuleTex:
except Exception as ex:
self.log.error(f"{self.tag} Failed creating Image of formula: {formula} with error: {ex}")
return f"/home/pi/signalbot/shrug_face.png"
###### Requirements without Version Specifiers ######`
paho-mqtt
requests
schedule
gLib
pydbus
matplotlib
beautifulsoup4
python-dateutil
sympy
\ No newline at end of file
......@@ -2,40 +2,31 @@
# Based on https://github.com/mh-g/python-signal-cli (c)2017 mh-g
# (c) 2021 FA, PM
from pydbus import SystemBus # LGPL v2+
from gi.repository import GLib # LGPL v2.1+
import requests
import json
from bs4 import BeautifulSoup # MIT
import logging
import numpy as np
from mod_genderneutral import ModuleGenderneutral
from mod_quotes import ModuleQuotes
from mod_freegames import ModuleFreeGames
from mod_challenge import ModuleChallenge
from mod_birthdayreminder import ModuleBirthdayReminder
from mod_tex import ModuleTex
from mod_help import ModuleHelp
import random
import time
from threading import Thread
import paho.mqtt.client as mqtt # EPL V1.0
import schedule
import time
import requests # Apache 2.0
import schedule # MIT
from gi.repository import GLib # LGPL v2.1+
from pydbus import SystemBus # LGPL v2+
from mod_birthdayreminder import ModuleBirthdayReminder
from mod_challenge import ModuleChallenge
from mod_freegames import ModuleFreeGames
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 Geburtstagsfunktion einbauen
# @TODO Einfacher Wrapper zum senden von Nachrichten per shell
# @TODO EPIC-Game Benachrichtigung https://epicstore-api.readthedocs.io/en/latest/api.html
# @TODO freegamesyo.com crawlen (stündlich/täglich) und nur bei neuen Spielen posten
# @TODO Wetter API?
# @TODO Funktionen in Module auslagern, welche eingeschaltet werden können
# @TODO Bot umbenennen evtl in den Bot Emoji
# @TODO Request über .request "Nachricht" und die wird an eine Requestgruppe geschickt
# @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')
......@@ -69,6 +60,7 @@ challenges = None
birthday_reminder = None
tex = None
help = None
event_reminder = None
CONFIG = {}
FUN_DICT = {}
......@@ -84,6 +76,7 @@ MQTT_TIMEOUT = None
FREE_GAMES_SUBSCRIBER = {}
GROUPS = {}
def load_config(filename):
global CONFIG
global FUN_DICT
......@@ -100,112 +93,103 @@ def load_config(filename):
global GROUPS
try:
CONFIG = json.load(open(filename, 'r'))
if("FUN_DICT" in CONFIG):
if "FUN_DICT" in CONFIG:
FUN_DICT = CONFIG["FUN_DICT"]
if("NTP_LINKS" in CONFIG):
if "NTP_LINKS" in CONFIG:
NTP_LINKS = CONFIG["NTP_LINKS"]
if("NTP_PASSWORD" in CONFIG):
if "NTP_PASSWORD" in CONFIG:
NTP_PASSWORD = CONFIG["NTP_PASSWORD"]
if("MQTT" in CONFIG):
if("mqtt.local" in CONFIG["MQTT"]):
if("MQTT_USER" in CONFIG["MQTT"]["mqtt.local"]):
if "MQTT" in CONFIG:
if "mqtt.local" in CONFIG["MQTT"]:
if "MQTT_USER" in CONFIG["MQTT"]["mqtt.local"]:
MQTT_USER = CONFIG["MQTT"]["mqtt.local"]["MQTT_USER"]
if("MQTT_PWD" in CONFIG["MQTT"]["mqtt.local"]):
if "MQTT_PWD" in CONFIG["MQTT"]["mqtt.local"]:
MQTT_PWD = CONFIG["MQTT"]["mqtt.local"]["MQTT_PWD"]
if("MQTT_IP" in CONFIG["MQTT"]["mqtt.local"]):
if "MQTT_IP" in CONFIG["MQTT"]["mqtt.local"]:
MQTT_IP = CONFIG["MQTT"]["mqtt.local"]["MQTT_IP"]
if("MQTT_PORT" in CONFIG["MQTT"]["mqtt.local"]):
if "MQTT_PORT" in CONFIG["MQTT"]["mqtt.local"]:
MQTT_PORT = CONFIG["MQTT"]["mqtt.local"]["MQTT_PORT"]
if("MQTT_TIMEOUT" in CONFIG["MQTT"]["mqtt.local"]):
if "MQTT_TIMEOUT" in CONFIG["MQTT"]["mqtt.local"]:
MQTT_TIMEOUT = CONFIG["MQTT"]["mqtt.local"]["MQTT_TIMEOUT"]
if "FREE_GAMES_SUBSCRIBER" in CONFIG:
FREE_GAMES_SUBSCRIBER = CONFIG["FREE_GAMES_SUBSCRIBER"]
if "GROUPS" in CONFIG:
GROUPS = CONFIG["GROUPS"]
except FileNotFoundError:
log.error(f"File:'{filename}' not accessible")
log.error(f"File:'{filename}' not accessible. Running in reduced mode.")
print("File not accessible")
print("Running in reduced mode")
def handle_action(timestamp, source, groupID, message, attachments):
print("msgRcv called")
if not (message.startswith(".") and len(message) >= 2):
return
print(timestamp)
print(source)
print(groupID)
print(message)
print(attachments)
receiver = source
if(len(groupID) > 0):
receiver = groupID
receiver = groupID if len(groupID) > 0 else source
try:
if(message.startswith(".") and len(message) >= 2):
message = message[1:].strip()
msg_splitted = message.split(" ")
action = msg_splitted[0].lower()
if(len(action) > 0):
if(action == "help"):
help_func(receiver," ".join(str(x)
for x in msg_splitted[1:]).strip())
elif(action == "remusfeinste"):
if len(action) == 0:
return
if action == "help":
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"):
elif action == "yesno" or action == "yn":
yes_no_wtf(receiver, action)
elif(action == "dadjoke"):
elif action == "dadjoke":
dadjoke(receiver)
elif(action == "links"):
elif action == "links":
password = ""
if(len(msg_splitted) >= 2):
if len(msg_splitted) >= 2:
password = msg_splitted[1]
links(password, receiver)
elif(action in FUN_DICT):
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"):
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"):
elif action == "credits":
credits(receiver)
elif(action == "freegames"):
elif action == "freegames":
free_games(receiver)
elif(action == "gn" or action == "genderneutral"):
genderneutral(receiver, " ".join(str(x)
for x in msg_splitted[1:]))
elif(action == "schlücke" or action == "sips"):
elif action == "gn" or action == "genderneutral":
genderneutral(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "schlücke" or action == "sips":
sips(receiver)
elif(action == "roll"):
elif action == "roll":
roll(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif(action == "request"):
elif action == "request":
request(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif(action == "challenge"):
elif action == "challenge":
get_random_challenge(receiver)
elif(action == "savebirthday"):
save_birthday(receiver, " ".join(str(x)
for x in msg_splitted[1:]))
elif(action == "allbirthdays"):
elif action == "savebirthday":
save_birthday(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "allbirthdays":
get_all_birthdays(receiver)
elif(action == "nextbirthday"):
elif action == "nextbirthday":
get_next_birthday(receiver)
elif(action=="tex"):
get_tex_formula(receiver, " ".join(str(x)
for x in msg_splitted[1:]))
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:
unknown_command(receiver, message)
except Exception as ex:
log.critical(
f'Unknown error:"{ex}", timestamp="{timestamp}", source="{source}", groupID="{groupID}", message="{message}", attachments="{attachments}"')
log.critical(f'Unknown error:"{ex}", timestamp="{timestamp}", source="{source}", groupID="{groupID}", '
f'message="{message}", attachments="{attachments}"')
def send(message, receiver):
......@@ -234,6 +218,7 @@ def help_func(receiver, message):
answer = help.get_all_commands()
send(answer, receiver)
def remus_feinste(receiver):
message = "- 1,5l Weißwein\n" \
"- 2,5l Rotwein\n" \
......@@ -257,23 +242,21 @@ def yes_no_wtf(receiver, action):
def dadjoke(receiver):
response = requests.get(f"https://icanhazdadjoke.com",
headers={"Accept": "application/json"})
response = requests.get(f"https://icanhazdadjoke.com", headers={"Accept": "application/json"})
result = response.json()
send(result["joke"], 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):
message = "Bitte das Passwort angeben!"
if(len(NTP_LINKS) == 0):
if len(NTP_LINKS) == 0:
message = "Keine Links hinterlegt!"
elif(password.lower() == NTP_PASSWORD):
elif password.lower() == NTP_PASSWORD:
message = ""
if len(NTP_LINKS) > 0:
for key, value in NTP_LINKS.items():
if type(value) is str:
message += key + ":\n" # Gruppenname / Linkbezeichnung
......@@ -291,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)
......@@ -303,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" \
......@@ -318,6 +293,7 @@ def credits(receiver):
def free_games(receiver):
games.freegames(receiver)
def genderneutral(receiver, badstring):
global gn
message = gn.search_in_db(badstring)
......@@ -331,12 +307,12 @@ def sips(receiver):
message = "Trinke "
backfire = random.randrange(0, 50)
if(backfire == 49):
if backfire == 49:
message = "Jokes on You!\n" + message
if ex == 32:
message = "Trink dein Getränk auf EX!!1"
else:
if(amount_sips == 1):
if amount_sips == 1:
message += "einen Schluck!"
else:
message += f"{amount_sips} Schlücke!"
......@@ -361,16 +337,17 @@ def roll(receiver, range):
send(message, receiver)
def request(receiver, message):
answer = ""
if not message:
answer = "Was soll denn hinzugefügt werden?"
else:
answer = "Besten Dank! Die Anfrage wurde weitergeleitet."
send(answer, receiver)
send(message, CONFIG["GROUPS"]["Requests"])
def get_random_challenge(receiver):
global challenges
message = "Keine Challenge verfügbar - bitte melde dich bei uns per .request !"
......@@ -386,18 +363,42 @@ def save_birthday(receiver, birthday_line):
message = birthday_reminder.save_birthday(birthday_line)
send(message, receiver)
def get_all_birthdays(receiver):
message = "Du besitzt nicht die notwendigen Zugriffsrechte!"
if receiver == GROUPS["ntp"] or receiver == GROUPS["Testung"]:
message = birthday_reminder.get_birthdaylist()
send(message, receiver)
def get_next_birthday(receiver):
message = "Du besitzt nicht die notwendigen Zugriffsrechte!"
if receiver == GROUPS["ntp"] or receiver == GROUPS["Testung"]:
message = birthday_reminder.get_next_birthday()
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)
......@@ -406,6 +407,7 @@ def unknown_command(receiver, message):
def get_tex_formula(receiver, message):
send_a(message, receiver, tex.create_formula(message))
def on_mqtt_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
send(msg.topic + " " + str(msg.payload), CONFIG['Admins']['Fred'])
......@@ -430,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)
......@@ -454,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