extends Node class_name WebsocketClient signal opened signal received(type: TwitchEvents.Event, data: Dictionary) const URL = "wss://eventsub.wss.twitch.tv/ws" var socket := WebSocketPeer.new() var connection_state := WebSocketPeer.STATE_CLOSED var id := "" # -- Built in Methods func _process(delta: float) -> void: socket.poll() var new_connection_state := socket.get_ready_state() if new_connection_state != connection_state: _change_state(new_connection_state) match connection_state: WebSocketPeer.STATE_OPEN: _read_data() # -- Public Methods ## Open up the websocket to start listening func open(): socket.connect_to_url(URL) # -- Private Methods func _change_state(new_state: WebSocketPeer.State): match new_state: WebSocketPeer.STATE_OPEN: opened.emit() connection_state = new_state func _read_data(): while (socket.get_available_packet_count()): var packet := socket.get_packet() var data = _read_packet(packet) var payload = data.payload match data.metadata.message_type: "session_welcome": id = payload.session.id "session_keepalive": pass "session_reconnect": pass _: var event_type = TwitchEvents.get_event_type_from_name(payload.subscription.type) received.emit(event_type, payload.event) func _read_packet(packet: PackedByteArray): var string = "" for chunk in packet: string += char(chunk) var data = JSON.parse_string(string) return data