You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.2 KiB
77 lines
2.2 KiB
extends Mod_Base |
|
|
|
var server: TCPServer |
|
var peers: Dictionary[WebSocketPeer, int] |
|
|
|
func _ready() -> void: |
|
server = TCPServer.new() |
|
server.listen(13981, "127.0.0.1") |
|
|
|
func _exit_tree() -> void: |
|
server.stop() |
|
for peer in peers: |
|
peer.close() |
|
|
|
server = null |
|
peers.clear() |
|
|
|
func _process(_delta: float) -> void: |
|
# Accept new connections. |
|
while server.is_connection_available(): |
|
var conn := server.take_connection() |
|
if not conn: break |
|
|
|
var socket := WebSocketPeer.new() |
|
# socket.supported_protocols = [] |
|
socket.accept_stream(conn) |
|
socket.set_no_delay(true) |
|
|
|
peers.set(socket, Time.get_ticks_msec()) |
|
|
|
var to_remove: Array[WebSocketPeer] |
|
for peer in peers: |
|
peer.poll() |
|
|
|
# Receive messages. |
|
while peer.get_available_packet_count(): |
|
var packet := peer.get_packet() |
|
if not peer.was_string_packet(): continue # ignore binary packets |
|
var message := packet.get_string_from_utf8() |
|
_on_websocket_message(peer, message) |
|
|
|
# Remove the peer if it's disconnected. |
|
if peer.get_ready_state() != WebSocketPeer.STATE_OPEN: |
|
to_remove.append(peer) |
|
|
|
# Remove the peer if it's been around for over 0.5 seconds. |
|
if Time.get_ticks_msec() - peers[peer] > 500: |
|
to_remove.append(peer) |
|
|
|
# Clear out disconnected peers. |
|
for peer in to_remove: |
|
peers.erase(peer) |
|
|
|
func _on_websocket_message(peer: WebSocketPeer, message: String) -> void: |
|
# Process only one message, then disconnect. |
|
peer.close() |
|
|
|
var split := message.split(" ", false, 1) |
|
var command := split[0] |
|
var rest := split[1] |
|
|
|
match command: |
|
"camera": |
|
if not rest.is_valid_int(): print_log("expected integer, got '%s'" % rest); return |
|
var index := int(rest) |
|
if not (index >= 1 and index <= 9): print_log("invalid camera '%s'" % rest); return |
|
var camera_mod := get_node("../CameraPositions") |
|
if not camera_mod: print_log("mod 'CameraPositions' not found"); return |
|
camera_mod._load_camera_position("Camera %d" % index) |
|
"vibrate": |
|
if not rest.is_valid_float(): print_log("expected float, got '%s'" % rest); return |
|
var amount := float(rest) |
|
var copy_thrower_mod := get_node("../copyThrower") |
|
if not copy_thrower_mod: print_log("mod 'copyThrower' not found"); return |
|
copy_thrower_mod.vibrate(get_skeleton(), amount) |
|
_: |
|
print_log("unknown command: '%s'" % command)
|
|
|