Spaces:
Sleeping
Sleeping
| 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 <b>#{oid[:8]}</b> confirmed by {from_user}!"}) | |
| elif text.startswith("/cancel"): | |
| supabase.table("orders").update({"status": "cancelled"}).eq("id", oid).execute() | |
| send_via_relay({"text": f"β Order <b>#{oid[:8]}</b> 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() |