From a5a226a5b363b51ad61f6f51f8b8a3ceb6385048 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 16 Apr 2022 18:20:59 +0000 Subject: [PATCH] Reformat the logfile --- data/nethack/logfile/nutmeg.json | 570 +++++++++++++++--------------- scripts/import-nethack-logfile.py | 51 +-- 2 files changed, 308 insertions(+), 313 deletions(-) diff --git a/data/nethack/logfile/nutmeg.json b/data/nethack/logfile/nutmeg.json index 8444485..5a81d58 100644 --- a/data/nethack/logfile/nutmeg.json +++ b/data/nethack/logfile/nutmeg.json @@ -1,299 +1,285 @@ -{ - "records": [ - { - "nethack_version": "3.6.6", - "score": 2652, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 7, - "level_descriptive": "Level 7", - "max_level": 7, - "hit_points": 0, - "max_hit_points": 60, - "number_of_deaths": 1, - "end_date": "2022-04-03", - "start_date": "2022-01-16", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "killed by a Woodland-elf" +[ + { + "score": 4171, + "dungeon": { + "n": 0, + "name": "The Dungeons of Doom", + "level": { + "n": 9, + "descriptive": "Level 9" + } }, - { - "nethack_version": "3.6.6", - "score": 40, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 1, - "level_descriptive": "Level 1", - "max_level": 1, - "hit_points": 0, - "max_hit_points": 15, - "number_of_deaths": 1, - "end_date": "2022-04-03", - "start_date": "2022-04-03", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", + "end_date": "2022-04-16", + "start_date": "2022-04-14", + "character": { "name": "Eryn", - "reason_for_death": "killed by an electric shock" + "abbreviated": "Eryn-Sam-Hum-Fem-Law", + "max_level": 9, + "hp": { + "n": 0, + "max": 63 + }, + "role": { + "short": "Sam", + "descriptive": "Samurai" + }, + "race": { + "short": "Hum", + "descriptive": "Human" + }, + "gender": { + "short": "Fem", + "descriptive": "Female" + }, + "alignment": { + "short": "Law", + "descriptive": "Lawful" + } }, - { - "nethack_version": "3.6.6", - "score": 1973, - "dungeon_number": 2, - "dungeon_name": "The Gnomish Mines", - "level": 6, - "level_descriptive": "Level 6", - "max_level": 6, - "hit_points": 0, - "max_hit_points": 57, - "number_of_deaths": 1, - "end_date": "2022-04-03", - "start_date": "2022-04-03", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "poisoned by a rotted gnomish wizard corpse" + "death": { + "n": 1, + "cause": "killed by a Green-elf" }, - { - "nethack_version": "3.6.6", - "score": 898, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 4, - "level_descriptive": "Level 4", - "max_level": 5, - "hit_points": 0, - "max_hit_points": 36, - "number_of_deaths": 1, - "end_date": "2022-04-04", - "start_date": "2022-04-03", + "system": { + "hostname": "nutmeg", "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "died of starvation, while fainted" - }, - { - "nethack_version": "3.6.6", - "score": 399, - "dungeon_number": 2, - "dungeon_name": "The Gnomish Mines", - "level": 3, - "level_descriptive": "Level 3", - "max_level": 3, - "hit_points": 0, - "max_hit_points": 21, - "number_of_deaths": 1, - "end_date": "2022-04-04", - "start_date": "2022-04-04", - "user_id": 1002, - "role": "Priest", - "race": "Elf", - "gender": "Female", - "alignment": "Chaotic", - "name": "Eryn", - "reason_for_death": "killed by a dwarf" - }, - { - "nethack_version": "3.6.6", - "score": 138, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 2, - "level_descriptive": "Level 2", - "max_level": 2, - "hit_points": 0, - "max_hit_points": 14, - "number_of_deaths": 1, - "end_date": "2022-04-05", - "start_date": "2022-04-05", - "user_id": 1002, - "role": "Ranger", - "race": "Gnome", - "gender": "Female", - "alignment": "Neutral", - "name": "Eryn", - "reason_for_death": "killed by a jackal" - }, - { - "nethack_version": "3.6.6", - "score": 455, - "dungeon_number": 2, - "dungeon_name": "The Gnomish Mines", - "level": 4, - "level_descriptive": "Level 4", - "max_level": 4, - "hit_points": 0, - "max_hit_points": 37, - "number_of_deaths": 1, - "end_date": "2022-04-07", - "start_date": "2022-04-05", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "killed by a little dog" - }, - { - "nethack_version": "3.6.6", - "score": 397, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 4, - "level_descriptive": "Level 4", - "max_level": 4, - "hit_points": 0, - "max_hit_points": 15, - "number_of_deaths": 1, - "end_date": "2022-04-07", - "start_date": "2022-04-07", - "user_id": 1002, - "role": "Rogue", - "race": "Human", - "gender": "Female", - "alignment": "Chaotic", - "name": "Eryn", - "reason_for_death": "killed by a cave spider, while frozen by a monster's gaze" - }, - { - "nethack_version": "3.6.6", - "score": 2552, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 6, - "level_descriptive": "Level 6", - "max_level": 6, - "hit_points": 0, - "max_hit_points": 44, - "number_of_deaths": 1, - "end_date": "2022-04-09", - "start_date": "2022-04-08", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "killed by a violet fungus" - }, - { - "nethack_version": "3.6.6", - "score": 391, - "dungeon_number": 2, - "dungeon_name": "The Gnomish Mines", - "level": 3, - "level_descriptive": "Level 3", - "max_level": 3, - "hit_points": 0, - "max_hit_points": 36, - "number_of_deaths": 1, - "end_date": "2022-04-09", - "start_date": "2022-04-09", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "killed by a gnome king" - }, - { - "nethack_version": "3.6.6", - "score": 567, - "dungeon_number": 2, - "dungeon_name": "The Gnomish Mines", - "level": 5, - "level_descriptive": "Level 5", - "max_level": 5, - "hit_points": 0, - "max_hit_points": 34, - "number_of_deaths": 1, - "end_date": "2022-04-09", - "start_date": "2022-04-09", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "killed by a little dog called Hachi, while fainted from lack of food" - }, - { - "nethack_version": "3.6.6", - "score": 0, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 1, - "level_descriptive": "Level 1", - "max_level": 1, - "hit_points": 15, - "max_hit_points": 15, - "number_of_deaths": 0, - "end_date": "2022-04-11", - "start_date": "2022-04-11", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "quit" - }, - { - "nethack_version": "3.6.6", - "score": 866, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 4, - "level_descriptive": "Level 4", - "max_level": 6, - "hit_points": 0, - "max_hit_points": 43, - "number_of_deaths": 1, - "end_date": "2022-04-12", - "start_date": "2022-04-11", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "killed by a bolt of cold" - }, - { - "nethack_version": "3.6.6", - "score": 4143, - "dungeon_number": 0, - "dungeon_name": "The Dungeons of Doom", - "level": 6, - "level_descriptive": "Level 6", - "max_level": 7, - "hit_points": 0, - "max_hit_points": 64, - "number_of_deaths": 1, - "end_date": "2022-04-13", - "start_date": "2022-04-12", - "user_id": 1002, - "role": "Samurai", - "race": "Human", - "gender": "Female", - "alignment": "Lawful", - "name": "Eryn", - "reason_for_death": "killed by a plains centaur" + "nethack_version": "3.6.6" } - ] -} + }, + { + "score": 4143, + "dungeon": { + "n": 0, + "name": "The Dungeons of Doom", + "level": { + "n": 6, + "descriptive": "Level 6" + } + }, + "end_date": "2022-04-13", + "start_date": "2022-04-12", + "character": { + "name": "Eryn", + "abbreviated": "Eryn-Sam-Hum-Fem-Law", + "max_level": 7, + "hp": { + "n": 0, + "max": 64 + }, + "role": { + "short": "Sam", + "descriptive": "Samurai" + }, + "race": { + "short": "Hum", + "descriptive": "Human" + }, + "gender": { + "short": "Fem", + "descriptive": "Female" + }, + "alignment": { + "short": "Law", + "descriptive": "Lawful" + } + }, + "death": { + "n": 1, + "cause": "killed by a plains centaur" + }, + "system": { + "hostname": "nutmeg", + "user_id": 1002, + "nethack_version": "3.6.6" + } + }, + { + "score": 2652, + "dungeon": { + "n": 0, + "name": "The Dungeons of Doom", + "level": { + "n": 7, + "descriptive": "Level 7" + } + }, + "end_date": "2022-04-03", + "start_date": "2022-01-16", + "character": { + "name": "Eryn", + "abbreviated": "Eryn-Sam-Hum-Fem-Law", + "max_level": 7, + "hp": { + "n": 0, + "max": 60 + }, + "role": { + "short": "Sam", + "descriptive": "Samurai" + }, + "race": { + "short": "Hum", + "descriptive": "Human" + }, + "gender": { + "short": "Fem", + "descriptive": "Female" + }, + "alignment": { + "short": "Law", + "descriptive": "Lawful" + } + }, + "death": { + "n": 1, + "cause": "killed by a Woodland-elf" + }, + "system": { + "hostname": "nutmeg", + "user_id": 1002, + "nethack_version": "3.6.6" + } + }, + { + "score": 399, + "dungeon": { + "n": 2, + "name": "The Gnomish Mines", + "level": { + "n": 3, + "descriptive": "Level 3" + } + }, + "end_date": "2022-04-04", + "start_date": "2022-04-04", + "character": { + "name": "Eryn", + "abbreviated": "Eryn-Pri-Elf-Fem-Cha", + "max_level": 3, + "hp": { + "n": 0, + "max": 21 + }, + "role": { + "short": "Pri", + "descriptive": "Priest" + }, + "race": { + "short": "Elf", + "descriptive": "Elf" + }, + "gender": { + "short": "Fem", + "descriptive": "Female" + }, + "alignment": { + "short": "Cha", + "descriptive": "Chaotic" + } + }, + "death": { + "n": 1, + "cause": "killed by a dwarf" + }, + "system": { + "hostname": "nutmeg", + "user_id": 1002, + "nethack_version": "3.6.6" + } + }, + { + "score": 397, + "dungeon": { + "n": 0, + "name": "The Dungeons of Doom", + "level": { + "n": 4, + "descriptive": "Level 4" + } + }, + "end_date": "2022-04-07", + "start_date": "2022-04-07", + "character": { + "name": "Eryn", + "abbreviated": "Eryn-Rog-Hum-Fem-Cha", + "max_level": 4, + "hp": { + "n": 0, + "max": 15 + }, + "role": { + "short": "Rog", + "descriptive": "Rogue" + }, + "race": { + "short": "Hum", + "descriptive": "Human" + }, + "gender": { + "short": "Fem", + "descriptive": "Female" + }, + "alignment": { + "short": "Cha", + "descriptive": "Chaotic" + } + }, + "death": { + "n": 1, + "cause": "killed by a cave spider, while frozen by a monster's gaze" + }, + "system": { + "hostname": "nutmeg", + "user_id": 1002, + "nethack_version": "3.6.6" + } + }, + { + "score": 138, + "dungeon": { + "n": 0, + "name": "The Dungeons of Doom", + "level": { + "n": 2, + "descriptive": "Level 2" + } + }, + "end_date": "2022-04-05", + "start_date": "2022-04-05", + "character": { + "name": "Eryn", + "abbreviated": "Eryn-Ran-Gno-Fem-Neu", + "max_level": 2, + "hp": { + "n": 0, + "max": 14 + }, + "role": { + "short": "Ran", + "descriptive": "Ranger" + }, + "race": { + "short": "Gno", + "descriptive": "Gnome" + }, + "gender": { + "short": "Fem", + "descriptive": "Female" + }, + "alignment": { + "short": "Neu", + "descriptive": "Neutral" + } + }, + "death": { + "n": 1, + "cause": "killed by a jackal" + }, + "system": { + "hostname": "nutmeg", + "user_id": 1002, + "nethack_version": "3.6.6" + } + } +] diff --git a/scripts/import-nethack-logfile.py b/scripts/import-nethack-logfile.py index 440225e..c8701bc 100755 --- a/scripts/import-nethack-logfile.py +++ b/scripts/import-nethack-logfile.py @@ -13,6 +13,7 @@ import argparse import datetime import json import os.path +import subprocess import sys DUNGEONS = { @@ -73,6 +74,8 @@ def main(argv): print('Given path is not a real file!', file=sys.stderr) return -1 + hostname = subprocess.check_output(['hostname', '-s']).decode('ascii').strip() + records = [] with open(args.logfile) as logfile: for record in logfile.readlines(): @@ -90,34 +93,40 @@ def main(argv): start_date = datetime.datetime.strptime(fields[9], '%Y%m%d').strftime('%Y-%m-%d') end_date = datetime.datetime.strptime(fields[8], '%Y%m%d').strftime('%Y-%m-%d') - name, reason = fields[15].split(',', maxsplit=1) + name, cause_of_death = (s.strip() for s in fields[15].split(',', maxsplit=1)) + role = fields[11] + race = fields[12] + gender = fields[13] + alignment = fields[14] records.append({ - 'nethack_version': fields[0], 'score': int(fields[1]), - 'dungeon_number': int(fields[2]), - 'dungeon_name': dungeon_name, - 'level': dungeon_level, - 'level_descriptive': dungeon_level_descriptive, - 'max_level': int(fields[4]), - 'hit_points': int(fields[5]), - 'max_hit_points': int(fields[6]), - 'number_of_deaths': int(fields[7]), + 'dungeon': { + 'n': int(fields[2]), + 'name': dungeon_name, + 'level': {'n': dungeon_level, 'descriptive': dungeon_level_descriptive}, + }, 'end_date': end_date, 'start_date': start_date, - 'user_id': int(fields[10]), - 'role': ROLES[fields[11]], - 'race': RACES[fields[12]], - 'gender': GENDERS[fields[13]], - 'alignment': ALIGNMENTS[fields[14]], - 'name': name.strip(), - 'reason_for_death': reason.strip(), + 'character': { + 'name': name, + 'abbreviated': f'{name}-{role}-{race}-{gender}-{alignment}', + 'max_level': int(fields[4]), + 'hp': {'n': int(fields[5]), 'max': int(fields[6])}, + 'role': {'short': role, 'descriptive': ROLES[role]}, + 'race': {'short': race, 'descriptive': RACES[race]}, + 'gender': {'short': gender, 'descriptive': GENDERS[gender]}, + 'alignment': {'short': alignment, 'descriptive': ALIGNMENTS[alignment]}, + }, + 'death': {'n': int(fields[7]), 'cause': cause_of_death}, + 'system': { + 'hostname': hostname, + 'user_id': int(fields[10]), + 'nethack_version': fields[0], + } }) - output_object = { - 'records': records, - } - json.dump(output_object, sys.stdout, indent=2) + json.dump(records, sys.stdout, indent=2) print('\n') if __name__ == '__main__':