| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- import json
- import requests
- import sqlite3
- import time
- import settings
- from pprint import pprint
- def send_notification(maintainer, player, property, old_value, new_value):
- query = """SELECT discord FROM discord WHERE maintainer = ?;"""
- conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
- conn.row_factory = sqlite3.Row
- cur = conn.cursor()
- cur.execute(query, (maintainer,))
- discord = cur.fetchone()['discord']
- query = """SELECT value FROM player
- WHERE maintainer = ?
- AND player = ?
- AND property = 'name';"""
- cur.execute(query, (maintainer, player))
- name = '?'
- val = cur.fetchone()
- if val:
- name = val['value']
- message = f"{name} [{player}] property '{property}' changed from {old_value} to {new_value}"
- message_json = {"content": message}
- response = requests.post(discord, json=message_json)
- if response.status_code in [200, 204]:
- print("Webhook executed")
- else:
- print("status code {}: {}".format(response.status_code, response.content.decode("utf-8")))
- if response.status_code == int(429):
- sys.exit(1)
- conn.close()
- def update_value(maintainer, player, property, new_value):
- print(f"update_value({maintainer}, {player}, {property}, {value})")
- query = """INSERT OR REPLACE INTO player (maintainer, player, property, value)
- VALUES (?, ?, ?, ?)"""
- conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
- conn.row_factory = sqlite3.Row
- cur = conn.cursor()
- cur.execute(query, (maintainer, player, property, new_value))
- conn.commit()
- def update_missing_value(maintainer, player, property, value):
- print(f"update_missing_value({maintainer}, {player}, {property}, {value})")
- query = """INSERT OR REPLACE INTO player (maintainer, player, property, value)
- VALUES (?, ?, ?, ?);"""
- conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
- cur = conn.cursor()
- cur.execute(query, (maintainer, player, property, value))
- conn.close()
- def cron():
- query_first = """SELECT player_properties.maintainer,
- maintainer.api, player_properties.player,
- player_properties.property
- FROM player_properties
- JOIN maintainer ON player_properties.maintainer = maintainer.maintainer;"""
- conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
- conn.row_factory = sqlite3.Row
- cur = conn.cursor()
- cur.execute(query_first)
- for row in cur.fetchall():
- print(f"{row['maintainer']} - {row['api']} - {row['player']} - {row['property']}")
- url = f"https://api.torn.com/user/{row['player']}?selections=personalstats,basic&key={row['api']}"
- print(url)
- response = requests.get(url)
- player_json = None
- print(response.text[:10])
- if response and response.text:
- player_json = json.loads(response.text)
- # pprint(faction_json)
- if 'error' in player_json:
- pprint(faction_json)
- break
- # Check for changes
- properties = json.loads(row['property'])
- if 'name' not in properties:
- properties.append(name)
- pprint(properties)
- query_second = """SELECT player.value, properties.parent
- FROM player
- JOIN properties ON player.property = properties.property
- WHERE maintainer = ?
- AND player = ?
- AND player.property = ?;"""
- retrieved_properties = []
- for property in properties:
- pprint((row['maintainer'], row['player'], property,))
- cur.execute(query_second, (row['maintainer'], row['player'], property,))
- p_row = cur.fetchone()
- print(f"property: '{property}' parent: '{p_row['parent']}' -> value: '{p_row['value']}'")
- retrieved_properties.append(property)
- new_value = ''
- if (p_row['parent']):
- new_value = player_json[p_row['parent']][property]
- else:
- new_value = player_json[property]
- print(f"p_row['value']: {p_row['value']} != new_value: '{new_value}'")
- if str(p_row['value']) != str(new_value):
- send_notification(row['maintainer'], row['player'], property, p_row['value'], new_value)
- update_value(row['maintainer'], row['player'], property, new_value)
- new_properties = []
- print(f"len(properties): {len(properties)}")
- print(f"len(retrieved_properties): {len(retrieved_properties)}")
- for item in properties:
- if item not in retrieved_properties:
- new_properties.append(item)
- if len(new_properties) > 0:
- print(f"len(new_properties): {len(new_properties)}")
- for item in new_properties:
- if item == 'tokenrefills':
- # Weird error
- continue
- if item == 'incendiaryammoused':
- continue
- query_third = """SELECT parent FROM properties where property = ?;"""
- cur.execute(query_third, (item,))
- parent = cur.fetchone()['parent']
- if (parent):
- value = player_json[parent][item]
- else:
- value = player_json[item]
- print(f"item: {item} -> value: {value}")
- update_missing_value(row['maintainer'], row['player'], item, value)
- time.sleep(1)
- conn.close()
- if __name__ == '__main__':
- cron()
|