refactor: harden client runtime and exports

This commit is contained in:
ANG-Server
2026-07-23 00:59:00 +08:00
parent 5d2339a29b
commit fc872fe8af
27 changed files with 902 additions and 856 deletions

View File

@@ -1,7 +1,6 @@
extends CanvasLayer
class_name DatawhaleHonorRankingPanel
const NetworkConfig = preload("res://_Core/utils/NetworkConfig.gd")
const TEX_PANEL_FRAME = preload("res://assets/ui/datawhale_honor/honor_panel_wood_frame.png")
const TEX_WINDOW_SHELL = preload("res://assets/ui/datawhale_honor/honor_window_shell.png")
const TEX_PARCHMENT_PANEL = preload("res://assets/ui/datawhale_honor/honor_parchment_panel.png")
@@ -37,6 +36,7 @@ const TEX_AVATAR_FALLBACK_3 = preload("res://assets/ui/auth/generated/auth_chara
const API_PATH: String = "/rankings/datawhale-honor"
const PANEL_SIZE: Vector2 = Vector2(1500, 850)
const REQUEST_LIMIT: int = 9
const REQUEST_TIMEOUT: float = 18.0
const LOWER_RANK_LIMIT: int = 6
const LOWER_RANK_SLOT_HEIGHT: float = 45.0
const LOWER_RANK_AVATAR_SIZE: float = 30.0
@@ -85,8 +85,8 @@ var _podiumRow: Control
var _rankList: VBoxContainer
var _footerLabel: Label
var _statusLabel: Label
var _request: HTTPRequest
var _avatarRequests: Array[HTTPRequest] = []
var _rankingRequestGeneration: int = 0
var _chatUi: Control
var _chatUiPrevMouseFilter: Control.MouseFilter = Control.MOUSE_FILTER_STOP
var _chatUiMouseDisabled: bool = false
@@ -186,10 +186,6 @@ func _buildUi() -> void:
_panel.add_child(_buildRuleOverlay())
_panel.add_child(_buildCloseButton())
_request = HTTPRequest.new()
_request.timeout = 18.0
_request.request_completed.connect(_onRequestCompleted)
add_child(_request)
_setLoadingState()
func _buildBoardBody() -> Control:
@@ -252,38 +248,28 @@ func _positionPanel() -> void:
_panel.position = (viewportSize - PANEL_SIZE * scaleFactor) * 0.5
func _fetchRanking(categoryId: String) -> void:
if _request == null:
return
if _isLoading:
_request.cancel_request()
_activeCategory = categoryId
_isLoading = true
_rankingRequestGeneration += 1
_setLoadingState()
var endpoint := "%s%s?category=%s&limit=%d&refresh=true" % [
NetworkConfig.get_api_base_url(),
var endpoint := "%s?category=%s&limit=%d&refresh=true" % [
API_PATH,
_urlEncode(_activeCategory),
REQUEST_LIMIT,
]
var err := _request.request(endpoint, PackedStringArray(), HTTPClient.METHOD_GET, "")
if err != OK:
var api_client := get_node_or_null("/root/ApiClient")
if api_client == null or not api_client.has_method("get_json"):
_isLoading = false
_setErrorState("荣誉榜请求失败:%s" % error_string(err))
_setErrorState("荣誉榜服务不可用")
return
api_client.call("get_json", endpoint, Callable(self, "_onRequestCompleted").bind(_rankingRequestGeneration), false, REQUEST_TIMEOUT)
func _onRequestCompleted(result: int, responseCode: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
func _onRequestCompleted(success: bool, payload: Dictionary, error_info: Dictionary, request_generation: int) -> void:
if request_generation != _rankingRequestGeneration:
return
_isLoading = false
if result != HTTPRequest.RESULT_SUCCESS or responseCode < 200 or responseCode >= 300:
_setErrorState("荣誉榜加载失败,请稍后再试")
return
var parsed: Variant = JSON.parse_string(body.get_string_from_utf8())
if not parsed is Dictionary:
_setErrorState("荣誉榜数据解析失败")
return
var payload := parsed as Dictionary
if not bool(payload.get("success", true)):
_setErrorState(str(payload.get("message", "荣誉榜加载失败")))
if not success:
_setErrorState(str(error_info.get("message", "荣誉榜加载失败,请稍后再试")))
return
var dataVariant: Variant = payload.get("data", {})