install_base.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  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_decoration_level(
  27. decoration TEXT,
  28. level INT,
  29. bonus INT,
  30. cost INT
  31. );
  32. ''')
  33. cursor.execute('''
  34. CREATE TABLE IF NOT EXISTS k_effect(
  35. id INT,
  36. name TEXT,
  37. is_buff INT,
  38. description TEXT
  39. );
  40. ''')
  41. cursor.execute('''
  42. CREATE TABLE IF NOT EXISTS k_skill_level(
  43. skill TEXT,
  44. level INT,
  45. description TEXT
  46. );
  47. ''')
  48. cursor.execute('''
  49. CREATE TABLE IF NOT EXISTS k_skill(
  50. id TEXT,
  51. name TEXT,
  52. description TEXT,
  53. slot INT,
  54. cooltime INT,
  55. hits INT,
  56. passive INT,
  57. aoe INT,
  58. max_level INT,
  59. multiplier_formula TEXT
  60. );
  61. ''')
  62. cursor.execute('''
  63. CREATE TABLE IF NOT EXISTS k_skill_tmp(
  64. id TEXT,
  65. com2us_id TEXT,
  66. name TEXT,
  67. description TEXT,
  68. slot INT,
  69. cooltime INT,
  70. hits INT,
  71. passive INT,
  72. aoe INT,
  73. max_level INT,
  74. multiplier_formula TEXT
  75. );
  76. ''')
  77. cursor.execute('''
  78. CREATE TABLE IF NOT EXISTS k_skill_effect(
  79. skill TEXT,
  80. effect INT
  81. );
  82. ''')
  83. cursor.execute('''
  84. CREATE TABLE IF NOT EXISTS k_leader_skill(
  85. id INT,
  86. attribute TEXT,
  87. amount INT,
  88. area TEXT,
  89. element TEXT
  90. );
  91. ''')
  92. cursor.execute('''
  93. CREATE TABLE IF NOT EXISTS k_unit(
  94. id TEXT,
  95. family TEXT,
  96. name TEXT,
  97. element TEXT,
  98. archetype TEXT,
  99. base_stars INT,
  100. natural_stars INT,
  101. obtainable INT,
  102. can_awaken INT,
  103. awaken_bonus TEXT,
  104. skill_ups_to_max INT,
  105. leader_skill INT,
  106. hp INT,
  107. attack INT,
  108. defense INT,
  109. speed INT,
  110. crit_rate INT,
  111. crit_damage INT,
  112. resistance INT,
  113. accuracy INT,
  114. raw_hp INT,
  115. raw_attack INT,
  116. raw_defense INT,
  117. max_lvl_hp INT,
  118. max_lvl_attack INT,
  119. max_lvl_defense INT,
  120. awakens_from INT,
  121. awakens_to INT,
  122. fusion_food INT,
  123. homunculus INT,
  124. craft_cost INT
  125. );
  126. ''')
  127. cursor.execute('''
  128. CREATE TABLE IF NOT EXISTS k_unit_tmp(
  129. id TEXT,
  130. com2us_id TEXT,
  131. family TEXT,
  132. name TEXT,
  133. element TEXT,
  134. archetype TEXT,
  135. base_stars INT,
  136. natural_stars INT,
  137. obtainable INT,
  138. can_awaken INT,
  139. awaken_bonus TEXT,
  140. skill_ups_to_max INT,
  141. leader_skill INT,
  142. hp INT,
  143. attack INT,
  144. defense INT,
  145. speed INT,
  146. crit_rate INT,
  147. crit_damage INT,
  148. resistance INT,
  149. accuracy INT,
  150. raw_hp INT,
  151. raw_attack INT,
  152. raw_defense INT,
  153. max_lvl_hp INT,
  154. max_lvl_attack INT,
  155. max_lvl_defense INT,
  156. awakens_from INT,
  157. awakens_to INT,
  158. fusion_food INT,
  159. homunculus INT,
  160. craft_cost INT
  161. );
  162. ''')
  163. cursor.execute('''
  164. CREATE TABLE IF NOT EXISTS k_unit_skill(
  165. unit TEXT,
  166. skill TEXT
  167. );
  168. ''')
  169. cursor.execute('''
  170. CREATE TABLE IF NOT EXISTS k_unit_source(
  171. unit TEXT,
  172. source INT
  173. );
  174. ''')
  175. cursor.execute('''
  176. CREATE TABLE IF NOT EXISTS k_unit_essence(
  177. unit TEXT,
  178. element TEXT,
  179. grade TEXT,
  180. amount TEXT
  181. );
  182. ''')
  183. cursor.execute('''
  184. CREATE TABLE IF NOT EXISTS k_fusion(
  185. id INT,
  186. product TEXT,
  187. stars INT,
  188. cost INT,
  189. ingredient TEXT
  190. );
  191. ''')
  192. cursor.execute('''
  193. CREATE TABLE IF NOT EXISTS player(
  194. uid TEXT,
  195. name TEXT,
  196. mana INT,
  197. crystal INT,
  198. country TEXT,
  199. lang TEXT,
  200. level INT,
  201. experience INT,
  202. energy INT,
  203. energy_max INT,
  204. energy_per_min INT,
  205. arena_energy INT,
  206. arena_energy_max INT,
  207. rep TEXT,
  208. social_point INT,
  209. honor_point INT,
  210. guild_point INT,
  211. darkportal_energy INT,
  212. darkportal_energy_max INT,
  213. dimension_energy INT,
  214. dimension_energy_max INT,
  215. costume_point INT,
  216. costume_point_max INT,
  217. honor_medal INT,
  218. honor_mark INT,
  219. event_coin INT,
  220. storage_slots INT,
  221. island INT
  222. );
  223. ''')
  224. cursor.execute('''
  225. CREATE TABLE IF NOT EXISTS scenario(
  226. uid TEXT,
  227. region INT,
  228. difficulty INT,
  229. cleared INT,
  230. max_cleared INT
  231. );
  232. ''')
  233. cursor.execute('''
  234. CREATE TABLE IF NOT EXISTS defense(
  235. uid TEXT,
  236. unit TEXT,
  237. position INT
  238. );
  239. ''')
  240. cursor.execute('''
  241. CREATE TABLE IF NOT EXISTS defense(
  242. uid TEXT,
  243. building INT,
  244. level INT
  245. );
  246. ''')
  247. cursor.execute('''
  248. CREATE TABLE IF NOT EXISTS unit(
  249. uid TEXT,
  250. id TEXT,
  251. building TEXT,
  252. unit TEXT,
  253. level INT,
  254. stars INT,
  255. hp INT,
  256. attack INT,
  257. defense INT,
  258. speed INT,
  259. crit_rate INT,
  260. crit_damage INT,
  261. resistance INT,
  262. accuracy INT,
  263. experience INT,
  264. exp_gained INT,
  265. exp_gain_rate INT,
  266. costume INT,
  267. attribute INT,
  268. source INT,
  269. create_time DATETIME,
  270. homunculus INT,
  271. homunculus_name TEXT,
  272. lock INT
  273. );
  274. ''')
  275. cursor.execute('''
  276. CREATE TABLE IF NOT EXISTS unit_skill(
  277. uid TEXT,
  278. unit TEXT,
  279. skill TEXT,
  280. level INT
  281. );
  282. ''')
  283. cursor.execute('''
  284. CREATE TABLE IF NOT EXISTS rune(
  285. uid TEXT,
  286. id TEXT,
  287. assigned_to TEXT,
  288. type TEXT,
  289. slot INT,
  290. stars INT,
  291. ancient INT,
  292. level INT,
  293. quality INT,
  294. original_quality INT,
  295. value INT,
  296. efficiency INT,
  297. max_efficiency INT,
  298. main_stat TEXT,
  299. main_stat_value INT,
  300. innate_stat TEXT,
  301. innate_stat_value INT,
  302. substat_1 TEXT,
  303. substat_1_value INT,
  304. substat_1_enchant INT,
  305. substat_1_grind INT,
  306. substat_2 TEXT,
  307. substat_2_value INT,
  308. substat_2_enchant INT,
  309. substat_2_grind INT,
  310. substat_3 TEXT,
  311. substat_3_value INT,
  312. substat_3_enchant INT,
  313. substat_3_grind INT,
  314. substat_4 TEXT,
  315. substat_4_value INT,
  316. substat_4_enchant INT,
  317. substat_4_grind INT
  318. );
  319. ''')
  320. cursor.execute('''
  321. CREATE TABLE IF NOT EXISTS building(
  322. uid TEXT,
  323. building INT,
  324. gain INT
  325. );
  326. ''')
  327. cursor.execute('''
  328. CREATE TABLE IF NOT EXISTS decoration(
  329. uid TEXT,
  330. decoration INT,
  331. level INT
  332. );
  333. ''')
  334. cursor.execute('''
  335. CREATE TABLE IF NOT EXISTS inventory(
  336. uid TEXT,
  337. id TEXT,
  338. type TEXT,
  339. amount INT
  340. );
  341. ''')
  342. cursor.execute('''
  343. CREATE TABLE IF NOT EXISTS summon_special(
  344. week TEXT,
  345. unit TEXT
  346. );
  347. ''')
  348. cursor.execute('''
  349. CREATE TABLE IF NOT EXISTS guild(
  350. id TEXT,
  351. name TEXT,
  352. level INT,
  353. experience INT,
  354. recruiting INT,
  355. members INT,
  356. leader INT,
  357. comment TEXT,
  358. notice TEXT
  359. );
  360. ''')
  361. cursor.execute('''
  362. CREATE TABLE IF NOT EXISTS guild_member(
  363. id TEXT,
  364. guild TEXT,
  365. grade INT,
  366. name TEXT,
  367. level INT,
  368. rating INT,
  369. arena_score INT,
  370. joined TIMESTAMP,
  371. last_login TIMESTAMP,
  372. in_war INT,
  373. has_defense INT
  374. );
  375. ''')
  376. cursor.execute('''
  377. CREATE TABLE IF NOT EXISTS rune_craft(
  378. uid TEXT,
  379. id INT,
  380. type INT,
  381. quality INT,
  382. rune INT,
  383. stat INT,
  384. value INT
  385. );
  386. ''')
  387. cursor.execute('''
  388. CREATE TABLE IF NOT EXISTS run(
  389. uid TEXT,
  390. id INT,
  391. dtime TIMESTAMP,
  392. area INT,
  393. stage INT,
  394. difficulty INT,
  395. win INT,
  396. time INT,
  397. mana INT,
  398. energy INT,
  399. crystal INT,
  400. helper INT
  401. );
  402. ''')
  403. cursor.execute('''
  404. CREATE TABLE IF NOT EXISTS run_party(
  405. run INT,
  406. unit INT,
  407. k_unit INT
  408. );
  409. ''')
  410. cursor.execute('''
  411. CREATE TABLE IF NOT EXISTS run_drop_rune(
  412. run INT,
  413. id INT,
  414. type TEXT,
  415. slot INT,
  416. stars INT,
  417. ancient INT,
  418. quality INT,
  419. value INT,
  420. efficiency INT,
  421. main_stat TEXT,
  422. main_stat_value INT,
  423. innate_stat TEXT,
  424. innate_stat_value INT,
  425. substat_1 TEXT,
  426. substat_1_value INT,
  427. substat_2 TEXT,
  428. substat_2_value INT,
  429. substat_3 TEXT,
  430. substat_3_value INT,
  431. substat_4 TEXT,
  432. substat_4_value INT
  433. );
  434. ''')
  435. cursor.execute('''
  436. CREATE TABLE IF NOT EXISTS run_drop_rune_craft(
  437. run INT,
  438. id INT,
  439. type INT,
  440. quality INT,
  441. rune INT,
  442. stat INT,
  443. value INT
  444. );
  445. ''')
  446. cursor.execute('''
  447. CREATE TABLE IF NOT EXISTS run_drop_item(
  448. run INT,
  449. item INT,
  450. quantity INT
  451. );
  452. ''')
  453. cursor.execute('''
  454. CREATE TABLE IF NOT EXISTS run_drop_unit(
  455. run INT,
  456. unit INT
  457. );
  458. ''')
  459. cursor.execute('''
  460. CREATE TABLE IF NOT EXISTS run_drop_sd(
  461. run INT,
  462. unit INT
  463. );
  464. ''')
  465. cursor.execute('''
  466. CREATE TABLE IF NOT EXISTS run_drop_unit_pieces(
  467. run INT,
  468. unit INT,
  469. quantity INT
  470. );
  471. ''')
  472. cursor.execute('''
  473. CREATE TABLE IF NOT EXISTS run_drop_shapeshifting(
  474. run INT,
  475. quantity INT
  476. );
  477. ''')
  478. db.commit()
  479. cursor.close()
  480. return db
  481. except sqlite3.IntegrityError as e:
  482. print("Error executing statement: " + str(e))
  483. raise
  484. except IOError as e:
  485. print("I/O Error creating database " + name + ": " + str(e))
  486. raise
  487. """
  488. Inserts a row into the database.
  489. :param db: Connection to the database.
  490. :param table: Name of the table to insert into.
  491. :param values: List of values to insert.
  492. :raises IntegrityError: The insert query was unsuccesfull.
  493. """
  494. def insert(db, table, values):
  495. cursor = db.cursor()
  496. placeholders = ''
  497. for x in range(0, len(values)):
  498. placeholders = placeholders + '?, '
  499. placeholders = placeholders[:len(placeholders) - 2]
  500. query = 'INSERT INTO ' + table + ' VALUES (' + placeholders + ')'
  501. try:
  502. cursor.execute(query, values)
  503. except sqlite3.IntegrityError as e:
  504. print('Error Inserting into ' + table + ' with values (' + str(values) + '): ' + str(e))
  505. raise
  506. cursor.close;
  507. """
  508. Dowwnloads a file.
  509. If OPT_DOWNLOAD is set to false, it will do nothing (but it will still return
  510. true).
  511. If OPT_DOWNLOAD_OVERWRITE it will only download the file if the target doesn't
  512. exist (but it will still return true if it does).
  513. :param url: File url.
  514. :param target: Full or relative path (whit filename to save the url).
  515. :returns: True on success, false on error.
  516. """
  517. def download(url, target):
  518. if OPT_DOWNLOAD == False:
  519. return True
  520. if OPT_DOWNLOAD_OVERWRITE == False and os.path.isfile(target):
  521. return True
  522. try:
  523. urllib.request.urlretrieve(url, target)
  524. return True
  525. except:
  526. return False
  527. """
  528. Parses building date (tables k_building, k_building_level).
  529. :param db: Sqlite database connection.
  530. :param url: Swarfarm APIv2, buildings.
  531. """
  532. def parseBuildings(db, url):
  533. print("Parsing buildings...")
  534. http = urllib3.PoolManager()
  535. mlist = str(http.request('GET', url).data.decode('utf-8'))
  536. data = json.loads(mlist)
  537. while True:
  538. for building in data["results"]:
  539. id = building["id"]
  540. com2us_id = building["com2us_id"]
  541. area = building["area"]
  542. affected_stat = building["affected_stat"]
  543. element = building["element"]
  544. name = building["name"]
  545. description = building["description"]
  546. max_level = building["max_level"]
  547. insert(db, "k_building_tmp", (id, com2us_id, area, affected_stat, element, name, description, max_level))
  548. lv = 0
  549. for bonus in building["stat_bonus"]:
  550. insert(db, "k_building_level", (id, lv, bonus, building["upgrade_cost"][lv]))
  551. lv = lv + 1
  552. # Next page
  553. db.commit()
  554. if data["next"] != None:
  555. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  556. data = json.loads(mlist)
  557. else:
  558. break
  559. """
  560. Parses skill data (tables k_skill, k_skill_level, k_skill_effect).
  561. :param db: Sqlite database connection.
  562. :param url: Swarfarm APIv2, skills.
  563. """
  564. def parseSkills(db, url):
  565. print("Parsing skills...")
  566. http = urllib3.PoolManager()
  567. mlist = str(http.request('GET', url).data.decode('utf-8'))
  568. data = json.loads(mlist)
  569. while True:
  570. for skill in data["results"]:
  571. id = skill["id"]
  572. com2us_id = skill["com2us_id"]
  573. name = skill["name"]
  574. description = skill["description"]
  575. slot = skill["slot"]
  576. cooltime = skill["cooltime"]
  577. hits = skill["hits"]
  578. passive = skill["passive"]
  579. aoe = skill["aoe"]
  580. max_level = skill["max_level"]
  581. multiplier_formula = skill["multiplier_formula"]
  582. insert(db, "k_skill_tmp", (id, com2us_id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula))
  583. insert(db, "k_skill_level", (id, 1, ""))
  584. if (max_level > 1):
  585. lv = 2
  586. for level in skill["level_progress_description"]:
  587. insert(db, "k_skill_level", (id, str(lv), level))
  588. lv = lv + 1
  589. for effect in skill["effects"]:
  590. insert(db, "k_skill_effect", (id, effect["effect"]["id"]))
  591. image = "https://swarfarm.com/static/herders/images/skills/" + skill["icon_filename"]
  592. download(image, 'public/img/content/skill/' + str(id).zfill(4) + '.png')
  593. # Next page
  594. db.commit()
  595. if data["next"] != None:
  596. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  597. data = json.loads(mlist)
  598. else:
  599. break
  600. """
  601. Parses leader skills (table k_leader_skill).
  602. :param db: Sqlite database connection.
  603. :param url: Swarfarm APIv2, leader-skills.
  604. """
  605. def parseLeaderSkills(db, url):
  606. print("Parsing leader skills...")
  607. http = urllib3.PoolManager()
  608. mlist = str(http.request('GET', url).data.decode('utf-8'))
  609. data = json.loads(mlist)
  610. while True:
  611. for skill in data["results"]:
  612. id = skill["id"]
  613. attribute = skill["attribute"]
  614. amount = skill["amount"]
  615. area = skill["area"]
  616. element = skill["element"]
  617. if element == 'Water':
  618. element = 1;
  619. elif element == 'Fire':
  620. element = 2;
  621. elif element == 'Wind':
  622. element = 3;
  623. elif element == 'Light':
  624. element = 4;
  625. elif element == 'Dark':
  626. element = 5;
  627. else:
  628. element = None
  629. if attribute == 'HP':
  630. attribute = 1
  631. elif attribute == 'Attack Power':
  632. attribute = 2
  633. elif attribute == 'Defense':
  634. attribute = 3
  635. elif attribute == 'Attack Speed':
  636. attribute = 4
  637. elif attribute == 'Critical Rate':
  638. attribute = 5
  639. elif attribute == 'Critical DMG':
  640. attribute = 6
  641. elif attribute == 'Resistance':
  642. attribute = 7
  643. elif attribute == 'Accuracy':
  644. attribute = 8
  645. else:
  646. attribute = None
  647. if area == 'General':
  648. area = 1
  649. elif area == 'Element':
  650. area = 1
  651. elif area == 'Dungeon':
  652. area = 2
  653. elif area == 'Arena':
  654. area = 3
  655. elif area == 'Guild':
  656. area = 4
  657. else:
  658. area = 1
  659. insert(db, "k_leader_skill", (id, attribute, amount, area, element))
  660. # Next page
  661. db.commit()
  662. if data["next"] != None:
  663. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  664. data = json.loads(mlist)
  665. else:
  666. break
  667. """
  668. Parses skill effects (table k_effect).
  669. :param db: Sqlite database connection.
  670. :param url: Swarfarm APIv2, skill-efects.
  671. """
  672. def parseEffects(db, url):
  673. print("Parsing skill effects...")
  674. http = urllib3.PoolManager()
  675. mlist = str(http.request('GET', url).data.decode('utf-8'))
  676. data = json.loads(mlist)
  677. while True:
  678. for effect in data["results"]:
  679. id = effect["id"]
  680. name = effect["name"]
  681. is_buff = effect["is_buff"]
  682. description = effect["description"]
  683. insert(db, "k_effect", (id, name, is_buff, description))
  684. # Next page
  685. db.commit()
  686. if data["next"] != None:
  687. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  688. data = json.loads(mlist)
  689. else:
  690. break
  691. """
  692. Parses monster sources (table k_source).
  693. :param db: Sqlite database connection.
  694. :param url: Swarfarm APIv2, craft-materials.
  695. """
  696. def parseSources(db, url):
  697. print("Parsing sources...")
  698. http = urllib3.PoolManager()
  699. mlist = str(http.request('GET', url).data.decode('utf-8'))
  700. data = json.loads(mlist)
  701. while True:
  702. for source in data["results"]:
  703. id = source["id"]
  704. name = source["name"]
  705. description = source["description"]
  706. farmable_source = source["farmable_source"]
  707. insert(db, "k_source", (id, name, description, farmable_source))
  708. # Next page
  709. db.commit()
  710. if data["next"] != None:
  711. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  712. data = json.loads(mlist)
  713. else:
  714. break
  715. """
  716. Parses monster data (tables k_unit, k_unit_essence, k_unit_source,
  717. k_monsster_skill).
  718. :param db: Sqlite database connection.
  719. :param url: Swarfarm APIv2, monsters.
  720. """
  721. def parseMonsters(db, url):
  722. print("Parsing monsters...")
  723. http = urllib3.PoolManager()
  724. mlist = str(http.request('GET', url).data.decode('utf-8'))
  725. data = json.loads(mlist)
  726. while True:
  727. for mon in data["results"]:
  728. id = mon["id"]
  729. url = mon["url"]
  730. com2us_id = mon["com2us_id"]
  731. family_id = mon["family_id"]
  732. name = mon["name"]
  733. image_filename = mon["image_filename"]
  734. element = mon["element"]
  735. archetype = mon["archetype"]
  736. base_stars = mon["base_stars"]
  737. natural_stars = mon["natural_stars"]
  738. obtainable = mon["obtainable"]
  739. can_awaken = mon["can_awaken"]
  740. awaken_level = mon["awaken_level"]
  741. awaken_bonus = mon["awaken_bonus"]
  742. skill_ups_to_max = mon["skill_ups_to_max"]
  743. if mon["leader_skill"] != None:
  744. leader_skill = mon["leader_skill"]["id"]
  745. else:
  746. leader_skill = None
  747. homunculus_skills = mon["homunculus_skills"]
  748. hp = mon["base_hp"]
  749. attack = mon["base_attack"]
  750. defense = mon["base_defense"]
  751. speed = mon["speed"]
  752. crit_rate = mon["crit_rate"]
  753. crit_damage = mon["crit_damage"]
  754. resistance = mon["resistance"]
  755. accuracy = mon["accuracy"]
  756. raw_hp = mon["raw_hp"]
  757. raw_attack = mon["raw_attack"]
  758. raw_defense = mon["raw_defense"]
  759. max_lvl_hp = mon["max_lvl_hp"]
  760. max_lvl_attack = mon["max_lvl_attack"]
  761. max_lvl_defense = mon["max_lvl_defense"]
  762. awakens_from = mon["awakens_from"]
  763. awakens_to = mon["awakens_to"]
  764. awaken_mats_fire_low = mon["awaken_mats_fire_low"]
  765. awaken_mats_fire_mid = mon["awaken_mats_fire_mid"]
  766. awaken_mats_fire_high = mon["awaken_mats_fire_high"]
  767. awaken_mats_water_low = mon["awaken_mats_water_low"]
  768. awaken_mats_water_mid = mon["awaken_mats_water_mid"]
  769. awaken_mats_water_high = mon["awaken_mats_water_high"]
  770. awaken_mats_wind_low = mon["awaken_mats_wind_low"]
  771. awaken_mats_wind_mid = mon["awaken_mats_wind_mid"]
  772. awaken_mats_wind_high = mon["awaken_mats_wind_high"]
  773. awaken_mats_light_low = mon["awaken_mats_light_low"]
  774. awaken_mats_light_mid = mon["awaken_mats_light_mid"]
  775. awaken_mats_light_high = mon["awaken_mats_light_high"]
  776. awaken_mats_dark_low = mon["awaken_mats_dark_low"]
  777. awaken_mats_dark_mid = mon["awaken_mats_dark_mid"]
  778. awaken_mats_dark_high = mon["awaken_mats_dark_high"]
  779. awaken_mats_magic_low = mon["awaken_mats_magic_low"]
  780. awaken_mats_magic_mid = mon["awaken_mats_magic_mid"]
  781. awaken_mats_magic_high = mon["awaken_mats_magic_high"]
  782. fusion_food = mon["fusion_food"]
  783. homunculus = mon["homunculus"]
  784. craft_cost = mon["craft_cost"]
  785. insert(db, "k_unit_tmp", (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))
  786. if awaken_mats_fire_low > 0:
  787. insert(db, "k_unit_essence", (id, "Fire", "Low", awaken_mats_fire_low))
  788. if awaken_mats_fire_mid > 0:
  789. insert(db, "k_unit_essence", (id, "Fire", "Mid", awaken_mats_fire_mid))
  790. if awaken_mats_fire_high > 0:
  791. insert(db, "k_unit_essence", (id, "Fire", "High", awaken_mats_fire_high))
  792. if awaken_mats_water_low > 0:
  793. insert(db, "k_unit_essence", (id, "Water", "Low", awaken_mats_water_low))
  794. if awaken_mats_water_mid > 0:
  795. insert(db, "k_unit_essence", (id, "Water", "Mid", awaken_mats_water_mid))
  796. if awaken_mats_water_high > 0:
  797. insert(db, "k_unit_essence", (id, "Water", "High", awaken_mats_water_high))
  798. if awaken_mats_wind_low > 0:
  799. insert(db, "k_unit_essence", (id, "Wind", "Low", awaken_mats_wind_low))
  800. if awaken_mats_wind_mid > 0:
  801. insert(db, "k_unit_essence", (id, "Wind", "Mid", awaken_mats_wind_mid))
  802. if awaken_mats_wind_high > 0:
  803. insert(db, "k_unit_essence", (id, "Wind", "High", awaken_mats_wind_high))
  804. if awaken_mats_dark_low > 0:
  805. insert(db, "k_unit_essence", (id, "Dark", "Low", awaken_mats_dark_low))
  806. if awaken_mats_dark_mid > 0:
  807. insert(db, "k_unit_essence", (id, "Dark", "Mid", awaken_mats_dark_mid))
  808. if awaken_mats_dark_high > 0:
  809. insert(db, "k_unit_essence", (id, "Dark", "High", awaken_mats_dark_high))
  810. if awaken_mats_light_low > 0:
  811. insert(db, "k_unit_essence", (id, "Light", "Low", awaken_mats_light_low))
  812. if awaken_mats_light_mid > 0:
  813. insert(db, "k_unit_essence", (id, "Light", "Mid", awaken_mats_light_mid))
  814. if awaken_mats_light_high > 0:
  815. insert(db, "k_unit_essence", (id, "Light", "High", awaken_mats_light_high))
  816. if awaken_mats_magic_low > 0:
  817. insert(db, "k_unit_essence", (id, "Magic", "Low", awaken_mats_magic_low))
  818. if awaken_mats_magic_mid > 0:
  819. insert(db, "k_unit_essence", (id, "Magic", "Mid", awaken_mats_magic_mid))
  820. if awaken_mats_magic_high > 0:
  821. insert(db, "k_unit_essence", (id, "Magic", "High", awaken_mats_magic_high))
  822. for skill in mon["skills"]:
  823. insert(db, "k_unit_skill", (id, skill))
  824. for source in mon["source"]:
  825. insert(db, "k_unit_source", (id, source["id"]))
  826. # TODO: craft_materials
  827. image = "https://swarfarm.com/static/herders/images/monsters/" + mon["image_filename"]
  828. download(image, 'public/img/content/monster/' + str(id).zfill(4) + '.png')
  829. # Next page
  830. db.commit()
  831. if data["next"] != None:
  832. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  833. data = json.loads(mlist)
  834. else:
  835. break
  836. """
  837. Parses fusion data (table k_fusion).
  838. :param db: Sqlite database connection.
  839. :param url: Swarfarm APIv2, fusions.
  840. """
  841. def parseFusions(db, url):
  842. print("Parsing fusions...")
  843. http = urllib3.PoolManager()
  844. mlist = str(http.request('GET', url).data.decode('utf-8'))
  845. data = json.loads(mlist)
  846. while True:
  847. for fusion in data["results"]:
  848. id = fusion["id"]
  849. product = fusion["product"]
  850. stars = fusion["stars"]
  851. cost = fusion["cost"]
  852. for ingredient in fusion["ingredients"]:
  853. insert(db, "k_fusion", (id, product, stars, cost, ingredient))
  854. # Next page
  855. db.commit()
  856. if data["next"] != None:
  857. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  858. data = json.loads(mlist)
  859. else:
  860. break
  861. """
  862. Parses crafting materials (table k_craft).
  863. :param db: Sqlite database connection.
  864. :param url: Swarfarm APIv2, craft-materials.
  865. """
  866. def parseCraft(db, url):
  867. print("Parsing crafting materials...")
  868. http = urllib3.PoolManager()
  869. mlist = str(http.request('GET', url).data.decode('utf-8'))
  870. data = json.loads(mlist)
  871. while True:
  872. first = False
  873. for crat in data["results"]:
  874. id = crat["id"]
  875. name = crat["name"]
  876. insert(db, "k_craft", (id, name))
  877. # Next page
  878. db.commit()
  879. if data["next"] != None:
  880. mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
  881. data = json.loads(mlist)
  882. else:
  883. break
  884. """
  885. Removes references to imperfect monsters.
  886. Imperfect monsters are only available in Japanese servers due to legal reasons,
  887. they are not needed for this app. They wont be deleted, but awakening chains
  888. wil be cut.
  889. :param db: Sqlite database connection.
  890. """
  891. def removeImperfect(db):
  892. print("Unlinking inperfetc units...")
  893. cursor = db.cursor()
  894. cursor.execute('''
  895. UPDATE k_unit
  896. SET awakens_from = null
  897. WHERE awakens_from IN (SELECT id FROM k_unit WHERE name LIKE 'Imperfect %')
  898. ''');
  899. db.commit()
  900. cursor.close()
  901. """
  902. Changes IDS from swarfarm formats to swex formats.
  903. :param db: Sqlite database connection.
  904. """
  905. def useSwexIds(db):
  906. print("Updating IDs...")
  907. cursor = db.cursor()
  908. #cursor.execute('UPDATE k_building_level SET building = (SELECT com2us_id FROM k_building WHERE building = id)')
  909. #cursor.execute('UPDATE k_building_tmp SET id = com2us_id')
  910. cursor.execute('UPDATE k_skill_level SET skill = (SELECT com2us_id FROM k_skill_tmp WHERE skill = id)')
  911. cursor.execute('UPDATE k_skill_effect SET skill = (SELECT com2us_id FROM k_skill_tmp WHERE skill = id)')
  912. cursor.execute('UPDATE k_unit_skill SET skill = (SELECT com2us_id FROM k_skill_tmp WHERE skill = id)')
  913. cursor.execute('UPDATE k_skill_tmp SET id = com2us_id')
  914. cursor.execute('UPDATE k_unit_skill SET unit = (SELECT com2us_id FROM k_unit_tmp WHERE unit = k_unit_tmp.id)')
  915. cursor.execute('UPDATE k_unit_source SET unit = (SELECT com2us_id FROM k_unit_tmp WHERE unit = k_unit_tmp.id)')
  916. cursor.execute('UPDATE k_unit_essence SET unit = (SELECT com2us_id FROM k_unit_tmp WHERE unit = k_unit_tmp.id)')
  917. cursor.execute('UPDATE k_fusion SET product = (SELECT com2us_id FROM k_unit_tmp WHERE product = k_unit_tmp.id)')
  918. cursor.execute('UPDATE k_fusion SET ingredient = (SELECT com2us_id FROM k_unit_tmp WHERE ingredient = k_unit_tmp.id)')
  919. cursor.execute('UPDATE k_unit_tmp SET awakens_from = (SELECT com2us_id FROM k_unit_tmp un WHERE k_unit_tmp.awakens_from = un.id)')
  920. cursor.execute('UPDATE k_unit_tmp SET awakens_to = (SELECT com2us_id FROM k_unit_tmp un WHERE k_unit_tmp.awakens_to = un.id)')
  921. cursor.execute('UPDATE k_unit_tmp SET id = com2us_id')
  922. cursor.execute('UPDATE k_unit_tmp SET element = (SELECT id FROM k_element WHERE k_element.name = k_unit_tmp.element)')
  923. cursor.execute('UPDATE k_unit_tmp SET archetype = (SELECT id FROM k_archetype WHERE k_archetype.name = k_unit_tmp.archetype) WHERE archetype IS NOT NULL')
  924. db.commit()
  925. #cursor.execute('INSERT INTO k_building SELECT id, area, affected_stat, element, name, description, max_level FROM k_building_tmp')
  926. cursor.execute('INSERT INTO k_skill SELECT id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula FROM k_skill_tmp')
  927. cursor.execute('INSERT INTO k_unit SELECT id, family, 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 FROM k_unit_tmp')
  928. db.commit()
  929. #cursor.execute('DROP TABLE k_building_tmp')
  930. cursor.execute('DROP TABLE k_skill_tmp')
  931. cursor.execute('DROP TABLE k_unit_tmp')
  932. cursor.close()
  933. def staticData(db):
  934. print("Procesing data...")
  935. cursor = db.cursor()
  936. with open("data.sql", "r") as data:
  937. for line in data:
  938. if len(line) > 1:
  939. cursor.execute(line)
  940. db.commit()
  941. cursor.close()
  942. """
  943. Begin script
  944. """
  945. db = createDatabase('application/sw.sqlite')
  946. staticData(db)
  947. #parseBuildings(db, 'https://swarfarm.com/api/v2/buildings/')
  948. parseEffects(db, 'https://swarfarm.com/api/v2/skill-effects/')
  949. parseSkills(db, 'https://swarfarm.com/api/v2/skills/')
  950. parseLeaderSkills(db, 'https://swarfarm.com/api/v2/leader-skills/')
  951. #parseSources(db, 'https://swarfarm.com/api/v2/monster-sources/')
  952. parseMonsters(db, 'https://swarfarm.com/api/v2/monsters/')
  953. parseFusions(db, 'https://swarfarm.com/api/v2/fusions/')
  954. #parseCraft(db, 'https://swarfarm.com/api/v2/craft-materials/')
  955. removeImperfect(db)
  956. useSwexIds(db)