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

Berechtigungen und gruppenspezifische Daten.

parent e1c14bb6
No related branches found
No related tags found
No related merge requests found
......@@ -23,32 +23,34 @@ class Birthday:
class ModuleBirthdayReminder:
def __init__(self, filename, receiver, send, log):
def __init__(self, groups, send, log):
self.tag = "%20s - " % "mBirthdayReminder"
self.log = log
self.filename = filename
self.receiver = receiver
self.send = send
self.birthday_list = []
self.birthday_list = {}
self.load_birthday_list()
for group in groups:
self.load_birthdays_from_csv(group)
self.log.debug(f"{self.tag}Modul BirthdayReminder geladen")
def load_birthday_list(self):
def load_birthdays_from_csv(self, groupInfo):
lines = []
try:
with open(self.filename, 'r', encoding='utf16') as f:
with open(groupInfo["BIRTHDAYDIR"], 'r', encoding='utf16') as f:
lines = f.readlines()
except IOError as exc:
self.log.error(
f"{self.tag}Reading birthdays from csv failed: {exc}")
self.birthday_list[groupInfo["NAME"]] = []
for line in lines:
try:
birthday = self.interpret_birthday_line(line)
self.birthday_list.append(birthday)
self.birthday_list[groupInfo["NAME"]].append(birthday)
except (SyntaxError, ValueError) as exc:
self.log.warning(
f"{self.tag}Error while interpreting birthday line:{line}; Error: {exc}")
......@@ -56,17 +58,18 @@ class ModuleBirthdayReminder:
def check_for_birthdays(self):
today = date.today()
dm = today.strftime("%d.%m")
for birthday in self.birthday_list:
for groups in self.birthday_list:
for birthday in groups:
if dm == birthday.DATE:
self.send(birthday.get_congratulation(), self.receiver)
def get_next_birthday(self):
def get_next_birthday(self, groupInfo):
today = datetime.today()
format = "%d.%m.%Y"
delta = 800
next_birthday = None
birthday_next_year_string = ""
for birthday in self.birthday_list:
for birthday in self.birthday_list[groupInfo["NAME"]]:
# Dieses Jahr
birthday_string = f"{birthday.DATE}.{date.today().strftime('%Y')}"
birthday_dt = datetime.strptime(birthday_string, format)
......@@ -83,12 +86,14 @@ class ModuleBirthdayReminder:
if delta_temp < delta:
next_birthday = birthday
delta = delta_temp
message = "Niemand hat hier Geburtstag! Wir sind in einer Zeitschleife gefangen."
if next_birthday:
message = f"Als nächstes hat {next_birthday.PERSON} am {next_birthday.DATE} Geburtstag (noch {delta} Tage)"
return message
return f"Als nächstes hat {next_birthday.PERSON} am {next_birthday.DATE} Geburtstag (noch {delta} Tage)"
def get_birthdaylist(self):
def get_birthdaylist(self,groupInfo ):
message = "Alle Geburtstage:\n"
for birthday in self.birthday_list:
for birthday in self.birthday_list[groupInfo["NAME"]]:
message += f"{birthday.PERSON}, {birthday.DATE}\n"
return message
......@@ -117,39 +122,24 @@ class ModuleBirthdayReminder:
return Birthday(person, f"{day}.{month}")
def save_birthday(self, message):
def save_birthday(self, message, groupInfo):
birthday: Birthday = None
try:
birthday = self.interpret_birthday_line(message)
if birthday in self.birthday_list: # TODO TESTEN!11
if birthday in self.birthday_list[groupInfo["NAME"]]:
return "Birthday is already saved"
self.birthday_list.append(birthday)
self.birthday_list[groupInfo["NAME"]].append(birthday)
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting birthday line:{message}; Error: {exc}")
return f"{exc}"
try:
with open(self.filename, 'a', encoding='utf16') as f:
with open(groupInfo["BIRTHDAYDIR"], 'a', encoding='utf16') as f:
f.write(f"{birthday.get_csv_line()}\n")
return "Successfully added birthday"
except IOError as exc:
self.log.error(f"{self.tag}Adding new birthday'{birthday.get_csv_line()}' to file failed: {exc}")
return "Saving birthday failed"
def load_birthdays_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 birthdays from csv:'{self.filename}' failed: {exc}")
for line in lines:
try:
birthday = self.interpret_birthday_line(line)
self.birthday_list.append(birthday)
except (SyntaxError, ValueError) as exc:
self.log.warning(f"{self.tag}Error while interpreting birthday line:{line}; Error: {exc}")
......@@ -24,34 +24,39 @@ class Event:
class ModuleEventReminder:
def __init__(self, filename, receiver, send, log):
def __init__(self, groups, 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.events = {}
for group in groups:
self.load_events_from_csv(group)
self.log.debug(f"{self.tag}Modul EventReminder geladen")
def load_event_list(self):
def load_events_from_csv(self, groupInfo):
lines = []
try:
with open(self.filename, 'r', encoding='utf16') as f:
with open(groupInfo["EVENTDIR"], 'r', encoding='utf16') as f:
lines = f.readlines()
except IOError as exc:
self.log.error(
f"{self.tag}Reading events from csv failed: {exc}")
self.events[groupInfo["NAME"]] =[]
for line in lines:
try:
self.events.append(self.interpret_event_line(line))
self.events[groupInfo["NAME"]].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:
for groups in self.events:
for event in groups:
if dm == event.date:
self.send(event.get_event_msg(), self.receiver)
else:
......@@ -60,23 +65,26 @@ class ModuleEventReminder:
if tomorrow == event.date:
self.send(event.get_event_msg(), self.receiver)
def get_next_event(self):
def get_next_event(self, groupInfo):
today = datetime.today()
format = "%d.%m.%Y"
delta = 800
next_event = None
for event in self.events:
for event in self.events[groupInfo["NAME"]]:
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!"
message = "Es ist ruhig... zu ruhig!"
if next_event:
message = f"Nächstes Event:\n{next_event.get_event_msg()}\nNoch {delta} Tage!"
return message
def get_eventlist(self):
def get_eventlist(self, groupInfo):
message = "Alle Events:\n"
for event in self.events: # Dieses For geht bestimmt in einer Teile, so wie in signalbot.py
for event in self.events[groupInfo["NAME"]]: # Dieses For geht bestimmt in einer Teile, so wie in signalbot.py
message += f"{event.headline}, {event.date}\n"
return message
......@@ -109,38 +117,25 @@ class ModuleEventReminder:
return Event(headline, f"{day}.{month}.{year}", " ".join(str(x) for x in splitted[2:]))
def save_event(self, message):
def save_event(self, message, groupInfo):
event: Event = None
try:
event = self.interpret_event_line(message)
if event in self.events: # TODO TESTEN!11
if event in self.events[groupInfo["NAME"]]: # TODO TESTEN!11
return "Event is already saved"
self.events.append(event)
self.events[groupInfo["NAME"]].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:
with open(groupInfo["EVENTDIR"], '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}")
......@@ -23,7 +23,7 @@ class ModuleHelp:
return help_dict
def search_command(self, keyword):
def search_command(self, keyword, groupInfo):
answer = ''
try:
keyword = keyword.strip().lower()
......@@ -32,7 +32,7 @@ class ModuleHelp:
for category in self.help_dict:
for command in self.help_dict[category]:
if keyword in [x.lower() for x in command["Names"]]:
if keyword in [x.lower() for x in command["Names"]] and (groupInfo is None or keyword[1:] in groupInfo["COMMANDS"]):
answer += f'Name(s): {", ".join(str(x) for x in command["Names"])}\n'
answer += f'Description: \n{command["Description"]}'
break
......@@ -47,13 +47,21 @@ class ModuleHelp:
return answer
def get_all_commands(self):
def get_all_commands(self, groupInfo):
answer = ''
try:
for category in self.help_dict:
answer += f'## {category} ##\n'
cmdList=''
for command in self.help_dict[category]:
answer += f'{", ".join(str(x) for x in [x.lower() for x in command["Names"]])}\n'
cmds = []
for cmd in command["Names"]:
if (groupInfo is None or cmd[1:] in groupInfo["COMMANDS"]):
cmds.append(cmd)
if len(cmds)>0:
cmdList += f'{", ".join(str(x) for x in [x.lower() for x in cmds])}\n'
if len(cmdList) >0:
answer += f'## {category} ##\n'
answer+= cmdList
answer += '\n'
if answer == '':
......
......@@ -33,12 +33,12 @@ class Quote:
class ModuleQuotes:
def __init__(self,filename, log):
def __init__(self, groups, log):
self.tag = "%20s - " % "mQuotes"
self.log = log
self.filename = filename
self.quotes = []
self.load_quotes_from_csv()
self.quotes = {}
for group in groups:
self.load_quotes_from_csv(group)
self.log.debug(f"{self.tag}Modul Quotes geladen")
......@@ -50,38 +50,46 @@ class ModuleQuotes:
quote = Quote(",".join(splitted[0:-2]), splitted[-2], splitted[-1])
return quote
def save_quote(self, message):
def save_quote(self, message, groupInfo):
quote: Quote = None
try:
quote = self.interpret_quote_line(message)
self.quotes.append(quote)
if groupInfo["NAME"] in self.quotes:
self.quotes[groupInfo["NAME"]].append(quote)
else:
self.log.critical( f'{self.tag}Error while appending quote to self.quotes group:{groupInfo["NAME"]} line:{message}; Error: {exc}')
except (SyntaxError, ValueError) as exc:
self.log.warning( f"{self.tag}Error while interpreting quote line:{message}; Error: {exc}")
return f"{exc}"
try:
with open(self.filename, 'a', encoding='utf16') as f:
with open(groupInfo["QUOTESDIR"], 'a', encoding='utf16') as f:
f.write(quote.get_csv_line())
return "Successfully added quote"
except IOError as exc:
self.log.error(f"{self.tag}Adding new Quote to file failed: {exc}")
return "Saving quote failed"
def load_quotes_from_csv(self):
def load_quotes_from_csv(self, groupInfo):
lines = []
try:
with open(self.filename, 'r', encoding='utf16') as f:
with open(groupInfo["QUOTESDIR"], 'r', encoding='utf16') as f:
lines = f.readlines()
except IOError as exc:
self.log.error(f"{self.tag}Reading quotes from csv:'{self.filename}' failed: {exc}")
self.log.error(f'{self.tag}Reading quotes from csv:\'{groupInfo["QUOTESDIR"]}\' failed: {exc}')
self.quotes[groupInfo["NAME"]] = []
for line in lines:
try:
quote = self.interpret_quote_line(line)
self.quotes.append(quote)
self.quotes[groupInfo["NAME"]].append(quote)
except (SyntaxError, ValueError) as exc:
self.log.warning( f"{self.tag}Error while interpreting quote line:{line}; Error: {exc}")
def get_random_quote(self):
return random.choice(self.quotes).get_quote()
def get_random_quote(self, groupInfo):
message = "Sorry, there are no quotes"
if groupInfo["NAME"] in self.quotes and len(self.quotes[groupInfo["NAME"]]):
message = random.choice(self.quotes[groupInfo["NAME"]]).get_quote()
return message
\ No newline at end of file
......@@ -64,8 +64,6 @@ event_reminder = None
CONFIG = {}
FUN_DICT = {}
NTP_LINKS = {}
NTP_PASSWORD = ""
MQTT_USER = ""
MQTT_PWD = ""
......@@ -80,8 +78,6 @@ GROUPS = {}
def load_config(filename):
global CONFIG
global FUN_DICT
global NTP_LINKS
global NTP_PASSWORD
global MQTT_USER
global MQTT_PWD
......@@ -95,10 +91,6 @@ def load_config(filename):
CONFIG = json.load(open(filename, 'r'))
if "FUN_DICT" in CONFIG:
FUN_DICT = CONFIG["FUN_DICT"]
if "NTP_LINKS" in CONFIG:
NTP_LINKS = CONFIG["NTP_LINKS"]
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"]:
......@@ -131,7 +123,18 @@ def handle_action(timestamp, source, groupID, message, attachments):
print(groupID)
print(message)
print(attachments)
receiver = groupID if len(groupID) > 0 else source
receiver = source
groupInfo = None
if len(groupID) > 0:
receiver = groupID
# wenn gruppe, dann berechtigungsobjekt suchen um die rechte zu beschneiden
for group in GROUPS:
if group["ID"] == groupID:
groupInfo = group
break
try:
message = message[1:].strip()
msg_splitted = message.split(" ")
......@@ -139,54 +142,51 @@ def handle_action(timestamp, source, groupID, message, attachments):
if len(action) == 0:
return
if action == "help":
help_func(receiver, " ".join(str(x) for x in msg_splitted[1:]).strip())
elif action == "remusfeinste":
help_func(receiver, " ".join(str(x) for x in msg_splitted[1:]).strip(), groupInfo)
elif action == "remusfeinste" and (groupInfo is None or action in groupInfo["COMMANDS"]):
remus_feinste(receiver)
elif action == "yesno" or action == "yn":
elif (action == "yesno" or action == "yn")and (groupInfo is None or action in groupInfo["COMMANDS"]):
yes_no_wtf(receiver, action)
elif action == "dadjoke":
elif action == "dadjoke"and (groupInfo is None or action in groupInfo["COMMANDS"]):
dadjoke(receiver)
elif action == "links":
password = ""
if len(msg_splitted) >= 2:
password = msg_splitted[1]
links(password, receiver)
elif action == "links"and (groupInfo is not None and action in groupInfo["COMMANDS"]):
links( receiver, groupInfo)
elif action in FUN_DICT:
send(FUN_DICT[action], receiver)
elif action == "savequote":
save_quote(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "randomquote":
random_quote(receiver)
elif action == "savequote" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
save_quote(receiver, " ".join(str(x) for x in msg_splitted[1:]), groupInfo)
elif action == "randomquote" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
random_quote(receiver, groupInfo)
elif action == "credits":
credits(receiver)
elif action == "freegames":
elif action == "freegames" and (groupInfo is None or action in groupInfo["COMMANDS"]):
free_games(receiver)
elif action == "gn" or action == "genderneutral":
elif (action == "gn" or action == "genderneutral") and (groupInfo is None or action in groupInfo["COMMANDS"]):
genderneutral(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "schlücke" or action == "sips":
elif (action == "schlücke" or action == "sips") and (groupInfo is None or action in groupInfo["COMMANDS"]):
sips(receiver)
elif action == "roll":
elif action == "roll" and (groupInfo is None or action in groupInfo["COMMANDS"]):
roll(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "request":
request(receiver, " ".join(str(x) for x in msg_splitted[1:]))
elif action == "challenge":
elif action == "challenge" and (groupInfo is None or action in groupInfo["COMMANDS"]):
get_random_challenge(receiver)
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":
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":
elif action == "savebirthday" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
save_birthday(receiver, " ".join(str(x) for x in msg_splitted[1:]), groupInfo)
elif action == "allbirthdays" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
get_all_birthdays(receiver, groupInfo)
elif action == "nextbirthday" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
get_next_birthday(receiver, groupInfo)
elif action == "saveevent" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
save_event(receiver, " ".join(str(x) for x in msg_splitted[1:]), groupInfo)
elif action == "allevents" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
get_all_events(receiver, groupInfo)
elif action == "nextevent" and (groupInfo is not None and action in groupInfo["COMMANDS"]):
get_next_event(receiver, groupInfo)
elif action == "tex" and (groupInfo is None or action in groupInfo["COMMANDS"]):
get_tex_formula(receiver, " ".join(str(x) for x in msg_splitted[1:]))
else:
unknown_command(receiver, message)
unknown_command(receiver, message) # wenn nicht berechtigt, dann "ich seh nix, ich weiss nix, ich hör nix" => unbekannter befehl
except Exception as ex:
log.critical(f'Unknown error:"{ex}", timestamp="{timestamp}", source="{source}", groupID="{groupID}", '
f'message="{message}", attachments="{attachments}"')
......@@ -210,12 +210,12 @@ def send_a(message, receiver, attachment):
signal.sendGroupMessage(message, [attachment], receiver)
def help_func(receiver, message):
def help_func(receiver, message, groupInfo):
answer = ""
if len(message) > 0:
answer = help.search_command(message)
answer = help.search_command(message, groupInfo)
else:
answer = help.get_all_commands()
answer = help.get_all_commands(groupInfo)
send(answer, receiver)
......@@ -251,13 +251,17 @@ def next_event(receiver):
send("", receiver)
def links(password, receiver):
message = "Bitte das Passwort angeben!"
if len(NTP_LINKS) == 0:
def links(receiver, groupInfo):
links = {}
if groupInfo is not None and "LINKS" in groupInfo:
links = groupInfo["LINKS"]
if len(links) == 0:
message = "Keine Links hinterlegt!"
elif password.lower() == NTP_PASSWORD:
else:
message = ""
for key, value in NTP_LINKS.items():
for key, value in links.items():
if type(value) is str:
message += key + ":\n" # Gruppenname / Linkbezeichnung
message += value + " \n"
......@@ -274,12 +278,12 @@ def links(password, receiver):
send(message, receiver)
def save_quote(receiver, quote_line):
send(quotes.save_quote(quote_line), receiver)
def save_quote(receiver, quote_line, groupInfo):
send(quotes.save_quote(quote_line, groupInfo), receiver)
def random_quote(receiver):
send(quotes.get_random_quote(), receiver)
def random_quote(receiver,groupInfo):
send(quotes.get_random_quote(groupInfo), receiver)
def credits(receiver):
......@@ -357,46 +361,28 @@ def get_random_challenge(receiver):
send(message, receiver)
def save_birthday(receiver, birthday_line):
message = "Du besitzt nicht die notwendigen Zugriffsrechte!"
if receiver == GROUPS["ntp"] or receiver == GROUPS["Testung"]:
message = birthday_reminder.save_birthday(birthday_line)
send(message, receiver)
def save_birthday(receiver, birthday_line, groupInfo):
send(birthday_reminder.save_birthday(birthday_line, groupInfo), 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_all_birthdays(receiver, groupInfo):
send(birthday_reminder.get_birthdaylist(groupInfo), 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 get_next_birthday(receiver, groupInfo):
send(birthday_reminder.get_next_birthday(groupInfo), 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 save_event(receiver, event_line, groupInfo):
send(event_reminder.save_event(event_line, groupInfo), 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_all_events(receiver, groupInfo ):
send(event_reminder.get_eventlist(groupInfo), 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 get_next_event(receiver, groupInfo):
send( event_reminder.get_next_event(groupInfo), receiver)
def unknown_command(receiver, message):
......@@ -451,13 +437,13 @@ if __name__ == "__main__":
load_config('/home/pi/signalbot/config.json')
gn = ModuleGenderneutral('gn.json', log)
quotes = ModuleQuotes('quotes.csv', log)
quotes = ModuleQuotes(GROUPS, log)
games = ModuleFreeGames(FREE_GAMES_SUBSCRIBER, send_a, log)
challenges = ModuleChallenge('/home/pi/signalbot/challenge.json', log)
birthday_reminder = ModuleBirthdayReminder('birthdays.csv', GROUPS["ntp"], send, log)
birthday_reminder = ModuleBirthdayReminder(GROUPS , send, log)
tex = ModuleTex(log)
help = ModuleHelp('/home/pi/signalbot/betterhelp.json', log)
event_reminder = ModuleEventReminder('events.csv', GROUPS["ntp"], send, log)
event_reminder = ModuleEventReminder(GROUPS, 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