extends Node var ap_server = "" var ap_user = "" var ap_pass = "" const ap_version = {"major": 0, "minor": 4, "build": 0, "class": "Version"} var _client = WebSocketClient.new() var _last_state = WebSocketPeer.STATE_CLOSED var _should_process = false var _datapackage_checksum = "" var _item_name_to_id = {} var _location_name_to_id = {} const uuid_util = preload("user://maps/Archipelago/vendor/uuid.gd") var _authenticated = false var _team = 0 var _slot = 0 var _players = [] var _checked_locations = [] var _slot_data = {} func _init(): global._print("Instantiated APClient") # Read AP settings from file, if there are any var file = File.new() if file.file_exists("user://settings/archipelago"): file.open("user://settings/archipelago", File.READ) var data = file.get_var(true) file.close() if data.size() > 0: ap_server = data[0] if data.size() > 1: ap_user = data[1] if data.size() > 2: ap_pass = data[2] if data.size() > 3: _datapackage_checksum = data[3] if data.size() > 4: _item_name_to_id = data[4] if data.size() > 5: _location_name_to_id = data[5] func _ready(): _client.connect("connection_closed", self, "_closed") _client.connect("connection_error", self, "_closed") _client.connect("connection_established", self, "_connected") _client.connect("data_received", self, "_on_data") func _closed(was_clean = false): global._print("Closed, clean: " + was_clean) _should_process = false _authenticated = false func _connected(_proto = ""): global._print("Connected!") func _on_data(): var packet = _client.get_peer(1).get_packet() global._print("Got data from server: " + packet.get_string_from_utf8()) var data = JSON.parse(packet.get_string_from_utf8()) if data.error != OK: global._print("Error parsing packet from AP: " + data.error_string) return for message in data.result: var cmd = message["cmd"] global._print("Received command: " + cmd) if cmd == "RoomInfo": if message["datapackage_checksums"].has("Lingo"): if _datapackage_checksum != message["datapackage_checksums"]["Lingo"]: requestDatapackage() else: connectToRoom() elif cmd == "DataPackage": if message["data"]["games"].has("Lingo"): var lingo_pkg = message["data"]["games"]["Lingo"] _datapackage_checksum = lingo_pkg["checksum"] _item_name_to_id = lingo_pkg["item_name_to_id"] _location_name_to_id = lingo_pkg["location_name_to_id"] saveSettings() connectToRoom() elif cmd == "Connected": _authenticated = true _team = message["team"] _slot = message["slot"] _players = message["players"] _checked_locations = message["checked_locations"] _slot_data = message["slot_data"] elif cmd == "ConnectionRefused": global._print("Connection to AP refused") global._print(message) func _process(_delta): if _should_process: _client.poll() func saveSettings(): # Save the AP settings to disk. var dir = Directory.new() var path = "user://settings" if dir.dir_exists(path): pass else: dir.make_dir(path) var file = File.new() file.open("user://settings/archipelago", File.WRITE) var data = [ ap_server, ap_user, ap_pass, _datapackage_checksum, _item_name_to_id, _location_name_to_id ] file.store_var(data, true) file.close() func connectToServer(): var url = "ws://" + ap_server var err = _client.connect_to_url(url) if err != OK: global._print("Could not connect to AP: " + err) return _should_process = true func sendMessage(msg): var payload = JSON.print(msg) _client.get_peer(1).set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) _client.get_peer(1).put_packet(payload.to_utf8()) func requestDatapackage(): sendMessage([{"cmd": "GetDataPackage", "games": ["Lingo"]}]) func connectToRoom(): sendMessage( [ { "cmd": "Connect", "password": ap_pass, "game": "Lingo", "name": ap_user, "uuid": uuid_util.v4(), "version": ap_version, "items_handling": 0b111, # always receive our items "tags": [], "slot_data": true } ] )