2024-03-05 08:09:36 +01:00
|
|
|
# (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
|
|
|
|
|
|
|
|
|
|
|
|
func _init() -> void:
|
|
|
|
name = "deck"
|
|
|
|
|
|
|
|
operation_types = {
|
2024-03-15 08:47:45 +01:00
|
|
|
"add_node": {"callable": add_node, "event_name": "node_added"},
|
|
|
|
"remove_node": {"callable": remove_node, "event_name": "node_removed"},
|
|
|
|
"get_node": {"callable": get_node, "event_name": ""},
|
2024-03-15 07:02:04 +01:00
|
|
|
|
2024-03-15 08:47:45 +01:00
|
|
|
"is_valid_connection": {"callable": is_valid_connection, "event_name": ""},
|
|
|
|
"connect_nodes": {"callable": connect_nodes, "event_name": "nodes_connected"},
|
|
|
|
"disconnect_nodes": {"callable": disconnect_nodes, "event_name": "nodes_disconnected"},
|
2024-03-15 07:02:04 +01:00
|
|
|
|
2024-03-15 08:47:45 +01:00
|
|
|
"group_nodes": {"callable": group_nodes, "event_name": "nodes_grouped"},
|
2024-03-15 07:02:04 +01:00
|
|
|
|
2024-03-15 08:47:45 +01:00
|
|
|
"set_variable": {"callable": set_variable, "event_name": ""},
|
|
|
|
"get_variable": {"callable": get_variable, "event_name": ""},
|
|
|
|
"get_variable_list": {"callable": get_variable_list, "event_name": ""},
|
2024-03-15 07:02:04 +01:00
|
|
|
|
2024-03-15 08:47:45 +01:00
|
|
|
"send_event": {"callable": send_event, "event_name": ""},
|
|
|
|
"get_referenced_groups": {"callable": get_referenced_groups, "event_name": ""},
|
2024-03-05 08:09:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
RPCSignalLayer.signals.deck_node_added.connect(_on_deck_node_added)
|
2024-03-14 06:54:25 +01:00
|
|
|
RPCSignalLayer.signals.deck_node_removed.connect(_on_deck_node_removed)
|
|
|
|
|
|
|
|
RPCSignalLayer.signals.deck_nodes_connected.connect(_on_deck_nodes_connected)
|
|
|
|
RPCSignalLayer.signals.deck_nodes_disconnected.connect(_on_deck_nodes_disconnected)
|
2024-03-15 07:02:04 +01:00
|
|
|
RPCSignalLayer.signals.deck_variables_updated.connect(_on_deck_variables_updated)
|
2024-03-05 08:09:36 +01:00
|
|
|
|
|
|
|
|
|
|
|
func add_node(r: RPCRequest) -> void:
|
|
|
|
reconnect(
|
|
|
|
RPCSignalLayer.signals.deck_node_added,
|
|
|
|
_on_deck_node_added,
|
|
|
|
func():
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var node := deck.add_node_type(r.operation.payload.node_type)
|
|
|
|
|
|
|
|
var node_partial := RPCNodePartial.new()
|
|
|
|
node_partial.deck_id = deck.id
|
|
|
|
node_partial.id = node._id
|
|
|
|
|
|
|
|
var resp := create_response(r, node_partial)
|
2024-03-15 08:47:45 +01:00
|
|
|
resp.create_event_counterpart(node_partial, operation_types)
|
2024-03-05 08:09:36 +01:00
|
|
|
response.emit(resp)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2024-03-15 07:02:04 +01:00
|
|
|
func remove_node(r: RPCRequest) -> void:
|
|
|
|
reconnect(
|
|
|
|
RPCSignalLayer.signals.deck_node_removed,
|
|
|
|
_on_deck_node_removed,
|
|
|
|
func():
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var node_id: String = r.operation.payload.node_id
|
|
|
|
|
|
|
|
deck.remove_node(node_id, true)
|
|
|
|
|
|
|
|
var node_partial := RPCNodePartial.new()
|
|
|
|
node_partial.deck_id = deck.id
|
|
|
|
node_partial.id = node_id
|
|
|
|
|
|
|
|
var resp := create_generic_success(r)
|
2024-03-15 08:47:45 +01:00
|
|
|
resp.create_event_counterpart(node_partial, operation_types)
|
2024-03-15 07:02:04 +01:00
|
|
|
response.emit(resp)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func get_node(r: RPCRequest) -> void:
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var node := deck.get_node(r.operation.payload.node_id)
|
|
|
|
var node_data := node.to_dict()
|
|
|
|
|
|
|
|
var resp := create_response(r, {"node": node_data})
|
|
|
|
response.emit(resp)
|
|
|
|
|
|
|
|
|
|
|
|
func is_valid_connection(r: RPCRequest) -> void:
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var from_node_id: String = r.operation.payload.from_node_id
|
|
|
|
var from_output_port := int(r.operation.payload.from_output_port)
|
|
|
|
var to_node_id: String = r.operation.payload.to_node_id
|
|
|
|
var to_input_port := int(r.operation.payload.to_input_port)
|
|
|
|
|
|
|
|
var is_valid = deck.is_valid_connection(from_node_id, to_node_id, from_output_port, to_input_port)
|
|
|
|
|
|
|
|
var resp := create_response(r, {"valid": is_valid})
|
|
|
|
response.emit(resp)
|
|
|
|
|
|
|
|
|
|
|
|
func connect_nodes(r: RPCRequest) -> void:
|
|
|
|
reconnect(
|
|
|
|
RPCSignalLayer.signals.deck_nodes_connected,
|
|
|
|
_on_deck_nodes_connected,
|
|
|
|
func():
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var from_node_id: String = r.operation.payload.from_node_id
|
|
|
|
var from_output_port := int(r.operation.payload.from_output_port)
|
|
|
|
var to_node_id: String = r.operation.payload.to_node_id
|
|
|
|
var to_input_port := int(r.operation.payload.to_input_port)
|
|
|
|
|
|
|
|
var connected := deck.connect_nodes(from_node_id, to_node_id, from_output_port, to_input_port)
|
|
|
|
if connected:
|
|
|
|
var connection := RPCNodeConnection.new()
|
|
|
|
connection.from_node_id = from_node_id
|
|
|
|
connection.to_node_id = to_node_id
|
|
|
|
connection.from_output_port = from_output_port
|
|
|
|
connection.to_input_port = to_input_port
|
|
|
|
var resp := create_generic_success(r)
|
2024-03-15 08:47:45 +01:00
|
|
|
resp.create_event_counterpart(connection, operation_types)
|
2024-03-15 07:02:04 +01:00
|
|
|
response.emit(resp)
|
|
|
|
else:
|
|
|
|
var err := create_generic_failure(r)
|
|
|
|
response.emit(err)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func disconnect_nodes(r: RPCRequest) -> void:
|
|
|
|
reconnect(
|
|
|
|
RPCSignalLayer.signals.deck_nodes_disconnected,
|
|
|
|
_on_deck_nodes_disconnected,
|
|
|
|
func():
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var from_node_id: String = r.operation.payload.from_node_id
|
|
|
|
var from_output_port := int(r.operation.payload.from_output_port)
|
|
|
|
var to_node_id: String = r.operation.payload.to_node_id
|
|
|
|
var to_input_port := int(r.operation.payload.to_input_port)
|
|
|
|
|
|
|
|
deck.disconnect_nodes(from_node_id, to_node_id, from_output_port, to_input_port)
|
|
|
|
|
|
|
|
var connection := RPCNodeConnection.new()
|
|
|
|
connection.from_node_id = from_node_id
|
|
|
|
connection.to_node_id = to_node_id
|
|
|
|
connection.from_output_port = from_output_port
|
|
|
|
connection.to_input_port = to_input_port
|
|
|
|
|
|
|
|
var resp := create_generic_success(r)
|
2024-03-15 08:47:45 +01:00
|
|
|
resp.create_event_counterpart(connection, operation_types)
|
2024-03-15 07:02:04 +01:00
|
|
|
response.emit(resp)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func group_nodes(r: RPCRequest) -> void:
|
|
|
|
reconnect(
|
|
|
|
RPCSignalLayer.signals.deck_node_removed,
|
|
|
|
_on_deck_node_removed,
|
|
|
|
func():
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var node_ids: Array = r.operation.payload.nodes
|
|
|
|
var nodes := node_ids.map(
|
|
|
|
func(e: String):
|
|
|
|
return deck.get_node(e)
|
|
|
|
)
|
|
|
|
var group := deck.group_nodes(nodes)
|
|
|
|
if group == null:
|
|
|
|
var err := create_error(r, "Error grouping")
|
|
|
|
response.emit(err)
|
|
|
|
else:
|
|
|
|
var dp := RPCDeckPartial.new(group)
|
|
|
|
var resp := create_response(r, dp)
|
2024-03-15 08:47:45 +01:00
|
|
|
resp.create_event_counterpart(node_ids, operation_types)
|
2024-03-15 07:02:04 +01:00
|
|
|
response.emit(resp)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func set_variable(r: RPCRequest) -> void:
|
|
|
|
reconnect(
|
|
|
|
RPCSignalLayer.signals.deck_variables_updated,
|
|
|
|
_on_deck_variables_updated,
|
|
|
|
func():
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var var_name: String = r.operation.payload.name
|
|
|
|
var var_value = r.operation.payload.value
|
|
|
|
|
|
|
|
deck.set_variable(var_name, var_value)
|
|
|
|
var resp := create_generic_success(r)
|
2024-03-15 08:47:45 +01:00
|
|
|
resp.create_event_counterpart({}, operation_types)
|
2024-03-15 07:02:04 +01:00
|
|
|
response.emit(resp)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func get_variable(r: RPCRequest) -> void:
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var var_name: String = r.operation.payload.name
|
|
|
|
var value = deck.variable_stack.get(var_name)
|
|
|
|
|
|
|
|
var resp := create_response(r, {"name": var_name, "value": value})
|
|
|
|
response.emit(resp)
|
|
|
|
|
|
|
|
|
|
|
|
func get_variable_list(r: RPCRequest) -> void:
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
|
|
|
|
var resp := create_response(r, {"variables": deck.variable_stack.keys()})
|
|
|
|
response.emit(resp)
|
|
|
|
|
|
|
|
|
|
|
|
func send_event(r: RPCRequest) -> void:
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var event_name: StringName = r.operation.payload.event_name
|
|
|
|
var event_data: Dictionary = r.operation.payload.get("event_data", {})
|
|
|
|
|
|
|
|
deck.send_event(event_name, event_data)
|
|
|
|
|
|
|
|
var resp := create_generic_success(r)
|
|
|
|
response.emit(resp)
|
|
|
|
|
|
|
|
|
|
|
|
func get_referenced_groups(r: RPCRequest) -> void:
|
|
|
|
var deck := DeckHolder.get_deck(r.operation.condition.deck_id)
|
|
|
|
var groups := deck.get_referenced_groups()
|
|
|
|
|
|
|
|
var resp := create_response(r, {"groups": groups})
|
|
|
|
response.emit(resp)
|
|
|
|
|
|
|
|
|
2024-03-05 08:09:36 +01:00
|
|
|
func _on_deck_node_added(deck_id: String, node_id: String) -> void:
|
|
|
|
event.emit(create_event("node_added", {"node_id": node_id}, {"deck_id": deck_id}))
|
2024-03-14 06:54:25 +01:00
|
|
|
|
|
|
|
|
|
|
|
func _on_deck_node_removed(deck_id: String, node_id: String) -> void:
|
|
|
|
event.emit(create_event("node_removed", {"node_id": node_id}, {"deck_id": deck_id}))
|
|
|
|
|
|
|
|
|
|
|
|
func _on_deck_nodes_connected(deck_id: String, from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int) -> void:
|
|
|
|
var connection := RPCNodeConnection.new()
|
|
|
|
connection.from_node_id = from_node_id
|
|
|
|
connection.to_node_id = to_node_id
|
|
|
|
connection.from_output_port = from_output_port
|
|
|
|
connection.to_input_port = to_input_port
|
|
|
|
|
|
|
|
var ev := create_event("nodes_connected", connection, {"deck_id": deck_id})
|
|
|
|
event.emit(ev)
|
|
|
|
|
|
|
|
|
|
|
|
func _on_deck_nodes_disconnected(deck_id: String, from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int) -> void:
|
|
|
|
var connection := RPCNodeConnection.new()
|
|
|
|
connection.from_node_id = from_node_id
|
|
|
|
connection.to_node_id = to_node_id
|
|
|
|
connection.from_output_port = from_output_port
|
|
|
|
connection.to_input_port = to_input_port
|
|
|
|
|
|
|
|
var ev := create_event("nodes_disconnected", connection, {"deck_id": deck_id})
|
|
|
|
event.emit(ev)
|
2024-03-15 07:02:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
func _on_deck_variables_updated(deck_id: String) -> void:
|
|
|
|
var ev := create_event("variables_updated", {}, {"deck_id": deck_id})
|
|
|
|
event.emit(ev)
|