import os import time import logging import re from threading import Thread from http.server import BaseHTTPRequestHandler, HTTPServer from supabase import create_client, Client import requests from requests.exceptions import ReadTimeout # --- LOGGING --- logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") logger = logging.getLogger("GreenCafeNotifier") # --- CONFIG --- URL = os.environ.get("SUPABASE_URL", "https://eoazyzszahatchuxxnui.supabase.co") KEY = os.environ.get("SUPABASE_KEY") TELEGRAM_TOKEN = os.environ.get("TELEGRAM_TOKEN") GROUP_ID = "-1003956756122" supabase: Client = create_client(URL, KEY) # --- HEALTH CHECK --- class HealthCheckHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.end_headers() self.wfile.write(b"Green Cafe Notifier Operational.") def log_message(self, format, *args): return def run_health_server(): httpd = HTTPServer(('0.0.0.0', 7860), HealthCheckHandler) httpd.serve_forever() # --- TELEGRAM RELAY CORE --- def send_via_relay(payload: dict) -> bool: try: edge_url = f"{URL}/functions/v1/telegram-notify" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {KEY}" } res = requests.post(edge_url, json=payload, headers=headers, timeout=20) return res.status_code == 200 except Exception as e: logger.error(f"Relay Connection Error: {e}") return False # --- POLLS TELEGRAM FOR COMMANDS --- def poll_telegram_feedback(): logger.info("📡 Telegram Poller (Commands Only) started...") offset = 0 while True: try: url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/getUpdates" res = requests.get(url, params={"offset": offset, "timeout": 30}, timeout=45) data = res.json() if data.get("ok"): for update in data.get("result", []): offset = update["update_id"] + 1 msg = update.get("message") if msg and msg.get("text"): text = msg["text"].strip() from_user = msg.get("from", {}).get("first_name", "Waiter") oid_match = re.search(r'([a-f0-9-]{8,})', text) if not oid_match: continue oid = oid_match.group(1) if text.startswith("/confirm"): supabase.table("orders").update({"status": "confirmed"}).eq("id", oid).execute() send_via_relay({"text": f"✅ Order #{oid[:8]} confirmed by {from_user}!"}) elif text.startswith("/cancel"): supabase.table("orders").update({"status": "cancelled"}).eq("id", oid).execute() send_via_relay({"text": f"❌ Order #{oid[:8]} cancelled by {from_user}."}) except ReadTimeout: continue except Exception as e: logger.error(f"Poller error: {e}") time.sleep(5) if __name__ == "__main__": Thread(target=run_health_server, daemon=True).start() poll_telegram_feedback()