fix(chat): 调整输入交互并加固 WS/告警处理
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user