forked from xiangwang25/whale-town-front-v2
refactor: harden client runtime and exports
This commit is contained in:
@@ -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", {})
|
||||
|
||||
Reference in New Issue
Block a user