def object_hook(obj): if '_type' not in obj: return obj if obj['_type'] == 'Waypoint': waypoint = Waypoint( nx.DiGraph(), obj['title'], obj['description'], obj['time_limit'], obj['money_limit'], obj['budget_modification'], [json.loads(i, cls=MarugotoDecoder) for i in obj['items']] if 'items' in obj and obj['items'] else None, obj['timer_visible'], json.loads(obj['level'], cls=MarugotoDecoder)) waypoint.id = UUID(obj['_key']) if 'items' in obj and obj['items']: for i in obj['items']: waypoint.items.append(json.loads(i, cls=MarugotoDecoder)) for t in obj['tasks']: waypoint.tasks.append(UUID(t)) for i in obj['interactions']: waypoint.interactions.append(UUID(i)) return waypoint if obj['_type'] == 'Level': icon = base64.decodebytes(obj['icon']) if obj['icon'] else None return Level(obj['title'], icon) if obj['_type'] == 'Task': media = base64.decodebytes(obj['media']) if obj['media'] else None task = Task( None, obj['description'], obj['text'], obj['solution'], media, [json.loads(i, cls=MarugotoDecoder) for i in obj['items']] if 'items' in obj and obj['items'] else None, obj['time_limit'], obj['money_limit'], obj['budget_modification'], obj['ratio'], obj['days'], obj['offset']) task.id = UUID(obj['_key']) if obj['destination']: task.destination = UUID(obj['destination']) return task if obj['_type'] == 'Dialog': dialog = Dialog() dialog.start = UUID(obj['start']) dialog.id = UUID(obj['_key']) return dialog if obj['_type'] == 'Mail': mail = Mail( nx.DiGraph(), obj['subject'], obj['body'], obj['description'], obj['time_limit'], obj['money_limit'], obj['budget_modification'], [json.loads(i, cls=MarugotoDecoder) for i in obj['items']] if 'items' in obj and obj['items'] else None) mail.id = UUID(obj['_key']) if obj['destination']: mail.destination = UUID(obj['destination']) if obj['task']: mail.task = UUID(obj['task']) for w in obj['waypoints']: mail.waypoints.append(UUID(w)) return mail if obj['_type'] == 'Speech': speech = Speech( nx.DiGraph(), obj['content'], obj['description'], obj['time_limit'], obj['money_limit'], obj['budget_modification'], [json.loads(i, cls=MarugotoDecoder) for i in obj['items']] if 'items' in obj and obj['items'] else None) speech.id = UUID(obj['_key']) if obj['destination']: speech.destination = UUID(obj['destination']) if obj['task']: speech.task = UUID(obj['task']) for w in obj['waypoints']: speech.waypoints.append(UUID(w)) return speech if obj['_type'] == 'Game': game = Game(obj['title']) game.image = base64.decodebytes( obj['image']) if obj['image'] else None game.energy = obj['energy'] game.start = UUID(obj['start']) return game if obj['_type'] == 'GameInstance': game_instance = GameInstance( json.loads(obj['game'], cls=MarugotoDecoder), obj['name'], json.loads(obj['game_master'], cls=MarugotoDecoder), strptime(obj['starts_at'], '%Y-%m-%d %H-%M-%S-%f') if obj['starts_at'] else None, strptime(obj['ends_at'], '%Y-%m-%d %H-%M-%S-%f') if obj['ends_at'] else None) game_instance.created_at = strptime(obj['created_at'], '%Y-%m-%d %H-%M-%S-%f') game_instance.id = UUID(obj['_key']) if obj['players']: for player in obj['players']: game_instance.player_states.append( json.loads(player, cls=MarugotoDecoder)) if obj['npcs']: for npc in obj['npcs']: game_instance.npc_states.append( json.loads(npc, cls=MarugotoDecoder)) return game_instance if obj['_type'] == 'Player': player = Player(obj['mail'], obj['password']) player.id = UUID(obj['_key']) return player if obj['_type'] == 'PlayerState': player_state = PlayerState( json.loads(obj['player'], cls=MarugotoDecoder), obj['first'], obj['last'], None, obj['budget']) player_state.energy = obj['energy'] for waypoint in obj['path']: player_state.path.append( json.loads(waypoint, cls=MarugotoDecoder)) for npc, interactions in obj['dialogs'].items(): player_state.dialogs[npc] = [(strptime(i['stamp'], '%Y-%m-%d %H-%M-%S-%f'), json.loads(i['interaction'], cls=MarugotoDecoder), i['response']) for i in interactions] for stamp, kvs in obj['inventory']: player_state.inventory[strptime(stamp, '%Y-%m-%d %H-%M-%S-%f')] = [ (k['key'], json.loads(v['value'])) for k, v in kvs ] return player_state if obj['_type'] == 'NonPlayableCharacterState': npc = NonPlayableCharacterState( obj['first'], obj['last'], None, json.loads(obj['dialog'], cls=MarugotoDecoder), obj['salutation'], obj['mail'], base64.decodebytes(obj['image']) if obj['image'] else None) for player, interactions in obj['paths'].items(): npc.paths[json.loads(player, cls=MarugotoDecoder)] = [ (strptime(i['stamp'], '%Y-%m-%d %H-%M-%S-%f'), json.loads(i['interaction'], cls=MarugotoDecoder)) for i in interactions ] return npc if obj['_type'] == 'UUID': return UUID(obj['value']) if obj['_type'] == 'STAMP': return strptime(obj['value'], '%Y-%m-%d %H-%M-%S-%f') return obj