#!/usr/bin/python3 import urllib3 import sys import os import requests import urllib.request import sqlite3 import wget import json FILE = "/home/ivalentin/.SWEX/IVV0-8114048.json" def readFile(file): with open(file) as json_file: data = json.load(json_file) return data """ Opens the database file and deletes from the user tables :param name: The path to the sqlite database. :returns: Connection to the database. :raises IntegrityError: The queryes couldn't bre executed. :raises IOError: The sqlite file couldn't be created. """ def openDatabase(name): global OPT_CREATE_DB print('Configuring database...') try: db = sqlite3.connect(name) cursor = db.cursor() cursor.execute('''DELETE FROM scenario''') cursor.execute('''DELETE FROM defense''') cursor.execute('''DELETE FROM unit''') cursor.execute('''DELETE FROM rune''') cursor.execute('''DELETE FROM player''') cursor.execute('''DELETE FROM building''') cursor.execute('''DELETE FROM decoration''') cursor.execute('''DELETE FROM inventory''') cursor.execute('''DELETE FROM summon_special''') db.commit() cursor.close() return db except sqlite3.IntegrityError as e: print("Error executing statement: " + str(e)) raise except IOError as e: print("I/O Error creating database " + name + ": " + str(e)) raise """ Inserts a row into the database. :param db: Connection to the database. :param table: Name of the table to insert into. :param values: List of values to insert. :raises IntegrityError: The insert query was unsuccesfull. """ def insert(db, table, values): cursor = db.cursor() placeholders = '' for x in range(0, len(values)): placeholders = placeholders + '?, ' placeholders = placeholders[:len(placeholders) - 2] query = 'INSERT INTO ' + table + ' VALUES (' + placeholders + ')' try: cursor.execute(query, values) except sqlite3.IntegrityError as e: print('Error Inserting into ' + table + ' with values (' + str(values) + '): ' + str(e)) raise cursor.close; """ Parses player (table player). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parsePlayer(db, data): print("Parsing player...") uid = data["wizard_info"]["wizard_id"] name = data["wizard_info"]["wizard_name"] mana = data["wizard_info"]["wizard_mana"] crystal = data["wizard_info"]["wizard_crystal"] country = data["wizard_info"]["wizard_last_country"] lang = data["wizard_info"]["wizard_last_lang"] level = data["wizard_info"]["wizard_level"] experience = data["wizard_info"]["experience"] energy = data["wizard_info"]["wizard_energy"] energy_max = data["wizard_info"]["energy_max"] energy_per_min = data["wizard_info"]["energy_per_min"] arena_energy = data["wizard_info"]["arena_energy"] arena_energy_max = data["wizard_info"]["arena_energy_max"] rep = data["wizard_info"]["rep_unit_id"] social_point = data["wizard_info"]["social_point_current"] honor_point = data["wizard_info"]["honor_point"] guild_point = data["wizard_info"]["guild_point"] darkportal_energy = data["wizard_info"]["darkportal_energy"] darkportal_energy_max = data["wizard_info"]["darkportal_energy_max"] costume_point = data["wizard_info"]["costume_point"] costume_point_max = data["wizard_info"]["costume_point_max"] honor_medal = data["wizard_info"]["honor_medal"] honor_mark = data["wizard_info"]["honor_mark"] event_coin = data["wizard_info"]["event_coin"] 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)) db.commit() """ Parses scenarios (table scenario). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseScenarios(db, data): print("Parsing scenarios...") uid = data["wizard_info"]["wizard_id"] for sce in data["scenario_list"]: region = sce["region_id"] difficulty = sce["difficulty"] cleared = sce["cleared"] max_cleared = 0 for stage in sce["stage_list"]: if stage["cleared"] == 1: max_cleared = stage["stage_no"] insert(db, "scenario", (uid, region, difficulty, cleared, max_cleared)) db.commit() """ Parses arena defense units (table defense). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseDefense(db, data): print("Parsing arena defense...") uid = data["wizard_info"]["wizard_id"] for defense in data["defense_unit_list"]: unit = defense["unit_id"] position = defense["pos_id"] insert(db, "defense", (uid, unit, position)) db.commit() """ Parses buildings (table building). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseBuildings(db, data): print("Parsing buildings...") uid = data["wizard_info"]["wizard_id"] for bui in data["building_list"]: building = bui["wizard_id"] gain = bui["gain_per_hour"] insert(db, "building", (uid, building, gain)) db.commit() """ Parses decoration buildings (table dcoration). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseDecorations(db, data): print("Parsing decorations...") uid = data["wizard_info"]["wizard_id"] for bui in data["deco_list"]: building = bui["master_id"] level = bui["level"] insert(db, "decoration", (uid, building, level)) db.commit() """ Parses unit data (tables unit, unit_skill). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseUnits(db, data): print("Parsing monsters...") uid = data["wizard_info"]["wizard_id"] for mon in data["unit_list"]: id = mon["unit_id"] building = mon["building_id"] monster = mon["unit_master_id"] level = mon["unit_level"] stars = mon["class"] hp = mon["con"] * 15 # Always x15 attack = mon["atk"] defense = mon["def"] speed = mon["spd"] crit_rate = mon["critical_rate"] crit_damage = mon["critical_damage"] resistance = mon["resist"] accuracy = mon["accuracy"] experience = mon["experience"] exp_gained = mon["exp_gained"] exp_gain_rate = mon["exp_gain_rate"] costume = mon["costume_master_id"] attribute = mon["attribute"] source = mon["source"] create_time = mon["create_time"] homunculus = mon["homunculus"] homunculus_name = mon["homunculus_name"] 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)) for skill in mon["skills"]: skill_id = skill[0] skill_level = skill[1] insert(db, "unit_skill", (uid, id, skill_id, skill_level)) db.commit() """ Parses inventory data (table inventory). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseInventory(db, data): print("Parsing inventory...") uid = data["wizard_info"]["wizard_id"] for item in data["inventory_info"]: id = item["wizard_id"] type = item["item_master_type"] # TODO: Master id? amount = item["item_quantity"] insert(db, "inventory", (uid, id, type, amount)) """ Parses summon stone list (table summon_special). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseSummonSpecial(db, data): print("Parsing Summon stone monster list...") uid = data["wizard_info"]["wizard_id"] for unit in data["summon_special_info"]["this"]: insert(db, "summon_special", (0, unit)) for unit in data["summon_special_info"]["next"]: insert(db, "summon_special", (1, unit)) for unit in data["summon_special_info"]["third"]: insert(db, "summon_special", (2, unit)) for unit in data["summon_special_info"]["fourth"]: insert(db, "summon_special", (3, unit)) """ Parses rune data (table rune). :param db: Sqlite database connection. :param data: Data in SWEX json file. """ def parseRunes(db, data): print("Parsing runes...") uid = data["wizard_info"]["wizard_id"] # Unequipped runes for rune in data["runes"]: id = rune["rune_id"] assigned_to = rune["occupied_id"] if assigned_to == 0: assigned_to = None runeset = rune["set_id"] slot = rune["slot_no"] stars = rune["class"] ancient = 0 level = rune["upgrade_curr"] original_quality = rune["extra"] value = rune["sell_value"] if stars > 10: ancient = 1 stars = stars - 10 original_quality = original_quality - 10 if level >= 12: quality = 4 elif level >= 9: quality = 3 elif level >= 6: quality = 2 elif level >= 3: quality = 1 else: quality = 0 if original_quality > quality: quality = original_quality # TODO: Calculate #efficiency = rune["efficiency"] #max_efficiency = rune["max_efficiency"] efficiency = 0 max_efficiency = 0 main_stat = rune["pri_eff"][0] main_stat_value = rune["pri_eff"][1] if rune["prefix_eff"][0] > 0: innate_stat = rune["prefix_eff"][0] innate_stat_value = rune["prefix_eff"][1] else: innate_stat = None innate_stat_value = 0 if len(rune["sec_eff"]) > 0: substat_1 = rune["sec_eff"][0][0] substat_1_value = rune["sec_eff"][0][1] substat_1_enchant = rune["sec_eff"][0][2] substat_1_grind = rune["sec_eff"][0][3] else: substat_1 = None substat_1_value = 0 substat_1_enchant = 0 substat_1_grind = 0 if len(rune["sec_eff"]) > 1: substat_2 = rune["sec_eff"][1][0] substat_2_value = rune["sec_eff"][1][1] substat_2_enchant = rune["sec_eff"][1][2] substat_2_grind = rune["sec_eff"][1][3] else: substat_2 = None substat_2_value = 0 substat_2_enchant = 0 substat_2_grind = 0 if len(rune["sec_eff"]) > 2: substat_3 = rune["sec_eff"][2][0] substat_3_value = rune["sec_eff"][2][1] substat_3_enchant = rune["sec_eff"][2][2] substat_3_grind = rune["sec_eff"][2][3] else: substat_3 = None substat_3_value = 0 substat_3_enchant = 0 substat_3_grind = 0 if len(rune["sec_eff"]) > 3: substat_4 = rune["sec_eff"][0][0] substat_4_value = rune["sec_eff"][3][1] substat_4_enchant = rune["sec_eff"][3][2] substat_4_grind = rune["sec_eff"][3][3] else: substat_4 = None substat_4_value = 0 substat_4_enchant = 0 substat_4_grind = 0 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)) # Equipped runes for mon in data["unit_list"]: for rune in mon["runes"]: id = rune["rune_id"] assigned_to = rune["occupied_id"] if assigned_to == 0: assigned_to = None runeset = rune["set_id"] slot = rune["slot_no"] stars = rune["class"] ancient = 0 level = rune["upgrade_curr"] original_quality = rune["extra"] value = rune["sell_value"] if stars > 10: ancient = 1 stars = stars - 10 original_quality = original_quality - 10 if level >= 12: quality = 4 elif level >= 9: quality = 3 elif level >= 6: quality = 2 elif level >= 3: quality = 1 else: quality = 0 if original_quality > quality: quality = original_quality # TODO: Calculate #efficiency = rune["efficiency"] #max_efficiency = rune["max_efficiency"] efficiency = 0 max_efficiency = 0 main_stat = rune["pri_eff"][0] main_stat_value = rune["pri_eff"][1] if rune["prefix_eff"][0] > 0: innate_stat = rune["prefix_eff"][0] innate_stat_value = rune["prefix_eff"][1] else: innate_stat = None innate_stat_value = 0 if len(rune["sec_eff"]) > 0: substat_1 = rune["sec_eff"][0][0] substat_1_value = rune["sec_eff"][0][1] substat_1_enchant = rune["sec_eff"][0][2] substat_1_grind = rune["sec_eff"][0][3] else: substat_1 = None substat_1_value = 0 substat_1_enchant = 0 substat_1_grind = 0 if len(rune["sec_eff"]) > 1: substat_2 = rune["sec_eff"][1][0] substat_2_value = rune["sec_eff"][1][1] substat_2_enchant = rune["sec_eff"][1][2] substat_2_grind = rune["sec_eff"][1][3] else: substat_2 = None substat_2_value = 0 substat_2_enchant = 0 substat_2_grind = 0 if len(rune["sec_eff"]) > 2: substat_3 = rune["sec_eff"][2][0] substat_3_value = rune["sec_eff"][2][1] substat_3_enchant = rune["sec_eff"][2][2] substat_3_grind = rune["sec_eff"][2][3] else: substat_3 = None substat_3_value = 0 substat_3_enchant = 0 substat_3_grind = 0 if len(rune["sec_eff"]) > 3: substat_4 = rune["sec_eff"][3][0] substat_4_value = rune["sec_eff"][3][1] substat_4_enchant = rune["sec_eff"][3][2] substat_4_grind = rune["sec_eff"][3][3] else: substat_4 = None substat_4_value = 0 substat_4_enchant = 0 substat_4_grind = 0 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)) db.commit() """ Begin script """ db = openDatabase('application/sw.sqlite') data = readFile(FILE) parsePlayer(db, data) parseScenarios(db, data) parseDefense(db, data) parseBuildings(db, data) parseDecorations(db, data) # TODO homunculus_skill_list parseUnits(db, data) parseSummonSpecial(db, data) parseInventory(db, data) parseRunes(db, data) # TODO rune_craft_item_list