Merge pull request #14 from ctx77/main

reworking some food-items, f-strings and only react when messages startswith the command and not when it is somewhere
This commit is contained in:
BaerbelBox
2024-08-03 07:27:24 +02:00
committed by GitHub
17 changed files with 149 additions and 144 deletions

View File

@@ -26,9 +26,9 @@ class Config(object):
if not append: if not append:
self._config_dict = {} self._config_dict = {}
for l in f.readlines(): for l in f.readlines():
kv_pair = l.split(':') kv_pair = l.split(':', 1)
if len(kv_pair) == 2: if len(kv_pair) == 2:
self._config_dict[kv_pair[0].strip()] = kv_pair[1][:-1].strip() self._config_dict[kv_pair[0].strip()] = kv_pair[1].strip()
mods = self._config_dict['mods'].split(',') mods = self._config_dict['mods'].split(',')
self._config_dict['mods'] = [] self._config_dict['mods'] = []
for mod in mods: for mod in mods:

View File

@@ -1,5 +1,3 @@
import datetime
from FaustBot.Communication.Connection import Connection from FaustBot.Communication.Connection import Connection
from FaustBot.Model.UserProvider import UserProvider from FaustBot.Model.UserProvider import UserProvider
from FaustBot.Modules.PrivMsgObserverPrototype import PrivMsgObserverPrototype from FaustBot.Modules.PrivMsgObserverPrototype import PrivMsgObserverPrototype
@@ -15,8 +13,7 @@ class CharactersCountObserver(PrivMsgObserverPrototype):
return ".characters - um abzufragen wieviel du bisher geschrieben hast." return ".characters - um abzufragen wieviel du bisher geschrieben hast."
def update_on_priv_msg(self, data, connection: Connection): def update_on_priv_msg(self, data, connection: Connection):
if data['message'].find('.characters') == -1: if data["message"].startswith(".characters"):
return
user_provider = UserProvider() user_provider = UserProvider()
output = data['nick']+": du hast "+str(user_provider.get_characters(data['nick']))+ " Zeichen geschrieben." output = f"{data['nick']}: du hast {str(user_provider.get_characters(data['nick']))} Zeichen geschrieben."
connection.send_back(output, data) connection.send_back(output, data)

View File

@@ -6,6 +6,12 @@ from FaustBot.Modules.PrivMsgObserverPrototype import PrivMsgObserverPrototype
class ICDObserver(PrivMsgObserverPrototype): class ICDObserver(PrivMsgObserverPrototype):
with open("care_icd10_de.csv", "r", encoding="utf8") as icd10_codes:
icd10_dict = {
row[0]: row[1]
for row in csv.reader(icd10_codes, delimiter=";", quotechar='"')
}
@staticmethod @staticmethod
def cmd(): def cmd():
return None return None
@@ -14,27 +20,18 @@ class ICDObserver(PrivMsgObserverPrototype):
def help(): def help():
return None return None
def get_icd(self, code):
icd10_codes = open('care_icd10_de.csv', 'r',encoding='utf8')
icd10 = csv.reader(icd10_codes, delimiter=';', quotechar='"')
for row in icd10:
if row[0] == code:
return code +' - ' + row[1]
return 0
def update_on_priv_msg(self, data, connection: Connection): def update_on_priv_msg(self, data, connection: Connection):
if data['channel'] != connection.details.get_channel(): if data["channel"] == connection.details.get_channel():
return regex = r"\b(\w\d{2}\.?\d?\d?)\b"
regex = r'\b(\w\d{2}\.?\d?\d?)\b' codes = re.findall(regex, data["message"])
codes = re.findall(regex, data['message'])
for code in codes: for code in codes:
code = code.capitalize() code = code.capitalize()
text = self.get_icd(code) text = self.icd10_dict.get(code, False)
if text == 0: if text == False:
if code.find('.') != -1: if "." in code:
code += '-' code += "-"
else: else:
code += '.-' code += ".-"
text = self.get_icd(code) text = self.icd10_dict.get(code, False)
if text != 0: if text:
connection.send_back(text, data) connection.send_back(f"{code} - {text}", data)

View File

@@ -12,10 +12,9 @@ class ModmailObserver(PrivMsgObserverPrototype):
return ".modmail <msg> - Sendet allen Moderatoren <msg> per PN" return ".modmail <msg> - Sendet allen Moderatoren <msg> per PN"
def update_on_priv_msg(self, data, connection: Connection): def update_on_priv_msg(self, data, connection: Connection):
if data['message'].find('.modmail') == -1: if data["message"].startswith(".modmail"):
return
mods = connection.details.get_mods() mods = connection.details.get_mods()
print(mods) print(mods)
message = data['message'].split('.modmail ')[1] message = data["message"].split(".modmail ")[1]
for mod in mods: for mod in mods:
connection.send_to_user(mod, data['nick'] + ' meldet: ' + message) connection.send_to_user(mod, f"{data['nick']} meldet: {message}")

View File

@@ -2,6 +2,8 @@ from FaustBot.Communication.Connection import Connection
from FaustBot.Modules.JoinObserverPrototype import JoinObserverPrototype from FaustBot.Modules.JoinObserverPrototype import JoinObserverPrototype
from FaustBot.Model.UserProvider import UserProvider from FaustBot.Model.UserProvider import UserProvider
from time import sleep from time import sleep
class First_Greeter(JoinObserverPrototype): class First_Greeter(JoinObserverPrototype):
""" """
A Class only reacting to pings A Class only reacting to pings
@@ -20,12 +22,15 @@ class First_Greeter(JoinObserverPrototype):
self.first_greeting = greeting self.first_greeting = greeting
def update_on_join(self, data, connection: Connection): def update_on_join(self, data, connection: Connection):
if data['channel'] == connection.details.get_channel(): if data["channel"] == connection.details.get_channel():
if data['nick'].find("Guest") != -1: new_nick = data["nick"]
if (
new_nick.startswith("Guest")
or UserProvider().get_characters(new_nick) < 100
):
sleep(20) sleep(20)
connection.send_back(self.first_greeting + " " + data['nick'], data) if "{NICK}" in self.first_greeting:
return greeting = self.first_greeting.replace("{NICK}", new_nick)
UProvider= UserProvider() else:
if(UProvider.get_characters(data['nick'])) < 100: greeting = f"{self.first_greeting} {new_nick}"
sleep(20) connection.send_back(greeting, data)
connection.send_back(self.first_greeting + " " + data['nick'], data)

View File

@@ -1,3 +1,5 @@
import random
from FaustBot.Communication import Connection from FaustBot.Communication import Connection
from FaustBot.Modules.PrivMsgObserverPrototype import PrivMsgObserverPrototype from FaustBot.Modules.PrivMsgObserverPrototype import PrivMsgObserverPrototype
@@ -12,6 +14,6 @@ class FreeHugsObserver(PrivMsgObserverPrototype):
return ".hug - verteilt Umarmungen" return ".hug - verteilt Umarmungen"
def update_on_priv_msg(self, data: dict, connection: Connection): def update_on_priv_msg(self, data: dict, connection: Connection):
if data['message'].find('.hug') == -1: if data["message"].startswith(".hug"):
return hug_word = random.choice(["umarmt", "knuddelt", "drückt"])
connection.send_back('\001ACTION knuddelt ' + data['nick'] + '.\001', data) connection.send_back(f"\001ACTION {hug_word} {data['nick']}.\001", data)

View File

@@ -15,6 +15,7 @@ class GiveCookieObserver(PrivMsgObserverPrototype):
return ".cookie - verteilt Kekse; oder auch nicht" return ".cookie - verteilt Kekse; oder auch nicht"
def update_on_priv_msg(self, data: dict, connection: Connection): def update_on_priv_msg(self, data: dict, connection: Connection):
if data['message'].find('.cookie') == -1: if data["message"].startswith(".cookie"):
return connection.send_back(
connection.send_back('\001ACTION schenkt ' + data['nick'] + ' ' + random.choice(kekse) + '.\001', data) f"\001ACTION schenkt {data['nick']} {random.choice(kekse)}.\001", data
)

View File

@@ -15,6 +15,8 @@ class GiveDrinkObserver(PrivMsgObserverPrototype):
return ".drink - schenkt Getränke aus" return ".drink - schenkt Getränke aus"
def update_on_priv_msg(self, data: dict, connection: Connection): def update_on_priv_msg(self, data: dict, connection: Connection):
if data['message'].find('.drink') == -1: if data["message"].startswith(".drink"):
return connection.send_back(
connection.send_back('\001ACTION schenkt ' + data['nick'] + ' ' + random.choice(getraenke) + ' ein.\001', data) f"\001ACTION schenkt {data.get('nick')} {random.choice(getraenke)} ein.\001",
data,
)

View File

@@ -11,17 +11,12 @@ from snacks import snacks
from kekse import kekseGoodOnes from kekse import kekseGoodOnes
def _servier(receiver,item,requester): def _servier(receiver, item, requester):
fluff_text = [" ohne zu kleckern",""," mit Begeisterung","",""," nach einer substantiellen Wartezeit"] return f"\001ACTION serviert {receiver} {item}. Schöne Grüße von {requester}\001"
return "\001ACTION serviert {0} {1}{2}. Schöne Grüße von {3}\001".format(
receiver,item,random.choice(fluff_text),requester
)
def _schenk(receiver,item,requester): def _schenk(receiver, item, requester):
return "\001ACTION schenkt {0} {1} ein. Schöne Grüße von {2}\001".format( return f"\001ACTION schenkt {receiver} {item} ein. Schöne Grüße von {requester}\001"
receiver,item,requester
)
non_good_serveables = getraenke + essen + icecream + giveextras + snacks non_good_serveables = getraenke + essen + icecream + giveextras + snacks
@@ -36,11 +31,11 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype):
def help(): def help():
return ".give NUTZER - serviert jemand anderem Getränke oder Snacks" return ".give NUTZER - serviert jemand anderem Getränke oder Snacks"
def update_on_priv_msg(self,data ,connection: Connection): def update_on_priv_msg(self, data, connection: Connection):
if data["message"].find(".give") == -1: if not data["message"].startswith(".give"):
return return
receiver = type = None receiver = type = None
message_parts = data["message"].split() message_parts = data["messageCaseSensitive"].split()
if len(message_parts) >= 2: if len(message_parts) >= 2:
receiver = message_parts[1] receiver = message_parts[1]
if len(message_parts) >= 3: if len(message_parts) >= 3:
@@ -48,7 +43,7 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype):
if receiver is None: if receiver is None:
return return
requester = data["nick"].lower() requester = data["nick"].lower()
if receiver == requester: if receiver.lower() == requester:
if type == "kaffee": if type == "kaffee":
connection.send_back("Fehler 418: Ich bin eine Teekanne",data) connection.send_back("Fehler 418: Ich bin eine Teekanne",data)
else: else:
@@ -57,7 +52,7 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype):
if type is None: if type is None:
connection.send_back(_schenk(receiver,random.choice(getraenkegoodones),requester),data) connection.send_back(_schenk(receiver,random.choice(getraenkegoodones),requester),data)
return return
if type in ["drink","food","cookie","snack","massage","ice"]: if type in ["drink", "food", "cookie", "snack", "massage", "ice"]:
if type == "drink": if type == "drink":
connection.send_back(_schenk(receiver,random.choice(getraenke),requester),data) connection.send_back(_schenk(receiver,random.choice(getraenke),requester),data)
elif type == "food": elif type == "food":
@@ -70,9 +65,8 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype):
connection.send_back(_servier(receiver,random.choice(icecream),requester),data) connection.send_back(_servier(receiver,random.choice(icecream),requester),data)
elif type == "massage": elif type == "massage":
connection.send_back( connection.send_back(
"\001ACTION knetet {0} feste den Rücken durch. {1} meinte ich solle dir was Gutes tun.\001".format( f"\001ACTION knetet {receiver} feste den Rücken durch. {requester} meinte ich solle dir was Gutes tun.\001",
receiver,requester data,
),data
) )
return return
matchingGoodDrinks = [drink for drink in getraenkegoodones if type in drink.lower()] matchingGoodDrinks = [drink for drink in getraenkegoodones if type in drink.lower()]
@@ -86,7 +80,5 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype):
return return
connection.send_back( connection.send_back(
"Tut mir leid {0}, {1} haben wir nicht auf der Karte!".format( f"Tut mir leid {requester}, {type} haben wir nicht auf der Karte!", data
requester,type
),data
) )

View File

@@ -15,6 +15,8 @@ class GiveFoodObserver(PrivMsgObserverPrototype):
return ".food - gibt etwas zu essen aus" return ".food - gibt etwas zu essen aus"
def update_on_priv_msg(self, data: dict, connection: Connection): def update_on_priv_msg(self, data: dict, connection: Connection):
if data['message'].find('.food') == -1: if data["message"].startswith(".food"):
return connection.send_back(
connection.send_back('\001ACTION tischt ' + data['nick'] + ' ' + random.choice(essen) + ' auf.\001', data) f"\001ACTION tischt {data['nick']} {random.choice(essen)} auf.\001",
data,
)

View File

@@ -15,6 +15,8 @@ class GiveIceObserver(PrivMsgObserverPrototype):
return ".ice - serviert Eis" return ".ice - serviert Eis"
def update_on_priv_msg(self, data: dict, connection: Connection): def update_on_priv_msg(self, data: dict, connection: Connection):
if data['message'].find('.ice') == -1: if data["message"].startswith(".ice"):
return connection.send_back(
connection.send_back('\001ACTION serviert ' + data['nick'] + ' ' + random.choice(icecream) + '.\001', data) f"\001ACTION serviert {data['nick']} {random.choice(icecream)}.\001",
data,
)

View File

@@ -4,15 +4,17 @@ from FaustBot.Model.UserProvider import UserProvider
import time import time
from collections import defaultdict from collections import defaultdict
class Greeter(JoinObserverPrototype): class Greeter(JoinObserverPrototype):
""" """
A Class only reacting to pings A Class only reacting to pings
""" """
greetings_dict = defaultdict(str) greetings_dict = defaultdict(str)
greetings_dict['Luci'] = "Hewuu" greetings_dict["Luci"] = "Hewuu"
greetings_dict['pome'] = "Hewuu" greetings_dict["pome"] = "Hewuu"
greetings_dict['Skadi'] = "Awoo" greetings_dict["Skadi"] = "Awoo {NICK}!"
@staticmethod @staticmethod
def cmd(): def cmd():
return None return None
@@ -27,17 +29,21 @@ class Greeter(JoinObserverPrototype):
self.greeting = greeting self.greeting = greeting
def update_on_join(self, data, connection: Connection): def update_on_join(self, data, connection: Connection):
if data['channel'] == connection.details.get_channel(): if data["channel"] == connection.details.get_channel():
if data['nick'].find("Guest") != -1: joined_user = data["nick"]
if (
joined_user.startswith("Guest")
or UserProvider().get_characters(joined_user) < 100
):
return return
UProvider= UserProvider()
if(UProvider.get_characters(data['nick'])) < 100:
return
if data['channel'] == connection.details.get_channel():
if int(time.time()) - self.names[data['nick']] > 28800:
if Greeter.greetings_dict[data['nick']] != "":
connection.send_back(Greeter.greetings_dict[data['nick']]+" " + data['nick'], data)
else:
connection.send_back(self.greeting+" " + data['nick'], data)
self.names[data['nick']] = int(time.time()) if int(time.time()) - self.names[joined_user] > 28800:
greeting_text = self.greetings_dict.get(joined_user, self.greeting)
if "{NICK}" in greeting_text:
response = greeting_text.replace("{NICK}", joined_user)
else:
response = f"{greeting_text} {joined_user}"
connection.send_back(response, data)
self.names[joined_user] = int(time.time())

View File

@@ -15,18 +15,19 @@ class SeenObserver(PrivMsgObserverPrototype):
return ".seen <nick> - um abzufragen wann <nick> zuletzt hier war" return ".seen <nick> - um abzufragen wann <nick> zuletzt hier war"
def update_on_priv_msg(self, data, connection: Connection): def update_on_priv_msg(self, data, connection: Connection):
if data['message'].find('.seen ') == -1: if data["message"].startswith(".seen ") and self._is_idented_mod(
return data, connection
if not self._is_idented_mod(data, connection): ):
return who = data["message"].split(" ")[1]
who = data['message'].split(' ')[1]
user_provider = UserProvider() user_provider = UserProvider()
activity = user_provider.get_activity(who) activity = user_provider.get_activity(who)
output = data['nick']+": Ich habe "+who+" zuletzt am "+str(datetime.datetime.fromtimestamp(activity).strftime("%d.%m.%Y um %H:%M:%S"))+ ' Uhr gesehen' if activity == 0:
if not self._is_idented_mod(data, connection): output = f"{data['nick']}: Ich habe {who} noch nicht gesehen."
connection.send_channel(output) else:
return output = f"{data['nick']}: Ich habe {who} zuletzt am {str(datetime.datetime.fromtimestamp(activity).strftime('%d.%m.%Y um %H:%M:%S'))} Uhr gesehen."
connection.send_back(output, data) connection.send_back(output, data)
def _is_idented_mod(self, data: dict, connection: Connection): def _is_idented_mod(self, data: dict, connection: Connection):
return data['nick'] in self._config.mods and connection.is_idented(data['nick']) return data["nick"] in self._config.mods and connection.is_idented(data["nick"])

View File

@@ -15,6 +15,7 @@ class SnacksObserver(PrivMsgObserverPrototype):
return ".snack - teilt Snacks aus" return ".snack - teilt Snacks aus"
def update_on_priv_msg(self, data: dict, connection: Connection): def update_on_priv_msg(self, data: dict, connection: Connection):
if data['message'].find('.snack') == -1: if data["message"].startswith(".snack"):
return connection.send_back(
connection.send_back('\001ACTION serviert ' + data['nick'] + ' ' + random.choice(snacks) + '.\001', data) f"\001ACTION serviert {data['nick']} {random.choice(snacks)}.\001", data
)

View File

@@ -76,7 +76,7 @@ class TitleObserver(PrivMsgObserverPrototype):
else: else:
# with open("content.html", "w") as file: # with open("content.html", "w") as file:
# file.write(content) # file.write(content)
raise Exception("Could not Parse Title for {}".format(url)) raise Exception(f"Could not Parse Title for {url}")
title = html.unescape(title) title = html.unescape(title)
title = title.replace("\n", " ").replace("\r", "") title = title.replace("\n", " ").replace("\r", "")
@@ -84,5 +84,5 @@ class TitleObserver(PrivMsgObserverPrototype):
title = title.replace("&gt;", ">") title = title.replace("&gt;", ">")
title = title.replace("&amp;", "&") title = title.replace("&amp;", "&")
if title == "": if title == "":
raise Exception("Empty Title for {}".format(url)) raise Exception(f"Empty Title for {url}")
return title return title

View File

@@ -6,7 +6,7 @@ Designed for non-technical channels
## Usage ## Usage
### Requirements ### Requirements
- Python 3.5 - Python 3.8+
- pip - pip
- wikipedia package (can be installed using pip; tested with version 1.4.0) - wikipedia package (can be installed using pip; tested with version 1.4.0)
- virtualenv (optional) - virtualenv (optional)

View File

@@ -47,30 +47,30 @@ essen = [
'einen Teller selbstgedrehte Zucchini-Nudeln', 'einen Teller selbstgedrehte Zucchini-Nudeln',
'mildes Möhrenmischmasch','gegrillten Kürbis','knusprige Frühlingsrollen mit Dip', 'mildes Möhrenmischmasch','gegrillten Kürbis','knusprige Frühlingsrollen mit Dip',
'drei frische Onigiri','den Kraftriegel der deutschen Arbeiterklasse', 'drei frische Onigiri','den Kraftriegel der deutschen Arbeiterklasse',
'ein Klabusterbeerensorbet','Bratwurst mit Sauerkraut','ein Bündel Petersilie', 'Bratwurst mit Sauerkraut','ein Bündel Petersilie',
'eine Schale Stachelbeerkompott','Stulle mit Brot','einen laienhaft zubereiteten Fugofisch', 'eine Schale Stachelbeerkompott','Stulle mit Brot','einen laienhaft zubereiteten Fugofisch',
'ein Stück kichernden Käsekuchen mit Himbeeren','eine Handvoll rohe Mandeln', 'ein Stück kichernden Käsekuchen mit Himbeeren','eine Handvoll rohe Mandeln',
'die Rechnung','entzückendes Erbsengemüse','Eierlikörkuchen mit vollständig ausgebackenem Eierlikör', 'die Rechnung','entzückendes Erbsengemüse','Eierlikörkuchen mit vollständig ausgebackenem Eierlikör',
'drei Stücke traurige trockene Torte','Wassermelonensalat in einer ausgehöhlten Wassermelone', 'drei Stücke traurige trockene Torte','Wassermelonensalat in einer ausgehöhlten Wassermelone',
'das feingemahlene Horn eines Narwals','einen Tuppen Gänseschmalz ohne Salz', 'das feingemahlene Horn eines Narwals','einen Tuppen Gänseschmalz ohne Salz',
'das Leid der Vorväter','abgelaufenes Knäckebrot, das nicht mehr knackt', 'abgelaufenes Knäckebrot, das nicht mehr knackt',
'einen runderneuerten Obstkuchen mit einer Hundertschaft Obstfliegen', 'einen runderneuerten Obstkuchen mit upgegradeten Erdbeeren',
'Rock`n Roll-Rouladen','eine ganze Benjamin-Blümchen-Torte','eine Schüssel chaotische Chili-sin-Carne', 'Rock`n Roll-Rouladen','eine ganze Benjamin-Blümchen-Torte','eine Schüssel chaotische Chili-sin-Carne',
'eine zerbrochene Schallplatte','sauer eingelegten Aal in Aspik','Ameisen in Aspik', 'eine zerbrochene Schallplatte','sauer eingelegten Aal in Aspik',
'ein unidentifizierbares Experiment mit zu viel zerlaufener Butter', 'ein unidentifizierbares Experiment mit zu viel zerlaufener Butter',
'einen Hilferuf des Küchenlehrlings', 'einen Gruß des Küchenlehrlings',
'einen Klumpen Teig, der an einen Kuchen erinnert,','gefüllte Chocolate-Chip-Cookies', 'einen Klumpen Teig, der an einen Kuchen erinnert,','gefüllte Chocolate-Chip-Cookies',
'gedünsteten Brokkoli mit Lachsfilet','gebratenes Gemüse mit Erdnusssoße', 'gedünsteten Brokkoli mit Lachsfilet','gebratenes Gemüse mit Erdnusssoße',
'einen unleserlichen Erpresserbrief','Quinoasalat mit feinen Tomaten', 'einen unleserlicher Brief eines voherigen Besuchers','Quinoasalat mit feinen Tomaten',
'einen italienischen Klassiker mit einem “Spritzer” Olivenöl', 'einen italienischen Klassiker mit einem “Spritzer” Olivenöl',
'ein selbst gebackenes Kürbiskernbrötchen','ein knuspriges Laugendreieck', 'ein selbst gebackenes Kürbiskernbrötchen','ein knuspriges Laugendreieck',
'eine Wagenladung voll Spritzgebäck','einen Döner mit Mais', 'eine Wagenladung voll Spritzgebäck','einen Döner mit Mais',
'eine ominöse grellgrüne Grütze','einen benutzten Teller', 'eine ominöse grellgrüne Grütze','einen benutzten Teller',
'Schlagsahne direkt aus der Sprühdose', 'Schlagsahne direkt aus der Sprühdose',
'ein Glas Erdnussbutter und einen Löffel', 'ein Glas Erdnussbutter und einen Löffel',
'einen halb gegessenen Pfannkuchen','eine völlig verkohlte Crème Brûlée', 'einen halb gegessenen Pfannkuchen','eine nicht ganz perfekte Crème Brûlée',
'eine Portion Thunfischsalat','eine rohe Knoblauchzehe', 'eine Portion Thunfischsalat','eine rohe Knoblauchzehe',
'eine Botschaft vom Weihnachtsmann (er ist enttäuscht von dir)', 'eine Botschaft vom Weihnachtsmann (er wünscht alles Gute)',
'Wok-Gemüse mit Udonnudeln','eine Schüssel Ramen mit einem Alibi-Ei', 'Wok-Gemüse mit Udonnudeln','eine Schüssel Ramen mit einem Alibi-Ei',
'eine Kringelbratwurst mit Gurkensalat','ein Stück Lasagne nach einem alten Rezept', 'eine Kringelbratwurst mit Gurkensalat','ein Stück Lasagne nach einem alten Rezept',
'die Reliquie eines unbekannten Heiligen','ein Stück Hochzeitstorte mit 2kg Fondant', 'die Reliquie eines unbekannten Heiligen','ein Stück Hochzeitstorte mit 2kg Fondant',
@@ -98,7 +98,7 @@ essen = [
'ein knuspriges Langos mit Salz und Öl','einen Spieß frisch gebackener Kartoffelchips mit Salz und Essig', 'ein knuspriges Langos mit Salz und Öl','einen Spieß frisch gebackener Kartoffelchips mit Salz und Essig',
'eine ganze Ananas','einen prall gefüllten Frühstücksburrito', 'eine ganze Ananas','einen prall gefüllten Frühstücksburrito',
'eine mehr oder weniger gelungene Weihnachtsgans','eine Handvoll getrocknete Früchte', 'eine mehr oder weniger gelungene Weihnachtsgans','eine Handvoll getrocknete Früchte',
'Gemüsestreifen mit Hummus-Dip','Bertie-Botts-Bohnen in nur den schlechten Geschmacksrichtungen', 'Gemüsestreifen mit Hummus-Dip','Bertie-Botts-Bohnen in den sonderbarsten Geschmacksrichtungen',
'drei brodelnde Kesselküchlein','eine Schale festklebender Bonbons aus Omas Schrank', 'drei brodelnde Kesselküchlein','eine Schale festklebender Bonbons aus Omas Schrank',
'Gourmet-Katzenfutter','ein Omelett mit Pilzen und Cheddar','eine Pizza Supreme mit gefülltem Rand', 'Gourmet-Katzenfutter','ein Omelett mit Pilzen und Cheddar','eine Pizza Supreme mit gefülltem Rand',
'zwei französische Tacos mit algerischer Soße','eine Packung Schokofrösche', 'zwei französische Tacos mit algerischer Soße','eine Packung Schokofrösche',
@@ -133,7 +133,7 @@ essen = [
'einen deckenhohen Stapel Pfannkuchen und eine Flasche Ahornsirup','einen gegrillten Gemüsespieß', 'einen deckenhohen Stapel Pfannkuchen und eine Flasche Ahornsirup','einen gegrillten Gemüsespieß',
'ein Panna Cotta mit Aprikosenkompott','eine knusprige Heuschrecke am Spieß', 'ein Panna Cotta mit Aprikosenkompott','eine knusprige Heuschrecke am Spieß',
'eine Schale liebevoll geschnittenes Obst','ein halbes Brötchen mit grober Leberwurst', 'eine Schale liebevoll geschnittenes Obst','ein halbes Brötchen mit grober Leberwurst',
'eine täuschend echte Rolle Toilettenpapier','eine große Auswahl an Sushi-Spezialitäten und etwas Sojasoße', 'eine täuschend echte Rolle Toilettenpapier, aber es ist Kuchen','eine große Auswahl an Sushi-Spezialitäten und etwas Sojasoße',
'eine schmackhafte Ingwerwurzel','eine Portion Süßkartoffelpommes mit Mango-Chutney','ein Ticket zum Mond', 'eine schmackhafte Ingwerwurzel','eine Portion Süßkartoffelpommes mit Mango-Chutney','ein Ticket zum Mond',
'eine gut abgeschmeckte Portion Kartoffeleintopf','eine Bockwurst mit Ketchup', 'eine gut abgeschmeckte Portion Kartoffeleintopf','eine Bockwurst mit Ketchup',
'einen Teller Eisbein mit Sauerkraut','eine Scheibe salzigen Kasseler','eine Portion Schmorgurken', 'einen Teller Eisbein mit Sauerkraut','eine Scheibe salzigen Kasseler','eine Portion Schmorgurken',
@@ -153,12 +153,11 @@ essen = [
'einen Teller Pasta Primaverda','eine heiße Ofenkartoffel','eine Pizza mit riesiger Ananasscheibe', 'einen Teller Pasta Primaverda','eine heiße Ofenkartoffel','eine Pizza mit riesiger Ananasscheibe',
'eine halbe Pizza frutti-di-mare mit extra Knoblauch','eine krachende Kaisersemmel', 'eine halbe Pizza frutti-di-mare mit extra Knoblauch','eine krachende Kaisersemmel',
'eine Packung gebratener Hühnerherzen','einen sofort die Flucht ergreifenden Tausendfüßler', 'eine Packung gebratener Hühnerherzen','einen sofort die Flucht ergreifenden Tausendfüßler',
'einen riesigen Königsberger Klops mit Kapernfüllung','ein verirrtes Silberfischchen', 'einen riesigen Königsberger Klops mit Kapernfüllung','einen unverständlichen Gruß aus der Küche',
'einen unverständlichen Gruß aus der Küche',
'ein schokoladiges Miniaturmodell des Sonnensystems mit Pluto als Kirsche','Gold, Weihrauch und Myrrhe', 'ein schokoladiges Miniaturmodell des Sonnensystems mit Pluto als Kirsche','Gold, Weihrauch und Myrrhe',
'den kulinarischen Epitaph des Küchenchefs','ein halsbrecherisches Stuntmanöver mit klapperndem Geschirr', 'den kulinarischen Epitaph des Küchenchefs','ein halsbrecherisches Stuntmanöver mit klapperndem Geschirr',
'einen nicht wie die Abbildung auf der Karte aussehenden Burger','einen echten Cheeseburger zum Mitnnehmen', 'einen nicht wie die Abbildung auf der Karte aussehenden Burger','einen echten Cheeseburger zum Mitnnehmen',
'gefälschten Kokoskuchen mit Hornhautraspel','ein Replikat der Fettecke','einen einzelnen angekokelten Marshmallow', 'gefälschten Kokoskuchen mit Hornhautraspel','ein Replikat der Fettecke','einen einzelnen karamellisierten Marshmallow',
'einen seltenen niederländischen Bergkäse','den Nuclear Football mit Gebrauchsanleitung', 'einen seltenen niederländischen Bergkäse','den Nuclear Football mit Gebrauchsanleitung',
'ein Schokoladentörtchen mit geschmolzenem Kern','eine Partypackung Salzstangen', 'ein Schokoladentörtchen mit geschmolzenem Kern','eine Partypackung Salzstangen',
'ein deftig belegtes Laugenbrötchen','zwei Fischfrikadellen mit Tomatensalat','die Reste der gestrigen Grillfeier', 'ein deftig belegtes Laugenbrötchen','zwei Fischfrikadellen mit Tomatensalat','die Reste der gestrigen Grillfeier',
@@ -172,9 +171,9 @@ essen = [
'eine überreife Banane mit braunen Stellen','einen fruchtigen Salat mit Honigmelone', 'eine überreife Banane mit braunen Stellen','einen fruchtigen Salat mit Honigmelone',
'eine ganze Aloe-Vera-Pflanze im Topf','ein Frühstücks-Abendessen', 'eine ganze Aloe-Vera-Pflanze im Topf','ein Frühstücks-Abendessen',
'die abgelaufene Srirachasoße aus dem Kühlschrank','einen Teller nordische Fischsuppe', 'die abgelaufene Srirachasoße aus dem Kühlschrank','einen Teller nordische Fischsuppe',
'ein frisches Matjesbrötchen','eine Dose Schwertfisch mit abgelaufenem Verfallsdatum', 'ein frisches Matjesbrötchen','eine Dose Schwertfisch mit kürzlich abgelaufenem Verfallsdatum',
'Kartoffelpuffer mit Apfelmus','Spinat mit gummiartigem Rührei','Spinat mit knusprigen Fischstäbchen', 'Kartoffelpuffer mit Apfelmus','Spinat mit gummiartigem Rührei','Spinat mit knusprigen Fischstäbchen',
'eine nervös machende tickende Taschenuhr','eine einzelne Bertie-Botts-Bohne mit Hundefuttergeschmack', 'eine tickende Taschenuhr','eine einzelne Bertie-Botts-Bohne mit Hundefuttergeschmack',
'eine Rolle Klebestreifen ohne findbaren Anfang','eine Schale duftender Fenchelsuppe', 'eine Rolle Klebestreifen ohne findbaren Anfang','eine Schale duftender Fenchelsuppe',
'eine Schale Fertigsalat aus dem Supermarkt','eine Schüssel Nudel-Rosenkohl-Eintopf','eine Schale Wrukeneintopf', 'eine Schale Fertigsalat aus dem Supermarkt','eine Schüssel Nudel-Rosenkohl-Eintopf','eine Schale Wrukeneintopf',
'eine glasierte Streuselschnecke','ein fruchtiger Mandarinenkuchen mit Teigstreuseln','ein Stück Fantakuchen', 'eine glasierte Streuselschnecke','ein fruchtiger Mandarinenkuchen mit Teigstreuseln','ein Stück Fantakuchen',
@@ -198,8 +197,8 @@ essen = [
'klassisch in Bierteig frittierte Fish`n Chips','ein Stilleben aus Wachs','eine Schale ungewürztes Erbsenpüree', 'klassisch in Bierteig frittierte Fish`n Chips','ein Stilleben aus Wachs','eine Schale ungewürztes Erbsenpüree',
'ein gegrilltes Hähnchen mit einer würzigen Tomaten-Curry-Soße','eine kaum Licht spendende Waltranfunsel', 'ein gegrilltes Hähnchen mit einer würzigen Tomaten-Curry-Soße','eine kaum Licht spendende Waltranfunsel',
'gedämpfte Miesmuscheln mit knusprigen Pommes','einen Geburtstagskuchen mit zu wenig Kerzen', 'gedämpfte Miesmuscheln mit knusprigen Pommes','einen Geburtstagskuchen mit zu wenig Kerzen',
'einen Human Body Part Cake','einen seltsam grünlich schimmernden Leberkäse','eine angebrochene Packung Oreos', 'einen seltsam grünlich schimmernden Leberkäse','eine angebrochene Packung Oreos',
'eine Eitrige mit einem Buckel und Krokodil','eine überraschende Wendung der Dinge','eine hinterlistige Intrige', 'ein Krokodil','eine überraschende Wendung der Dinge','eine dramatische Intrige',
'einen geheimnisvollen Schlüssel unter einer Speiseglocke','einen Rücktrittsbrief des Papstes', 'einen geheimnisvollen Schlüssel unter einer Speiseglocke','einen Rücktrittsbrief des Papstes',
'ein unlösbares Rätsel','das Leibgericht von Theodore Roosevelt','die Bestellung des Sitznachbarn', 'ein unlösbares Rätsel','das Leibgericht von Theodore Roosevelt','die Bestellung des Sitznachbarn',
'ein saftiges Elchsteak mit Rotkohl','eine intergalaktische Spezialität','ein Rezept und passende Zutaten', 'ein saftiges Elchsteak mit Rotkohl','eine intergalaktische Spezialität','ein Rezept und passende Zutaten',
@@ -211,32 +210,32 @@ essen = [
'eine Packung Proteinpulver und Wasser','eine Pizza ohne Rand','eine aufgeklappte Calzone', 'eine Packung Proteinpulver und Wasser','eine Pizza ohne Rand','eine aufgeklappte Calzone',
'eine Pizza mit ausschließlich Rand','ein Haar in der Suppe','vier Töpfe cremiger Muschelsuppe', 'eine Pizza mit ausschließlich Rand','ein Haar in der Suppe','vier Töpfe cremiger Muschelsuppe',
'eine Portion Rindfleisch und Brokkoli','ein von Javier Milei mit der Motorsäge zurechtgeschnittenes Beefsteak', 'eine Portion Rindfleisch und Brokkoli','ein von Javier Milei mit der Motorsäge zurechtgeschnittenes Beefsteak',
'ein closed-faced Sandwich','etwas Stroh und eine Maske','ein open-faced Sandwich', 'ein closed-faced Sandwich','ein open-faced Sandwich',
'einen auslaufenden Kautschukbaum','Sägespäne mit knuspriger Baumrinde','eine gleißend helle Sonne', 'einen auslaufenden Kautschukbaum','Sägespäne mit knuspriger Baumrinde','eine gleißend helle Sonne',
'ein Stück Sägespänekuchen','Lammbraten mit Minzsoße','einen strikten Diätplan', 'ein Stück Sägespänekuchen','Lammbraten mit Minzsoße',
'ein ambitioniertes Trainingsprogramm','einen straffen Tagesplan','einen Teller Englische Scones mit Marmelade', 'ein ambitioniertes Trainingsprogramm','einen straffen Tagesplan','einen Teller Englische Scones mit Marmelade',
'eine Portion Kanadische Poutine','einen Pfälzer Saumagen auf Sauerkraut','eine Packung knusprige Käsestangen', 'eine Portion Kanadische Poutine','einen Pfälzer Saumagen auf Sauerkraut','eine Packung knusprige Käsestangen',
'zwei Körbe fettiger Pizzabrötchen','eine Freikarte für einen sich im Niedergang befindenden Zirkus', 'zwei Körbe fettiger Pizzabrötchen','eine Freikarte für einen sich im Niedergang befindenden Zirkus',
'einen ganzen Baumkuchen','ein Bündel Scheine','einen verdächtig stinkenden Fischburger', 'einen ganzen Baumkuchen','ein Bündel Scheine','einen Fischburger',
'einen doppelten Hamburger mit extra Käse','einen blinden Handspiegel','Dornröschens Spindel', 'einen doppelten Hamburger mit extra Käse','einen blinden Handspiegel','Dornröschens Spindel',
'eine Liste mit Restaurants in der Nähe','die Bremer Stadtmusikanten','ein Töpfchen mit endlosem süßen Brei', 'eine Liste mit Restaurants in der Nähe','die Bremer Stadtmusikanten','ein Töpfchen mit endlosem süßen Brei',
'ein Stück frische Honigwabe','einen Teller Rote-Beete-Suppe mit saurer Sahne', 'ein Stück frische Honigwabe','einen Teller Rote-Beete-Suppe mit saurer Sahne',
'einen Salzstreuer mit perfide abgeschraubtem Deckel','zwölf knusprige Chicken-Wings', 'einen Salzstreuer mit fast abgeschraubtem Deckel','zwölf knusprige Chicken-Wings',
'ein großes Lachsfilet mit knuspriger Haut','ein fest geschlossenes Glas Mayonnaise', 'ein großes Lachsfilet mit knuspriger Haut','ein fest geschlossenes Glas Mayonnaise',
'aufgetauten Kuchen vom letzten Jahr','ein Lebkuchenhaus mit eingestürztem Dach','ein Stück Lebkuchen-Kuchen', 'aufgetauten Kuchen vom letzten Jahr','ein Lebkuchenhaus mit eingestürztem Dach','ein Stück Lebkuchen-Kuchen',
'auf offenem Feuer zubereitetes Bulgogi','den Orden pour le Mérite','eine billige Imitation vom Goldenen Vlies', 'auf offenem Feuer zubereitetes Bulgogi','den Orden pour le Mérite','eine billige Imitation vom Goldenen Vlies',
'das bei Alfred Biolek von Blixa Bargeld gekochte Risotto','das legendenumwobene Stück eines italienischen Rinds', 'das bei Alfred Biolek von Blixa Bargeld gekochte Risotto','das legendenumwobene Stück eines italienischen Rinds',
'einen Rasenziegel','eine Mütze Schlaf','eine Portion Obatzter','eine Raffaello-Torte', 'einen Rasenziegel','eine Mütze Schlaf','eine Portion Obatzter','eine Raffaello-Torte',
'einen Tortenheber ohne Torte weit und breit','einen alten ledrigen linken Stiefel','eine Büste von Karl Marx', 'einen Tortenheber ohne Torte weit und breit','einen alten ledrigen linken Stiefel','eine Büste von Karl Marx',
'Kartoffelpüree aus der Tüte','eine ganze Zitrone','ein Fragment vom Elefantenfuß in Tschernobyl', 'Kartoffelpüree aus der Tüte','eine ganze Zitrone','eine Schale Elefantencreme',
'geschichteten Schokopudding mit Waldbeeren','eine Mao-Bibel','zwei Stücke Champignon-Spinat-Lasagne', 'geschichteten Schokopudding mit Waldbeeren','eine Mao-Bibel','zwei Stücke Champignon-Spinat-Lasagne',
'eine Schale Haferbrei mit Honig','eine Schale Chiapudding mit Mango','eine weiche Birne','eine einzelne Walnuss', 'eine Schale Haferbrei mit Honig','eine Schale Chiapudding mit Mango','eine weiche Birne','eine einzelne Walnuss',
'eine sich in seinen Haaren verfangene Fledermaus','einen Hauch von Verachtung für die niederen Dinge im Leben', 'eine sich in seinen Haaren verfangene Fledermaus','einen Hauch von Verachtung für die niederen Dinge im Leben',
'eine Portion Reis mit Hühnerfrikassee','Jasminreis mit gedünstetem Kaisergemüse', 'eine Portion Reis mit Hühnerfrikassee','Jasminreis mit gedünstetem Kaisergemüse',
'das Herz eines gemeinsamen Feindes','eine Warnung','die Totenmaske des Tutanchamun', 'ein Brief eines gemeinsamen Feindes','eine Warnung','die Totenmaske des Tutanchamun',
'einen Brief von Hogwarts in grüner Tinte','drei westafrikanische Kichererbsenfrikadellen', 'einen Brief von Hogwarts in grüner Tinte','drei westafrikanische Kichererbsenfrikadellen',
'einen Hornissenschwarm unter einer Käseglocke','gebackene Bananenbällchen mit Honig','billiges Sushi', 'gebackene Bananenbällchen mit Honig','billiges Sushi',
'eine Auswahl an winterlichen Gebäcken','ein Ohr von Vincent van Gogh','Sommerrollen mit Teriyaki-Sauce', 'eine Auswahl an winterlichen Gebäcken','Sommerrollen mit Teriyaki-Sauce',
'einen duftenden Bratapfel','dreizehn üppige Zimtschnecken','selbstgemachte Tacos mit Ortega-Soße', 'einen duftenden Bratapfel','dreizehn üppige Zimtschnecken','selbstgemachte Tacos mit Ortega-Soße',
'eine Schale geriebenen Gouda','überbackenes Toast Hawaii','einige Stücke russischen Zupfkuchen', 'eine Schale geriebenen Gouda','überbackenes Toast Hawaii','einige Stücke russischen Zupfkuchen',
'gezuckerte Krapfen','eine heiße Apfeltasche','eine gigantische knusprige Krokette', 'gezuckerte Krapfen','eine heiße Apfeltasche','eine gigantische knusprige Krokette',
@@ -281,10 +280,9 @@ essen = [
'einige harte Salzkaramell-Bonbons','Mokka-Eiscreme mit einem klitzebisschen Pistazie', 'einige harte Salzkaramell-Bonbons','Mokka-Eiscreme mit einem klitzebisschen Pistazie',
'nicht weniger als zwanzig Semmelknödel','einen klobig-klebrigen Proteinriegel','das Antlitz der Fata Morgana', 'nicht weniger als zwanzig Semmelknödel','einen klobig-klebrigen Proteinriegel','das Antlitz der Fata Morgana',
'einen dreckigen Deal','ein einschneidendes Erfolgserlebnis','einen Berg fettige Ringelpommes', 'einen dreckigen Deal','ein einschneidendes Erfolgserlebnis','einen Berg fettige Ringelpommes',
'eine meterlange Gurkenspirale','eine Schale fein pürierter Selbstkontrolle','Nougat in Form von Meeresfrüchten', 'eine meterlange Gurkenspirale','Nougat in Form von Meeresfrüchten',
'einen Topf Matzah-Ball-Suppe','einen Laib geflochtenes Challah','eine XXL-Packung Merci', 'einen Topf Matzah-Ball-Suppe','einen Laib geflochtenes Challah','eine XXL-Packung Merci',
'Pekingente mit Hoisin-Sauce', 'Pekingente mit Hoisin-Sauce',
] ]