install_user.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  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. FILE = "/home/ivalentin/.SWEX/IVV0-8114048.json"
  11. def readFile(file):
  12. with open(file) as json_file:
  13. data = json.load(json_file)
  14. return data
  15. """
  16. Opens the database file and deletes from the user tables
  17. :param name: The path to the sqlite database.
  18. :returns: Connection to the database.
  19. :raises IntegrityError: The queryes couldn't bre executed.
  20. :raises IOError: The sqlite file couldn't be created.
  21. """
  22. def openDatabase(name):
  23. global OPT_CREATE_DB
  24. print('Configuring database...')
  25. try:
  26. db = sqlite3.connect(name)
  27. cursor = db.cursor()
  28. cursor.execute('''DELETE FROM scenario''')
  29. cursor.execute('''DELETE FROM defense''')
  30. cursor.execute('''DELETE FROM unit''')
  31. cursor.execute('''DELETE FROM rune''')
  32. cursor.execute('''DELETE FROM player''')
  33. cursor.execute('''DELETE FROM building''')
  34. cursor.execute('''DELETE FROM decoration''')
  35. cursor.execute('''DELETE FROM inventory''')
  36. cursor.execute('''DELETE FROM summon_special''')
  37. db.commit()
  38. cursor.close()
  39. return db
  40. except sqlite3.IntegrityError as e:
  41. print("Error executing statement: " + str(e))
  42. raise
  43. except IOError as e:
  44. print("I/O Error creating database " + name + ": " + str(e))
  45. raise
  46. """
  47. Inserts a row into the database.
  48. :param db: Connection to the database.
  49. :param table: Name of the table to insert into.
  50. :param values: List of values to insert.
  51. :raises IntegrityError: The insert query was unsuccesfull.
  52. """
  53. def insert(db, table, values):
  54. cursor = db.cursor()
  55. placeholders = ''
  56. for x in range(0, len(values)):
  57. placeholders = placeholders + '?, '
  58. placeholders = placeholders[:len(placeholders) - 2]
  59. query = 'INSERT INTO ' + table + ' VALUES (' + placeholders + ')'
  60. try:
  61. cursor.execute(query, values)
  62. except sqlite3.IntegrityError as e:
  63. print('Error Inserting into ' + table + ' with values (' + str(values) + '): ' + str(e))
  64. raise
  65. cursor.close;
  66. """
  67. Parses player (table player).
  68. :param db: Sqlite database connection.
  69. :param data: Data in SWEX json file.
  70. """
  71. def parsePlayer(db, data):
  72. print("Parsing player...")
  73. uid = data["wizard_info"]["wizard_id"]
  74. name = data["wizard_info"]["wizard_name"]
  75. mana = data["wizard_info"]["wizard_mana"]
  76. crystal = data["wizard_info"]["wizard_crystal"]
  77. country = data["wizard_info"]["wizard_last_country"]
  78. lang = data["wizard_info"]["wizard_last_lang"]
  79. level = data["wizard_info"]["wizard_level"]
  80. experience = data["wizard_info"]["experience"]
  81. energy = data["wizard_info"]["wizard_energy"]
  82. energy_max = data["wizard_info"]["energy_max"]
  83. energy_per_min = data["wizard_info"]["energy_per_min"]
  84. arena_energy = data["wizard_info"]["arena_energy"]
  85. arena_energy_max = data["wizard_info"]["arena_energy_max"]
  86. rep = data["wizard_info"]["rep_unit_id"]
  87. social_point = data["wizard_info"]["social_point_current"]
  88. honor_point = data["wizard_info"]["honor_point"]
  89. guild_point = data["wizard_info"]["guild_point"]
  90. darkportal_energy = data["wizard_info"]["darkportal_energy"]
  91. darkportal_energy_max = data["wizard_info"]["darkportal_energy_max"]
  92. costume_point = data["wizard_info"]["costume_point"]
  93. costume_point_max = data["wizard_info"]["costume_point_max"]
  94. honor_medal = data["wizard_info"]["honor_medal"]
  95. honor_mark = data["wizard_info"]["honor_mark"]
  96. event_coin = data["wizard_info"]["event_coin"]
  97. insert(db, "player", (uid, name, mana, crystal, country, lang, level, experience, energy, energy_max, energy_per_min, arena_energy, arena_energy_max, rep, social_point, honor_point, guild_point, darkportal_energy, darkportal_energy_max, costume_point, costume_point_max, honor_medal, honor_medal, event_coin))
  98. db.commit()
  99. """
  100. Parses scenarios (table scenario).
  101. :param db: Sqlite database connection.
  102. :param data: Data in SWEX json file.
  103. """
  104. def parseScenarios(db, data):
  105. print("Parsing scenarios...")
  106. uid = data["wizard_info"]["wizard_id"]
  107. for sce in data["scenario_list"]:
  108. region = sce["region_id"]
  109. difficulty = sce["difficulty"]
  110. cleared = sce["cleared"]
  111. max_cleared = 0
  112. for stage in sce["stage_list"]:
  113. if stage["cleared"] == 1:
  114. max_cleared = stage["stage_no"]
  115. insert(db, "scenario", (uid, region, difficulty, cleared, max_cleared))
  116. db.commit()
  117. """
  118. Parses arena defense units (table defense).
  119. :param db: Sqlite database connection.
  120. :param data: Data in SWEX json file.
  121. """
  122. def parseDefense(db, data):
  123. print("Parsing arena defense...")
  124. uid = data["wizard_info"]["wizard_id"]
  125. for defense in data["defense_unit_list"]:
  126. unit = defense["unit_id"]
  127. position = defense["pos_id"]
  128. insert(db, "defense", (uid, unit, position))
  129. db.commit()
  130. """
  131. Parses buildings (table building).
  132. :param db: Sqlite database connection.
  133. :param data: Data in SWEX json file.
  134. """
  135. def parseBuildings(db, data):
  136. print("Parsing buildings...")
  137. uid = data["wizard_info"]["wizard_id"]
  138. for bui in data["building_list"]:
  139. building = bui["wizard_id"]
  140. gain = bui["gain_per_hour"]
  141. insert(db, "building", (uid, building, gain))
  142. db.commit()
  143. """
  144. Parses decoration buildings (table dcoration).
  145. :param db: Sqlite database connection.
  146. :param data: Data in SWEX json file.
  147. """
  148. def parseDecorations(db, data):
  149. print("Parsing decorations...")
  150. uid = data["wizard_info"]["wizard_id"]
  151. for bui in data["deco_list"]:
  152. building = bui["master_id"]
  153. level = bui["level"]
  154. insert(db, "decoration", (uid, building, level))
  155. db.commit()
  156. """
  157. Parses unit data (tables unit, unit_skill).
  158. :param db: Sqlite database connection.
  159. :param data: Data in SWEX json file.
  160. """
  161. def parseUnits(db, data):
  162. print("Parsing monsters...")
  163. uid = data["wizard_info"]["wizard_id"]
  164. for mon in data["unit_list"]:
  165. id = mon["unit_id"]
  166. building = mon["building_id"]
  167. monster = mon["unit_master_id"]
  168. level = mon["unit_level"]
  169. stars = mon["class"]
  170. hp = mon["con"] * 15 # Always x15
  171. attack = mon["atk"]
  172. defense = mon["def"]
  173. speed = mon["spd"]
  174. crit_rate = mon["critical_rate"]
  175. crit_damage = mon["critical_damage"]
  176. resistance = mon["resist"]
  177. accuracy = mon["accuracy"]
  178. experience = mon["experience"]
  179. exp_gained = mon["exp_gained"]
  180. exp_gain_rate = mon["exp_gain_rate"]
  181. costume = mon["costume_master_id"]
  182. attribute = mon["attribute"]
  183. source = mon["source"]
  184. create_time = mon["create_time"]
  185. homunculus = mon["homunculus"]
  186. homunculus_name = mon["homunculus_name"]
  187. insert(db, "unit", (uid, id, building, monster, level, stars, hp, attack, defense, speed, crit_rate, crit_damage, resistance, accuracy, experience, exp_gained, exp_gain_rate, costume, attribute, source, create_time, homunculus, homunculus_name, 0, None))
  188. for skill in mon["skills"]:
  189. skill_id = skill[0]
  190. skill_level = skill[1]
  191. insert(db, "unit_skill", (uid, id, skill_id, skill_level))
  192. db.commit()
  193. """
  194. Parses inventory data (table inventory).
  195. :param db: Sqlite database connection.
  196. :param data: Data in SWEX json file.
  197. """
  198. def parseInventory(db, data):
  199. print("Parsing inventory...")
  200. uid = data["wizard_info"]["wizard_id"]
  201. for item in data["inventory_info"]:
  202. id = item["wizard_id"]
  203. type = item["item_master_type"]
  204. # TODO: Master id?
  205. amount = item["item_quantity"]
  206. insert(db, "inventory", (uid, id, type, amount))
  207. """
  208. Parses summon stone list (table summon_special).
  209. :param db: Sqlite database connection.
  210. :param data: Data in SWEX json file.
  211. """
  212. def parseSummonSpecial(db, data):
  213. print("Parsing Summon stone monster list...")
  214. uid = data["wizard_info"]["wizard_id"]
  215. for unit in data["summon_special_info"]["this"]:
  216. insert(db, "summon_special", (0, unit))
  217. for unit in data["summon_special_info"]["next"]:
  218. insert(db, "summon_special", (1, unit))
  219. for unit in data["summon_special_info"]["third"]:
  220. insert(db, "summon_special", (2, unit))
  221. for unit in data["summon_special_info"]["fourth"]:
  222. insert(db, "summon_special", (3, unit))
  223. """
  224. Parses rune data (table rune).
  225. :param db: Sqlite database connection.
  226. :param data: Data in SWEX json file.
  227. """
  228. def parseRunes(db, data):
  229. print("Parsing runes...")
  230. uid = data["wizard_info"]["wizard_id"]
  231. # Unequipped runes
  232. for rune in data["runes"]:
  233. id = rune["rune_id"]
  234. assigned_to = rune["occupied_id"]
  235. if assigned_to == 0:
  236. assigned_to = None
  237. runeset = rune["set_id"]
  238. slot = rune["slot_no"]
  239. stars = rune["class"]
  240. ancient = 0
  241. level = rune["upgrade_curr"]
  242. original_quality = rune["extra"]
  243. value = rune["sell_value"]
  244. if stars > 10:
  245. ancient = 1
  246. stars = stars - 10
  247. original_quality = original_quality - 10
  248. if level >= 12:
  249. quality = 4
  250. elif level >= 9:
  251. quality = 3
  252. elif level >= 6:
  253. quality = 2
  254. elif level >= 3:
  255. quality = 1
  256. else:
  257. quality = 0
  258. if original_quality > quality:
  259. quality = original_quality
  260. # TODO: Calculate
  261. #efficiency = rune["efficiency"]
  262. #max_efficiency = rune["max_efficiency"]
  263. efficiency = 0
  264. max_efficiency = 0
  265. main_stat = rune["pri_eff"][0]
  266. main_stat_value = rune["pri_eff"][1]
  267. if rune["prefix_eff"][0] > 0:
  268. innate_stat = rune["prefix_eff"][0]
  269. innate_stat_value = rune["prefix_eff"][1]
  270. else:
  271. innate_stat = None
  272. innate_stat_value = 0
  273. if len(rune["sec_eff"]) > 0:
  274. substat_1 = rune["sec_eff"][0][0]
  275. substat_1_value = rune["sec_eff"][0][1]
  276. substat_1_enchant = rune["sec_eff"][0][2]
  277. substat_1_grind = rune["sec_eff"][0][3]
  278. else:
  279. substat_1 = None
  280. substat_1_value = 0
  281. substat_1_enchant = 0
  282. substat_1_grind = 0
  283. if len(rune["sec_eff"]) > 1:
  284. substat_2 = rune["sec_eff"][1][0]
  285. substat_2_value = rune["sec_eff"][1][1]
  286. substat_2_enchant = rune["sec_eff"][1][2]
  287. substat_2_grind = rune["sec_eff"][1][3]
  288. else:
  289. substat_2 = None
  290. substat_2_value = 0
  291. substat_2_enchant = 0
  292. substat_2_grind = 0
  293. if len(rune["sec_eff"]) > 2:
  294. substat_3 = rune["sec_eff"][2][0]
  295. substat_3_value = rune["sec_eff"][2][1]
  296. substat_3_enchant = rune["sec_eff"][2][2]
  297. substat_3_grind = rune["sec_eff"][2][3]
  298. else:
  299. substat_3 = None
  300. substat_3_value = 0
  301. substat_3_enchant = 0
  302. substat_3_grind = 0
  303. if len(rune["sec_eff"]) > 3:
  304. substat_4 = rune["sec_eff"][0][0]
  305. substat_4_value = rune["sec_eff"][3][1]
  306. substat_4_enchant = rune["sec_eff"][3][2]
  307. substat_4_grind = rune["sec_eff"][3][3]
  308. else:
  309. substat_4 = None
  310. substat_4_value = 0
  311. substat_4_enchant = 0
  312. substat_4_grind = 0
  313. insert(db, "rune", (uid, id, assigned_to, runeset, slot, stars, ancient, level, quality, original_quality, value, efficiency, max_efficiency, main_stat, main_stat_value, innate_stat, innate_stat_value, substat_1, substat_1_value, substat_1_enchant, substat_1_grind, substat_2, substat_2_value, substat_2_enchant, substat_2_grind, substat_3, substat_3_value, substat_3_enchant, substat_3_grind, substat_4, substat_4_value, substat_4_enchant, substat_4_grind))
  314. # Equipped runes
  315. for mon in data["unit_list"]:
  316. for rune in mon["runes"]:
  317. id = rune["rune_id"]
  318. assigned_to = rune["occupied_id"]
  319. if assigned_to == 0:
  320. assigned_to = None
  321. runeset = rune["set_id"]
  322. slot = rune["slot_no"]
  323. stars = rune["class"]
  324. ancient = 0
  325. level = rune["upgrade_curr"]
  326. original_quality = rune["extra"]
  327. value = rune["sell_value"]
  328. if stars > 10:
  329. ancient = 1
  330. stars = stars - 10
  331. original_quality = original_quality - 10
  332. if level >= 12:
  333. quality = 4
  334. elif level >= 9:
  335. quality = 3
  336. elif level >= 6:
  337. quality = 2
  338. elif level >= 3:
  339. quality = 1
  340. else:
  341. quality = 0
  342. if original_quality > quality:
  343. quality = original_quality
  344. # TODO: Calculate
  345. #efficiency = rune["efficiency"]
  346. #max_efficiency = rune["max_efficiency"]
  347. efficiency = 0
  348. max_efficiency = 0
  349. main_stat = rune["pri_eff"][0]
  350. main_stat_value = rune["pri_eff"][1]
  351. if rune["prefix_eff"][0] > 0:
  352. innate_stat = rune["prefix_eff"][0]
  353. innate_stat_value = rune["prefix_eff"][1]
  354. else:
  355. innate_stat = None
  356. innate_stat_value = 0
  357. if len(rune["sec_eff"]) > 0:
  358. substat_1 = rune["sec_eff"][0][0]
  359. substat_1_value = rune["sec_eff"][0][1]
  360. substat_1_enchant = rune["sec_eff"][0][2]
  361. substat_1_grind = rune["sec_eff"][0][3]
  362. else:
  363. substat_1 = None
  364. substat_1_value = 0
  365. substat_1_enchant = 0
  366. substat_1_grind = 0
  367. if len(rune["sec_eff"]) > 1:
  368. substat_2 = rune["sec_eff"][1][0]
  369. substat_2_value = rune["sec_eff"][1][1]
  370. substat_2_enchant = rune["sec_eff"][1][2]
  371. substat_2_grind = rune["sec_eff"][1][3]
  372. else:
  373. substat_2 = None
  374. substat_2_value = 0
  375. substat_2_enchant = 0
  376. substat_2_grind = 0
  377. if len(rune["sec_eff"]) > 2:
  378. substat_3 = rune["sec_eff"][2][0]
  379. substat_3_value = rune["sec_eff"][2][1]
  380. substat_3_enchant = rune["sec_eff"][2][2]
  381. substat_3_grind = rune["sec_eff"][2][3]
  382. else:
  383. substat_3 = None
  384. substat_3_value = 0
  385. substat_3_enchant = 0
  386. substat_3_grind = 0
  387. if len(rune["sec_eff"]) > 3:
  388. substat_4 = rune["sec_eff"][3][0]
  389. substat_4_value = rune["sec_eff"][3][1]
  390. substat_4_enchant = rune["sec_eff"][3][2]
  391. substat_4_grind = rune["sec_eff"][3][3]
  392. else:
  393. substat_4 = None
  394. substat_4_value = 0
  395. substat_4_enchant = 0
  396. substat_4_grind = 0
  397. insert(db, "rune", (uid, id, assigned_to, runeset, slot, stars, ancient, level, quality, original_quality, value, efficiency, max_efficiency, main_stat, main_stat_value, innate_stat, innate_stat_value, substat_1, substat_1_value, substat_1_enchant, substat_1_grind, substat_2, substat_2_value, substat_2_enchant, substat_2_grind, substat_3, substat_3_value, substat_3_enchant, substat_3_grind, substat_4, substat_4_value, substat_4_enchant, substat_4_grind))
  398. db.commit()
  399. """
  400. Begin script
  401. """
  402. db = openDatabase('application/sw.sqlite')
  403. data = readFile(FILE)
  404. parsePlayer(db, data)
  405. parseScenarios(db, data)
  406. parseDefense(db, data)
  407. parseBuildings(db, data)
  408. parseDecorations(db, data)
  409. # TODO homunculus_skill_list
  410. parseUnits(db, data)
  411. parseSummonSpecial(db, data)
  412. parseInventory(db, data)
  413. parseRunes(db, data)
  414. # TODO rune_craft_item_list