162 lines
3.8 KiB
Ruby
Executable File
162 lines
3.8 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
require "json"
|
|
require "set"
|
|
|
|
ADVENTURE_BIOMES = [
|
|
"Beach",
|
|
"Birch Forest",
|
|
"Birch Forest Hills",
|
|
"Cold Beach",
|
|
"Cold Taiga",
|
|
"Cold Taiga Hills",
|
|
"Deep Ocean",
|
|
"Desert",
|
|
"Desert Hills",
|
|
"Extreme Hills",
|
|
"Extreme Hills+",
|
|
"Forest",
|
|
"ForestHills",
|
|
"FrozenRiver",
|
|
"Ice Mountains",
|
|
"Ice Plains",
|
|
"Jungle",
|
|
"Jungle Edge",
|
|
"Jungle Hills",
|
|
"Mega Taiga",
|
|
"Mega Taiga Hills",
|
|
"Mesa",
|
|
"Mesa Plateau",
|
|
"Mesa Plateau F",
|
|
"Mushroom Island",
|
|
"MushroomIslandShore",
|
|
"Ocean",
|
|
"Plains",
|
|
"River",
|
|
"Roofed Forest",
|
|
"Savanna",
|
|
"Savanna Plateau",
|
|
"Stone Beach",
|
|
"Swampland",
|
|
"Taiga",
|
|
"Taiga Hills",
|
|
]
|
|
|
|
class GenStats
|
|
def initialize
|
|
@all_explored_biomes = []
|
|
end
|
|
|
|
def run
|
|
user_cache = JSON.load(File.read("usercache.json"))
|
|
@users_by_uuid = user_cache.reduce({}) do |result, user|
|
|
result[user["uuid"]] = user
|
|
result
|
|
end
|
|
|
|
@all_stats = {
|
|
"Achievements" => {},
|
|
"Unexplored Biomes" => {},
|
|
"Mob Kills" => {},
|
|
"Deaths" => {},
|
|
"Killed" => {},
|
|
"Killed By" => {},
|
|
"Items Broken" => {},
|
|
}
|
|
Dir["world/stats/*.json"].each do |stats_fname|
|
|
load_stats(stats_fname)
|
|
end
|
|
|
|
print_stats
|
|
end
|
|
|
|
private
|
|
|
|
def load_stats(stats_fname)
|
|
File.basename(stats_fname) =~ /^(.*)\.json/
|
|
user_name =
|
|
if @users_by_uuid[$1]
|
|
@users_by_uuid[$1]["name"]
|
|
else
|
|
$1
|
|
end
|
|
stats = JSON.load(File.read(stats_fname))
|
|
|
|
@all_stats["Achievements"][user_name] =
|
|
stats.find_all do |stat_name, stat_value|
|
|
stat_name.start_with?("achievement.") and (stat_value.is_a?(Integer) or (stat_value.is_a?(Hash) and stat_value["value"] and stat_value["value"] > 0))
|
|
end.size
|
|
|
|
@all_stats["Unexplored Biomes"][user_name] =
|
|
if stats["achievement.exploreAllBiomes"]
|
|
explored_biomes = stats["achievement.exploreAllBiomes"]["progress"]
|
|
unexplored_biomes = ADVENTURE_BIOMES - explored_biomes
|
|
@all_explored_biomes += explored_biomes
|
|
unexplored_biomes.sort.join(", ")
|
|
end
|
|
|
|
@all_stats["Mob Kills"][user_name] = stats["stat.mobKills"]
|
|
|
|
@all_stats["Deaths"][user_name] = stats["stat.deaths"]
|
|
|
|
@all_stats["Killed"][user_name] =
|
|
stats.reduce({}) do |result, (stat_name, stat_value)|
|
|
if stat_name =~ /^stat\.killEntity\.(\w+)$/
|
|
result[$1] = stat_value
|
|
end
|
|
result
|
|
end
|
|
|
|
@all_stats["Killed By"][user_name] =
|
|
stats.reduce({}) do |result, (stat_name, stat_value)|
|
|
if stat_name =~ /^stat\.entityKilledBy\.(\w+)$/
|
|
result[$1] = stat_value
|
|
end
|
|
result
|
|
end
|
|
|
|
@all_stats["Items Broken"][user_name] =
|
|
stats.reduce({}) do |result, (stat_name, stat_value)|
|
|
if stat_name =~ /^stat\.breakItem\.minecraft\.(\w+)$/
|
|
result[$1] = stat_value
|
|
end
|
|
result
|
|
end
|
|
end
|
|
|
|
def print_stats
|
|
@all_stats.each do |stat_name, stats|
|
|
next if stats.empty?
|
|
|
|
puts "= #{stat_name} ="
|
|
|
|
if stats.first.last.is_a?(Hash)
|
|
keys = stats.reduce([]) do |result, (player_name, stat_value)|
|
|
result + stat_value.keys
|
|
end.uniq.sort
|
|
puts "|= Player |= #{keys.join(" |= ")}"
|
|
stats.sort.each do |player_name, stat_value|
|
|
values = keys.map do |key|
|
|
stat_value[key]
|
|
end
|
|
puts "| #{player_name} | #{values.join(" | ")}"
|
|
end
|
|
else
|
|
puts "|= Player |= Value"
|
|
stats.sort.each do |player_name, stat_value|
|
|
puts "| #{player_name} | #{stat_value}"
|
|
end
|
|
end
|
|
|
|
puts
|
|
|
|
if stat_name == "Unexplored Biomes"
|
|
puts("Common Unexplored Biomes: " + (ADVENTURE_BIOMES - @all_explored_biomes).sort.join(", "))
|
|
puts
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
GenStats.new.run
|