fix(chat): 调整输入交互并加固 WS/告警处理

This commit is contained in:
2026-03-11 18:11:09 +08:00
parent dc403179f7
commit 558a0ff9bc
12 changed files with 315 additions and 44 deletions

View File

@@ -126,6 +126,10 @@ var _game_token: String = ""
const SELF_ECHO_DEDUPE_WINDOW: float = 10.0
var _pending_self_messages: Array[Dictionary] = []
# 空消息类型告警限频(避免日志刷屏)
const EMPTY_MESSAGE_TYPE_WARNING_INTERVAL: float = 10.0
var _last_empty_message_type_warning_at: float = -1000.0
# ============================================================================
# 生命周期方法
# ============================================================================
@@ -489,12 +493,22 @@ func _on_data_received(message: String) -> void:
push_error("ChatManager: JSON 解析失败")
return
var data: Dictionary = json.data
var data_variant: Variant = json.data
if not (data_variant is Dictionary):
push_warning("ChatManager: 收到非对象消息,已忽略")
return
# 检查消息类型字段
var message_type: String = data.get("t", "")
var data: Dictionary = data_variant
# 兼容不同后端字段命名t / type
var message_type: String = str(data.get("t", data.get("type", ""))).strip_edges()
if message_type.is_empty():
_warn_empty_message_type_limited(data)
return
match message_type:
"connected":
pass
"login_success":
_handle_login_success(data)
"login_error":
@@ -509,9 +523,22 @@ func _on_data_received(message: String) -> void:
_handle_chat_render(data)
"position_updated":
_handle_position_updated(data)
"error":
_handle_error_response(data)
_:
push_warning("ChatManager: 未处理的消息类型 %s" % message_type)
func _warn_empty_message_type_limited(data: Dictionary) -> void:
var now: float = Time.get_unix_time_from_system()
if now - _last_empty_message_type_warning_at < EMPTY_MESSAGE_TYPE_WARNING_INTERVAL:
return
_last_empty_message_type_warning_at = now
var payload_preview: String = JSON.stringify(data)
if payload_preview.length() > 180:
payload_preview = payload_preview.substr(0, 180) + "..."
push_warning("ChatManager: 收到未带消息类型的消息,已忽略 payload=%s" % payload_preview)
# 处理登录成功
func _handle_login_success(data: Dictionary) -> void:
_is_logged_in = true