install_base.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. #!/usr/bin/python3
  2. import urllib3
  3. import sys
  4. import os
  5. import requests
  6. import urllib.request
  7. import sqlite3
  8. import wget
  9. import json
  10. OPT_DOWNLOAD = True;
  11. OPT_DOWNLOAD_OVERWRITE = False;
  12. """
  13. Initializes the database file and creates all the tables.
  14. :param name: The path to the sqlite database.
  15. :returns: Connection to the database.
  16. :raises IntegrityError: The queryes couldn't bre executed.
  17. :raises IOError: The sqlite file couldn't be created.
  18. """
  19. def createDatabase(name):
  20. global OPT_CREATE_DB
  21. print('Configuring database...')
  22. try:
  23. db = sqlite3.connect(name)
  24. cursor = db.cursor()
  25. cursor.execute('''
  26. CREATE TABLE IF NOT EXISTS k_building(
  27. id INT,
  28. com2us_id INT,
  29. area TEXT,
  30. affected_stat TEXT,
  31. element TEXT,
  32. name TEXT,
  33. description TEXT,
  34. max_level INT
  35. );
  36. ''')
  37. cursor.execute('''
  38. CREATE TABLE IF NOT EXISTS k_building_level(
  39. building INT,
  40. level INT,
  41. bonus INT,
  42. cost INT
  43. );
  44. ''')
  45. cursor.execute('''
  46. CREATE TABLE IF NOT EXISTS k_effect(
  47. id INT,
  48. name TEXT,
  49. is_buff INT,
  50. description TEXT
  51. );
  52. ''')
  53. cursor.execute('''
  54. CREATE TABLE IF NOT EXISTS k_skill_level(
  55. skill INT,
  56. level INT,
  57. description TEXT
  58. );
  59. ''')
  60. cursor.execute('''
  61. CREATE TABLE IF NOT EXISTS k_skill(
  62. id INT,
  63. com2us_id TEXT,
  64. name TEXT,
  65. description TEXT,
  66. slot INT,
  67. cooltime INT,
  68. hits INT,
  69. passive INT,
  70. aoe INT,
  71. max_level INT,
  72. multiplier_formula TEXT
  73. );
  74. ''')
  75. cursor.execute('''
  76. CREATE TABLE IF NOT EXISTS k_skill_effect(
  77. skill INT,
  78. effect INT
  79. );
  80. ''')
  81. cursor.execute('''
  82. CREATE TABLE IF NOT EXISTS k_leader_skill(
  83. id INT,
  84. attribute TEXT,
  85. amount INT,
  86. area TEXT,
  87. element TEXT
  88. );
  89. ''')
  90. cursor.execute('''
  91. CREATE TABLE IF NOT EXISTS k_source(
  92. id INT,
  93. name TEXT,
  94. description TEXT,
  95. farmable_source INT
  96. );
  97. ''')
  98. cursor.execute('''
  99. CREATE TABLE IF NOT EXISTS k_monster(
  100. id INT,
  101. com2us_id TEXT,
  102. family_id TEXT,
  103. name TEXT,
  104. element TEXT,
  105. archetype TEXT,
  106. base_stars INT,
  107. natural_stars INT,
  108. obtainable INT,
  109. can_awaken INT,
  110. awaken_bonus TEXT,
  111. skill_ups_to_max INT,
  112. leader_skill INT,
  113. base_hp INT,
  114. base_attack INT,
  115. base_defense INT,
  116. speed INT,
  117. crit_rate INT,
  118. crit_damage INT,
  119. resistance INT,
  120. accuracy INT,
  121. raw_hp INT,
  122. raw_attack INT,
  123. raw_defense INT,
  124. max_lvl_hp INT,
  125. max_lvl_attack INT,
  126. max_lvl_defense INT,
  127. awakens_from INT,
  128. awakens_to INT,
  129. fusion_food INT,
  130. homunculus INT,
  131. craft_cost INT
  132. );
  133. ''')
  134. cursor.execute('''
  135. CREATE TABLE IF NOT EXISTS k_monster_skill(
  136. monster INT,
  137. skill INT
  138. );
  139. ''')
  140. cursor.execute('''
  141. CREATE TABLE IF NOT EXISTS k_monster_source(
  142. monster INT,
  143. source INT
  144. );
  145. ''')
  146. cursor.execute('''
  147. CREATE TABLE IF NOT EXISTS k_monster_essence(
  148. monster INT,
  149. element TEXT,
  150. grade TEXT,
  151. amount TEXT
  152. );
  153. ''')
  154. cursor.execute('''
  155. CREATE TABLE IF NOT EXISTS k_fusion(
  156. id INT,
  157. product INT,
  158. stars INT,
  159. cost INT,
  160. ingredient INT
  161. );
  162. ''')
  163. cursor.execute('''
  164. CREATE TABLE IF NOT EXISTS k_craft(
  165. id INT,
  166. name INT
  167. );
  168. ''')
  169. cursor.execute('''
  170. CREATE TABLE IF NOT EXISTS monster(
  171. id TEXT,
  172. com2us_id TEXT,
  173. monster INT,
  174. stars INT,
  175. level INT,
  176. skill_1_level INT,
  177. skill_2_level INT,
  178. skill_3_level INT,
  179. skill_4_level INT,
  180. base_hp INT,
  181. base_attack INT,
  182. base_defense INT,
  183. base_speed INT,
  184. base_crit_rate INT,
  185. base_crit_damage INT,
  186. base_resistance INT,
  187. base_accuracy INT,
  188. rune_hp INT,
  189. rune_attack INT,
  190. rune_defense INT,
  191. rune_speed INT,
  192. rune_crit_rate INT,
  193. rune_crit_damage INT,
  194. rune_resistance INT,
  195. rune_accuracy INT,
  196. avg_rune_efficiency INT,
  197. fodder INT,
  198. in_storage INT,
  199. ignore_for_fusion INT,
  200. priority INT,
  201. notes INT
  202. );
  203. ''')
  204. cursor.execute('''
  205. CREATE TABLE IF NOT EXISTS rune(
  206. id TEXT,
  207. com2us_id TEXT,
  208. assigned_to TEXT,
  209. type TEXT,
  210. slot INT,
  211. stars INT,
  212. level INT,
  213. quality INT,
  214. original_quality INT,
  215. value INT,
  216. substat_upgrades_remaining INT,
  217. efficiency INT,
  218. max_efficiency INT,
  219. main_stat TEXT,
  220. main_stat_value INT,
  221. innate_stat TEXT,
  222. innate_stat_value INT,
  223. substat_1 TEXT,
  224. substat_1_value INT,
  225. substat_1_craft INT,
  226. substat_2 TEXT,
  227. substat_2_value INT,
  228. substat_2_craft INT,
  229. substat_3 TEXT,
  230. substat_3_value INT,
  231. substat_3_craft INT,
  232. substat_4 TEXT,
  233. substat_4_value INT,
  234. substat_4_craft INT
  235. );
  236. ''')
  237. cursor.execute('''
  238. CREATE TABLE IF NOT EXISTS monster_rune(
  239. monster TEXT,
  240. rune INT
  241. );
  242. ''')
  243. cursor.execute('''
  244. CREATE TABLE IF NOT EXISTS building(
  245. building INT,
  246. level INT
  247. );
  248. ''')
  249. db.commit()
  250. cursor.close()
  251. return db
  252. except sqlite3.IntegrityError as e:
  253. print("Error executing statement: " + str(e))
  254. raise
  255. except IOError as e:
  256. print("I/O Error creating database " + name + ": " + str(e))
  257. raise
  258. """
  259. Inserts a row into the database.
  260. :param db: Connection to the database.
  261. :param table: Name of the table to insert into.
  262. :param values: List of values to insert.
  263. :raises IntegrityError: The insert query was unsuccesfull.
  264. """
  265. def insert(db, table, values):
  266. cursor = db.cursor()
  267. placeholders = ''
  268. for x in range(0, len(values)):
  269. placeholders = placeholders + '?, '
  270. placeholders = placeholders[:len(placeholders) - 2]
  271. query = 'INSERT INTO ' + table + ' VALUES (' + placeholders + ')'
  272. try:
  273. cursor.execute(query, values)
  274. except sqlite3.IntegrityError as e:
  275. print('Error Inserting into ' + table + ' with values (' + str(values) + '): ' + str(e))
  276. raise
  277. cursor.close;
  278. """
  279. Dowwnloads a file.
  280. If OPT_DOWNLOAD is set to false, it will do nothing (but it will still return
  281. true).
  282. If OPT_DOWNLOAD_OVERWRITE it will only download the file if the target doesn't
  283. exist (but it will still return true if it does).
  284. :param url: File url.
  285. :param target: Full or relative path (whit filename to save the url).
  286. :returns: True on success, false on error.
  287. """
  288. def download(url, target):
  289. if OPT_DOWNLOAD == False:
  290. return True
  291. if OPT_DOWNLOAD_OVERWRITE == False and os.path.isfile(target):
  292. return True
  293. try:
  294. urllib.request.urlretrieve(url, target)
  295. return True
  296. except:
  297. return False
  298. """
  299. Parses building date (tables k_building, k_building_level).
  300. :param db: Sqlite database connection.
  301. :param url: Swarfarm APIv2, buildings.
  302. """
  303. def parseBuildings(db, url):
  304. print("Parsing buildings...")
  305. http = urllib3.PoolManager()
  306. mlist = str(http.request('GET', url).data.decode('utf-8'))
  307. data = json.loads(mlist)
  308. while True:
  309. for building in data["results"]:
  310. id = building["id"]
  311. com2us_id = building["com2us_id"]
  312. area = building["area"]
  313. affected_stat = building["affected_stat"]
  314. element = building["element"]
  315. name = building["name"]
  316. description = building["description"]
  317. max_level = building["max_level"]
  318. insert(db, "k_building", (id, com2us_id, area, affected_stat, element, name, description, max_level))
  319. lv = 0
  320. for bonus in building["stat_bonus"]:
  321. insert(db, "k_building_level", (id, lv, bonus, building["upgrade_cost"][lv]))
  322. lv = lv + 1
  323. # Next page
  324. db.commit()
  325. if data["next"] != None:
  326. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  327. data = json.loads(mlist)
  328. else:
  329. break
  330. """
  331. Parses skill data (tables k_skill, k_skill_level, k_skill_effect).
  332. :param db: Sqlite database connection.
  333. :param url: Swarfarm APIv2, skills.
  334. """
  335. def parseSkills(db, url):
  336. print("Parsing skills...")
  337. http = urllib3.PoolManager()
  338. mlist = str(http.request('GET', url).data.decode('utf-8'))
  339. data = json.loads(mlist)
  340. while True:
  341. for skill in data["results"]:
  342. id = skill["id"]
  343. com2us_id = skill["com2us_id"]
  344. name = skill["name"]
  345. description = skill["description"]
  346. slot = skill["slot"]
  347. cooltime = skill["cooltime"]
  348. hits = skill["hits"]
  349. passive = skill["passive"]
  350. aoe = skill["aoe"]
  351. max_level = skill["max_level"]
  352. multiplier_formula = skill["multiplier_formula"]
  353. insert(db, "k_skill", (id, com2us_id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula))
  354. insert(db, "k_skill_level", (id, 1, ""))
  355. if (max_level > 1):
  356. lv = 2
  357. for level in skill["level_progress_description"]:
  358. insert(db, "k_skill_level", (id, str(lv), level))
  359. lv = lv + 1
  360. for effect in skill["effects"]:
  361. insert(db, "k_skill_effect", (id, effect["effect"]["id"]))
  362. image = "https://swarfarm.com/static/herders/images/skills/" + skill["icon_filename"]
  363. download(image, 'public/img/content/skill/' + str(id).zfill(4) + '.png')
  364. # Next page
  365. db.commit()
  366. if data["next"] != None:
  367. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  368. data = json.loads(mlist)
  369. else:
  370. break
  371. """
  372. Parses leader skills (table k_leader_skill).
  373. :param db: Sqlite database connection.
  374. :param url: Swarfarm APIv2, leader-skills.
  375. """
  376. def parseLeaderSkills(db, url):
  377. print("Parsing leader skills...")
  378. http = urllib3.PoolManager()
  379. mlist = str(http.request('GET', url).data.decode('utf-8'))
  380. data = json.loads(mlist)
  381. while True:
  382. for skill in data["results"]:
  383. id = skill["id"]
  384. attribute = skill["attribute"]
  385. amount = skill["amount"]
  386. area = skill["area"]
  387. element = skill["element"]
  388. insert(db, "k_leader_skill", (id, attribute, amount, area, element))
  389. # Next page
  390. db.commit()
  391. if data["next"] != None:
  392. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  393. data = json.loads(mlist)
  394. else:
  395. break
  396. """
  397. Parses skill effects (table k_effect).
  398. :param db: Sqlite database connection.
  399. :param url: Swarfarm APIv2, skill-efects.
  400. """
  401. def parseEffects(db, url):
  402. print("Parsing skill effects...")
  403. http = urllib3.PoolManager()
  404. mlist = str(http.request('GET', url).data.decode('utf-8'))
  405. data = json.loads(mlist)
  406. while True:
  407. for effect in data["results"]:
  408. id = effect["id"]
  409. name = effect["name"]
  410. is_buff = effect["is_buff"]
  411. description = effect["description"]
  412. insert(db, "k_effect", (id, name, is_buff, description))
  413. # Next page
  414. db.commit()
  415. if data["next"] != None:
  416. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  417. data = json.loads(mlist)
  418. else:
  419. break
  420. """
  421. Parses monster sources (table k_source).
  422. :param db: Sqlite database connection.
  423. :param url: Swarfarm APIv2, craft-materials.
  424. """
  425. def parseSources(db, url):
  426. print("Parsing sources...")
  427. http = urllib3.PoolManager()
  428. mlist = str(http.request('GET', url).data.decode('utf-8'))
  429. data = json.loads(mlist)
  430. while True:
  431. for source in data["results"]:
  432. id = source["id"]
  433. name = source["name"]
  434. description = source["description"]
  435. farmable_source = source["farmable_source"]
  436. insert(db, "k_source", (id, name, description, farmable_source))
  437. # Next page
  438. db.commit()
  439. if data["next"] != None:
  440. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  441. data = json.loads(mlist)
  442. else:
  443. break
  444. """
  445. Parses monster data (tables k_monster, k_monster_essence, k_monster_source,
  446. k_monsster_skill).
  447. :param db: Sqlite database connection.
  448. :param url: Swarfarm APIv2, monsters.
  449. """
  450. def parseMonsters(db, url):
  451. print("Parsing monsters...")
  452. http = urllib3.PoolManager()
  453. mlist = str(http.request('GET', url).data.decode('utf-8'))
  454. data = json.loads(mlist)
  455. while True:
  456. for mon in data["results"]:
  457. id = mon["id"]
  458. url = mon["url"]
  459. com2us_id = mon["com2us_id"]
  460. family_id = mon["family_id"]
  461. name = mon["name"]
  462. image_filename = mon["image_filename"]
  463. element = mon["element"]
  464. archetype = mon["archetype"]
  465. base_stars = mon["base_stars"]
  466. natural_stars = mon["natural_stars"]
  467. obtainable = mon["obtainable"]
  468. can_awaken = mon["can_awaken"]
  469. awaken_level = mon["awaken_level"]
  470. awaken_bonus = mon["awaken_bonus"]
  471. skill_ups_to_max = mon["skill_ups_to_max"]
  472. if mon["leader_skill"] != None:
  473. leader_skill = mon["leader_skill"]["id"]
  474. else:
  475. leader_skill = None
  476. homunculus_skills = mon["homunculus_skills"]
  477. base_hp = mon["base_hp"]
  478. base_attack = mon["base_attack"]
  479. base_defense = mon["base_defense"]
  480. speed = mon["speed"]
  481. crit_rate = mon["crit_rate"]
  482. crit_damage = mon["crit_damage"]
  483. resistance = mon["resistance"]
  484. accuracy = mon["accuracy"]
  485. raw_hp = mon["raw_hp"]
  486. raw_attack = mon["raw_attack"]
  487. raw_defense = mon["raw_defense"]
  488. max_lvl_hp = mon["max_lvl_hp"]
  489. max_lvl_attack = mon["max_lvl_attack"]
  490. max_lvl_defense = mon["max_lvl_defense"]
  491. awakens_from = mon["awakens_from"]
  492. awakens_to = mon["awakens_to"]
  493. awaken_mats_fire_low = mon["awaken_mats_fire_low"]
  494. awaken_mats_fire_mid = mon["awaken_mats_fire_mid"]
  495. awaken_mats_fire_high = mon["awaken_mats_fire_high"]
  496. awaken_mats_water_low = mon["awaken_mats_water_low"]
  497. awaken_mats_water_mid = mon["awaken_mats_water_mid"]
  498. awaken_mats_water_high = mon["awaken_mats_water_high"]
  499. awaken_mats_wind_low = mon["awaken_mats_wind_low"]
  500. awaken_mats_wind_mid = mon["awaken_mats_wind_mid"]
  501. awaken_mats_wind_high = mon["awaken_mats_wind_high"]
  502. awaken_mats_light_low = mon["awaken_mats_light_low"]
  503. awaken_mats_light_mid = mon["awaken_mats_light_mid"]
  504. awaken_mats_light_high = mon["awaken_mats_light_high"]
  505. awaken_mats_dark_low = mon["awaken_mats_dark_low"]
  506. awaken_mats_dark_mid = mon["awaken_mats_dark_mid"]
  507. awaken_mats_dark_high = mon["awaken_mats_dark_high"]
  508. awaken_mats_magic_low = mon["awaken_mats_magic_low"]
  509. awaken_mats_magic_mid = mon["awaken_mats_magic_mid"]
  510. awaken_mats_magic_high = mon["awaken_mats_magic_high"]
  511. fusion_food = mon["fusion_food"]
  512. homunculus = mon["homunculus"]
  513. craft_cost = mon["craft_cost"]
  514. insert(db, "k_monster", (id, com2us_id, family_id, name, element, archetype, base_stars, natural_stars, obtainable, can_awaken, awaken_bonus, skill_ups_to_max, leader_skill, base_hp, base_attack, base_defense, speed, crit_rate, crit_damage, resistance, accuracy, raw_hp, raw_attack, raw_defense, max_lvl_hp, max_lvl_attack, max_lvl_defense, awakens_from, awakens_to, fusion_food, homunculus, craft_cost))
  515. if awaken_mats_fire_low > 0:
  516. insert(db, "k_monster_essence", (id, "Fire", "Low", awaken_mats_fire_low))
  517. if awaken_mats_fire_mid > 0:
  518. insert(db, "k_monster_essence", (id, "Fire", "Mid", awaken_mats_fire_mid))
  519. if awaken_mats_fire_high > 0:
  520. insert(db, "k_monster_essence", (id, "Fire", "High", awaken_mats_fire_high))
  521. if awaken_mats_water_low > 0:
  522. insert(db, "k_monster_essence", (id, "Water", "Low", awaken_mats_water_low))
  523. if awaken_mats_water_mid > 0:
  524. insert(db, "k_monster_essence", (id, "Water", "Mid", awaken_mats_water_mid))
  525. if awaken_mats_water_high > 0:
  526. insert(db, "k_monster_essence", (id, "Water", "High", awaken_mats_water_high))
  527. if awaken_mats_wind_low > 0:
  528. insert(db, "k_monster_essence", (id, "Wind", "Low", awaken_mats_wind_low))
  529. if awaken_mats_wind_mid > 0:
  530. insert(db, "k_monster_essence", (id, "Wind", "Mid", awaken_mats_wind_mid))
  531. if awaken_mats_wind_high > 0:
  532. insert(db, "k_monster_essence", (id, "Wind", "High", awaken_mats_wind_high))
  533. if awaken_mats_dark_low > 0:
  534. insert(db, "k_monster_essence", (id, "Dark", "Low", awaken_mats_dark_low))
  535. if awaken_mats_dark_mid > 0:
  536. insert(db, "k_monster_essence", (id, "Dark", "Mid", awaken_mats_dark_mid))
  537. if awaken_mats_dark_high > 0:
  538. insert(db, "k_monster_essence", (id, "Dark", "High", awaken_mats_dark_high))
  539. if awaken_mats_light_low > 0:
  540. insert(db, "k_monster_essence", (id, "Light", "Low", awaken_mats_light_low))
  541. if awaken_mats_light_mid > 0:
  542. insert(db, "k_monster_essence", (id, "Light", "Mid", awaken_mats_light_mid))
  543. if awaken_mats_light_high > 0:
  544. insert(db, "k_monster_essence", (id, "Light", "High", awaken_mats_light_high))
  545. if awaken_mats_magic_low > 0:
  546. insert(db, "k_monster_essence", (id, "Magic", "Low", awaken_mats_magic_low))
  547. if awaken_mats_magic_mid > 0:
  548. insert(db, "k_monster_essence", (id, "Magic", "Mid", awaken_mats_magic_mid))
  549. if awaken_mats_magic_high > 0:
  550. insert(db, "k_monster_essence", (id, "Magic", "High", awaken_mats_magic_high))
  551. for skill in mon["skills"]:
  552. insert(db, "k_monster_skill", (id, skill))
  553. for source in mon["source"]:
  554. insert(db, "k_monster_source", (id, source["id"]))
  555. # TODO: craft_materials
  556. image = "https://swarfarm.com/static/herders/images/monsters/" + mon["image_filename"]
  557. download(image, 'public/img/content/monster/' + str(id).zfill(4) + '.png')
  558. # Next page
  559. db.commit()
  560. if data["next"] != None:
  561. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  562. data = json.loads(mlist)
  563. else:
  564. break
  565. """
  566. Parses fusion data (table k_fusion).
  567. :param db: Sqlite database connection.
  568. :param url: Swarfarm APIv2, fusions.
  569. """
  570. def parseFusions(db, url):
  571. print("Parsing fusions...")
  572. http = urllib3.PoolManager()
  573. mlist = str(http.request('GET', url).data.decode('utf-8'))
  574. data = json.loads(mlist)
  575. while True:
  576. for fusion in data["results"]:
  577. id = fusion["id"]
  578. product = fusion["product"]
  579. stars = fusion["stars"]
  580. cost = fusion["cost"]
  581. for ingredient in fusion["ingredients"]:
  582. insert(db, "k_fusion", (id, product, stars, cost, ingredient))
  583. # Next page
  584. db.commit()
  585. if data["next"] != None:
  586. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  587. data = json.loads(mlist)
  588. else:
  589. break
  590. """
  591. Parses crafting materials (table k_craft).
  592. :param db: Sqlite database connection.
  593. :param url: Swarfarm APIv2, craft-materials.
  594. """
  595. def parseCraft(db, url):
  596. print("Parsing crafting materials...")
  597. http = urllib3.PoolManager()
  598. mlist = str(http.request('GET', url).data.decode('utf-8'))
  599. data = json.loads(mlist)
  600. while True:
  601. first = False
  602. for crat in data["results"]:
  603. id = crat["id"]
  604. name = crat["name"]
  605. insert(db, "k_craft", (id, name))
  606. # Next page
  607. db.commit()
  608. if data["next"] != None:
  609. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  610. data = json.loads(mlist)
  611. else:
  612. break
  613. """
  614. Removes references to imperfect monsters.
  615. Imperfect monsters are only available in Japanese servers due to legal reasons,
  616. they are not needed for this app. They wont be deleted, but awakening chains
  617. wil be cut.
  618. :param db: Sqlite database connection.
  619. """
  620. def removeImperfect():
  621. cursor = db.cursor()
  622. cursor.execute('''
  623. UPDATE k_monster
  624. SET awakens_from = null
  625. WHERE awakens_from IN (SELECT id FROM k_monster WHERE name LIKE 'Imperfect %')
  626. ''');
  627. db.commit()
  628. cursor.close()
  629. """
  630. Begin script
  631. """
  632. db = createDatabase('application/sw.sqlite')
  633. parseBuildings(db, 'https://swarfarm.com/api/v2/buildings/')
  634. parseEffects(db, 'https://swarfarm.com/api/v2/skill-effects/')
  635. parseSkills(db, 'https://swarfarm.com/api/v2/skills/')
  636. parseLeaderSkills(db, 'https://swarfarm.com/api/v2/leader-skills/')
  637. parseSources(db, 'https://swarfarm.com/api/v2/monster-sources/')
  638. parseMonsters(db, 'https://swarfarm.com/api/v2/monsters/')
  639. parseFusions(db, 'https://swarfarm.com/api/v2/fusions/')
  640. parseCraft(db, 'https://swarfarm.com/api/v2/craft-materials/')
  641. removeImperfect(db)