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

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)