The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.


NetHack::NAOdash - Analyze NetHack xlogfiles and extract statistics


  use NetHack::NAOdash;
  my $stats = naodash_user 'mgv'; # Retrieve and analyze mgv's xlogfile from
  my @checks = @{$stats->{checks}}; # List of 'achievements' obtained by mgv
  my %checks = map { $_ => 1 } @checks;
  say 'mgv has ascended an orcish rogue' if $checks{combo_rog_orc_cha};
  say 'mgv has ascended an atheist character' if $checks{conduct_atheist};
  my %numbers = %{$stats->{numbers}};
  say "mgv has ascended $numbers{ascensions} out of $numbers{games} games";
  say "mgv has spent $numbers{totalrealtime} seconds playing NetHack on NAO";

  $stats = naodash_user {include_versions => ['3.6.0']}, 'mgv';
  say 'mgv has ascended an orcish rogue in 3.6.0' if $checks{combo_rog_orc_cha};
  $stats = naodash_user {exclude_versions => ['3.6.0']}, 'mgv';
  say 'mgv has ascended an atheist character pre-3.6.0' if $checks{conduct_atheist};

  use File::Slurp;
  $stats = naodash_xlog read_file 'path/to/my/xlogfile';
  %checks = map { $_ => 1 } @{$stats->{checks}};
  say 'I have ascended a survivor' if $checks{uconduct_survivor};


NetHack::NAOdash analyzes a NetHack xlogfile and reports statistics. There are two types of statistics: checks, which are flags (booleans) and numbers which are integers.

The checks are tracked across all games. That is, a check will be true in the statistics if it is true in at least one game. Except for checks in the Achievements category, only games that end in an ascension are considered for awarding a check.

The checks, sorted by category, are:


These start with achieve_ and represent significant milestones in a game. They are usually relevant only for users who never ascended, as a game that ends in an ascension generally meets all of them.

  achieve_sokoban  achieve_luckstone   achieve_medusa achieve_bell
  achieve_gehennom achieve_candelabrum achieve_book   achieve_invocation
  achieve_amulet   achieve_endgame     achieve_astral achieve_ascended
Starting Combos

These look like combo_role_race_alignment and represent role/race/alignment combinations in ascended games. The starting alignment, not the alignment at the end of the game is considered. For example, cav_gno_neu is true if the user ascended at least one gnomish caveman.


These start with conduct_ and represent the 12 officially tracked conducts.

  conduct_foodless     conduct_vegan        conduct_vegetarian
  conduct_atheist      conduct_weaponless   conduct_pacifist
  conduct_illiterate   conduct_genocideless conduct_polypileless
  conduct_polyselfless conduct_wishless     conduct_artiwishless
Unofficial Conducts

These start with uconduct_ and represent conducts that are not officially tracked by the game.

  uconduct_survivor uconduct_bones uconduct_minscore

The numbers are:


The total time spent playing NetHack on NAO, in seconds.


The number of games played.


The number of games played that ended in an ascension.


The highest maxHP at the end of an ascension.


The highest score obtained at the end of an ascension.


The maximum number of conducts at the end of an ascension.


The minimum turns across ascended games.


The minimum realtime across ascended games, in seconds.

This module exports two functions:

naodash_xlog([\%args], @lines)
naodash_xlog([\%args], $xlog)

Takes an optional hashref followed by the contents of an xlogfile and returns the results of the analysis. The contents are joined together then split by the newline character, so they can be specified as a single string, as a list of lines, or as a combination thereof.

The following keys are recognised in the optional hashref:


The associated value is an arrayref of NetHack versions that should be considered. Any game that was played on a version that is not in this arrayref will be ignored. If this key is not present or the value is an empty arrayref, all versions are considered.


The associated value is an arrayref of NetHack versions that should not be considered. Any game that was played on a version that is in this arrayref will be ignored. If a version is both included and excluded at the same time, it will not be considered (in other words, exclude_versions overrides include_versions).

The return value is of the following form:

  { checks => ['achieve_sokoban', 'achieve_luckstone', ...],
    numbers => {totalrealtime => 12345, games => 2, ...} }

In other words, @{$result->{checks}} is an array of checks that are true and %{$result->{numbers}} is a hash of numbers.

naodash_user([\%args], $nao_username)

Retrieves the xlogfile of a user from NAO and gives it to naodash_xlog. Dies if no xlogfile is found or if the server cannot be contacted.

An optional hashref can be passed as a first argument. In this case it will be supplied as a first argument to naodash_xlog, see that function's documentation for an explanation of useful keys.

This method caches the downloaded xlogfiles for one day in the directory named by the NAODASH_CACHE environment variable.



Path to a directory that should be used to cache xlogfiles downloaded from NAO, or the special value 'none' (case-insensitive) to disable caching.

By default a directory named 'naodash' in the default temporary directory (File::Spec->tmpdir) is used.


App::NAOdash, App::Web::NAOdash,


Marius Gavrilescu, <>


Copyright (C) 2015 by Marius Gavrilescu

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.20.2 or, at your option, any later version of Perl 5 you may have available.