From 05e934dd661e47f638e51757b797bca497ae148d Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 18 Jun 2026 00:06:57 +0200 Subject: [PATCH] feat: #out detection sets category=ausverkauft + Spieltitel-Extraktion - WhatsApp-Webhook: Neue Nachrichten mit #out setzen category='ausverkauft', Spieltitel wird nach #out extrahiert (abgeschnitten an Satzzeichen/Trennern) - Thread-Append: #out in Folgenachrichten aktualisiert category + spiel_titel - Web-Form-Submit: #out im Text setzt category='ausverkauft' + extrahiert Titel - Fix: lokales 'import re' in api_submit entfernt (globale 're' reicht) - Frontend: Filter-Dropdown zeigt 'ausverkauft' dynamisch, Badge auf Karten + Detailseite --- app.py | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 596512b..7367e1d 100644 --- a/app.py +++ b/app.py @@ -596,6 +596,14 @@ def whatsapp_webhook(): else: content = f"[{msg_type}]" + # #out detection: set category to "ausverkauft" and extract game title + if "#out" in content.lower(): + category_override = "ausverkauft" + idx = content.lower().find("#out") + after = content[idx + 4:].strip() + if after: + spiel_titel = re.split(r'[.!?\n]| - | – | — | ist | war | in ', after, maxsplit=1)[0].strip()[:200] + # GDPR: "Meine Daten löschen" trigger if msg_type == "text" and content.strip().lower() == "meine daten löschen": _gdpr_delete_sender(db, sender_id) @@ -649,6 +657,17 @@ def whatsapp_webhook(): "UPDATE submissions SET content=?, halle=?, created_at=CURRENT_TIMESTAMP WHERE id=?", (new_content, new_halle, recent["id"]), ) + # Check for #out in appended content — update category + spiel_titel + if "#out" in content.lower(): + out_title = None + idx = content.lower().find("#out") + after = content[idx + 4:].strip() + if after: + out_title = re.split(r'[.!?\n]| - | – | — | ist | war | in ', after, maxsplit=1)[0].strip()[:200] + db.execute( + "UPDATE submissions SET category=?, spiel_titel=? WHERE id=?", + ("ausverkauft", out_title, recent["id"]), + ) # Merge media paths (keep all, separated by ||) if media_path: merged_media = media_path @@ -3040,18 +3059,27 @@ def api_submit(): # Validate halle halle_valid = None if halle: - import re if re.match(r'^H[1-7]\s*[A-Z]\d{1,4}$', halle, re.IGNORECASE): halle_valid = halle.upper() sender_id = 'web_' + (name.replace(' ', '_') if name else 'anonym') sender_name = name or None + # #out detection for web form + category = None + if text and "#out" in text.lower(): + category = "ausverkauft" + if not spiel_titel: + idx = text.lower().find("#out") + after = text[idx + 4:].strip() + if after: + spiel_titel = re.split(r'[.!?\n]| - | – | — | ist | war | in ', after, maxsplit=1)[0].strip()[:200] + db.execute( """INSERT INTO submissions - (channel, sender_id, sender_name, type, content, media_path, status, halle, spiel_titel) - VALUES (?, ?, ?, ?, ?, ?, 'new', ?, ?)""", - ('web', sender_id, sender_name, msg_type, text or None, media_path, halle_valid, spiel_titel or None), + (channel, sender_id, sender_name, type, content, media_path, status, halle, category, spiel_titel) + VALUES (?, ?, ?, ?, ?, ?, 'new', ?, ?, ?)""", + ('web', sender_id, sender_name, msg_type, text or None, media_path, halle_valid, category, spiel_titel or None), ) db.commit() sub_id = db.execute("SELECT last_insert_rowid()").fetchone()[0]