Added some net locks to prevent fetching news while a fetch is already in progress

This commit is contained in:
2022-03-20 18:28:19 -05:00
parent 8766ed7d86
commit 57bcff8019
3 changed files with 65 additions and 7 deletions

View File

@@ -123,5 +123,31 @@ class W3DHub
ensure ensure
file&.close file&.close
end end
def self.acquire_net_lock(key)
Store["net_locks"] ||= {}
if Store["net_locks"][key]
false
else
Store["net_locks"][key] = true
end
end
def self.release_net_lock(key)
Store["net_locks"] ||= {}
if Store["net_locks"][key]
Store["net_locks"].delete(key)
else
warn "!!! net_lock not found for #{key.inspect}"
end
end
def self.net_lock?(key)
Store["net_locks"] ||= {}
Store["net_locks"][key]
end
end end
end end

View File

@@ -18,7 +18,7 @@ class W3DHub
flow(width: icon_container_width, height: 1.0) do flow(width: icon_container_width, height: 1.0) do
image "#{GAME_ROOT_PATH}/media/icons/app.png", hover: { color: 0xaa_ffffff }, height: 1.0, tip: "#{I18n.t(:app_name)} Github Repository" do image "#{GAME_ROOT_PATH}/media/icons/app.png", hover: { color: 0xaa_ffffff }, height: 1.0, tip: "#{I18n.t(:app_name)} Github Repository" do
Launchy.open("https://github.com/cyberarm/w3dhub_ruby") Launchy.open("https://github.com/cyberarm/w3d_hub_linux_launcher")
end end
image "#{GAME_ROOT_PATH}/media/icons/w3dhub.png", hover: { color: 0xaa_ffffff }, height: 1.0, margin_left: 32, tip: "W3D Hub Forums" do image "#{GAME_ROOT_PATH}/media/icons/w3dhub.png", hover: { color: 0xaa_ffffff }, height: 1.0, margin_left: 32, tip: "W3D Hub Forums" do
Launchy.open("https://w3dhub.com/forum/") Launchy.open("https://w3dhub.com/forum/")
@@ -43,16 +43,18 @@ class W3DHub
tagline "<b>Help & Support</b>" tagline "<b>Help & Support</b>"
flow(width: 1.0) do flow(width: 1.0) do
para "For help and support using this launcher or playing any W3D Hub game visit the" para "For help and support using this launcher or playing any W3D Hub game visit the"
link("W3D Hub forums", text_size: 16) { Launchy.open("https://w3dhub.com/forum/") } link("W3D Hub forums", text_size: 16, tip: "https://w3dhub.com/forum/") { Launchy.open("https://w3dhub.com/forum/") }
para "or join us in" para "or join us in"
image "#{GAME_ROOT_PATH}/media/social_media_icons/discord.png", height: 16, padding_top: 4 image "#{GAME_ROOT_PATH}/media/social_media_icons/discord.png", height: 16, padding_top: 4
link("#tech-support", text_size: 16) { Launchy.open("https://discord.com/invite/GYhW7eV") } link("#tech-support", text_size: 16, tip: "https://discord.com/invite/GYhW7eV") { Launchy.open("https://discord.com/invite/GYhW7eV") }
para "on the W3D Hub Discord server" para "on the W3D Hub Discord server"
end end
end end
end end
end end
return if Cache.net_lock?("w3dhub_news")
if @w3dhub_news if @w3dhub_news
populate_w3dhub_news populate_w3dhub_news
else else
@@ -60,12 +62,24 @@ class W3DHub
para I18n.t(:"games.fetching_news"), padding: 8 para I18n.t(:"games.fetching_news"), padding: 8
end end
BackgroundWorker.foreground_job(-> { fetch_w3dhub_news }, ->(result) { populate_w3dhub_news }) BackgroundWorker.foreground_job(
-> { fetch_w3dhub_news },
lambda do |result|
if result
populate_w3dhub_news
Cache.release_net_lock(result)
end
end
)
end end
end end
def fetch_w3dhub_news def fetch_w3dhub_news
lock = Cache.acquire_net_lock("w3dhub_news")
return false unless lock
news = Api.news("launcher-home") news = Api.news("launcher-home")
Cache.release_net_lock("w3dhub_news") unless news
return unless news return unless news
@@ -74,6 +88,8 @@ class W3DHub
end end
@w3dhub_news = news @w3dhub_news = news
"w3dhub_news"
end end
def populate_w3dhub_news def populate_w3dhub_news

View File

@@ -164,6 +164,8 @@ class W3DHub
end end
end end
return if Cache.net_lock?("game_news_#{game.id}")
if @game_news[game.id] if @game_news[game.id]
populate_game_news(game) populate_game_news(game)
else else
@@ -171,20 +173,34 @@ class W3DHub
title I18n.t(:"games.fetching_news"), padding: 8 title I18n.t(:"games.fetching_news"), padding: 8
end end
BackgroundWorker.foreground_job(-> { fetch_game_news(game) }, ->(result) { populate_game_news(game) }) BackgroundWorker.foreground_job(
-> { fetch_game_news(game) },
lambda do |result|
if result
populate_game_news(game)
Cache.release_net_lock(result)
end
end
)
end end
end end
def fetch_game_news(game) def fetch_game_news(game)
news = Api.news(game.id) lock = Cache.acquire_net_lock("game_news_#{game.id}")
return false unless lock
return unless news news = Api.news(game.id)
Cache.release_net_lock("game_news_#{game.id}") unless news
return false unless news
news.items[0..9].each do |item| news.items[0..9].each do |item|
Cache.fetch(uri: item.image, async: false) Cache.fetch(uri: item.image, async: false)
end end
@game_news[game.id] = news @game_news[game.id] = news
"game_news_#{game.id}"
end end
def populate_game_news(game) def populate_game_news(game)