install_base.py 21 KB

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