Welly-code's picture
Update main.py
14e28ba verified
Raw
History Blame Contribute Delete
3.26 kB
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()