install_base.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  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. def download(url, target):
  279. if OPT_DOWNLOAD == False:
  280. return True
  281. if OPT_DOWNLOAD_OVERWRITE == False and os.path.isfile(target):
  282. return True
  283. try:
  284. urllib.request.urlretrieve(url, target)
  285. return True
  286. except:
  287. return False
  288. def parseBuildings(db, url):
  289. print("Parsing buildings...")
  290. http = urllib3.PoolManager()
  291. mlist = str(http.request('GET', url).data.decode('utf-8'))
  292. data = json.loads(mlist)
  293. while True:
  294. for building in data["results"]:
  295. id = building["id"]
  296. com2us_id = building["com2us_id"]
  297. area = building["area"]
  298. affected_stat = building["affected_stat"]
  299. element = building["element"]
  300. name = building["name"]
  301. description = building["description"]
  302. max_level = building["max_level"]
  303. insert(db, "k_building", (id, com2us_id, area, affected_stat, element, name, description, max_level))
  304. lv = 0
  305. for bonus in building["stat_bonus"]:
  306. insert(db, "k_building_level", (id, lv, bonus, building["upgrade_cost"][lv]))
  307. lv = lv + 1
  308. # Next page
  309. db.commit()
  310. if data["next"] != None:
  311. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  312. data = json.loads(mlist)
  313. else:
  314. break
  315. def parseSkills(db, url):
  316. print("Parsing skills...")
  317. http = urllib3.PoolManager()
  318. mlist = str(http.request('GET', url).data.decode('utf-8'))
  319. data = json.loads(mlist)
  320. while True:
  321. for skill in data["results"]:
  322. id = skill["id"]
  323. com2us_id = skill["com2us_id"]
  324. name = skill["name"]
  325. description = skill["description"]
  326. slot = skill["slot"]
  327. cooltime = skill["cooltime"]
  328. hits = skill["hits"]
  329. passive = skill["passive"]
  330. aoe = skill["aoe"]
  331. max_level = skill["max_level"]
  332. multiplier_formula = skill["multiplier_formula"]
  333. insert(db, "k_skill", (id, com2us_id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula))
  334. insert(db, "k_skill_level", (id, 1, ""))
  335. if (max_level > 1):
  336. lv = 2
  337. for level in skill["level_progress_description"]:
  338. insert(db, "k_skill_level", (id, str(lv), level))
  339. lv = lv + 1
  340. for effect in skill["effects"]:
  341. insert(db, "k_skill_effect", (id, effect["effect"]["id"]))
  342. image = "https://swarfarm.com/static/herders/images/skills/" + skill["icon_filename"]
  343. download(image, 'public/img/content/skill/' + str(id).zfill(4) + '.png')
  344. # Next page
  345. db.commit()
  346. if data["next"] != None:
  347. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  348. data = json.loads(mlist)
  349. else:
  350. break
  351. def parseLeaderSkills(db, url):
  352. print("Parsing leader skills...")
  353. http = urllib3.PoolManager()
  354. mlist = str(http.request('GET', url).data.decode('utf-8'))
  355. data = json.loads(mlist)
  356. while True:
  357. for skill in data["results"]:
  358. id = skill["id"]
  359. attribute = skill["attribute"]
  360. amount = skill["amount"]
  361. area = skill["area"]
  362. element = skill["element"]
  363. insert(db, "k_leader_skill", (id, attribute, amount, area, element))
  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. def parseEffects(db, url):
  372. print("Parsing skill effects...")
  373. http = urllib3.PoolManager()
  374. mlist = str(http.request('GET', url).data.decode('utf-8'))
  375. data = json.loads(mlist)
  376. while True:
  377. for effect in data["results"]:
  378. id = effect["id"]
  379. name = effect["name"]
  380. is_buff = effect["is_buff"]
  381. description = effect["description"]
  382. insert(db, "k_effect", (id, name, is_buff, description))
  383. # Next page
  384. db.commit()
  385. if data["next"] != None:
  386. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  387. data = json.loads(mlist)
  388. else:
  389. break
  390. def parseSources(db, url):
  391. print("Parsing sources...")
  392. http = urllib3.PoolManager()
  393. mlist = str(http.request('GET', url).data.decode('utf-8'))
  394. data = json.loads(mlist)
  395. while True:
  396. for source in data["results"]:
  397. id = source["id"]
  398. name = source["name"]
  399. description = source["description"]
  400. farmable_source = source["farmable_source"]
  401. insert(db, "k_source", (id, name, description, farmable_source))
  402. # Next page
  403. db.commit()
  404. if data["next"] != None:
  405. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  406. data = json.loads(mlist)
  407. else:
  408. break
  409. def parseMonsters(db, url):
  410. print("Parsing monsters...")
  411. http = urllib3.PoolManager()
  412. mlist = str(http.request('GET', url).data.decode('utf-8'))
  413. data = json.loads(mlist)
  414. while True:
  415. for mon in data["results"]:
  416. id = mon["id"]
  417. url = mon["url"]
  418. com2us_id = mon["com2us_id"]
  419. family_id = mon["family_id"]
  420. name = mon["name"]
  421. image_filename = mon["image_filename"]
  422. element = mon["element"]
  423. archetype = mon["archetype"]
  424. base_stars = mon["base_stars"]
  425. natural_stars = mon["natural_stars"]
  426. obtainable = mon["obtainable"]
  427. can_awaken = mon["can_awaken"]
  428. awaken_level = mon["awaken_level"]
  429. awaken_bonus = mon["awaken_bonus"]
  430. skill_ups_to_max = mon["skill_ups_to_max"]
  431. if mon["leader_skill"] != None:
  432. leader_skill = mon["leader_skill"]["id"]
  433. else:
  434. leader_skill = None
  435. homunculus_skills = mon["homunculus_skills"]
  436. base_hp = mon["base_hp"]
  437. base_attack = mon["base_attack"]
  438. base_defense = mon["base_defense"]
  439. speed = mon["speed"]
  440. crit_rate = mon["crit_rate"]
  441. crit_damage = mon["crit_damage"]
  442. resistance = mon["resistance"]
  443. accuracy = mon["accuracy"]
  444. raw_hp = mon["raw_hp"]
  445. raw_attack = mon["raw_attack"]
  446. raw_defense = mon["raw_defense"]
  447. max_lvl_hp = mon["max_lvl_hp"]
  448. max_lvl_attack = mon["max_lvl_attack"]
  449. max_lvl_defense = mon["max_lvl_defense"]
  450. awakens_from = mon["awakens_from"]
  451. awakens_to = mon["awakens_to"]
  452. awaken_mats_fire_low = mon["awaken_mats_fire_low"]
  453. awaken_mats_fire_mid = mon["awaken_mats_fire_mid"]
  454. awaken_mats_fire_high = mon["awaken_mats_fire_high"]
  455. awaken_mats_water_low = mon["awaken_mats_water_low"]
  456. awaken_mats_water_mid = mon["awaken_mats_water_mid"]
  457. awaken_mats_water_high = mon["awaken_mats_water_high"]
  458. awaken_mats_wind_low = mon["awaken_mats_wind_low"]
  459. awaken_mats_wind_mid = mon["awaken_mats_wind_mid"]
  460. awaken_mats_wind_high = mon["awaken_mats_wind_high"]
  461. awaken_mats_light_low = mon["awaken_mats_light_low"]
  462. awaken_mats_light_mid = mon["awaken_mats_light_mid"]
  463. awaken_mats_light_high = mon["awaken_mats_light_high"]
  464. awaken_mats_dark_low = mon["awaken_mats_dark_low"]
  465. awaken_mats_dark_mid = mon["awaken_mats_dark_mid"]
  466. awaken_mats_dark_high = mon["awaken_mats_dark_high"]
  467. awaken_mats_magic_low = mon["awaken_mats_magic_low"]
  468. awaken_mats_magic_mid = mon["awaken_mats_magic_mid"]
  469. awaken_mats_magic_high = mon["awaken_mats_magic_high"]
  470. fusion_food = mon["fusion_food"]
  471. homunculus = mon["homunculus"]
  472. craft_cost = mon["craft_cost"]
  473. 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))
  474. if awaken_mats_fire_low > 0:
  475. insert(db, "k_monster_essence", (id, "Fire", "Low", awaken_mats_fire_low))
  476. if awaken_mats_fire_mid > 0:
  477. insert(db, "k_monster_essence", (id, "Fire", "Mid", awaken_mats_fire_mid))
  478. if awaken_mats_fire_high > 0:
  479. insert(db, "k_monster_essence", (id, "Fire", "High", awaken_mats_fire_high))
  480. if awaken_mats_water_low > 0:
  481. insert(db, "k_monster_essence", (id, "Water", "Low", awaken_mats_water_low))
  482. if awaken_mats_water_mid > 0:
  483. insert(db, "k_monster_essence", (id, "Water", "Mid", awaken_mats_water_mid))
  484. if awaken_mats_water_high > 0:
  485. insert(db, "k_monster_essence", (id, "Water", "High", awaken_mats_water_high))
  486. if awaken_mats_wind_low > 0:
  487. insert(db, "k_monster_essence", (id, "Wind", "Low", awaken_mats_wind_low))
  488. if awaken_mats_wind_mid > 0:
  489. insert(db, "k_monster_essence", (id, "Wind", "Mid", awaken_mats_wind_mid))
  490. if awaken_mats_wind_high > 0:
  491. insert(db, "k_monster_essence", (id, "Wind", "High", awaken_mats_wind_high))
  492. if awaken_mats_dark_low > 0:
  493. insert(db, "k_monster_essence", (id, "Dark", "Low", awaken_mats_dark_low))
  494. if awaken_mats_dark_mid > 0:
  495. insert(db, "k_monster_essence", (id, "Dark", "Mid", awaken_mats_dark_mid))
  496. if awaken_mats_dark_high > 0:
  497. insert(db, "k_monster_essence", (id, "Dark", "High", awaken_mats_dark_high))
  498. if awaken_mats_light_low > 0:
  499. insert(db, "k_monster_essence", (id, "Light", "Low", awaken_mats_light_low))
  500. if awaken_mats_light_mid > 0:
  501. insert(db, "k_monster_essence", (id, "Light", "Mid", awaken_mats_light_mid))
  502. if awaken_mats_light_high > 0:
  503. insert(db, "k_monster_essence", (id, "Light", "High", awaken_mats_light_high))
  504. if awaken_mats_magic_low > 0:
  505. insert(db, "k_monster_essence", (id, "Magic", "Low", awaken_mats_magic_low))
  506. if awaken_mats_magic_mid > 0:
  507. insert(db, "k_monster_essence", (id, "Magic", "Mid", awaken_mats_magic_mid))
  508. if awaken_mats_magic_high > 0:
  509. insert(db, "k_monster_essence", (id, "Magic", "High", awaken_mats_magic_high))
  510. for skill in mon["skills"]:
  511. insert(db, "k_monster_skill", (id, skill))
  512. for source in mon["source"]:
  513. insert(db, "k_monster_source", (id, source["id"]))
  514. # TODO: craft_materials
  515. image = "https://swarfarm.com/static/herders/images/monsters/" + mon["image_filename"]
  516. #download(image, 'public/img/content/monster/' + str(id).zfill(4) + '.png')
  517. if id > 1215:
  518. download(image, 'public/img/content/monster/' + str(id).zfill(4) + '.png')
  519. # Next page
  520. db.commit()
  521. if data["next"] != None:
  522. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  523. data = json.loads(mlist)
  524. else:
  525. break
  526. def parseFusions(db, url):
  527. print("Parsing fusions...")
  528. http = urllib3.PoolManager()
  529. mlist = str(http.request('GET', url).data.decode('utf-8'))
  530. data = json.loads(mlist)
  531. while True:
  532. for fusion in data["results"]:
  533. id = fusion["id"]
  534. product = fusion["product"]
  535. stars = fusion["stars"]
  536. cost = fusion["cost"]
  537. for ingredient in fusion["ingredients"]:
  538. insert(db, "k_fusion", (id, product, stars, cost, ingredient))
  539. # Next page
  540. db.commit()
  541. if data["next"] != None:
  542. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  543. data = json.loads(mlist)
  544. else:
  545. break
  546. def parseCraft(db, url):
  547. print("Parsing crafting materials...")
  548. http = urllib3.PoolManager()
  549. mlist = str(http.request('GET', url).data.decode('utf-8'))
  550. data = json.loads(mlist)
  551. while True:
  552. first = False
  553. for crat in data["results"]:
  554. id = crat["id"]
  555. name = crat["name"]
  556. insert(db, "k_craft", (id, name))
  557. # Next page
  558. db.commit()
  559. if data["next"] != None:
  560. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  561. data = json.loads(mlist)
  562. else:
  563. break
  564. """
  565. Begin script
  566. """
  567. db = createDatabase('application/sw.sqlite')
  568. parseBuildings(db, 'https://swarfarm.com/api/v2/buildings/')
  569. parseEffects(db, 'https://swarfarm.com/api/v2/skill-effects/')
  570. parseSkills(db, 'https://swarfarm.com/api/v2/skills/')
  571. parseLeaderSkills(db, 'https://swarfarm.com/api/v2/leader-skills/')
  572. parseSources(db, 'https://swarfarm.com/api/v2/monster-sources/')
  573. parseMonsters(db, 'https://swarfarm.com/api/v2/monsters/')
  574. parseFusions(db, 'https://swarfarm.com/api/v2/fusions/')
  575. parseCraft(db, 'https://swarfarm.com/api/v2/craft-materials/')