2024-01-25 07:36:05 +01:00
|
|
|
extends Websocket_Client
|
|
|
|
|
|
|
|
const eventsub_url := "wss://eventsub.wss.twitch.tv/ws"
|
|
|
|
|
|
|
|
## Stores the "session id" for this EventSub connection.
|
|
|
|
var session_id
|
|
|
|
|
|
|
|
var connection : Twitch_Connection
|
|
|
|
|
|
|
|
signal notif_received(data)
|
|
|
|
|
|
|
|
signal welcome_received()
|
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
var keepalive_timer := 0
|
|
|
|
var timeout_time : int
|
2024-01-25 07:36:05 +01:00
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
var subscribed_events : Array[Twitch_Connection.EventSub_Subscription]
|
|
|
|
|
|
|
|
|
|
|
|
func _init(owner, timeout : int):
|
2024-01-25 07:36:05 +01:00
|
|
|
|
|
|
|
connection = owner
|
2024-02-09 12:43:17 +01:00
|
|
|
timeout_time = timeout
|
2024-01-25 07:36:05 +01:00
|
|
|
|
|
|
|
packet_received.connect(data_received)
|
|
|
|
|
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
## Overrides the default poll function for [Websocket_Client] to add functionality for a keepalive timer and reconnecting when the connection is lost.
|
|
|
|
func poll_socket():
|
2024-01-25 07:36:05 +01:00
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
super()
|
2024-01-25 07:36:05 +01:00
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
keepalive_timer += connection.get_process_delta_time()
|
|
|
|
if keepalive_timer >= timeout_time:
|
2024-01-25 07:36:05 +01:00
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
socket_closed.emit()
|
|
|
|
close()
|
|
|
|
connect_to_eventsub(subscribed_events)
|
2024-01-25 07:36:05 +01:00
|
|
|
|
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
|
|
|
|
## Handles setting up the connection to EventSub with an Array of the Events that should be subscribed to.
|
|
|
|
func connect_to_eventsub(events : Array[Twitch_Connection.EventSub_Subscription]):
|
|
|
|
|
|
|
|
connect_to_url(eventsub_url)
|
|
|
|
await welcome_received
|
|
|
|
|
|
|
|
subscribed_events = events
|
|
|
|
|
|
|
|
return await subscribe_to_events(events)
|
|
|
|
|
|
|
|
|
|
|
|
## Utility function for subscribing to multiple Twitch EventSub events at once.
|
|
|
|
func subscribe_to_events(events : Array[Twitch_Connection.EventSub_Subscription]):
|
|
|
|
|
2024-01-25 07:36:05 +01:00
|
|
|
var responses : Array[Twitch_Connection.HTTPResponse]
|
|
|
|
|
|
|
|
for all in events:
|
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
responses.append(await connection.add_eventsub_subscription(all))
|
|
|
|
|
|
|
|
|
|
|
|
if responses.size() == 1:
|
|
|
|
|
|
|
|
return responses[0]
|
2024-01-25 07:36:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
return responses
|
|
|
|
|
|
|
|
|
|
|
|
func data_received(packet : PackedByteArray):
|
|
|
|
|
|
|
|
var info = JSON.parse_string(packet.get_string_from_utf8())
|
|
|
|
|
|
|
|
match info.metadata.message_type:
|
|
|
|
|
|
|
|
"session_welcome":
|
|
|
|
|
|
|
|
session_id = info.payload.session.id
|
|
|
|
welcome_received.emit()
|
|
|
|
|
|
|
|
|
|
|
|
"session_ping":
|
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
print("Ping Received")
|
2024-01-25 07:36:05 +01:00
|
|
|
send_pong(info)
|
|
|
|
|
|
|
|
|
|
|
|
"notification":
|
|
|
|
|
|
|
|
notif_received.emit(info)
|
|
|
|
|
|
|
|
|
2024-02-09 12:43:17 +01:00
|
|
|
"session_keepalive":
|
|
|
|
|
|
|
|
keepalive_timer = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print(info)
|
2024-01-25 07:36:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
func send_pong(pong):
|
|
|
|
|
|
|
|
pong.metadata.message_type = "session_pong"
|
|
|
|
send_text(str(pong))
|
|
|
|
|