mirror of
https://github.com/cyberarm/w3d_hub_linux_launcher.git
synced 2026-09-19 23:03:53 +00:00
123 lines
3.3 KiB
Ruby
123 lines
3.3 KiB
Ruby
module W3DHubLauncher
|
|
class Worker
|
|
class Api
|
|
# Designed to work with cyberarm's Game Server Hub service data, may work with W3D Hub's service with degraded metadata.
|
|
class GameServer
|
|
BAD_OR_UNKNOWN_PING = 1_000_000
|
|
|
|
attr_reader :id, :game, :channel, :address, :port, :region,
|
|
:name, :password, :current_map, :player_count, :max_players,
|
|
:match_start_time, :estimated_end_time, :match_remaining_time,
|
|
:teams, :next_map, :version
|
|
|
|
def initialize(data)
|
|
# main data
|
|
@id = data["id"]
|
|
@game = data["game"]
|
|
@channel = data["channel"]
|
|
@address = data["address"]
|
|
@port = data["port"]
|
|
@region = data["region"]
|
|
|
|
# status data
|
|
@name = data["status"]["name"]
|
|
@password = data["status"]["password"] || false
|
|
@current_map = data["status"]["map"]
|
|
@player_count = data["status"]["numplayers"] || 0
|
|
@max_players = data["status"]["maxplayers"]
|
|
|
|
@match_start_time = data["status"]["started"]
|
|
@estimated_end_time = data["status"]["estimatedEndTime"]
|
|
@match_remaining_time = data["status"]["remaining"]
|
|
|
|
# status teams data
|
|
@teams = []
|
|
data["status"]["teams"].each do |team_data|
|
|
@teams << Team.new(team_data)
|
|
end
|
|
|
|
# status player data
|
|
data["status"]["players"].each do |player_data|
|
|
team = @teams.find { |t| t.id == player_data["id"] }
|
|
next unless team
|
|
|
|
team.players << Player.new(player_data)
|
|
end
|
|
|
|
# Cyberarm GSH extras
|
|
@version = data["version"] || "838"
|
|
@next_map = data["status"]["nextmap"] || ""
|
|
end
|
|
|
|
# TODO: implement :)
|
|
def time_elapsed
|
|
"00:00"
|
|
end
|
|
|
|
def password?
|
|
@password
|
|
end
|
|
|
|
def ping
|
|
MemCache.dig(:game_server_pings, @address) || BAD_OR_UNKNOWN_PING
|
|
end
|
|
|
|
def ping_score_ratio
|
|
# under 50 is best, over 200 is worst
|
|
case ping
|
|
when 0..49
|
|
return 1.0
|
|
when 50..200
|
|
1.0 - (ping / 200.0) + 0.1
|
|
else
|
|
return 0.1
|
|
end
|
|
end
|
|
|
|
def ping_score_color
|
|
case ping
|
|
when 0..49 # gentle green
|
|
0xff_26a269
|
|
when 50..149 # rich orange
|
|
0xff_e5a50a
|
|
when 150..200 # dark red
|
|
0xff_a51d2d
|
|
else # dark gray
|
|
0xff_3d3846
|
|
end
|
|
end
|
|
end
|
|
|
|
class Team
|
|
attr_reader :id, :name, :score, :kills, :deaths, :players
|
|
|
|
def initialize(data)
|
|
@id = data["id"]
|
|
@name = data["name"]
|
|
@score = data["score"]
|
|
@kills = data["kills"]
|
|
@deaths = data["deaths"]
|
|
|
|
@players = []
|
|
end
|
|
end
|
|
|
|
class Player
|
|
attr_reader :name, :team, :score, :kills, :deaths, :ping, :time
|
|
|
|
def initialize(data)
|
|
@name = data["nick"]
|
|
@team = data["team"]
|
|
@score = data["score"]
|
|
@kills = data["kills"]
|
|
@deaths = data["deaths"]
|
|
|
|
# Cyberarm GSH extras
|
|
@ping = data["ping"] || 0
|
|
@time = data["time"] || "00:00:00"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|