From 1d8e221078cfa17c5ef7fe6e7d8f39be3e213160 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:15:42 +0200 Subject: [PATCH 01/16] =?UTF-8?q?Essen-Liste=20etwas=20=C3=BCberarbeiten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- essen.py | 52 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/essen.py b/essen.py index fe24843..c33cb5e 100644 --- a/essen.py +++ b/essen.py @@ -47,30 +47,30 @@ essen = [ 'einen Teller selbstgedrehte Zucchini-Nudeln', 'mildes Möhrenmischmasch','gegrillten Kürbis','knusprige Frühlingsrollen mit Dip', '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', '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', 'drei Stücke traurige trockene Torte','Wassermelonensalat in einer ausgehöhlten Wassermelone', 'das feingemahlene Horn eines Narwals','einen Tuppen Gänseschmalz ohne Salz', - 'das Leid der Vorväter','abgelaufenes Knäckebrot, das nicht mehr knackt', - 'einen runderneuerten Obstkuchen mit einer Hundertschaft Obstfliegen', + 'abgelaufenes Knäckebrot, das nicht mehr knackt', + 'einen runderneuerten Obstkuchen mit upgegradeten Erdbeeren', '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', - 'einen Hilferuf des Küchenlehrlings', + 'einen Gruß des Küchenlehrlings', 'einen Klumpen Teig, der an einen Kuchen erinnert,','gefüllte Chocolate-Chip-Cookies', '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', 'ein selbst gebackenes Kürbiskernbrötchen','ein knuspriges Laugendreieck', 'eine Wagenladung voll Spritzgebäck','einen Döner mit Mais', 'eine ominöse grellgrüne Grütze','einen benutzten Teller', 'Schlagsahne direkt aus der Sprühdose', '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 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', 'eine Kringelbratwurst mit Gurkensalat','ein Stück Lasagne nach einem alten Rezept', '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', 'eine ganze Ananas','einen prall gefüllten Frühstücksburrito', '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', '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', @@ -133,7 +133,7 @@ essen = [ 'einen deckenhohen Stapel Pfannkuchen und eine Flasche Ahornsirup','einen gegrillten Gemüsespieß', 'ein Panna Cotta mit Aprikosenkompott','eine knusprige Heuschrecke am Spieß', '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 gut abgeschmeckte Portion Kartoffeleintopf','eine Bockwurst mit Ketchup', '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', 'eine halbe Pizza frutti-di-mare mit extra Knoblauch','eine krachende Kaisersemmel', 'eine Packung gebratener Hühnerherzen','einen sofort die Flucht ergreifenden Tausendfüßler', - 'einen riesigen Königsberger Klops mit Kapernfüllung','ein verirrtes Silberfischchen', - 'einen unverständlichen Gruß aus der Küche', + 'einen riesigen Königsberger Klops mit Kapernfüllung','einen unverständlichen Gruß aus der Küche', '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', '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', 'ein Schokoladentörtchen mit geschmolzenem Kern','eine Partypackung Salzstangen', '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 ganze Aloe-Vera-Pflanze im Topf','ein Frühstücks-Abendessen', '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', - '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 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', @@ -198,8 +197,8 @@ essen = [ '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', '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', - 'eine Eitrige mit einem Buckel und Krokodil','eine überraschende Wendung der Dinge','eine hinterlistige Intrige', + 'einen seltsam grünlich schimmernden Leberkäse','eine angebrochene Packung Oreos', + 'ein Krokodil','eine überraschende Wendung der Dinge','eine dramatische Intrige', '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 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 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', - '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', - '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', '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', - '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', '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', - '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', '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', '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 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','ein Schale Elefantencreme', '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 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', - '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 Hornissenschwarm unter einer Käseglocke','gebackene Bananenbällchen mit Honig','billiges Sushi', - 'eine Auswahl an winterlichen Gebäcken','ein Ohr von Vincent van Gogh','Sommerrollen mit Teriyaki-Sauce', + 'gebackene Bananenbällchen mit Honig','billiges Sushi', + 'eine Auswahl an winterlichen Gebäcken','Sommerrollen mit Teriyaki-Sauce', 'einen duftenden Bratapfel','dreizehn üppige Zimtschnecken','selbstgemachte Tacos mit Ortega-Soße', 'eine Schale geriebenen Gouda','überbackenes Toast Hawaii','einige Stücke russischen Zupfkuchen', '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', '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', - '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', 'Pekingente mit Hoisin-Sauce', - ] From 388809b145988f9bf0173c653df900c7bc250606 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:37:23 +0200 Subject: [PATCH 02/16] fix typo --- essen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/essen.py b/essen.py index c33cb5e..0a2ff53 100644 --- a/essen.py +++ b/essen.py @@ -227,7 +227,7 @@ essen = [ '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 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 Schale Elefantencreme', + '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', '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', From af44c49eb137a6d5cd5f4226763fc2db7a1451f3 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Fri, 2 Aug 2024 23:31:15 +0200 Subject: [PATCH 03/16] build a dict once with icd10 codes instead of reopening and scanning the file for every code --- .../Modules/CustomUserModules/ICDObserver.py | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/FaustBot/Modules/CustomUserModules/ICDObserver.py b/FaustBot/Modules/CustomUserModules/ICDObserver.py index 83dca33..d69aaa9 100644 --- a/FaustBot/Modules/CustomUserModules/ICDObserver.py +++ b/FaustBot/Modules/CustomUserModules/ICDObserver.py @@ -6,6 +6,12 @@ from FaustBot.Modules.PrivMsgObserverPrototype import 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 def cmd(): return None @@ -14,27 +20,18 @@ class ICDObserver(PrivMsgObserverPrototype): def help(): 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): - if data['channel'] != connection.details.get_channel(): - return - regex = r'\b(\w\d{2}\.?\d?\d?)\b' - codes = re.findall(regex, data['message']) - for code in codes: - code = code.capitalize() - text = self.get_icd(code) - if text == 0: - if code.find('.') != -1: - code += '-' - else: - code += '.-' - text = self.get_icd(code) - if text != 0: - connection.send_back(text, data) + if data["channel"] == connection.details.get_channel(): + regex = r"\b(\w\d{2}\.?\d?\d?)\b" + codes = re.findall(regex, data["message"]) + for code in codes: + code = code.capitalize() + text = self.icd10_dict.get(code, False) + if text == False: + if "." in code: + code += "-" + else: + code += ".-" + text = self.icd10_dict.get(code, False) + if text: + connection.send_back(f"{code} - {text}", data) From 1902a8342f91a8c77cfd9d22057edf4aa932de6b Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Fri, 2 Aug 2024 23:32:10 +0200 Subject: [PATCH 04/16] modmail f-string + only react when startswith. --- .../Modules/CustomUserModules/ModmailObserver.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/FaustBot/Modules/CustomUserModules/ModmailObserver.py b/FaustBot/Modules/CustomUserModules/ModmailObserver.py index c38aabb..060ea9b 100644 --- a/FaustBot/Modules/CustomUserModules/ModmailObserver.py +++ b/FaustBot/Modules/CustomUserModules/ModmailObserver.py @@ -12,10 +12,9 @@ class ModmailObserver(PrivMsgObserverPrototype): return ".modmail - Sendet allen Moderatoren per PN" def update_on_priv_msg(self, data, connection: Connection): - if data['message'].find('.modmail') == -1: - return - mods = connection.details.get_mods() - print(mods) - message = data['message'].split('.modmail ')[1] - for mod in mods: - connection.send_to_user(mod, data['nick'] + ' meldet: ' + message) + if data["message"].startswith(".modmail"): + mods = connection.details.get_mods() + print(mods) + message = data["message"].split(".modmail ")[1] + for mod in mods: + connection.send_to_user(mod, f"{data['nick']} meldet: {message}") From b2cef2da94383ab8d00914e843f632f445c4cfd3 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Fri, 2 Aug 2024 23:42:32 +0200 Subject: [PATCH 05/16] bumb python requirement for format-string mainly --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 549b1f6..bd1abce 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Designed for non-technical channels ## Usage ### Requirements - - Python 3.5 + - Python 3.8+ - pip - wikipedia package (can be installed using pip; tested with version 1.4.0) - virtualenv (optional) From 3e289134f957cefcf12595cb49406750338dcb8a Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 00:04:23 +0200 Subject: [PATCH 06/16] .character f-string + startswith --- FaustBot/Modules/CharactersCountObserver.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/FaustBot/Modules/CharactersCountObserver.py b/FaustBot/Modules/CharactersCountObserver.py index 68f95bd..824e34b 100644 --- a/FaustBot/Modules/CharactersCountObserver.py +++ b/FaustBot/Modules/CharactersCountObserver.py @@ -1,5 +1,3 @@ -import datetime - from FaustBot.Communication.Connection import Connection from FaustBot.Model.UserProvider import UserProvider from FaustBot.Modules.PrivMsgObserverPrototype import PrivMsgObserverPrototype @@ -15,8 +13,7 @@ class CharactersCountObserver(PrivMsgObserverPrototype): return ".characters - um abzufragen wieviel du bisher geschrieben hast." def update_on_priv_msg(self, data, connection: Connection): - if data['message'].find('.characters') == -1: - return - user_provider = UserProvider() - output = data['nick']+": du hast "+str(user_provider.get_characters(data['nick']))+ " Zeichen geschrieben." - connection.send_back(output, data) + if data["message"].startswith(".characters"): + user_provider = UserProvider() + output = f"{data['nick']}: du hast {str(user_provider.get_characters(data['nick']))} Zeichen geschrieben." + connection.send_back(output, data) From 2e55e974923e114827deb7c1240f0128b42d9e9d Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 00:44:41 +0200 Subject: [PATCH 07/16] Config.py: remove unnessary manual newline remove (strip does that), split each config.txt line only once, so that : works in values. --- FaustBot/Model/Config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FaustBot/Model/Config.py b/FaustBot/Model/Config.py index aaebafa..32a011f 100644 --- a/FaustBot/Model/Config.py +++ b/FaustBot/Model/Config.py @@ -26,9 +26,9 @@ class Config(object): if not append: self._config_dict = {} for l in f.readlines(): - kv_pair = l.split(':') + kv_pair = l.split(':', 1) 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(',') self._config_dict['mods'] = [] for mod in mods: @@ -86,4 +86,4 @@ class Config(object): @property def first_greeting(self): - return self._config_dict['first_greeting'] \ No newline at end of file + return self._config_dict['first_greeting'] From 2c01a0b7cb1d792f9eb686218b8e21ebe3c2a33e Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 00:46:13 +0200 Subject: [PATCH 08/16] Add "template" support for first-greet to put the nickname into the greeting instead of only at the end --- FaustBot/Modules/First_Greeter.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/FaustBot/Modules/First_Greeter.py b/FaustBot/Modules/First_Greeter.py index b1d9f6c..80a2b94 100644 --- a/FaustBot/Modules/First_Greeter.py +++ b/FaustBot/Modules/First_Greeter.py @@ -2,6 +2,8 @@ from FaustBot.Communication.Connection import Connection from FaustBot.Modules.JoinObserverPrototype import JoinObserverPrototype from FaustBot.Model.UserProvider import UserProvider from time import sleep + + class First_Greeter(JoinObserverPrototype): """ A Class only reacting to pings @@ -20,12 +22,15 @@ class First_Greeter(JoinObserverPrototype): self.first_greeting = greeting def update_on_join(self, data, connection: Connection): - if data['channel'] == connection.details.get_channel(): - if data['nick'].find("Guest") != -1: + if data["channel"] == connection.details.get_channel(): + new_nick = data["nick"] + if ( + new_nick.startswith("Guest") + or UserProvider().get_characters(new_nick) < 100 + ): sleep(20) - connection.send_back(self.first_greeting + " " + data['nick'], data) - return - UProvider= UserProvider() - if(UProvider.get_characters(data['nick'])) < 100: - sleep(20) - connection.send_back(self.first_greeting + " " + data['nick'], data) \ No newline at end of file + if "{NICK}" in self.first_greeting: + greeting = self.first_greeting.replace("{NICK}", new_nick) + else: + greeting = f"{self.first_greeting} {new_nick}" + connection.send_back(greeting, data) From 41621ad635850be7189812ec4e07b3a28e0ea0fd Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:09:46 +0200 Subject: [PATCH 09/16] allow Greeter to use NICK within responses. e.g. "Hello X, nice to see you" --- FaustBot/Modules/Greeter.py | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/FaustBot/Modules/Greeter.py b/FaustBot/Modules/Greeter.py index 712bf07..ffe559f 100644 --- a/FaustBot/Modules/Greeter.py +++ b/FaustBot/Modules/Greeter.py @@ -4,15 +4,17 @@ from FaustBot.Model.UserProvider import UserProvider import time from collections import defaultdict + class Greeter(JoinObserverPrototype): """ A Class only reacting to pings """ greetings_dict = defaultdict(str) - greetings_dict['Luci'] = "Hewuu" - greetings_dict['pome'] = "Hewuu" - greetings_dict['Skadi'] = "Awoo" + greetings_dict["Luci"] = "Hewuu" + greetings_dict["pome"] = "Hewuu" + greetings_dict["Skadi"] = "Awoo {NICK}!" + @staticmethod def cmd(): return None @@ -27,17 +29,21 @@ class Greeter(JoinObserverPrototype): self.greeting = greeting def update_on_join(self, data, connection: Connection): - if data['channel'] == connection.details.get_channel(): - if data['nick'].find("Guest") != -1: + if data["channel"] == connection.details.get_channel(): + joined_user = data["nick"] + if ( + joined_user.startswith("Guest") + or UserProvider().get_characters(joined_user) < 100 + ): 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()) \ No newline at end of file + 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()) From 55e09acff31850a04656295de9f3655b1c7889bc Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:16:25 +0200 Subject: [PATCH 10/16] =?UTF-8?q?.hug=20f-string=20and=20hug-variations=20?= =?UTF-8?q?(added=20umarmt=20und=20dr=C3=BCckt)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FaustBot/Modules/FreeHugsObserver.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/FaustBot/Modules/FreeHugsObserver.py b/FaustBot/Modules/FreeHugsObserver.py index 78f4787..67bf96e 100644 --- a/FaustBot/Modules/FreeHugsObserver.py +++ b/FaustBot/Modules/FreeHugsObserver.py @@ -1,3 +1,5 @@ +import random + from FaustBot.Communication import Connection from FaustBot.Modules.PrivMsgObserverPrototype import PrivMsgObserverPrototype @@ -12,6 +14,6 @@ class FreeHugsObserver(PrivMsgObserverPrototype): return ".hug - verteilt Umarmungen" def update_on_priv_msg(self, data: dict, connection: Connection): - if data['message'].find('.hug') == -1: - return - connection.send_back('\001ACTION knuddelt ' + data['nick'] + '.\001', data) + if data["message"].startswith(".hug"): + hug_word = random.choice(["umarmt", "knuddelt", "drückt"]) + connection.send_back(f"\001ACTION {hug_word} {data['nick']}.\001", data) From bb8751ed7fffdff435aad0bfe82d769ad0910805 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:18:42 +0200 Subject: [PATCH 11/16] .cookie f-string + startswith --- FaustBot/Modules/GiveCookieObserver.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/FaustBot/Modules/GiveCookieObserver.py b/FaustBot/Modules/GiveCookieObserver.py index 93933aa..08694a0 100644 --- a/FaustBot/Modules/GiveCookieObserver.py +++ b/FaustBot/Modules/GiveCookieObserver.py @@ -15,6 +15,7 @@ class GiveCookieObserver(PrivMsgObserverPrototype): return ".cookie - verteilt Kekse; oder auch nicht" def update_on_priv_msg(self, data: dict, connection: Connection): - if data['message'].find('.cookie') == -1: - return - connection.send_back('\001ACTION schenkt ' + data['nick'] + ' ' + random.choice(kekse) + '.\001', data) + if data["message"].startswith(".cookie"): + connection.send_back( + f"\001ACTION schenkt {data['nick']} {random.choice(kekse)}.\001", data + ) From 5b5eb2b7eaf021bd227062853d91cba93432abf8 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:24:58 +0200 Subject: [PATCH 12/16] .give f-string and servier-fluff-text revert --- FaustBot/Modules/GiveDrinkToObserver.py | 32 ++++++++++--------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/FaustBot/Modules/GiveDrinkToObserver.py b/FaustBot/Modules/GiveDrinkToObserver.py index fddf364..647911d 100644 --- a/FaustBot/Modules/GiveDrinkToObserver.py +++ b/FaustBot/Modules/GiveDrinkToObserver.py @@ -11,17 +11,12 @@ from snacks import snacks from kekse import kekseGoodOnes -def _servier(receiver,item,requester): - fluff_text = [" ohne zu kleckern",""," mit Begeisterung","",""," nach einer substantiellen Wartezeit"] - return "\001ACTION serviert {0} {1}{2}. Schöne Grüße von {3}\001".format( - receiver,item,random.choice(fluff_text),requester - ) +def _servier(receiver, item, requester): + return f"\001ACTION serviert {receiver} {item}. Schöne Grüße von {requester}\001" -def _schenk(receiver,item,requester): - return "\001ACTION schenkt {0} {1} ein. Schöne Grüße von {2}\001".format( - receiver,item,requester - ) +def _schenk(receiver, item, requester): + return f"\001ACTION schenkt {receiver} {item} ein. Schöne Grüße von {requester}\001" non_good_serveables = getraenke + essen + icecream + giveextras + snacks @@ -36,11 +31,11 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype): def help(): return ".give NUTZER - serviert jemand anderem Getränke oder Snacks" - def update_on_priv_msg(self,data ,connection: Connection): - if data["message"].find(".give") == -1: + def update_on_priv_msg(self, data, connection: Connection): + if not data["message"].startswith(".give"): return receiver = type = None - message_parts = data["message"].split() + message_parts = data["messageCaseSensitive"].split() if len(message_parts) >= 2: receiver = message_parts[1] if len(message_parts) >= 3: @@ -48,7 +43,7 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype): if receiver is None: return requester = data["nick"].lower() - if receiver == requester: + if receiver.lower() == requester: if type == "kaffee": connection.send_back("Fehler 418: Ich bin eine Teekanne",data) else: @@ -57,7 +52,7 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype): if type is None: connection.send_back(_schenk(receiver,random.choice(getraenkegoodones),requester),data) return - if type in ["drink","food","cookie","snack","massage","ice"]: + if type in ["drink", "food", "cookie", "snack", "massage", "ice"]: if type == "drink": connection.send_back(_schenk(receiver,random.choice(getraenke),requester),data) elif type == "food": @@ -70,9 +65,8 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype): connection.send_back(_servier(receiver,random.choice(icecream),requester),data) elif type == "massage": connection.send_back( - "\001ACTION knetet {0} feste den Rücken durch. {1} meinte ich solle dir was Gutes tun.\001".format( - receiver,requester - ),data + f"\001ACTION knetet {receiver} feste den Rücken durch. {requester} meinte ich solle dir was Gutes tun.\001", + data, ) return matchingGoodDrinks = [drink for drink in getraenkegoodones if type in drink.lower()] @@ -86,7 +80,5 @@ class GiveDrinkToObserver(PrivMsgObserverPrototype): return connection.send_back( - "Tut mir leid {0}, {1} haben wir nicht auf der Karte!".format( - requester,type - ),data + f"Tut mir leid {requester}, {type} haben wir nicht auf der Karte!", data ) From 31a0ef5153d0f74920b9c2b97e4afbd9b7dda46e Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:35:26 +0200 Subject: [PATCH 13/16] self-serve-foods with startswith and f-strings --- FaustBot/Modules/GiveDrinkObserver.py | 8 +++++--- FaustBot/Modules/GiveFoodObserver.py | 8 +++++--- FaustBot/Modules/GiveIceObserver.py | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/FaustBot/Modules/GiveDrinkObserver.py b/FaustBot/Modules/GiveDrinkObserver.py index 8132c64..fcbbecd 100644 --- a/FaustBot/Modules/GiveDrinkObserver.py +++ b/FaustBot/Modules/GiveDrinkObserver.py @@ -15,6 +15,8 @@ class GiveDrinkObserver(PrivMsgObserverPrototype): return ".drink - schenkt Getränke aus" def update_on_priv_msg(self, data: dict, connection: Connection): - if data['message'].find('.drink') == -1: - return - connection.send_back('\001ACTION schenkt ' + data['nick'] + ' ' + random.choice(getraenke) + ' ein.\001', data) + if data["message"].startswith(".drink"): + connection.send_back( + f"\001ACTION schenkt {data.get('nick')} {random.choice(getraenke)} ein.\001", + data, + ) diff --git a/FaustBot/Modules/GiveFoodObserver.py b/FaustBot/Modules/GiveFoodObserver.py index d306bc6..5e69ce2 100644 --- a/FaustBot/Modules/GiveFoodObserver.py +++ b/FaustBot/Modules/GiveFoodObserver.py @@ -15,6 +15,8 @@ class GiveFoodObserver(PrivMsgObserverPrototype): return ".food - gibt etwas zu essen aus" def update_on_priv_msg(self, data: dict, connection: Connection): - if data['message'].find('.food') == -1: - return - connection.send_back('\001ACTION tischt ' + data['nick'] + ' ' + random.choice(essen) + ' auf.\001', data) + if data["message"].startswith(".food"): + connection.send_back( + f"\001ACTION tischt {data['nick']} {random.choice(essen)} auf.\001", + data, + ) diff --git a/FaustBot/Modules/GiveIceObserver.py b/FaustBot/Modules/GiveIceObserver.py index 2b541a8..f141e91 100644 --- a/FaustBot/Modules/GiveIceObserver.py +++ b/FaustBot/Modules/GiveIceObserver.py @@ -15,6 +15,8 @@ class GiveIceObserver(PrivMsgObserverPrototype): return ".ice - serviert Eis" def update_on_priv_msg(self, data: dict, connection: Connection): - if data['message'].find('.ice') == -1: - return - connection.send_back('\001ACTION serviert ' + data['nick'] + ' ' + random.choice(icecream) + '.\001', data) + if data["message"].startswith(".ice"): + connection.send_back( + f"\001ACTION serviert {data['nick']} {random.choice(icecream)}.\001", + data, + ) From 5854f28869d48f83322c315f3f1bfa5722368536 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:41:25 +0200 Subject: [PATCH 14/16] update .seen: f-strings and answer "noch nicht gesehen" instead of 1970. --- FaustBot/Modules/SeenObserver.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/FaustBot/Modules/SeenObserver.py b/FaustBot/Modules/SeenObserver.py index da7b501..e8b704f 100644 --- a/FaustBot/Modules/SeenObserver.py +++ b/FaustBot/Modules/SeenObserver.py @@ -15,18 +15,19 @@ class SeenObserver(PrivMsgObserverPrototype): return ".seen - um abzufragen wann zuletzt hier war" def update_on_priv_msg(self, data, connection: Connection): - if data['message'].find('.seen ') == -1: - return - if not self._is_idented_mod(data, connection): - return - who = data['message'].split(' ')[1] - user_provider = UserProvider() - 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 not self._is_idented_mod(data, connection): - connection.send_channel(output) - return - connection.send_back(output, data) + if data["message"].startswith(".seen ") and self._is_idented_mod( + data, connection + ): + who = data["message"].split(" ")[1] + + user_provider = UserProvider() + activity = user_provider.get_activity(who) + if activity == 0: + output = f"{data['nick']}: Ich habe {who} noch nicht gesehen." + else: + 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) def _is_idented_mod(self, data: dict, connection: Connection): - return data['nick'] in self._config.mods and connection.is_idented(data['nick']) \ No newline at end of file + return data["nick"] in self._config.mods and connection.is_idented(data["nick"]) From ea1dbc47e359aabf869c4d6ba6cd113defe6ecc7 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:43:01 +0200 Subject: [PATCH 15/16] snack startswith + f-string --- FaustBot/Modules/SnacksObserver.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/FaustBot/Modules/SnacksObserver.py b/FaustBot/Modules/SnacksObserver.py index f77907c..29735ea 100644 --- a/FaustBot/Modules/SnacksObserver.py +++ b/FaustBot/Modules/SnacksObserver.py @@ -15,6 +15,7 @@ class SnacksObserver(PrivMsgObserverPrototype): return ".snack - teilt Snacks aus" def update_on_priv_msg(self, data: dict, connection: Connection): - if data['message'].find('.snack') == -1: - return - connection.send_back('\001ACTION serviert ' + data['nick'] + ' ' + random.choice(snacks) + '.\001', data) + if data["message"].startswith(".snack"): + connection.send_back( + f"\001ACTION serviert {data['nick']} {random.choice(snacks)}.\001", data + ) From e2d8e05ab553cdb8732e598a7e3fa6e8eff408c1 Mon Sep 17 00:00:00 2001 From: Context 77 <126421199+ctx77@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:46:23 +0200 Subject: [PATCH 16/16] fstrings for titleObs --- FaustBot/Modules/TitleObserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FaustBot/Modules/TitleObserver.py b/FaustBot/Modules/TitleObserver.py index 10e91bf..1dac8ec 100644 --- a/FaustBot/Modules/TitleObserver.py +++ b/FaustBot/Modules/TitleObserver.py @@ -76,7 +76,7 @@ class TitleObserver(PrivMsgObserverPrototype): else: # with open("content.html", "w") as file: # 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 = title.replace("\n", " ").replace("\r", "") @@ -84,5 +84,5 @@ class TitleObserver(PrivMsgObserverPrototype): title = title.replace(">", ">") title = title.replace("&", "&") if title == "": - raise Exception("Empty Title for {}".format(url)) + raise Exception(f"Empty Title for {url}") return title