mirror of
https://github.com/cyberarm/w3d_hub_linux_launcher.git
synced 2026-03-22 04:06:18 +00:00
Initial work on PingManager
This commit is contained in:
54
lib/ping_manager.rb
Normal file
54
lib/ping_manager.rb
Normal 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
|
||||
Reference in New Issue
Block a user