|
|
module Admin::AnalyticsHelper
|
|
|
|
|
|
# Colours a bar by what the answer does to the player's score, so a stage
|
|
|
# reads at a glance: green = they made the good call, red = they didn't.
|
|
|
def answer_tone(node)
|
|
|
case node.template
|
|
|
when "good_answer" then "positive"
|
|
|
when "bad_answer" then "negative"
|
|
|
when "chance" then "neutral"
|
|
|
end
|
|
|
end
|
|
|
|
|
|
|
|
|
def band_tone(band)
|
|
|
{ best: "positive", balanced: "neutral", worst: "negative" }[band.to_sym]
|
|
|
end
|
|
|
|
|
|
|
|
|
# Labels a row of the Countries breakdown. Everything outside the headcount
|
|
|
# list is collapsed into one bucket by GameAnalytics#by_country, and that
|
|
|
# bucket has no entry under `countries:` -- so name it here rather than
|
|
|
# letting the default fall through and print "OTHER".
|
|
|
def country_breakdown_label(key)
|
|
|
return "Other" if key.to_s == GameAnalytics::OTHER_COUNTRY_KEY
|
|
|
|
|
|
t("countries.#{key}", default: key.to_s.upcase)
|
|
|
end
|
|
|
|
|
|
|
|
|
# Labels a row of the Languages breakdown. `players.locale` stores the raw
|
|
|
# locale code, which is not much use at a glance -- so name it. Uses
|
|
|
# `language_names` (English exonyms: "Danish", "Chinese") rather than
|
|
|
# `languages` (native names: "Dansk", "\u4e2d\u6587"), which is what the player-facing
|
|
|
# menu shows; this dashboard reads better in one language.
|
|
|
def language_breakdown_label(key)
|
|
|
t("language_names.#{key}", default: key.to_s)
|
|
|
end
|
|
|
|
|
|
|
|
|
def format_duration(seconds)
|
|
|
return "—" if seconds.blank? || seconds.to_i.zero?
|
|
|
|
|
|
seconds = seconds.to_i
|
|
|
minutes, seconds = seconds.divmod(60)
|
|
|
minutes.zero? ? "#{seconds}s" : "#{minutes}m #{seconds}s"
|
|
|
end
|
|
|
end
|