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()