2015-12-18 16:12:47 -05:00

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