X-Git-Url: http://nitlanguage.org diff --git a/contrib/nitrpg/src/statistics.nit b/contrib/nitrpg/src/statistics.nit index 580023a..764616f 100644 --- a/contrib/nitrpg/src/statistics.nit +++ b/contrib/nitrpg/src/statistics.nit @@ -34,11 +34,6 @@ redef class Game redef var stats is lazy do return new GameStatsManager(game, self) - redef fun save do - super - stats.save_in(self.key) - end - redef fun pretty do var res = new FlatBuffer res.append super @@ -46,16 +41,19 @@ redef class Game res.append stats.pretty return res.write_to_string end + + redef fun save do + super + stats.save + end end redef class Player redef var stats is lazy do return new GameStatsManager(game, self) - redef fun save do - super - stats.save_in(self.key) - end + redef fun nitcoins do return stats["nitcoins"] + redef fun nitcoins=(nc) do stats["nitcoins"] = nc redef fun pretty do var res = new FlatBuffer @@ -64,6 +62,11 @@ redef class Player res.append stats.pretty return res.write_to_string end + + redef fun save do + super + stats.save + end end # Store game stats for defined period. @@ -76,49 +79,35 @@ class GameStatsManager # The GameEntity monitored by these statistics. var owner: GameEntity - redef var key = "stats" + # Current date to extract stats + private var date = new Tm.gmtime # Returns the `GameStats` instance for the overall statistics. - var overall: GameStats is lazy do - return load_stats_for("all") - end + var overall: GameStats = load_stats_for("all") is lazy # Returns the `GameStats` instance for the current year statistics. - var yearly: GameStats is lazy do - var date = new Tm.gmtime - var key = date.strftime("%Y") - return load_stats_for(key) - end + var yearly: GameStats = load_stats_for(date.strftime("%Y")) is lazy # Returns the `GameStats` instance for the current month statistics. - var monthly: GameStats is lazy do - var date = new Tm.gmtime - var key = date.strftime("%Y-%m") - return load_stats_for(key) - end + var monthly: GameStats = load_stats_for(date.strftime("%Y-%m")) is lazy # Returns the `GameStats` instance for the current day statistics. - var daily: GameStats is lazy do - var date = new Tm.gmtime - var key = date.strftime("%Y-%m-%d") - return load_stats_for(key) - end + var daily: GameStats = load_stats_for(date.strftime("%Y-%m-%d")) is lazy # Returns the `GameStats` instance for the current week statistics. - var weekly: GameStats is lazy do - var date = new Tm.gmtime - var key = date.strftime("%Y-W%U") - return load_stats_for(key) - end + var weekly: GameStats = load_stats_for(date.strftime("%Y-W%U")) is lazy # Load statistics for a `period` key. fun load_stats_for(period: String): GameStats do - var key = owner.key / self.key / period - if not game.store.has_key(key) then - return new GameStats(game, period) + var req = new JsonObject + req["period"] = period + req["owner"] = owner.key + var obj = game.db.collection("statistics").find(req) + if obj isa JsonObject then + return new GameStats.from_json(game, period, owner, obj) + else + return new GameStats(game, period, owner) end - var json = game.store.load_object(key) - return new GameStats.from_json(game, period, json) end redef fun [](key) do return overall[key] @@ -147,12 +136,12 @@ class GameStatsManager weekly.dec(e) end - redef fun save_in(key) do - overall.save_in(key / self.key) - yearly.save_in(key / self.key) - monthly.save_in(key / self.key) - daily.save_in(key / self.key) - weekly.save_in(key / self.key) + redef fun save do + overall.save + yearly.save + monthly.save + daily.save + weekly.save end redef fun pretty do return overall.pretty @@ -165,19 +154,31 @@ class GameStats redef var game - # The pedriod these stats are about. + redef var collection_name = "statistics" + + # The period these stats are about. var period: String - redef fun key do return period + # The game entity these stats are about. + var owner: GameEntity + + redef var key = "{owner.key}-{period}" is lazy # Load `self` from saved data. - init from_json(game: Game, period: String, json: JsonObject) do - for k, v in json do self[k] = v.as(Int) + init from_json(game: Game, period: String, owner: GameEntity, json: JsonObject) do + init(game, period, owner) + var values = json.get_or_null("values") + if not values isa JsonObject then return + for k, v in values do self[k] = v.as(Int) end - redef fun to_json do - var obj = new JsonObject - for k, v in self do obj[k] = v + redef fun to_json_object do + var obj = super + obj["period"] = period + obj["owner"] = owner.key + var values = new JsonObject + values.add_all(self) + obj["values"] = values return obj end @@ -270,7 +271,7 @@ redef class IssueCommentEvent game.stats.inc("comments") player.stats.inc("comments") # FIXME use a more precise way to locate reviews - if comment.has_ok_review then + if comment.is_ack then game.stats.inc("reviews") player.stats.inc("reviews") end @@ -279,8 +280,3 @@ redef class IssueCommentEvent end end end - -redef class IssueComment - # Does this comment contain a "+1"? - fun has_ok_review: Bool do return body.has("\\+1\\b".to_re) -end