+
+ def cancel
+ @canceled = true
+ end
+end
+
+class GameManager
+ def initialize
+ @games = {}
+ end
+
+ def current(target)
+ game = all(target).last
+ game if game && !game.over?
+ end
+
+ def all(target)
+ @games[target] || @games[target] = []
+ end
+
+ def previous(target)
+ all(target).select { |game| game.over? }.last
+ end
+
+ def new(game)
+ all(game.channel) << game
+ end
+end
+
+define_structure :HangmanPlayerStats, :played, :score
+define_structure :HangmanPrivateStats, :played, :score
+
+class StatsHandler
+ def initialize(registry)
+ @registry = registry
+ end
+
+ def save_gamestats(game)
+ target = game.channel
+
+ if target.is_a?(User)
+ stats = priv_reg[target]
+ stats.played += 1
+ stats.score += game.scores.values.last.round
+ priv_reg[target] = stats
+ elsif target.is_a?(Channel)
+ stats = chan_stats(target)
+ stats['played'] += 1
+
+ reg = player_stats(target)
+ game.scores.each do |user, score|
+ pstats = reg[user]
+ pstats.played += 1
+ pstats.score += score.round
+ reg[user] = pstats
+ end
+ end
+ end
+
+ def player_stats(channel)
+ reg = chan_reg(channel).sub_registry('player')
+ reg.set_default(HangmanPlayerStats.new(0,0))
+ reg
+ end
+
+ def chan_stats(channel)
+ reg = chan_reg(channel).sub_registry('stats')
+ reg.set_default(0)
+ reg
+ end
+
+ def chan_reg(channel)
+ @registry.sub_registry(channel.downcase)
+ end
+
+ def priv_reg
+ reg = @registry.sub_registry('private')
+ reg.set_default(HangmanPrivateStats.new(0,0))
+ reg
+ end