From 0f943252c501e127902462cd7edc17e1e6211a86 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Mon, 27 Dec 2021 20:48:30 -0600 Subject: [PATCH] Websocket based server list updater now works, gui needs a bit of work to not flash when refreshing list --- lib/api/server_list_server.rb | 12 +++++++++ lib/api/server_list_updater.rb | 15 +++++------ lib/pages/server_browser.rb | 49 ++++++++++++++++++++++++---------- lib/states/interface.rb | 8 ++++-- 4 files changed, 60 insertions(+), 24 deletions(-) diff --git a/lib/api/server_list_server.rb b/lib/api/server_list_server.rb index 5f4cce2..3b1eeba 100644 --- a/lib/api/server_list_server.rb +++ b/lib/api/server_list_server.rb @@ -16,6 +16,18 @@ class W3DHub @status = @data[:status] ? Status.new(@data[:status]) : nil end + def update(hash) + if @status + @status.instance_variable_set(:@name, hash[:name]) + @status.instance_variable_set(:@password, hash[:password] || false) + @status.instance_variable_set(:@map, hash[:map]) + @status.instance_variable_set(:@max_players, hash[:maxplayers]) + @status.instance_variable_set(:@player_count, hash[:numplayers] || 0) + @status.instance_variable_set(:@started, hash[:started]) + @status.instance_variable_set(:@remaining, hash[:remaining]) + end + end + class Status attr_reader :name, :password, :map, :max_players, :player_count, :started, :remaining, :teams, :players diff --git a/lib/api/server_list_updater.rb b/lib/api/server_list_updater.rb index c99bc75..3e06a11 100644 --- a/lib/api/server_list_updater.rb +++ b/lib/api/server_list_updater.rb @@ -1,6 +1,8 @@ class W3DHub class Api class ServerListUpdater + include CyberarmEngine::Common + ##!!! When this breaks update from: https://github.com/socketry/async-websocket/blob/master/lib/async/websocket/connection.rb # refinements preserves super... 😢 class PatchedConnection < ::Protocol::WebSocket::Connection @@ -71,7 +73,6 @@ class W3DHub run end - # TODO: Properly start up and monitor for updates to server list def run Async do |task| internet = Async::HTTP::Internet.instance @@ -88,12 +89,10 @@ class W3DHub pp connection.read connection.write({ "type": 6 }) - puts "servers: #{Store.server_list&.count}" - Store.server_list.each_with_index do |server, i| i += 1 mode = 1 # 2 full details, 1 basic details - out = { "type": 1, "invocationId": "#{i}", "target": "SubscribeToServerStatusUpdates", "arguments": [server.id, 1] } + out = { "type": 1, "invocationId": "#{i}", "target": "SubscribeToServerStatusUpdates", "arguments": [server.id, mode] } connection.write(out) end @@ -105,10 +104,10 @@ class W3DHub next unless rpc[:target] == "ServerStatusChanged" id, data = rpc[:arguments] - pp [id, data.length, data] - server = Api::ServerListServer.new(data) - - pp [server.player_count, server.max_players] + server = Store.server_list.find { |s| s.id == id } + server&.update(data) + state = window.current_state + state.update_server_browser(server) if state.is_a?(States::Interface) && server end end end diff --git a/lib/pages/server_browser.rb b/lib/pages/server_browser.rb index 0741b64..7fc8209 100644 --- a/lib/pages/server_browser.rb +++ b/lib/pages/server_browser.rb @@ -5,6 +5,7 @@ class W3DHub @server_locked_icons = {} @selected_server ||= nil + @selected_server_container ||= nil @selected_color = 0xff_666655 @filters = Store.settings[:server_list_filters] || {} @@ -119,6 +120,28 @@ class W3DHub end end + def update + super + + populate_server_list if @refresh_server_list + @refresh_server_list = false + end + + def refresh_server_list(server) + populate_server_info(server) if @selected_server&.id == server.id + @refresh_server_list = true + 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 @@ -171,25 +194,23 @@ class W3DHub end server_container.subscribe(:clicked_left_mouse_button) do - if @selected_server - @selected_server.style.background = @selected_server.style.server_item_background - @selected_server.style.default[:background] = @selected_server.style.server_item_background - @selected_server.style.hover[:background] = @selected_server.style.server_item_hover_background - @selected_server.style.active[:background] = @selected_server.style.server_item_active_background + if @selected_server_container + @selected_server_container.style.background = @selected_server_container.style.server_item_background + @selected_server_container.style.default[:background] = @selected_server_container.style.server_item_background + @selected_server_container.style.hover[:background] = @selected_server_container.style.server_item_hover_background + @selected_server_container.style.active[:background] = @selected_server_container.style.server_item_active_background end - 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 + stylize_selected_server(server_container) - @selected_server = server_container + @selected_server_container = server_container + + @selected_server = server populate_server_info(server) end + + stylize_selected_server(server_container) if server.id == @selected_server&.id end end end @@ -313,7 +334,7 @@ class W3DHub end def fetch_server_list - unless Gosu.milliseconds - Store.server_list_last_fetch >= 30_000 # 30 seconds + unless Gosu.milliseconds - Store.server_list_last_fetch >= 3_000 # 3 seconds populate_server_list # Fake it return end diff --git a/lib/states/interface.rb b/lib/states/interface.rb index 0d91b1b..c355679 100644 --- a/lib/states/interface.rb +++ b/lib/states/interface.rb @@ -165,8 +165,6 @@ class W3DHub end def page(klass, options = {}) - # @menu_bar.clear - # @status_bar.clear body.clear @page.blur if @page @@ -179,6 +177,12 @@ class W3DHub @page.focus end + def update_server_browser(server) + return unless @page.is_a?(Pages::ServerBrowser) + + @page.refresh_server_list(server) + end + def show_application_taskbar @application_taskbar_container.show end