From 1b91191d90dfc74c046c179b792889a3b0d6a774 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Thu, 30 Dec 2021 18:56:56 -0600 Subject: [PATCH] Server Browser is now properly updated like the offical launcher- just a bit more flashy due to taking 100+ ms to regenerate ui elements --- lib/api.rb | 10 +++++- lib/api/server_list_server.rb | 3 ++ lib/pages/server_browser.rb | 67 +++++++++++++++++------------------ w3d_hub_linux_launcher.rb | 2 +- 4 files changed, 46 insertions(+), 36 deletions(-) diff --git a/lib/api.rb b/lib/api.rb index ae78f64..286171d 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -177,7 +177,7 @@ class W3DHub return data.map { |hash| ServerListServer.new(hash) } end - pp response + false end # /listings/getStatus/v2/:id?statusLevel=#{0-2} @@ -192,6 +192,14 @@ class W3DHub # ...players[]: # nick, team (index of teams array), score, kills, deaths def self.server_details(internet, id, level) + response = internet.get("#{SERVER_LIST_ENDPOINT}/listings/getStatus/v2/#{id}?statusLevel=#{level}", DEFAULT_HEADERS) + + if response.success? + hash = JSON.parse(response.read, symbolize_names: true) + return hash + end + + false end # /listings/push/v2/negotiate?negotiateVersion=1 diff --git a/lib/api/server_list_server.rb b/lib/api/server_list_server.rb index 79840cd..b7dac07 100644 --- a/lib/api/server_list_server.rb +++ b/lib/api/server_list_server.rb @@ -26,6 +26,9 @@ class W3DHub @status.instance_variable_set(:@started, hash[:started]) @status.instance_variable_set(:@remaining, hash[:remaining]) + @status.instance_variable_set(:@teams, hash[:teams]&.map { |t| Team.new(t) }) if hash[:teams] + @status.instance_variable_set(:@players, hash[:players]&.select { |t| t[:nick] != "Nod" && t[:nick] != "GDI" }&.map { |t| Player.new(t) }) if hash[:players] + return true end diff --git a/lib/pages/server_browser.rb b/lib/pages/server_browser.rb index 7fc8209..f14dd07 100644 --- a/lib/pages/server_browser.rb +++ b/lib/pages/server_browser.rb @@ -3,6 +3,8 @@ class W3DHub class ServerBrowser < Page def setup @server_locked_icons = {} + @refresh_server_list = false + refresh_server = false @selected_server ||= nil @selected_server_container ||= nil @@ -52,9 +54,9 @@ class W3DHub populate_server_list end - button get_image("#{GAME_ROOT_PATH}/media/ui_icons/return.png"), tip: I18n.t(:"server_browser.refresh"), image_height: 1.0, margin_left: 16, padding_left: 2, padding_right: 2, padding_top: 2, padding_bottom: 2 do - fetch_server_list - end + # button get_image("#{GAME_ROOT_PATH}/media/ui_icons/return.png"), tip: I18n.t(:"server_browser.refresh"), image_height: 1.0, margin_left: 16, padding_left: 2, padding_right: 2, padding_top: 2, padding_bottom: 2 do + # fetch_server_list + # end end flow(width: 0.249, height: 1.0) do @@ -113,37 +115,48 @@ class W3DHub end end - if Store.server_list.empty? - fetch_server_list - else - populate_server_list - end + populate_server_list + populate_server_info(@selected_server) if @selected_server end def update super - populate_server_list if @refresh_server_list - @refresh_server_list = false + if @refresh_server_list && Gosu.milliseconds >= @refresh_server_list + @refresh_server_list = nil + + populate_server_list + + if @selected_server&.id == @refresh_server&.id + Async do + fetch_server_details(@refresh_server) if @refresh_server + populate_server_info(@refresh_server) if @refresh_server && @refresh_server == @selected_server + + @refresh_server = nil + end + end + end end def refresh_server_list(server) - populate_server_info(server) if @selected_server&.id == server.id - @refresh_server_list = true + @refresh_server_list = Gosu.milliseconds + 3_000 + @refresh_server = server if @selected_server&.id == server.id end def stylize_selected_server(server_container) server_container.style.server_item_background = server_container.style.default[:background] server_container.style.server_item_hover_background = server_container.style.hover[:background] server_container.style.server_item_active_background = server_container.style.active[:background] + server_container.style.background = @selected_color + server_container.style.default[:background] = @selected_color server_container.style.hover[:background] = @selected_color server_container.style.active[:background] = @selected_color end def populate_server_list - @server_list_container.scroll_top = 0 + Store.server_list = Store.server_list.sort_by! { |s| [s&.status&.player_count, s&.id] }.reverse if Store.server_list @server_list_container.clear do i = -1 @@ -207,7 +220,10 @@ class W3DHub @selected_server = server - populate_server_info(server) + Async do + fetch_server_details(server) + populate_server_info(server) if server == @selected_server + end end stylize_selected_server(server_container) if server.id == @selected_server&.id @@ -333,29 +349,12 @@ class W3DHub end end - def fetch_server_list - unless Gosu.milliseconds - Store.server_list_last_fetch >= 3_000 # 3 seconds - populate_server_list # Fake it - return - end - + def fetch_server_details(server) Async do internet = Async::HTTP::Internet.instance - begin - list = Api.server_list(internet, 2) - - if list - Store.server_list = list.sort_by! { |s| s&.status&.players&.size }.reverse - Store.server_list_last_fetch = Gosu.milliseconds - - main_thread_queue << proc { populate_server_list } - end - rescue => e - # Something went wrong! - pp e - Store.server_list = [] - end + server_data = Api.server_details(internet, server.id, 2) + server.update(server_data) if server_data end end diff --git a/w3d_hub_linux_launcher.rb b/w3d_hub_linux_launcher.rb index 6b14fc7..0defb8d 100644 --- a/w3d_hub_linux_launcher.rb +++ b/w3d_hub_linux_launcher.rb @@ -78,5 +78,5 @@ require_relative "lib/pages/download_manager" Async do W3DHub::Window.new(width: 980, height: 720, borderless: false).show - raise Async::Stop # ensure reactor is shutdown when window is closed + exit # ensure reactor is shutdown when window is closed end