Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.wiki.dumper.scraper.requests
- import org.jsoup.nodes.Document
- import org.jsoup.nodes.Element
- import org.wiki.rs.definition.server.NpcData
- import org.wiki.dumper.scraper.PageRequest
- import org.wiki.dumper.scraper.ScrapePage
- /**
- * TODO: add documentation
- *
- * @author Stan van der Bend (https://www.rune-server.ee/members/StanDev/)
- * @since 2019-02-12
- * @version 1.0
- */
- class NpcPageRequest(id: Int, name: String, private val combatLevel: Int = -1) : PageRequest<NpcData>(id, name) {
- override fun parse(doc: Document): NpcData {
- val data = NpcData()
- data.id = id
- data.name = name
- data.combatLevel = combatLevel
- val configTable = doc.selectFirst("table.rsw-infobox")
- var previousHeader = ""
- if(configTable == null)
- return data
- for (row in configTable.select("tr")) {
- if (row == null)
- continue
- val header = row.select("th").text()
- val firstColumn = row.selectFirst("td")
- val firstColumnText = (firstColumn?.text()?:"").trim()
- if(firstColumnText.isNotEmpty() && (firstColumnText.contains("N/A", true)
- || firstColumnText.contains("edit", true)
- || firstColumnText.contains("?", true)
- ))
- continue
- if(firstColumnText.contains("non-combat", true))
- continue
- if(firstColumnText.contains("varies", true))
- continue
- if(firstColumnText.contains("none", true))
- continue
- when {
- header == "Always drops" -> data.alwaysDrop = firstColumnText
- header == "Hitpoints" -> data.hitpoints = firstColumnText.toInt()
- header == "Max hit" -> data.extractMaxHit(firstColumnText)
- header == "Aggressive" -> data.aggressive = firstColumnText.toLowerCase() == "yes"
- header == "Poison" -> data.poison = firstColumnText.toLowerCase() == "yes"
- header == "Weakness" -> data.weakness =firstColumnText.replace("/", ",").split(",").toTypedArray()
- header == "Attack style" -> data.attackStyle = firstColumnText
- header == "Slayer level" -> data.slayerLevel = if(firstColumnText.contains("no", true)) -1 else firstColumnText.toInt()
- header == "Slayer XP" -> data.slayerXp = firstColumnText.replace(",", "").toDouble()
- header == "Category" -> data.slayerCategory = firstColumnText
- header == "Assigned by" -> data.slayerMasters = firstColumn.select("a").map { it.attr("title") }.toTypedArray()
- previousHeader == "Examine" -> data.examine = firstColumnText
- }
- previousHeader = header
- for(col in row.select("td")){
- if(col != null){
- val colText = (col.text() ?:"").trim()
- when(col.attr("data-attr-param")) {
- "att" -> data.combatStats[0] = colText.toInt()
- "str" -> data.combatStats[1] = colText.toInt()
- "def" -> data.combatStats[2] = colText.toInt()
- "mage" -> data.combatStats[3] = colText.toInt()
- "range" -> data.combatStats[4] = colText.toInt()
- "astab" -> data.aggressiveStats[0] = readBonus(col)
- "aslash" -> data.aggressiveStats[1] = readBonus(col)
- "acrush" -> data.aggressiveStats[2] = readBonus(col)
- "amagic" -> data.aggressiveStats[3] = readBonus(col)
- "arange" -> data.aggressiveStats[4] = readBonus(col)
- "dstab" -> data.defensiveStats[0] = readBonus(col)
- "dslash" -> data.defensiveStats[1] = readBonus(col)
- "dcrush" -> data.defensiveStats[2] = readBonus(col)
- "dmagic" -> data.defensiveStats[3] = readBonus(col)
- "drange" -> data.defensiveStats[4] = readBonus(col)
- "attbns" -> data.otherBonuses[0] = readBonus(col)
- "strbns" -> data.otherBonuses[1] = readBonus(col)
- "rngbns" -> data.otherBonuses[2] = readBonus(col)
- "mbns" -> data.otherBonuses[3] = readBonus(col)
- "immunepoison" -> data.immunePoison = !colText.contains("not", true)
- "immunevenom" -> data.immuneVenom = !colText.contains("not", true)
- "attack speed" -> data.attackSpeed = col
- .selectFirst("a")
- ?.selectFirst("img")
- ?.attr("alt")
- ?.replace("Monster attack speed", "")
- ?.replaceAfter(".png", "")
- ?.dropLast(4)?.trim()?.toInt()
- ?:-1
- }
- }
- }
- }
- ScrapePage.counter.incrementAndGet()
- return data
- }
- private fun readBonus(col: Element) : Int {
- return (if(col.text().contains("-")) -1 else 1) * col.text().trim().replace("%", "").drop(1).toInt()
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement