openclaw-neo-bot / database.py
bakulkrupuk2025's picture
Create database.py
82283a2 verified
Raw
History Blame Contribute Delete
2.63 kB
import os
import httpx
import asyncio
SUPABASE_URL = os.environ.get("SUPABASE_URL", "")
SUPABASE_KEY = os.environ.get("SUPABASE_KEY", "")
HEADERS = {
"apikey": SUPABASE_KEY,
"Authorization": f"Bearer {SUPABASE_KEY}",
"Content-Type": "application/json",
"Prefer": "return=minimal"
}
async def insert(table: str, data: dict):
"""Insert data ke Supabase"""
if not SUPABASE_URL or not SUPABASE_KEY:
return False
try:
async with httpx.AsyncClient(timeout=10) as client:
response = await client.post(
f"{SUPABASE_URL}/rest/v1/{table}",
headers=HEADERS,
json=data
)
return response.status_code in [200, 201]
except Exception:
return False
async def fetch(table: str, limit: int = 50) -> list:
"""Fetch data dari Supabase"""
if not SUPABASE_URL or not SUPABASE_KEY:
return []
try:
async with httpx.AsyncClient(timeout=10) as client:
response = await client.get(
f"{SUPABASE_URL}/rest/v1/{table}",
headers={**HEADERS, "Prefer": "return=representation"},
params={"order": "created_at.desc", "limit": limit}
)
if response.status_code == 200:
return response.json()
except Exception:
pass
return []
async def log_activity(action: str, details: str = ""):
"""Simpan activity log ke Supabase"""
await insert("activity_log", {"action": action, "details": details})
async def log_chat(role: str, message: str, provider: str = ""):
"""Simpan chat history ke Supabase"""
await insert("chat_history", {"role": role, "message": message, "provider": provider})
async def log_module_output(module_name: str, topic: str, output: str, provider: str = ""):
"""Simpan output modul ke Supabase"""
await insert("module_output", {
"module_name": module_name,
"topic": topic,
"output": output,
"provider": provider
})
async def keepalive_ping():
"""Ping untuk keepalive log"""
await insert("keepalive_log", {"status": "alive"})
async def start_keepalive(space_url: str = ""):
"""Auto ping setiap 5 menit biar Space tidak sleep"""
while True:
try:
# Ping Supabase
await keepalive_ping()
# Ping HF Space sendiri
if space_url:
async with httpx.AsyncClient(timeout=10) as client:
await client.get(space_url)
except Exception:
pass
await asyncio.sleep(300) # setiap 5 menit