install_base.py 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  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; # TODO
  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 TEXT,
  28. com2us_id TEXT,
  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 TEXT,
  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 TEXT,
  56. level INT,
  57. description TEXT
  58. );
  59. ''')
  60. cursor.execute('''
  61. CREATE TABLE IF NOT EXISTS k_skill(
  62. id TEXT,
  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 TEXT,
  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_unit(
  100. id TEXT,
  101. com2us_id TEXT,
  102. family 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. hp INT,
  114. attack INT,
  115. 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_unit_skill(
  136. unit TEXT,
  137. skill TEXT
  138. );
  139. ''')
  140. cursor.execute('''
  141. CREATE TABLE IF NOT EXISTS k_unit_source(
  142. unit TEXT,
  143. source INT
  144. );
  145. ''')
  146. cursor.execute('''
  147. CREATE TABLE IF NOT EXISTS k_unit_essence(
  148. unit TEXT,
  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 TEXT,
  158. stars INT,
  159. cost INT,
  160. ingredient TEXT
  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 k_experience(
  171. stars INT,
  172. level INT,
  173. exp INT
  174. );
  175. ''')
  176. cursor.execute('''
  177. CREATE TABLE IF NOT EXISTS player(
  178. uid TEXT,
  179. name TEXT,
  180. mana INT,
  181. crystal INT,
  182. country TEXT,
  183. lang TEXT,
  184. level INT,
  185. experience INT,
  186. energy INT,
  187. energy_max INT,
  188. energy_per_min INT,
  189. arena_energy INT,
  190. arena_energy_max INT,
  191. rep TEXT,
  192. social_point INT,
  193. honor_point INT,
  194. guild_point INT,
  195. darkportal_energy INT,
  196. darkportal_energy_max INT,
  197. costume_point INT,
  198. costume_point_max INT,
  199. honor_medal INT,
  200. honor_mark INT,
  201. event_coin INT
  202. );
  203. ''')
  204. cursor.execute('''
  205. CREATE TABLE IF NOT EXISTS scenario(
  206. uid TEXT,
  207. region INT,
  208. difficulty INT,
  209. cleared INT,
  210. max_cleared INT
  211. );
  212. ''')
  213. cursor.execute('''
  214. CREATE TABLE IF NOT EXISTS defense(
  215. uid TEXT,
  216. unit TEXT,
  217. position INT
  218. );
  219. ''')
  220. cursor.execute('''
  221. CREATE TABLE IF NOT EXISTS defense(
  222. uid TEXT,
  223. building INT,
  224. level INT
  225. );
  226. ''')
  227. cursor.execute('''
  228. CREATE TABLE IF NOT EXISTS unit(
  229. uid TEXT,
  230. id TEXT,
  231. building TEXT,
  232. unit TEXT,
  233. level INT,
  234. stars INT,
  235. hp INT,
  236. attack INT,
  237. defense INT,
  238. speed INT,
  239. crit_rate INT,
  240. crit_damage INT,
  241. resistance INT,
  242. accuracy INT,
  243. experience INT,
  244. exp_gained INT,
  245. exp_gain_rate INT,
  246. costume INT,
  247. attribute INT,
  248. source INT,
  249. create_time DATETIME,
  250. homunculus INT,
  251. homunculus_name TEXT,
  252. lock INT,
  253. notes TEXT
  254. );
  255. ''')
  256. cursor.execute('''
  257. CREATE TABLE IF NOT EXISTS unit_skill(
  258. uid TEXT,
  259. unit TEXT,
  260. skill TEXT,
  261. level INT
  262. );
  263. ''')
  264. cursor.execute('''
  265. CREATE TABLE IF NOT EXISTS rune(
  266. uid TEXT,
  267. id TEXT,
  268. assigned_to TEXT,
  269. type TEXT,
  270. slot INT,
  271. stars INT,
  272. level INT,
  273. quality INT,
  274. original_quality INT,
  275. value INT,
  276. efficiency INT,
  277. max_efficiency INT,
  278. main_stat TEXT,
  279. main_stat_value INT,
  280. innate_stat TEXT,
  281. innate_stat_value INT,
  282. substat_1 TEXT,
  283. substat_1_value INT,
  284. substat_1_enchant INT,
  285. substat_1_grind INT,
  286. substat_2 TEXT,
  287. substat_2_value INT,
  288. substat_2_enchant INT,
  289. substat_2_grind INT,
  290. substat_3 TEXT,
  291. substat_3_value INT,
  292. substat_3_enchant INT,
  293. substat_3_grind INT,
  294. substat_4 TEXT,
  295. substat_4_value INT,
  296. substat_4_enchant INT,
  297. substat_4_grind INT
  298. );
  299. ''')
  300. cursor.execute('''
  301. CREATE TABLE IF NOT EXISTS building(
  302. uid TEXT,
  303. building INT,
  304. level INT
  305. );
  306. ''')
  307. db.commit()
  308. cursor.close()
  309. return db
  310. except sqlite3.IntegrityError as e:
  311. print("Error executing statement: " + str(e))
  312. raise
  313. except IOError as e:
  314. print("I/O Error creating database " + name + ": " + str(e))
  315. raise
  316. """
  317. Inserts a row into the database.
  318. :param db: Connection to the database.
  319. :param table: Name of the table to insert into.
  320. :param values: List of values to insert.
  321. :raises IntegrityError: The insert query was unsuccesfull.
  322. """
  323. def insert(db, table, values):
  324. cursor = db.cursor()
  325. placeholders = ''
  326. for x in range(0, len(values)):
  327. placeholders = placeholders + '?, '
  328. placeholders = placeholders[:len(placeholders) - 2]
  329. query = 'INSERT INTO ' + table + ' VALUES (' + placeholders + ')'
  330. try:
  331. cursor.execute(query, values)
  332. except sqlite3.IntegrityError as e:
  333. print('Error Inserting into ' + table + ' with values (' + str(values) + '): ' + str(e))
  334. raise
  335. cursor.close;
  336. """
  337. Dowwnloads a file.
  338. If OPT_DOWNLOAD is set to false, it will do nothing (but it will still return
  339. true).
  340. If OPT_DOWNLOAD_OVERWRITE it will only download the file if the target doesn't
  341. exist (but it will still return true if it does).
  342. :param url: File url.
  343. :param target: Full or relative path (whit filename to save the url).
  344. :returns: True on success, false on error.
  345. """
  346. def download(url, target):
  347. if OPT_DOWNLOAD == False:
  348. return True
  349. if OPT_DOWNLOAD_OVERWRITE == False and os.path.isfile(target):
  350. return True
  351. try:
  352. urllib.request.urlretrieve(url, target)
  353. return True
  354. except:
  355. return False
  356. """
  357. Parses building date (tables k_building, k_building_level).
  358. :param db: Sqlite database connection.
  359. :param url: Swarfarm APIv2, buildings.
  360. """
  361. def parseBuildings(db, url):
  362. print("Parsing buildings...")
  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 building in data["results"]:
  368. id = building["id"]
  369. com2us_id = building["com2us_id"]
  370. area = building["area"]
  371. affected_stat = building["affected_stat"]
  372. element = building["element"]
  373. name = building["name"]
  374. description = building["description"]
  375. max_level = building["max_level"]
  376. insert(db, "k_building", (id, com2us_id, area, affected_stat, element, name, description, max_level))
  377. lv = 0
  378. for bonus in building["stat_bonus"]:
  379. insert(db, "k_building_level", (id, lv, bonus, building["upgrade_cost"][lv]))
  380. lv = lv + 1
  381. # Next page
  382. db.commit()
  383. if data["next"] != None:
  384. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  385. data = json.loads(mlist)
  386. else:
  387. break
  388. """
  389. Parses skill data (tables k_skill, k_skill_level, k_skill_effect).
  390. :param db: Sqlite database connection.
  391. :param url: Swarfarm APIv2, skills.
  392. """
  393. def parseSkills(db, url):
  394. print("Parsing skills...")
  395. http = urllib3.PoolManager()
  396. mlist = str(http.request('GET', url).data.decode('utf-8'))
  397. data = json.loads(mlist)
  398. while True:
  399. for skill in data["results"]:
  400. id = skill["id"]
  401. com2us_id = skill["com2us_id"]
  402. name = skill["name"]
  403. description = skill["description"]
  404. slot = skill["slot"]
  405. cooltime = skill["cooltime"]
  406. hits = skill["hits"]
  407. passive = skill["passive"]
  408. aoe = skill["aoe"]
  409. max_level = skill["max_level"]
  410. multiplier_formula = skill["multiplier_formula"]
  411. insert(db, "k_skill", (id, com2us_id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula))
  412. insert(db, "k_skill_level", (id, 1, ""))
  413. if (max_level > 1):
  414. lv = 2
  415. for level in skill["level_progress_description"]:
  416. insert(db, "k_skill_level", (id, str(lv), level))
  417. lv = lv + 1
  418. for effect in skill["effects"]:
  419. insert(db, "k_skill_effect", (id, effect["effect"]["id"]))
  420. image = "https://swarfarm.com/static/herders/images/skills/" + skill["icon_filename"]
  421. download(image, 'public/img/content/skill/' + str(id).zfill(4) + '.png')
  422. # Next page
  423. db.commit()
  424. if data["next"] != None:
  425. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  426. data = json.loads(mlist)
  427. else:
  428. break
  429. """
  430. Parses leader skills (table k_leader_skill).
  431. :param db: Sqlite database connection.
  432. :param url: Swarfarm APIv2, leader-skills.
  433. """
  434. def parseLeaderSkills(db, url):
  435. print("Parsing leader skills...")
  436. http = urllib3.PoolManager()
  437. mlist = str(http.request('GET', url).data.decode('utf-8'))
  438. data = json.loads(mlist)
  439. while True:
  440. for skill in data["results"]:
  441. id = skill["id"]
  442. attribute = skill["attribute"]
  443. amount = skill["amount"]
  444. area = skill["area"]
  445. element = skill["element"]
  446. insert(db, "k_leader_skill", (id, attribute, amount, area, element))
  447. # Next page
  448. db.commit()
  449. if data["next"] != None:
  450. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  451. data = json.loads(mlist)
  452. else:
  453. break
  454. """
  455. Parses skill effects (table k_effect).
  456. :param db: Sqlite database connection.
  457. :param url: Swarfarm APIv2, skill-efects.
  458. """
  459. def parseEffects(db, url):
  460. print("Parsing skill effects...")
  461. http = urllib3.PoolManager()
  462. mlist = str(http.request('GET', url).data.decode('utf-8'))
  463. data = json.loads(mlist)
  464. while True:
  465. for effect in data["results"]:
  466. id = effect["id"]
  467. name = effect["name"]
  468. is_buff = effect["is_buff"]
  469. description = effect["description"]
  470. insert(db, "k_effect", (id, name, is_buff, description))
  471. # Next page
  472. db.commit()
  473. if data["next"] != None:
  474. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  475. data = json.loads(mlist)
  476. else:
  477. break
  478. """
  479. Parses monster sources (table k_source).
  480. :param db: Sqlite database connection.
  481. :param url: Swarfarm APIv2, craft-materials.
  482. """
  483. def parseSources(db, url):
  484. print("Parsing sources...")
  485. http = urllib3.PoolManager()
  486. mlist = str(http.request('GET', url).data.decode('utf-8'))
  487. data = json.loads(mlist)
  488. while True:
  489. for source in data["results"]:
  490. id = source["id"]
  491. name = source["name"]
  492. description = source["description"]
  493. farmable_source = source["farmable_source"]
  494. insert(db, "k_source", (id, name, description, farmable_source))
  495. # Next page
  496. db.commit()
  497. if data["next"] != None:
  498. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  499. data = json.loads(mlist)
  500. else:
  501. break
  502. """
  503. Parses monster data (tables k_unit, k_unit_essence, k_unit_source,
  504. k_monsster_skill).
  505. :param db: Sqlite database connection.
  506. :param url: Swarfarm APIv2, monsters.
  507. """
  508. def parseMonsters(db, url):
  509. print("Parsing monsters...")
  510. http = urllib3.PoolManager()
  511. mlist = str(http.request('GET', url).data.decode('utf-8'))
  512. data = json.loads(mlist)
  513. while True:
  514. for mon in data["results"]:
  515. id = mon["id"]
  516. url = mon["url"]
  517. com2us_id = mon["com2us_id"]
  518. family_id = mon["family_id"]
  519. name = mon["name"]
  520. image_filename = mon["image_filename"]
  521. element = mon["element"]
  522. archetype = mon["archetype"]
  523. base_stars = mon["base_stars"]
  524. natural_stars = mon["natural_stars"]
  525. obtainable = mon["obtainable"]
  526. can_awaken = mon["can_awaken"]
  527. awaken_level = mon["awaken_level"]
  528. awaken_bonus = mon["awaken_bonus"]
  529. skill_ups_to_max = mon["skill_ups_to_max"]
  530. if mon["leader_skill"] != None:
  531. leader_skill = mon["leader_skill"]["id"]
  532. else:
  533. leader_skill = None
  534. homunculus_skills = mon["homunculus_skills"]
  535. hp = mon["base_hp"]
  536. attack = mon["base_attack"]
  537. defense = mon["base_defense"]
  538. speed = mon["speed"]
  539. crit_rate = mon["crit_rate"]
  540. crit_damage = mon["crit_damage"]
  541. resistance = mon["resistance"]
  542. accuracy = mon["accuracy"]
  543. raw_hp = mon["raw_hp"]
  544. raw_attack = mon["raw_attack"]
  545. raw_defense = mon["raw_defense"]
  546. max_lvl_hp = mon["max_lvl_hp"]
  547. max_lvl_attack = mon["max_lvl_attack"]
  548. max_lvl_defense = mon["max_lvl_defense"]
  549. awakens_from = mon["awakens_from"]
  550. awakens_to = mon["awakens_to"]
  551. awaken_mats_fire_low = mon["awaken_mats_fire_low"]
  552. awaken_mats_fire_mid = mon["awaken_mats_fire_mid"]
  553. awaken_mats_fire_high = mon["awaken_mats_fire_high"]
  554. awaken_mats_water_low = mon["awaken_mats_water_low"]
  555. awaken_mats_water_mid = mon["awaken_mats_water_mid"]
  556. awaken_mats_water_high = mon["awaken_mats_water_high"]
  557. awaken_mats_wind_low = mon["awaken_mats_wind_low"]
  558. awaken_mats_wind_mid = mon["awaken_mats_wind_mid"]
  559. awaken_mats_wind_high = mon["awaken_mats_wind_high"]
  560. awaken_mats_light_low = mon["awaken_mats_light_low"]
  561. awaken_mats_light_mid = mon["awaken_mats_light_mid"]
  562. awaken_mats_light_high = mon["awaken_mats_light_high"]
  563. awaken_mats_dark_low = mon["awaken_mats_dark_low"]
  564. awaken_mats_dark_mid = mon["awaken_mats_dark_mid"]
  565. awaken_mats_dark_high = mon["awaken_mats_dark_high"]
  566. awaken_mats_magic_low = mon["awaken_mats_magic_low"]
  567. awaken_mats_magic_mid = mon["awaken_mats_magic_mid"]
  568. awaken_mats_magic_high = mon["awaken_mats_magic_high"]
  569. fusion_food = mon["fusion_food"]
  570. homunculus = mon["homunculus"]
  571. craft_cost = mon["craft_cost"]
  572. insert(db, "k_unit", (id, com2us_id, family_id, name, element, archetype, base_stars, natural_stars, obtainable, can_awaken, awaken_bonus, skill_ups_to_max, leader_skill, hp, attack, 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))
  573. if awaken_mats_fire_low > 0:
  574. insert(db, "k_unit_essence", (id, "Fire", "Low", awaken_mats_fire_low))
  575. if awaken_mats_fire_mid > 0:
  576. insert(db, "k_unit_essence", (id, "Fire", "Mid", awaken_mats_fire_mid))
  577. if awaken_mats_fire_high > 0:
  578. insert(db, "k_unit_essence", (id, "Fire", "High", awaken_mats_fire_high))
  579. if awaken_mats_water_low > 0:
  580. insert(db, "k_unit_essence", (id, "Water", "Low", awaken_mats_water_low))
  581. if awaken_mats_water_mid > 0:
  582. insert(db, "k_unit_essence", (id, "Water", "Mid", awaken_mats_water_mid))
  583. if awaken_mats_water_high > 0:
  584. insert(db, "k_unit_essence", (id, "Water", "High", awaken_mats_water_high))
  585. if awaken_mats_wind_low > 0:
  586. insert(db, "k_unit_essence", (id, "Wind", "Low", awaken_mats_wind_low))
  587. if awaken_mats_wind_mid > 0:
  588. insert(db, "k_unit_essence", (id, "Wind", "Mid", awaken_mats_wind_mid))
  589. if awaken_mats_wind_high > 0:
  590. insert(db, "k_unit_essence", (id, "Wind", "High", awaken_mats_wind_high))
  591. if awaken_mats_dark_low > 0:
  592. insert(db, "k_unit_essence", (id, "Dark", "Low", awaken_mats_dark_low))
  593. if awaken_mats_dark_mid > 0:
  594. insert(db, "k_unit_essence", (id, "Dark", "Mid", awaken_mats_dark_mid))
  595. if awaken_mats_dark_high > 0:
  596. insert(db, "k_unit_essence", (id, "Dark", "High", awaken_mats_dark_high))
  597. if awaken_mats_light_low > 0:
  598. insert(db, "k_unit_essence", (id, "Light", "Low", awaken_mats_light_low))
  599. if awaken_mats_light_mid > 0:
  600. insert(db, "k_unit_essence", (id, "Light", "Mid", awaken_mats_light_mid))
  601. if awaken_mats_light_high > 0:
  602. insert(db, "k_unit_essence", (id, "Light", "High", awaken_mats_light_high))
  603. if awaken_mats_magic_low > 0:
  604. insert(db, "k_unit_essence", (id, "Magic", "Low", awaken_mats_magic_low))
  605. if awaken_mats_magic_mid > 0:
  606. insert(db, "k_unit_essence", (id, "Magic", "Mid", awaken_mats_magic_mid))
  607. if awaken_mats_magic_high > 0:
  608. insert(db, "k_unit_essence", (id, "Magic", "High", awaken_mats_magic_high))
  609. for skill in mon["skills"]:
  610. insert(db, "k_unit_skill", (id, skill))
  611. for source in mon["source"]:
  612. insert(db, "k_unit_source", (id, source["id"]))
  613. # TODO: craft_materials
  614. image = "https://swarfarm.com/static/herders/images/monsters/" + mon["image_filename"]
  615. download(image, 'public/img/content/monster/' + str(id).zfill(4) + '.png')
  616. # Next page
  617. db.commit()
  618. if data["next"] != None:
  619. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  620. data = json.loads(mlist)
  621. else:
  622. break
  623. """
  624. Parses fusion data (table k_fusion).
  625. :param db: Sqlite database connection.
  626. :param url: Swarfarm APIv2, fusions.
  627. """
  628. def parseFusions(db, url):
  629. print("Parsing fusions...")
  630. http = urllib3.PoolManager()
  631. mlist = str(http.request('GET', url).data.decode('utf-8'))
  632. data = json.loads(mlist)
  633. while True:
  634. for fusion in data["results"]:
  635. id = fusion["id"]
  636. product = fusion["product"]
  637. stars = fusion["stars"]
  638. cost = fusion["cost"]
  639. for ingredient in fusion["ingredients"]:
  640. insert(db, "k_fusion", (id, product, stars, cost, ingredient))
  641. # Next page
  642. db.commit()
  643. if data["next"] != None:
  644. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  645. data = json.loads(mlist)
  646. else:
  647. break
  648. """
  649. Parses crafting materials (table k_craft).
  650. :param db: Sqlite database connection.
  651. :param url: Swarfarm APIv2, craft-materials.
  652. """
  653. def parseCraft(db, url):
  654. print("Parsing crafting materials...")
  655. http = urllib3.PoolManager()
  656. mlist = str(http.request('GET', url).data.decode('utf-8'))
  657. data = json.loads(mlist)
  658. while True:
  659. first = False
  660. for crat in data["results"]:
  661. id = crat["id"]
  662. name = crat["name"]
  663. insert(db, "k_craft", (id, name))
  664. # Next page
  665. db.commit()
  666. if data["next"] != None:
  667. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  668. data = json.loads(mlist)
  669. else:
  670. break
  671. """
  672. Removes references to imperfect monsters.
  673. Imperfect monsters are only available in Japanese servers due to legal reasons,
  674. they are not needed for this app. They wont be deleted, but awakening chains
  675. wil be cut.
  676. :param db: Sqlite database connection.
  677. """
  678. def removeImperfect(db):
  679. print("Unlinking inperfetc units...")
  680. cursor = db.cursor()
  681. cursor.execute('''
  682. UPDATE k_unit
  683. SET awakens_from = null
  684. WHERE awakens_from IN (SELECT id FROM k_unit WHERE name LIKE 'Imperfect %')
  685. ''');
  686. db.commit()
  687. cursor.close()
  688. """
  689. Changes IDS from swarfarm formats to swex formats.
  690. :param db: Sqlite database connection.
  691. """
  692. def useSwexIds(db):
  693. print("Updating IDs...")
  694. cursor = db.cursor()
  695. cursor.execute('UPDATE k_building_level SET building = (SELECT com2us_id FROM k_building WHERE building = id)');
  696. #db.commit()
  697. #cursor.execute('ALTER TABLE k_building_level DROP COLUMN com2us_id')
  698. cursor.execute('UPDATE k_building SET id = com2us_id');
  699. #db.commit()
  700. #cursor.execute('ALTER TABLE k_building_level DROP COLUMN com2us_id')
  701. cursor.execute('UPDATE k_skill_level SET skill = (SELECT com2us_id FROM k_skill WHERE skill = id)');
  702. cursor.execute('UPDATE k_skill_effect SET skill = (SELECT com2us_id FROM k_skill WHERE skill = id)');
  703. cursor.execute('UPDATE k_unit_skill SET skill = (SELECT com2us_id FROM k_skill WHERE skill = id)');
  704. cursor.execute('UPDATE k_skill SET id = com2us_id');
  705. #db.commit()
  706. #cursor.execute('ALTER TABLE k_skill DROP COLUMN com2us_id')
  707. cursor.execute('UPDATE k_unit_skill SET unit = (SELECT com2us_id FROM k_unit WHERE unit = k_unit.id)');
  708. cursor.execute('UPDATE k_unit_source SET unit = (SELECT com2us_id FROM k_unit WHERE unit = k_unit.id)');
  709. cursor.execute('UPDATE k_unit_essence SET unit = (SELECT com2us_id FROM k_unit WHERE unit = k_unit.id)');
  710. cursor.execute('UPDATE k_fusion SET product = (SELECT com2us_id FROM k_unit WHERE product = k_unit.id)');
  711. cursor.execute('UPDATE k_fusion SET ingredient = (SELECT com2us_id FROM k_unit WHERE ingredient = k_unit.id)');
  712. cursor.execute('UPDATE k_unit SET awakens_from = (SELECT com2us_id FROM k_unit un WHERE k_unit.awakens_from = un.id)');
  713. cursor.execute('UPDATE k_unit SET awakens_to = (SELECT com2us_id FROM k_unit un WHERE k_unit.awakens_to = un.id)');
  714. cursor.execute('UPDATE k_unit SET id = com2us_id');
  715. db.commit()
  716. #cursor.execute('ALTER TABLE k_unit DROP COLUMN com2us_id')
  717. cursor.close()
  718. def staticData(db):
  719. print("Procesing data...")
  720. cursor = db.cursor()
  721. cursor.execute('INSERT INTO k_experience VALUES (1, 1, 460)')
  722. cursor.execute('INSERT INTO k_experience VALUES (2, 1, 552)')
  723. cursor.execute('INSERT INTO k_experience VALUES (3, 1, 662)')
  724. cursor.execute('INSERT INTO k_experience VALUES (4, 1, 796)')
  725. cursor.execute('INSERT INTO k_experience VALUES (5, 1, 952)')
  726. cursor.execute('INSERT INTO k_experience VALUES (6, 1, 1150)')
  727. cursor.execute('INSERT INTO k_experience VALUES (1, 2, 516)')
  728. cursor.execute('INSERT INTO k_experience VALUES (2, 2, 619)')
  729. cursor.execute('INSERT INTO k_experience VALUES (3, 2, 743)')
  730. cursor.execute('INSERT INTO k_experience VALUES (4, 2, 892)')
  731. cursor.execute('INSERT INTO k_experience VALUES (5, 2, 1068)')
  732. cursor.execute('INSERT INTO k_experience VALUES (6, 2, 1290)')
  733. cursor.execute('INSERT INTO k_experience VALUES (1, 3, 579)')
  734. cursor.execute('INSERT INTO k_experience VALUES (2, 3, 695)')
  735. cursor.execute('INSERT INTO k_experience VALUES (3, 3, 834)')
  736. cursor.execute('INSERT INTO k_experience VALUES (4, 3, 1002)')
  737. cursor.execute('INSERT INTO k_experience VALUES (5, 3, 1199)')
  738. cursor.execute('INSERT INTO k_experience VALUES (6, 3, 1447)')
  739. cursor.execute('INSERT INTO k_experience VALUES (1, 4, 650)')
  740. cursor.execute('INSERT INTO k_experience VALUES (2, 4, 779)')
  741. cursor.execute('INSERT INTO k_experience VALUES (3, 4, 936)')
  742. cursor.execute('INSERT INTO k_experience VALUES (4, 4, 1124)')
  743. cursor.execute('INSERT INTO k_experience VALUES (5, 4, 1344)')
  744. cursor.execute('INSERT INTO k_experience VALUES (6, 4, 1624)')
  745. cursor.execute('INSERT INTO k_experience VALUES (1, 5, 728)')
  746. cursor.execute('INSERT INTO k_experience VALUES (2, 5, 875)')
  747. cursor.execute('INSERT INTO k_experience VALUES (3, 5, 1049)')
  748. cursor.execute('INSERT INTO k_experience VALUES (4, 5, 1261)')
  749. cursor.execute('INSERT INTO k_experience VALUES (5, 5, 1509)')
  750. cursor.execute('INSERT INTO k_experience VALUES (6, 5, 1823)')
  751. cursor.execute('INSERT INTO k_experience VALUES (1, 6, 818)')
  752. cursor.execute('INSERT INTO k_experience VALUES (2, 6, 981)')
  753. cursor.execute('INSERT INTO k_experience VALUES (3, 6, 1178)')
  754. cursor.execute('INSERT INTO k_experience VALUES (4, 6, 1415)')
  755. cursor.execute('INSERT INTO k_experience VALUES (5, 6, 1693)')
  756. cursor.execute('INSERT INTO k_experience VALUES (6, 6, 2044)')
  757. cursor.execute('INSERT INTO k_experience VALUES (1, 7, 918)')
  758. cursor.execute('INSERT INTO k_experience VALUES (2, 7, 1102)')
  759. cursor.execute('INSERT INTO k_experience VALUES (3, 7, 1321)')
  760. cursor.execute('INSERT INTO k_experience VALUES (4, 7, 1587)')
  761. cursor.execute('INSERT INTO k_experience VALUES (5, 7, 1899)')
  762. cursor.execute('INSERT INTO k_experience VALUES (6, 7, 2294)')
  763. cursor.execute('INSERT INTO k_experience VALUES (1, 8, 1029)')
  764. cursor.execute('INSERT INTO k_experience VALUES (2, 8, 1235)')
  765. cursor.execute('INSERT INTO k_experience VALUES (3, 8, 1483)')
  766. cursor.execute('INSERT INTO k_experience VALUES (4, 8, 1781)')
  767. cursor.execute('INSERT INTO k_experience VALUES (5, 8, 2131)')
  768. cursor.execute('INSERT INTO k_experience VALUES (6, 8, 2574)')
  769. cursor.execute('INSERT INTO k_experience VALUES (1, 9, 1155)')
  770. cursor.execute('INSERT INTO k_experience VALUES (2, 9, 1386)')
  771. cursor.execute('INSERT INTO k_experience VALUES (3, 9, 1663)')
  772. cursor.execute('INSERT INTO k_experience VALUES (4, 9, 1998)')
  773. cursor.execute('INSERT INTO k_experience VALUES (5, 9, 2392)')
  774. cursor.execute('INSERT INTO k_experience VALUES (6, 9, 2888)')
  775. cursor.execute('INSERT INTO k_experience VALUES (1, 10, 1296)')
  776. cursor.execute('INSERT INTO k_experience VALUES (2, 10, 1555)')
  777. cursor.execute('INSERT INTO k_experience VALUES (3, 10, 1866)')
  778. cursor.execute('INSERT INTO k_experience VALUES (4, 10, 2243)')
  779. cursor.execute('INSERT INTO k_experience VALUES (5, 10, 2682)')
  780. cursor.execute('INSERT INTO k_experience VALUES (6, 10, 3240)')
  781. cursor.execute('INSERT INTO k_experience VALUES (1, 11, 1455)')
  782. cursor.execute('INSERT INTO k_experience VALUES (2, 11, 1745)')
  783. cursor.execute('INSERT INTO k_experience VALUES (3, 11, 2094)')
  784. cursor.execute('INSERT INTO k_experience VALUES (4, 11, 2515)')
  785. cursor.execute('INSERT INTO k_experience VALUES (5, 11, 3010)')
  786. cursor.execute('INSERT INTO k_experience VALUES (6, 11, 3635)')
  787. cursor.execute('INSERT INTO k_experience VALUES (1, 12, 1631)')
  788. cursor.execute('INSERT INTO k_experience VALUES (2, 12, 1958)')
  789. cursor.execute('INSERT INTO k_experience VALUES (3, 12, 2350)')
  790. cursor.execute('INSERT INTO k_experience VALUES (4, 12, 2823)')
  791. cursor.execute('INSERT INTO k_experience VALUES (5, 12, 3378)')
  792. cursor.execute('INSERT INTO k_experience VALUES (6, 12, 4079)')
  793. cursor.execute('INSERT INTO k_experience VALUES (1, 13, 1831)')
  794. cursor.execute('INSERT INTO k_experience VALUES (2, 13, 2197)')
  795. cursor.execute('INSERT INTO k_experience VALUES (3, 13, 2636)')
  796. cursor.execute('INSERT INTO k_experience VALUES (4, 13, 3167)')
  797. cursor.execute('INSERT INTO k_experience VALUES (5, 13, 3789)')
  798. cursor.execute('INSERT INTO k_experience VALUES (6, 13, 4576)')
  799. cursor.execute('INSERT INTO k_experience VALUES (1, 14, 2054)')
  800. cursor.execute('INSERT INTO k_experience VALUES (2, 14, 2465)')
  801. cursor.execute('INSERT INTO k_experience VALUES (3, 14, 2957)')
  802. cursor.execute('INSERT INTO k_experience VALUES (4, 14, 3553)')
  803. cursor.execute('INSERT INTO k_experience VALUES (5, 14, 4252)')
  804. cursor.execute('INSERT INTO k_experience VALUES (6, 14, 5135)')
  805. cursor.execute('INSERT INTO k_experience VALUES (1, 15, 0)')
  806. cursor.execute('INSERT INTO k_experience VALUES (2, 15, 2765)')
  807. cursor.execute('INSERT INTO k_experience VALUES (3, 15, 3319)')
  808. cursor.execute('INSERT INTO k_experience VALUES (4, 15, 3987)')
  809. cursor.execute('INSERT INTO k_experience VALUES (5, 15, 4770)')
  810. cursor.execute('INSERT INTO k_experience VALUES (6, 15, 5762)')
  811. cursor.execute('INSERT INTO k_experience VALUES (2, 16, 3103)')
  812. cursor.execute('INSERT INTO k_experience VALUES (3, 16, 3723)')
  813. cursor.execute('INSERT INTO k_experience VALUES (4, 16, 4473)')
  814. cursor.execute('INSERT INTO k_experience VALUES (5, 16, 5352)')
  815. cursor.execute('INSERT INTO k_experience VALUES (6, 16, 6464)')
  816. cursor.execute('INSERT INTO k_experience VALUES (2, 17, 3481)')
  817. cursor.execute('INSERT INTO k_experience VALUES (3, 17, 4178)')
  818. cursor.execute('INSERT INTO k_experience VALUES (4, 17, 5019)')
  819. cursor.execute('INSERT INTO k_experience VALUES (5, 17, 6006)')
  820. cursor.execute('INSERT INTO k_experience VALUES (6, 17, 7252)')
  821. cursor.execute('INSERT INTO k_experience VALUES (2, 18, 3906)')
  822. cursor.execute('INSERT INTO k_experience VALUES (3, 18, 4687)')
  823. cursor.execute('INSERT INTO k_experience VALUES (4, 18, 5631)')
  824. cursor.execute('INSERT INTO k_experience VALUES (5, 18, 6738)')
  825. cursor.execute('INSERT INTO k_experience VALUES (6, 18, 8138)')
  826. cursor.execute('INSERT INTO k_experience VALUES (2, 19, 4423)')
  827. cursor.execute('INSERT INTO k_experience VALUES (3, 19, 5307)')
  828. cursor.execute('INSERT INTO k_experience VALUES (4, 19, 6376)')
  829. cursor.execute('INSERT INTO k_experience VALUES (5, 19, 7628)')
  830. cursor.execute('INSERT INTO k_experience VALUES (6, 19, 9214)')
  831. cursor.execute('INSERT INTO k_experience VALUES (2, 20, 0)')
  832. cursor.execute('INSERT INTO k_experience VALUES (3, 20, 6009)')
  833. cursor.execute('INSERT INTO k_experience VALUES (4, 20, 7219)')
  834. cursor.execute('INSERT INTO k_experience VALUES (5, 20, 8638)')
  835. cursor.execute('INSERT INTO k_experience VALUES (6, 20, 10431)')
  836. cursor.execute('INSERT INTO k_experience VALUES (3, 21, 6802)')
  837. cursor.execute('INSERT INTO k_experience VALUES (4, 21, 8172)')
  838. cursor.execute('INSERT INTO k_experience VALUES (5, 21, 9779)')
  839. cursor.execute('INSERT INTO k_experience VALUES (6, 21, 11811)')
  840. cursor.execute('INSERT INTO k_experience VALUES (3, 22, 7703)')
  841. cursor.execute('INSERT INTO k_experience VALUES (4, 22, 9254)')
  842. cursor.execute('INSERT INTO k_experience VALUES (5, 22, 11072)')
  843. cursor.execute('INSERT INTO k_experience VALUES (6, 22, 13371)')
  844. cursor.execute('INSERT INTO k_experience VALUES (3, 23, 8720)')
  845. cursor.execute('INSERT INTO k_experience VALUES (4, 23, 10476)')
  846. cursor.execute('INSERT INTO k_experience VALUES (5, 23, 12535)')
  847. cursor.execute('INSERT INTO k_experience VALUES (6, 23, 15140)')
  848. cursor.execute('INSERT INTO k_experience VALUES (3, 24, 9962)')
  849. cursor.execute('INSERT INTO k_experience VALUES (4, 24, 11969)')
  850. cursor.execute('INSERT INTO k_experience VALUES (5, 24, 14321)')
  851. cursor.execute('INSERT INTO k_experience VALUES (6, 24, 17296)')
  852. cursor.execute('INSERT INTO k_experience VALUES (3, 25, 0)')
  853. cursor.execute('INSERT INTO k_experience VALUES (4, 25, 13673)')
  854. cursor.execute('INSERT INTO k_experience VALUES (5, 25, 16360)')
  855. cursor.execute('INSERT INTO k_experience VALUES (6, 25, 19758)')
  856. cursor.execute('INSERT INTO k_experience VALUES (4, 26, 15619)')
  857. cursor.execute('INSERT INTO k_experience VALUES (5, 26, 18690)')
  858. cursor.execute('INSERT INTO k_experience VALUES (6, 26, 22572)')
  859. cursor.execute('INSERT INTO k_experience VALUES (4, 27, 17844)')
  860. cursor.execute('INSERT INTO k_experience VALUES (5, 27, 21350)')
  861. cursor.execute('INSERT INTO k_experience VALUES (6, 27, 25786)')
  862. cursor.execute('INSERT INTO k_experience VALUES (4, 28, 20386)')
  863. cursor.execute('INSERT INTO k_experience VALUES (5, 28, 24392)')
  864. cursor.execute('INSERT INTO k_experience VALUES (6, 28, 29458)')
  865. cursor.execute('INSERT INTO k_experience VALUES (4, 29, 23495)')
  866. cursor.execute('INSERT INTO k_experience VALUES (5, 29, 28113)')
  867. cursor.execute('INSERT INTO k_experience VALUES (6, 29, 33954)')
  868. cursor.execute('INSERT INTO k_experience VALUES (4, 30, 0)')
  869. cursor.execute('INSERT INTO k_experience VALUES (5, 30, 32404)')
  870. cursor.execute('INSERT INTO k_experience VALUES (6, 30, 39134)')
  871. cursor.execute('INSERT INTO k_experience VALUES (5, 31, 37348)')
  872. cursor.execute('INSERT INTO k_experience VALUES (6, 31, 45107)')
  873. cursor.execute('INSERT INTO k_experience VALUES (5, 32, 43048)')
  874. cursor.execute('INSERT INTO k_experience VALUES (6, 32, 51990)')
  875. cursor.execute('INSERT INTO k_experience VALUES (5, 33, 49617)')
  876. cursor.execute('INSERT INTO k_experience VALUES (6, 33, 59924)')
  877. cursor.execute('INSERT INTO k_experience VALUES (5, 34, 57188)')
  878. cursor.execute('INSERT INTO k_experience VALUES (6, 34, 69068)')
  879. cursor.execute('INSERT INTO k_experience VALUES (5, 35, 0)')
  880. cursor.execute('INSERT INTO k_experience VALUES (6, 35, 76085)')
  881. cursor.execute('INSERT INTO k_experience VALUES (6, 36, 83816)')
  882. cursor.execute('INSERT INTO k_experience VALUES (6, 37, 92332)')
  883. cursor.execute('INSERT INTO k_experience VALUES (6, 38, 101712)')
  884. cursor.execute('INSERT INTO k_experience VALUES (6, 39, 112046)')
  885. cursor.execute('INSERT INTO k_experience VALUES (6, 40, 0)')
  886. db.commit()
  887. #cursor.execute('ALTER TABLE k_unit DROP COLUMN com2us_id')
  888. cursor.close()
  889. """
  890. Begin script
  891. """
  892. db = createDatabase('application/sw.sqlite')
  893. parseBuildings(db, 'https://swarfarm.com/api/v2/buildings/')
  894. parseEffects(db, 'https://swarfarm.com/api/v2/skill-effects/')
  895. parseSkills(db, 'https://swarfarm.com/api/v2/skills/')
  896. parseLeaderSkills(db, 'https://swarfarm.com/api/v2/leader-skills/')
  897. parseSources(db, 'https://swarfarm.com/api/v2/monster-sources/')
  898. parseMonsters(db, 'https://swarfarm.com/api/v2/monsters/')
  899. parseFusions(db, 'https://swarfarm.com/api/v2/fusions/')
  900. parseCraft(db, 'https://swarfarm.com/api/v2/craft-materials/')
  901. removeImperfect(db)
  902. useSwexIds(db)
  903. staticData(db)