#!/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" => {}, } 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 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