Initial work on PingManager

This commit is contained in:
2026-01-20 17:53:25 -06:00
parent 1f4185ada2
commit 4146debc4c
5 changed files with 233 additions and 64 deletions

54
lib/ping_manager.rb Normal file
View File

@@ -0,0 +1,54 @@
class W3DHub
class PingManager
Container = Struct.new(:pinger, :last_ping_time_ms)
PING_INTERVAL = 60_000
def initialize
@containers = {}
@addresses = []
end
def monitor(task)
task.async do |subtask|
while BackgroundWorker.alive?
# activate new addresses
@addresses.each do |address|
@containers[address] ||= Container.new(Ping.new(address: address), -PING_INTERVAL * 2)
end
# cleanup old addresses
@containers.each_key do |key|
@containers.delete(key) unless @addresses.find { |a| a == key }
end
# ping the pingers
@containers.each_value do |container|
next unless Gosu.milliseconds - container.last_ping_time_ms >= PING_INTERVAL
container.last_ping_time_ms = Gosu.milliseconds
subtask.async do
container.pinger.ping
pp [container.pinger.address, container.pinger.average_ping]
end
end
sleep 0.001
end
end
end
def add_address(address)
@addresses << address
@addresses.uniq!
end
def ping_for(address)
@containers[address]&.pinger&.average_ping&.round || -1
end
def remove_address(address)
@addresses.delete(address)
end
end
end