commit ed9edede05b55ac9d77d6148c0abb3a74dd5f699 Author: Josh Holtrop Date: Fri Dec 18 16:10:47 2015 -0500 add initial script diff --git a/gen-stats.rb b/gen-stats.rb new file mode 100755 index 0000000..aa4c60d --- /dev/null +++ b/gen-stats.rb @@ -0,0 +1,152 @@ +#!/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