1- # connection.gd
21extends Node
32
43var official_server_url = "wss://gomud.willowdalemud.com/ws"
54var catacombs_server_url = "wss://game.kegscatacombs.online/ws"
6- var socket := WebSocketPeer .new ()
75var websocket_url = official_server_url
6+ var socket := WebSocketPeer .new ()
87
9- # node
108@onready var status = $ Status_BG/Status
9+ @onready var reconnect_button = $ Status_BG/ReconnectButton
1110
12- # signals you can connect to your UI / audio / gmcp handlers ---
1311signal text_received (text : String )
1412signal sound_received (path : String , params : Dictionary )
1513signal GMCP_received (topic : String , data : Variant )
1614
17- # compiled once
1815var _re_token := RegEx .new ()
1916
2017func _ready ():
21- _re_token .compile ("!!(SOUND|MUSIC|GMCP)\\ (([\\ s\\ S]*?)\\ )" ) # DOTALL via [\\s\\S]
22- var err = socket .connect_to_url (websocket_url )
23- print ("Connecting to: " + str (websocket_url ))
18+ _re_token .compile ("!!(SOUND|MUSIC|GMCP)\\ (([\\ s\\ S]*?)\\ )" )
19+ reconnect_button .connect ("pressed" , Callable (self , "_on_reconnect_pressed" ))
20+ _connect_to_server ()
21+
22+ func _connect_to_server ():
2423 status .text = "Connecting to: " + str (websocket_url )
24+ print (status .text )
25+ socket = WebSocketPeer .new ()
26+ var err = socket .connect_to_url (websocket_url )
2527 if err != OK :
2628 status .text = "Failed to connect..."
27- print ("Failed to connect" )
29+ print (status . text )
2830 set_process (false )
2931 else :
32+ set_process (true )
33+ reconnect_button .visible = false
3034 await get_tree ().create_timer (2 ).timeout
3135 status .text = "Connection initiated..."
32- print ("Connection initiated" )
36+ print (status .text )
37+
38+ func _on_reconnect_pressed ():
39+ status .text = "Reconnecting..."
40+ Global_Status ._first_msg = true
41+ print ("Reconnecting to server..." )
42+ _connect_to_server ()
3343
3444func _process (_delta ):
3545 socket .poll ()
3646 var state = socket .get_ready_state ()
37- if state == WebSocketPeer .STATE_OPEN and socket .get_available_packet_count () > 0 :
38- var data_received = socket .get_packet ().get_string_from_utf8 ()
39- if data_received :
40- var unix_now = Time .get_unix_time_from_system ()
41- status .text = "Data_received: " + str (unix_now )
42- _parse_and_emit (data_received )
43- else :
44- status .text = "Failed to get data: " + data_received
45- print ("Failed to get data: " , data_received )
46-
47- elif state == WebSocketPeer .STATE_CLOSING or state == WebSocketPeer .STATE_CLOSED :
48- status .text = "Connection closed..."
49- print ("Connection closed" )
50- set_process (false )
47+
48+ match state :
49+ WebSocketPeer .STATE_OPEN :
50+ if socket .get_available_packet_count () > 0 :
51+ var data_received = socket .get_packet ().get_string_from_utf8 ()
52+ if data_received :
53+ var unix_now = Time .get_unix_time_from_system ()
54+ status .text = "Data received: " + str (unix_now )
55+ _parse_and_emit (data_received )
56+ else :
57+ status .text = "Failed to get data."
58+ print (status .text )
59+
60+ WebSocketPeer .STATE_CLOSING , WebSocketPeer .STATE_CLOSED :
61+ if reconnect_button .visible == false :
62+ status .text = "Connection closed. Click Reconnect."
63+ reconnect_button .visible = true
64+ print (status .text )
65+ set_process (false )
5166
5267# ---------- core splitter ----------
5368func _parse_and_emit (s : String ) -> void :
5469 var last := 0
5570 for m in _re_token .search_all (s ):
5671 var start = m .get_start ()
5772 var stop = m .get_end ()
58- # plain text before the token
5973 if start > last :
6074 var txt := s .substr (last , start - last )
6175 if txt != "" :
6276 emit_signal ("text_received" , txt )
63-
64- var kind = m .get_string (1 ) # "SOUND" or "GMCP"
65- var body = m .get_string (2 ) # inside the parentheses
66-
67- if kind == "SOUND" :
68- var snd = _parse_sound (body )
69- emit_signal ("sound_received" , snd )
70- elif kind == "MUSIC" :
71- var musc = _parse_sound (body )
72- emit_signal ("sound_received" , musc )
73- else : # GMCP
74- var gm = _parse_gmcp (body )
75- emit_signal ("GMCP_received" , gm )
77+
78+ var kind = m .get_string (1 )
79+ var body = m .get_string (2 )
80+
81+ match kind :
82+ "SOUND" , "MUSIC" :
83+ var snd = _parse_sound (body )
84+ emit_signal ("sound_received" , snd )
85+ "GMCP" :
86+ var gm = _parse_gmcp (body )
87+ emit_signal ("GMCP_received" , gm )
7688
7789 last = stop
7890
79- # tail after last token
8091 if last < s .length ():
8192 var tail := s .substr (last )
8293 if tail != "" :
8394 emit_signal ("text_received" , tail )
8495
8596# ---------- SOUND parser ----------
8697func _parse_sound (body : String ) -> Dictionary :
87- # Example: "static/audio/sound/movement/room-enter.mp3 T=movement V=100"
8898 var parts := body .strip_edges ().split (" " , false )
8999 var path := parts [0 ] if parts .size () > 0 else ""
90100 var params : Dictionary = {}
@@ -99,32 +109,28 @@ func _parse_sound(body: String) -> Dictionary:
99109 params [k ] = float (v )
100110 else :
101111 params [k ] = v
102-
103112 return {"path" : path , "params" : params }
104113
105114# ---------- GMCP parser ----------
106115func _parse_gmcp (body : String ) -> Dictionary :
107- # Example: "Char.Affects { ...json... }"
108116 var s := body .strip_edges ()
109117 var sp := s .find (" " )
110118
111119 var topic := s .substr (0 , sp ) if sp != - 1 else s
112120 var payload := s .substr (sp + 1 ).strip_edges () if sp != - 1 else ""
113-
114121 var data : Variant = payload
122+
115123 if payload .begins_with ("{" ) or payload .begins_with ("[" ):
116124 var j := JSON .new ()
117125 if j .parse (payload ) == OK :
118- data = j .data # Dictionary/Array
119-
126+ data = j .data
120127 return {"topic" : topic , "data" : data }
121128
122-
123129func send_message (cmd : String ):
124130 if socket .get_ready_state () != WebSocketPeer .STATE_OPEN :
125131 status .text = "Cannot send message. Socket not open."
126- print ("Cannot send message. Socket not open." )
132+ print (status . text )
127133 return
128134 socket .send_text (cmd )
129- status .text = "Sent:" + cmd
130- print ("Sent:" , cmd )
135+ status .text = "Sent: " + cmd
136+ print (status . text )
0 commit comments