Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 5.34 KB | None | 0 0
  1. package org.wiki.dumper.scraper.requests
  2.  
  3. import org.jsoup.nodes.Document
  4. import org.jsoup.nodes.Element
  5. import org.wiki.rs.definition.server.NpcData
  6. import org.wiki.dumper.scraper.PageRequest
  7. import org.wiki.dumper.scraper.ScrapePage
  8.  
  9. /**
  10.  * TODO: add documentation
  11.  *
  12.  * @author  Stan van der Bend (https://www.rune-server.ee/members/StanDev/)
  13.  * @since   2019-02-12
  14.  * @version 1.0
  15.  */
  16. class NpcPageRequest(id: Int, name: String, private val combatLevel: Int = -1) : PageRequest<NpcData>(id, name) {
  17.  
  18.     override fun parse(doc: Document): NpcData {
  19.         val data = NpcData()
  20.         data.id = id
  21.         data.name = name
  22.         data.combatLevel = combatLevel
  23.  
  24.         val configTable = doc.selectFirst("table.rsw-infobox")
  25.         var previousHeader = ""
  26.  
  27.         if(configTable == null)
  28.             return data
  29.  
  30.         for (row in configTable.select("tr")) {
  31.  
  32.             if (row == null)
  33.                 continue
  34.  
  35.             val header = row.select("th").text()
  36.             val firstColumn = row.selectFirst("td")
  37.             val firstColumnText = (firstColumn?.text()?:"").trim()
  38.  
  39.             if(firstColumnText.isNotEmpty() && (firstColumnText.contains("N/A", true)
  40.                                 || firstColumnText.contains("edit", true)
  41.                                 || firstColumnText.contains("?", true)
  42.                         ))
  43.                 continue
  44.  
  45.             if(firstColumnText.contains("non-combat", true))
  46.                 continue
  47.             if(firstColumnText.contains("varies", true))
  48.                 continue
  49.             if(firstColumnText.contains("none", true))
  50.                 continue
  51.             when {
  52.                 header == "Always drops" -> data.alwaysDrop = firstColumnText
  53.  
  54.                 header == "Hitpoints" -> data.hitpoints = firstColumnText.toInt()
  55.                 header == "Max hit" -> data.extractMaxHit(firstColumnText)
  56.                 header == "Aggressive" -> data.aggressive = firstColumnText.toLowerCase() == "yes"
  57.                 header == "Poison" -> data.poison = firstColumnText.toLowerCase() == "yes"
  58.                 header == "Weakness" -> data.weakness =firstColumnText.replace("/", ",").split(",").toTypedArray()
  59.                 header == "Attack style" -> data.attackStyle = firstColumnText
  60.  
  61.                 header == "Slayer level" -> data.slayerLevel = if(firstColumnText.contains("no", true)) -1 else firstColumnText.toInt()
  62.                 header == "Slayer XP" -> data.slayerXp = firstColumnText.replace(",", "").toDouble()
  63.                 header == "Category" -> data.slayerCategory = firstColumnText
  64.                 header == "Assigned by" -> data.slayerMasters = firstColumn.select("a").map { it.attr("title") }.toTypedArray()
  65.                 previousHeader == "Examine" -> data.examine = firstColumnText
  66.             }
  67.             previousHeader = header
  68.  
  69.             for(col in row.select("td")){
  70.                 if(col != null){
  71.  
  72.                     val colText = (col.text() ?:"").trim()
  73.  
  74.                     when(col.attr("data-attr-param")) {
  75.                         "att" -> data.combatStats[0] = colText.toInt()
  76.                         "str" -> data.combatStats[1] = colText.toInt()
  77.                         "def" -> data.combatStats[2] = colText.toInt()
  78.                         "mage" -> data.combatStats[3] = colText.toInt()
  79.                         "range" -> data.combatStats[4] = colText.toInt()
  80.  
  81.                         "astab" -> data.aggressiveStats[0] = readBonus(col)
  82.                         "aslash" -> data.aggressiveStats[1] = readBonus(col)
  83.                         "acrush" -> data.aggressiveStats[2] = readBonus(col)
  84.                         "amagic" -> data.aggressiveStats[3] = readBonus(col)
  85.                         "arange" -> data.aggressiveStats[4] = readBonus(col)
  86.  
  87.                         "dstab" -> data.defensiveStats[0] = readBonus(col)
  88.                         "dslash" -> data.defensiveStats[1] = readBonus(col)
  89.                         "dcrush" -> data.defensiveStats[2] = readBonus(col)
  90.                         "dmagic" -> data.defensiveStats[3] = readBonus(col)
  91.                         "drange" -> data.defensiveStats[4] = readBonus(col)
  92.  
  93.                         "attbns" -> data.otherBonuses[0] = readBonus(col)
  94.                         "strbns" -> data.otherBonuses[1] = readBonus(col)
  95.                         "rngbns" -> data.otherBonuses[2] = readBonus(col)
  96.                         "mbns" -> data.otherBonuses[3] = readBonus(col)
  97.  
  98.                         "immunepoison" -> data.immunePoison = !colText.contains("not", true)
  99.                         "immunevenom" -> data.immuneVenom = !colText.contains("not", true)
  100.  
  101.                         "attack speed" -> data.attackSpeed = col
  102.                             .selectFirst("a")
  103.                             ?.selectFirst("img")
  104.                             ?.attr("alt")
  105.                             ?.replace("Monster attack speed", "")
  106.                             ?.replaceAfter(".png", "")
  107.                             ?.dropLast(4)?.trim()?.toInt()
  108.                             ?:-1
  109.  
  110.                     }
  111.                 }
  112.             }
  113.  
  114.         }
  115.         ScrapePage.counter.incrementAndGet()
  116.         return data
  117.     }
  118.  
  119.     private fun readBonus(col: Element) : Int {
  120.         return (if(col.text().contains("-")) -1 else 1) * col.text().trim().replace("%", "").drop(1).toInt()
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement