install_base.py 21 KB

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