|
@@ -0,0 +1,156 @@
|
|
|
|
|
+#!/usr/bin/python3
|
|
|
|
|
+
|
|
|
|
|
+import sqlite3
|
|
|
|
|
+import json
|
|
|
|
|
+import sys
|
|
|
|
|
+import os
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+"""
|
|
|
|
|
+Reads the API KEY, that must be passed as first command line argument.
|
|
|
|
|
+
|
|
|
|
|
+:returns: Recovered API KEY.
|
|
|
|
|
+:raises Exception: Th KEY couldn't be red.
|
|
|
|
|
+"""
|
|
|
|
|
+def readKey():
|
|
|
|
|
+ try:
|
|
|
|
|
+ #print(sys.argv[0])
|
|
|
|
|
+ key = sys.argv[1]
|
|
|
|
|
+ return key
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ print("Error parsing API KEY: " + str(e))
|
|
|
|
|
+ raise
|
|
|
|
|
+
|
|
|
|
|
+"""
|
|
|
|
|
+Reads the JSON data, that must be passed as second command line argument.
|
|
|
|
|
+
|
|
|
|
|
+:param: index 2 for request data, 3 for response data
|
|
|
|
|
+:returns: Recovered data, in JSON format.
|
|
|
|
|
+:raises Exception: The data couldn't be red or converted to JSON.
|
|
|
|
|
+"""
|
|
|
|
|
+def readData(index):
|
|
|
|
|
+ try:
|
|
|
|
|
+ data = json.loads(sys.argv[index])
|
|
|
|
|
+ return data
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ print("Error parsing data: " + str(e))
|
|
|
|
|
+ raise
|
|
|
|
|
+
|
|
|
|
|
+"""
|
|
|
|
|
+Verifies that the API key matches the player data and that it exists in th DB.
|
|
|
|
|
+
|
|
|
|
|
+:param db: Connection to the database.
|
|
|
|
|
+:returns: Connection to the database.
|
|
|
|
|
+:param data: Data in json format.
|
|
|
|
|
+:param key: API KEY.
|
|
|
|
|
+:returns: True if key and player match, False otherwise.
|
|
|
|
|
+:raises IntegrityError: The queryes couldn't bre executed.
|
|
|
|
|
+"""
|
|
|
|
|
+def verifyKey(db, data, key):
|
|
|
|
|
+ print('Verifying KEY...')
|
|
|
|
|
+ status = False
|
|
|
|
|
+ try:
|
|
|
|
|
+ uid = data["wizard_id"]
|
|
|
|
|
+ cursor = db.cursor()
|
|
|
|
|
+ cursor.execute('SELECT count(uid) AS c FROM player WHERE uid = ? AND api_key = ?;', (uid, key))
|
|
|
|
|
+ if cursor.fetchone()[0] == 1:
|
|
|
|
|
+ status = True
|
|
|
|
|
+ cursor.close()
|
|
|
|
|
+ except sqlite3.IntegrityError as e:
|
|
|
|
|
+ print("Error executing statement: " + str(e))
|
|
|
|
|
+ raise
|
|
|
|
|
+ return status
|
|
|
|
|
+
|
|
|
|
|
+"""
|
|
|
|
|
+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():
|
|
|
|
|
+ kdb = os.path.dirname(os.path.realpath(sys.argv[0])) + '/../../../sw.sqlite'
|
|
|
|
|
+ udb = os.path.dirname(os.path.realpath(sys.argv[0])) + '/../../../../data/sw.sqlite'
|
|
|
|
|
+ print('Configuring database...')
|
|
|
|
|
+ try:
|
|
|
|
|
+ db = sqlite3.connect(kdb)
|
|
|
|
|
+ cursor = db.cursor()
|
|
|
|
|
+ cursor.execute('attach "' + udb + '" as data;')
|
|
|
|
|
+ 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 run data (tables run, run_party, run_drop_rune, run_drop_runecraft,
|
|
|
|
|
+run_drop_item, run_drop_unit, run_drop_sd, run_drop_unit_pieces,
|
|
|
|
|
+run_drop_shapeshifting).
|
|
|
|
|
+
|
|
|
|
|
+:param db: Sqlite database connection.
|
|
|
|
|
+:param data: JSON data.
|
|
|
|
|
+"""
|
|
|
|
|
+def parseData(db, data_request, data_response):
|
|
|
|
|
+
|
|
|
|
|
+ cursor = db.cursor()
|
|
|
|
|
+
|
|
|
|
|
+ # Page 1: Cairos non-elemental, rift raid, rift dungeon.
|
|
|
|
|
+ print("Parsing collection data...")
|
|
|
|
|
+
|
|
|
|
|
+ uid = data_request["wizard_id"]
|
|
|
|
|
+ collection = data_response["collection"]
|
|
|
|
|
+ cursor.execute("""
|
|
|
|
|
+ DELETE FROM collection
|
|
|
|
|
+ WHERE uid = ?;
|
|
|
|
|
+ """,
|
|
|
|
|
+ [uid]
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ # Loop Cairos records
|
|
|
|
|
+ for u in collection:
|
|
|
|
|
+ unit = u["unit_master_id"]
|
|
|
|
|
+ open = u["open"]
|
|
|
|
|
+ insert(db, "collection", (uid, unit, open))
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+
|
|
|
|
|
+"""
|
|
|
|
|
+Begin script
|
|
|
|
|
+"""
|
|
|
|
|
+data_request = readData(2)
|
|
|
|
|
+data_response = readData(3)
|
|
|
|
|
+key = readKey()
|
|
|
|
|
+db = openDatabase()
|
|
|
|
|
+if verifyKey(db, data_request, key) == False:
|
|
|
|
|
+ print("Invalid API KEY...")
|
|
|
|
|
+ sys.exit(-1)
|
|
|
|
|
+else:
|
|
|
|
|
+ parseData(db, data_request, data_response)
|
|
|
|
|
+sys.exit(0)
|
|
|
|
|
+
|
|
|
|
|
+
|