extends Node var server: TCPServer signal started signal received(auth) var clients: Array[StreamPeerTCP] = [] var listening = false func start(): var port = get_parent().auth.PORT print(port) server = TCPServer.new() server.listen(port) func _process(delta): if !server: return if(!server.is_listening()): return; if not listening: print("SERVER STARTED") started.emit() listening = true if(server.is_connection_available()): _handle_connect(); for client in clients: _process_request(client); func _handle_connect(): var client := server.take_connection() clients.push_back(client) print("CONNECT") func _process_request(client: StreamPeerTCP): match client.get_status(): StreamPeerTCP.STATUS_CONNECTED: client.poll() if client.get_available_bytes() > 0: var string = client.get_utf8_string(client.get_available_bytes()) var split = string.split("\n") var first = split[0] var regex = RegEx.new() regex.compile("code=(.*)&") var result = regex.search(first) if result: var auth = result.get_string(1) _send_response(client, "200 OK", "LoginSuccess!".to_utf8_buffer()); received.emit(auth) func auth(arguments: Dictionary): var comp_args = "" for argument in arguments: if comp_args == "": comp_args += "?%s=%s" % [argument, arguments[argument]] else: comp_args += "&%s=%s" % [argument, arguments[argument]] OS.shell_open("https://id.twitch.tv/oauth2/authorize%s" % [comp_args]) func _send_response(client, response_code : String, body : PackedByteArray) -> void: client.put_data(("HTTP/1.1 %s\r\n" % response_code).to_utf8_buffer()) client.put_data("Server: Godot Engine\r\n".to_utf8_buffer()) client.put_data(("Content-Length: %d\r\n"% body.size()).to_utf8_buffer()) client.put_data("Connection: close\r\n".to_utf8_buffer()) client.put_data("Content-Type: text/html; charset=UTF-8\r\n".to_utf8_buffer()) client.put_data("\r\n".to_utf8_buffer()) client.put_data(body) client.disconnect_from_host();