def parse_bonuses(self, template: mwparserfromhell.nodes.template.Template) -> bool: """Parse the wiki text template and extract item bonus values from it. :param template: A mediawiki wiki text template. """ self.item_dict["equipment"]["attack_stab"] = self.clean_bonuses_value(template, "astab") self.item_dict["equipment"]["attack_slash"] = self.clean_bonuses_value(template, "aslash") self.item_dict["equipment"]["attack_crush"] = self.clean_bonuses_value(template, "acrush") self.item_dict["equipment"]["attack_magic"] = self.clean_bonuses_value(template, "amagic") self.item_dict["equipment"]["attack_ranged"] = self.clean_bonuses_value(template, "arange") self.item_dict["equipment"]["defence_stab"] = self.clean_bonuses_value(template, "dstab") self.item_dict["equipment"]["defence_slash"] = self.clean_bonuses_value(template, "dslash") self.item_dict["equipment"]["defence_crush"] = self.clean_bonuses_value(template, "dcrush") self.item_dict["equipment"]["defence_magic"] = self.clean_bonuses_value(template, "dmagic") self.item_dict["equipment"]["defence_ranged"] = self.clean_bonuses_value(template, "drange") self.item_dict["equipment"]["melee_strength"] = self.clean_bonuses_value(template, "str") self.item_dict["equipment"]["ranged_strength"] = self.clean_bonuses_value(template, "rstr") self.item_dict["equipment"]["magic_damage"] = self.clean_bonuses_value(template, "mdmg") self.item_dict["equipment"]["prayer"] = self.clean_bonuses_value(template, "prayer") self.item_dict["equipment"]["slot"] = None try: self.item_dict["equipment"]["slot"] = self.strip_infobox(template.get("slot").value) self.item_dict["equipment"]["slot"] = self.item_dict["equipment"]["slot"].lower() except ValueError: self.item_dict["equipment"]["slot"] = None self.logger.critical("Could not determine equipable item slot") # If item is weapon, two-handed, or 2h determine attack speed self.item_dict["equipment"]["attack_speed"] = None if (self.item_dict["equipment"]["slot"] == "weapon" or self.item_dict["equipment"]["slot"] == "two-handed" or self.item_dict["equipment"]["slot"] == "2h"): try: self.item_dict["equipment"]["attack_speed"] = int(self.strip_infobox(template.get("aspeed").value)) except ValueError: self.item_dict["equipment"]["attack_speed"] = None self.logger.critical("Could not determine equipable item attack speed") if self.item_dict["equipment"]["attack_speed"] == 0: self.item_dict["equipment"]["attack_speed"] = None # Fetch item skill requirements self.item_dict["equipment"]["skill_reqs"] = None try: skill_reqs = self.skill_requirements[str(self.item_id)] self.item_dict["equipment"]["skill_reqs"] = skill_reqs except KeyError: self.item_dict["equipment"]["skill_reqs"] = None return True
def extract_infobox_value(self, template: mwparserfromhell.nodes.template.Template, key: str) -> str: """Helper method to extract a value from a template using a specified key. This helper method is a simple solution to repeatedly try to fetch a specific entry from a wiki text template (a mwparserfromhell template object). :param template: A mediawiki wiki text template. :param key: The key to query in the template. :return value: The extracted template value based on supplied key. """ value = None try: value = template.get(key).value value = value.strip() return value except ValueError: return value
def parse_bonuses(self, template: mwparserfromhell.nodes.template.Template) -> bool: """Parse the wiki text template and extract item bonus values from it. :param template: A mediawiki wiki text template. """ self.item_dict["equipment"]["attack_stab"] = self.clean_bonuses_value(template, "astab") self.item_dict["equipment"]["attack_slash"] = self.clean_bonuses_value(template, "aslash") self.item_dict["equipment"]["attack_crush"] = self.clean_bonuses_value(template, "acrush") self.item_dict["equipment"]["attack_magic"] = self.clean_bonuses_value(template, "amagic") self.item_dict["equipment"]["attack_ranged"] = self.clean_bonuses_value(template, "arange") self.item_dict["equipment"]["defence_stab"] = self.clean_bonuses_value(template, "dstab") self.item_dict["equipment"]["defence_slash"] = self.clean_bonuses_value(template, "dslash") self.item_dict["equipment"]["defence_crush"] = self.clean_bonuses_value(template, "dcrush") self.item_dict["equipment"]["defence_magic"] = self.clean_bonuses_value(template, "dmagic") self.item_dict["equipment"]["defence_ranged"] = self.clean_bonuses_value(template, "drange") self.item_dict["equipment"]["melee_strength"] = self.clean_bonuses_value(template, "str") self.item_dict["equipment"]["ranged_strength"] = self.clean_bonuses_value(template, "rstr") self.item_dict["equipment"]["magic_damage"] = self.clean_bonuses_value(template, "mdmg") self.item_dict["equipment"]["prayer"] = self.clean_bonuses_value(template, "prayer") # Determine the slot for the equipable item self.item_dict["equipment"]["slot"] = None try: self.item_dict["equipment"]["slot"] = self.strip_infobox(template.get("slot").value) self.item_dict["equipment"]["slot"] = self.item_dict["equipment"]["slot"].lower() except ValueError: self.item_dict["equipment"]["slot"] = None self.logger.critical("Could not determine equipable item slot") quit() # Determine the skill requirements for the equipable item self.item_dict["equipment"]["requirements"] = None try: requirements = self.skill_requirements[str(self.item_id)] self.item_dict["equipment"]["requirements"] = requirements except KeyError: self.item_dict["equipment"]["requirements"] = None # Start processing only weapons # If item is weapon, two-handed, or 2h, start processing the weapon data if (self.item_dict["equipment"]["slot"] == "weapon" or self.item_dict["equipment"]["slot"] == "two-handed" or self.item_dict["equipment"]["slot"] == "2h"): self.item_dict["weapon"] = dict() # Try set the attack speed of the weapon try: self.item_dict["weapon"]["attack_speed"] = int(self.strip_infobox(template.get("aspeed").value)) except ValueError: self.item_dict["weapon"]["attack_speed"] = None self.logger.critical("WEAPON: Could not determine weapon attack speed") # Item IDs with no known attack speed, set to zero if int(self.item_id) in [8871]: self.item_dict["weapon"]["attack_speed"] = 0 # Salamander fix, set to base attack speed of 5 elif int(self.item_id) in [10145, 10146, 10147, 10147, 10148, 10149]: self.item_dict["weapon"]["attack_speed"] = 5 else: quit() # Try to set the weapon type of the weapon try: weapon_type = self.weapon_types[str(self.item_dict["id"])]["weapon_type"] self.item_dict["weapon"]["weapon_type"] = weapon_type except KeyError: self.item_dict["weapon"]["weapon_type"] = None self.logger.critical("WEAPON: Could not determine weapon type") quit() # Try to set stances available for the weapon try: self.item_dict["weapon"]["stances"] = self.weapon_stances[self.item_dict["weapon"]["weapon_type"]] except KeyError: self.item_dict["weapon"]["stances"] = None self.logger.critical("WEAPON: Could not determine weapon stances") quit() # Finally, set the equipable_weapon property to true self.item_dict["equipable_weapon"] = True return True