Client/scripts/ui/websocket_time.gd
Snoweuph 1531505d2f
All checks were successful
Quality Check / Linting (push) Successful in 6s
Quality Check / Linting (pull_request) Successful in 6s
NOTICKET: Adding WS Structure and Example
2025-02-18 13:02:40 +01:00

50 lines
1.3 KiB
GDScript

extends RichTextLabel
@export var login: Login
@export var api_config: ApiConfig
var api := ServerApi.new(api_config)
# docs.redotengine.org/en/stable/tutorials/networking/websocket.html
var time_channel = WebSocketPeer.new()
func _ready() -> void:
login.connect("login_successful", on_login)
(
ConnectionChannel
. connect(
"on_channel_token_received",
on_channel_token_received,
)
)
func on_login(session: PlayerLoginSession):
ConnectionChannel.connect_to_channel(session.token)
ConnectionChannel.request_channel_token(Message.Channels.TIME)
func on_channel_token_received(msg: ProvidedConnectionTokenMessage) -> void:
if time_channel.get_ready_state() != WebSocketPeer.STATE_CLOSED:
return
if msg.channel != Message.Channels.TIME:
return
time_channel.handshake_headers = PackedStringArray(
["Authorization: " + msg.token],
)
time_channel.connect_to_url("ws://localhost:8080/ws/time")
func _process(_delta: float) -> void:
time_channel.poll()
var state = time_channel.get_ready_state()
if state != WebSocketPeer.STATE_OPEN:
return
while time_channel.get_available_packet_count():
var msg: CurrentUnixTimeMessage = Message.deserialize(
time_channel.get_packet().get_string_from_utf8(), [CurrentUnixTimeMessage]
)
if msg == null:
continue
self.text = str(msg.time)