mirror of
https://codeberg.org/StreamGraph/StreamGraph.git
synced 2024-11-13 19:49:55 +01:00
78 lines
2.5 KiB
GDScript3
78 lines
2.5 KiB
GDScript3
|
# (c) 2023-present Eroax
|
||
|
# (c) 2023-present Yagich
|
||
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||
|
extends RPCScope
|
||
|
class_name RPCScopeSystem
|
||
|
|
||
|
|
||
|
func _init() -> void:
|
||
|
name = "system"
|
||
|
operation_types = {
|
||
|
"identify": {"callable": identify, "event_name": ""},
|
||
|
"add_subscription": {"callable": add_subscription, "event_name": ""},
|
||
|
"get_subscriptions": {"callable": get_subscriptions, "event_name": ""},
|
||
|
"remove_subscriptions": {"callable": remove_subscriptions, "event_name": ""},
|
||
|
}
|
||
|
|
||
|
RPCSignalLayer.signals.client_connected.connect(_on_client_connected)
|
||
|
|
||
|
|
||
|
func identify(r: RPCRequest) -> void:
|
||
|
var subscriptions: Dictionary = r.operation.payload.get("subscriptions", {})
|
||
|
if subscriptions.is_empty():
|
||
|
subscriptions = {
|
||
|
"deck": [
|
||
|
"node_added", "node_removed", "nodes_connected", "nodes_disconnected",
|
||
|
"nodes_grouped", "variables_updated"
|
||
|
],
|
||
|
"deck_holder": [
|
||
|
"new_deck", "deck_closed"
|
||
|
]
|
||
|
}
|
||
|
r.client.subscriptions = subscriptions
|
||
|
r.client.identified = true
|
||
|
|
||
|
var resp := create_response(r, {"identified": true})
|
||
|
response.emit(resp)
|
||
|
|
||
|
|
||
|
func add_subscription(r: RPCRequest) -> void:
|
||
|
var new_subscriptions: Dictionary = r.operation.payload.subscriptions
|
||
|
for subscription_scope: String in new_subscriptions:
|
||
|
var event_names: Array = new_subscriptions[subscription_scope]
|
||
|
for event: String in event_names:
|
||
|
if event not in r.client.subscriptions[subscription_scope]:
|
||
|
(r.client.subscriptions[subscription_scope] as Array).append(event)
|
||
|
|
||
|
response.emit(create_generic_success(r))
|
||
|
|
||
|
|
||
|
func get_subscriptions(r: RPCRequest) -> void:
|
||
|
var resp := create_response(r, {"subscriptions": r.client.subscriptions})
|
||
|
response.emit(resp)
|
||
|
|
||
|
|
||
|
func remove_subscriptions(r: RPCRequest) -> void:
|
||
|
var to_remove: Dictionary = r.operation.payload.subscriptions
|
||
|
|
||
|
var scopes_to_remove: Array[String]
|
||
|
for subscription_scope: String in to_remove:
|
||
|
if subscription_scope not in r.client.subscriptions:
|
||
|
continue
|
||
|
var event_names: Array = to_remove[subscription_scope]
|
||
|
for event: String in event_names:
|
||
|
(r.client.subscriptions[subscription_scope] as Array).erase(event)
|
||
|
if (r.client.subscriptions[subscription_scope] as Array).is_empty():
|
||
|
scopes_to_remove.append(subscription_scope)
|
||
|
|
||
|
for scope in scopes_to_remove:
|
||
|
r.client.subscriptions.erase(scope)
|
||
|
|
||
|
response.emit(create_generic_success(r))
|
||
|
|
||
|
|
||
|
func _on_client_connected(client: RPCRenderer.Client) -> void:
|
||
|
var ev := create_event("identify", {})
|
||
|
ev.to_peer = client.id
|
||
|
event.emit(ev)
|