OverviewFilesCommitsIssuesDocsReleasesPeers

godot-keet / addons / keet_social / keet_graph.gd

75 lines · gd ref:
class_name KeetGraph
extends Node
## Local graph computation client — requests MI-computed clusters from daemon.

signal graph_computed(result: Dictionary)
signal clusters_loaded(clusters: Array)
signal edges_loaded(edges: Array)
signal error_occurred(message: String)

var client: KeetUdsClient
var last_clusters: Array = []  ## Cached clusters from last compute — read directly, no RPC


## Compute full graph (cached 60s, use force=true to recompute).
## Result: { clusters: Array, edges: Array, suggestions: Array }
## algo: optional Dictionary with {features, threshold, minSize} for MI clustering.
func compute(force: bool = false, algo: Dictionary = {}, callback: Callable = Callable()) -> void:
	_require_client()
	var params: Dictionary = {"force": force}
	if not algo.is_empty():
		params["algo"] = algo
	client.call_rpc("graph.compute", params, func(result, err):
		if err != null:
			error_occurred.emit("compute: %s" % str(err))
			return
		var r: Dictionary = result if result is Dictionary else {}
		# Cache clusters locally so other panels can read without RPC
		var clusters: Array = r.get("clusters", []) if r is Dictionary else []
		if clusters is Array:
			last_clusters = clusters
		graph_computed.emit(r)
		clusters_loaded.emit(last_clusters)
		if callback.is_valid():
			callback.call(r)
	)


## Get clusters from last computation (uses cache).
func get_clusters(algo: Dictionary = {}, callback: Callable = Callable()) -> void:
	_require_client()
	var params: Dictionary = {}
	if not algo.is_empty():
		params["algo"] = algo
	client.call_rpc("graph.clusters", params, func(result, err):
		if err != null:
			error_occurred.emit("get_clusters: %s" % str(err))
			return
		var clusters: Array = result if result is Array else []
		clusters_loaded.emit(clusters)
		if callback.is_valid():
			callback.call(clusters)
	)


## Get MI edges from last computation (uses cache).
func get_edges(algo: Dictionary = {}, callback: Callable = Callable()) -> void:
	_require_client()
	var params: Dictionary = {}
	if not algo.is_empty():
		params["algo"] = algo
	client.call_rpc("graph.edges", params, func(result, err):
		if err != null:
			error_occurred.emit("get_edges: %s" % str(err))
			return
		var edges: Array = result if result is Array else []
		edges_loaded.emit(edges)
		if callback.is_valid():
			callback.call(edges)
	)


func _require_client() -> void:
	if client == null:
		push_error("KeetGraph: client not set")