feat: Add presence heartbeat for Matrix online status
- matrix-gateway: POST /internal/matrix/presence/online endpoint - usePresenceHeartbeat hook with activity tracking - Auto away after 5 min inactivity - Offline on page close/visibility change - Integrated in MatrixChatRoom component
This commit is contained in:
61
services/living-map-service/adapters/microdao_client.py
Normal file
61
services/living-map-service/adapters/microdao_client.py
Normal file
@@ -0,0 +1,61 @@
|
||||
"""
|
||||
MicroDAO Service Client Adapter
|
||||
Phase 9: Living Map
|
||||
"""
|
||||
from typing import List, Dict, Any
|
||||
from .base_client import BaseServiceClient
|
||||
import os
|
||||
|
||||
class MicrodaoClient(BaseServiceClient):
|
||||
"""Client for microdao-service"""
|
||||
|
||||
def __init__(self):
|
||||
base_url = os.getenv("MICRODAO_SERVICE_URL", "http://localhost:7015")
|
||||
super().__init__(base_url)
|
||||
|
||||
async def get_microdaos_list(self) -> List[Dict[str, Any]]:
|
||||
"""Get list of all microDAOs"""
|
||||
# Note: This endpoint might require auth, using internal endpoint if available
|
||||
result = await self.get_with_fallback("/internal/microdaos", fallback=[])
|
||||
if not result:
|
||||
result = await self.get_with_fallback("/microdao", fallback=[])
|
||||
return result if isinstance(result, list) else []
|
||||
|
||||
async def get_layer_data(self) -> Dict[str, Any]:
|
||||
"""Get city layer data for Living Map"""
|
||||
microdaos_list = await self.get_microdaos_list()
|
||||
|
||||
# Transform to Living Map format
|
||||
items = []
|
||||
total_agents = 0
|
||||
total_nodes = 0
|
||||
total_members = 0
|
||||
|
||||
for microdao in microdaos_list:
|
||||
agents_count = microdao.get("agent_count", 0)
|
||||
nodes_count = microdao.get("node_count", 0)
|
||||
members_count = microdao.get("member_count", 0)
|
||||
|
||||
total_agents += agents_count
|
||||
total_nodes += nodes_count
|
||||
total_members += members_count
|
||||
|
||||
items.append({
|
||||
"id": microdao.get("external_id", f"microdao:{microdao.get('id')}"),
|
||||
"slug": microdao.get("slug", "unknown"),
|
||||
"name": microdao.get("name", "Unknown microDAO"),
|
||||
"status": "active" if microdao.get("is_active") else "inactive",
|
||||
"agents": agents_count,
|
||||
"nodes": nodes_count,
|
||||
"members": members_count,
|
||||
"description": microdao.get("description")
|
||||
})
|
||||
|
||||
return {
|
||||
"microdaos_total": len(items),
|
||||
"active_users": total_members,
|
||||
"active_agents": total_agents,
|
||||
"health": "green" if len(items) > 0 else "yellow",
|
||||
"items": items
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user