osrsbox-db/builders/monsters/builder.py

165 lines
6.8 KiB
Python

"""
Author: PH01L
Email: phoil@osrsbox.com
Website: https://www.osrsbox.com
Description:
Program to invoke monster database generation process.
Copyright (c) 2021, PH01L
###############################################################################
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
###############################################################################
"""
import json
import argparse
from pathlib import Path
import config
from builders.monsters import build_monster
class Builder:
def __init__(self, **kwargs):
# Set properties to control phases of build
self.verbose = kwargs["verbose"]
self.compare = kwargs["compare"]
self.export = kwargs["export"]
self.validate = kwargs["validate"]
# Load the raw cache data that has been processed (this is ground truth)
with open(Path(config.DATA_MONSTERS_PATH / "monsters-cache-data.json")) as f:
self.all_monster_cache_data = json.load(f)
# Load all monster data (from min JSON file)
# with open(Path(config.DOCS_PATH / "monsters-complete.json")) as f:
# self.all_db_monsters = json.load(f)
self.all_db_monsters = dict()
# Load the monster wikitext file of page text
with open(Path(config.DATA_MONSTERS_PATH / "monsters-wiki-page-text.json")) as f:
self.all_wikitext_raw = json.load(f)
# Load the monster wikitext file of processed data
with open(Path(config.DATA_MONSTERS_PATH / "monsters-wiki-page-text-processed.json")) as f:
self.all_wikitext_processed = json.load(f)
# Load the monster processed monster drops
with open(Path(config.DATA_MONSTERS_PATH / "monsters-drops.json")) as f:
self.monsters_drops = json.load(f)
# Load schema data
with open(Path(config.DATA_SCHEMAS_PATH / "schema-monsters.json")) as f:
self.schema_data = json.load(f)
# Initialize a list of known monsters
self.known_monsters = list()
def run(self):
# Start processing every monster!
for monster_id in self.all_monster_cache_data:
# if int(monster_id) < 11000:
# continue
# Initialize the BuildMonster class, used for all monsters
builder = build_monster.BuildMonster(monster_id=monster_id,
all_monster_cache_data=self.all_monster_cache_data,
all_db_monsters=self.all_db_monsters,
all_wikitext_raw=self.all_wikitext_raw,
all_wikitext_processed=self.all_wikitext_processed,
monsters_drops=self.monsters_drops,
schema_data=self.schema_data,
known_monsters=self.known_monsters,
verbose=self.verbose)
status = builder.preprocessing()
if status:
builder.populate_monster()
known_monster = builder.check_duplicate_monster()
self.known_monsters.append(known_monster)
builder.populate_monster_drops()
if self.compare:
builder.compare_new_vs_old_monster()
if self.export:
builder.export_monster_to_json()
if self.validate:
builder.validate_monster()
# Done processing, rejoice!
print("Built.")
exit(0)
def test(self):
# Start processing every monster!
for monster_id in self.all_monster_cache_data:
# if int(monster_id) < 10000:
# continue
# Initialize the BuildMonster class, used for all monsters
builder = build_monster.BuildMonster(monster_id=monster_id,
all_monster_cache_data=self.all_monster_cache_data,
all_db_monsters=self.all_db_monsters,
all_wikitext_raw=self.all_wikitext_raw,
all_wikitext_processed=self.all_wikitext_processed,
monsters_drops=self.monsters_drops,
schema_data=self.schema_data,
known_monsters=self.known_monsters,
verbose=self.verbose)
status = builder.preprocessing()
if status:
builder.populate_monster()
known_monster = builder.check_duplicate_monster()
self.known_monsters.append(known_monster)
builder.populate_monster_drops()
builder.validate_monster()
# Done testing, rejoice!
print("Tested.")
exit(0)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Build monster database.")
parser.add_argument('--verbose',
default=False,
required=False,
help='A boolean of whether to be verbose.')
parser.add_argument('--compare',
default=True,
required=False,
help='A boolean of whether to compare data.')
parser.add_argument('--export',
default=False,
required=False,
help='A boolean of whether to export data.')
parser.add_argument('--validate',
default=True,
required=False,
help='A boolean of whether to validate using schema.')
parser.add_argument('--test',
default=False,
required=False,
help='A boolean of whether to test the builder process.')
args = parser.parse_args()
builder = Builder(verbose=args.verbose,
compare=args.compare,
export=args.export,
validate=args.validate)
if args.test:
builder.test()
else:
builder.run()