cron.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import json
  2. import requests
  3. import sqlite3
  4. import time
  5. import settings
  6. from pprint import pprint
  7. def send_notification(maintainer, player, property, old_value, new_value):
  8. query = """SELECT discord FROM discord WHERE maintainer = ?;"""
  9. conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
  10. conn.row_factory = sqlite3.Row
  11. cur = conn.cursor()
  12. cur.execute(query, (maintainer,))
  13. discord = cur.fetchone()['discord']
  14. query = """SELECT value FROM player
  15. WHERE maintainer = ?
  16. AND player = ?
  17. AND property = 'name';"""
  18. cur.execute(query, (maintainer, player))
  19. name = '?'
  20. val = cur.fetchone()
  21. if val:
  22. name = val['value']
  23. message = f"{name} [{player}] property '{property}' changed from {old_value} to {new_value}"
  24. message_json = {"content": message}
  25. response = requests.post(discord, json=message_json)
  26. if response.status_code in [200, 204]:
  27. print("Webhook executed")
  28. else:
  29. print("status code {}: {}".format(response.status_code, response.content.decode("utf-8")))
  30. if response.status_code == int(429):
  31. sys.exit(1)
  32. def update_value(maintainer, player, property, new_value):
  33. query = """INSERT OR REPLACE INTO player (maintainer, player, property, value)
  34. VALUES (?, ?, ?, ?)"""
  35. conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
  36. conn.row_factory = sqlite3.Row
  37. cur = conn.cursor()
  38. cur.execute(query, (maintainer, player, property, new_value))
  39. conn.commit()
  40. def update_missing_value(maintainer, player, property, value):
  41. query = """INSERT OR REPLACE INTO player (maintainer, player, property, value)
  42. VALUES (?, ?, ?, ?);"""
  43. conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
  44. cur = conn.cursor()
  45. cur.execute(query, (maintainer, player, property, value))
  46. conn.commit()
  47. def cron():
  48. query_first = """SELECT player_properties.maintainer,
  49. maintainer.api, player_properties.player,
  50. player_properties.property
  51. FROM player_properties
  52. JOIN maintainer ON player_properties.maintainer = maintainer.maintainer;"""
  53. conn = sqlite3.connect(settings.db_path + '/slork.sqlite')
  54. conn.row_factory = sqlite3.Row
  55. cur = conn.cursor()
  56. for row in cur.execute(query_first):
  57. print(f"{row['maintainer']} - {row['api']} - {row['player']} - {row['property']}")
  58. url = f"https://api.torn.com/user/{row['player']}?selections=personalstats,basic&key={row['api']}"
  59. print(url)
  60. response = requests.get(url)
  61. player_json = None
  62. print(response.text[:10])
  63. if response and response.text:
  64. player_json = json.loads(response.text)
  65. # pprint(faction_json)
  66. if 'error' in player_json:
  67. pprint(faction_json)
  68. break
  69. # Check for changes
  70. properties = json.loads(row['property'])
  71. if 'name' not in properties:
  72. properties.append(name)
  73. pprint(properties)
  74. query_second = """SELECT player.value, properties.parent
  75. FROM player
  76. JOIN properties ON player.property = properties.property
  77. WHERE maintainer = ?
  78. AND player = ?
  79. AND player.property = ?;"""
  80. retrieved_properties = []
  81. for property in properties:
  82. pprint((row['maintainer'], row['player'], property,))
  83. p_rows = cur.execute(query_second, (row['maintainer'], row['player'], property,))
  84. for p_row in p_rows:
  85. print(f"property: '{property}' parent: '{p_row['parent']}' -> value: '{p_row['value']}'")
  86. retrieved_properties.append(property)
  87. new_value = ''
  88. if (p_row['parent']):
  89. new_value = player_json[p_row['parent']][property]
  90. else:
  91. new_value = player_json[property]
  92. print(f"p_row['value']: {p_row['value']} != new_value: '{new_value}'")
  93. if str(p_row['value']) != str(new_value):
  94. send_notification(row['maintainer'], row['player'], property, p_row['value'], new_value)
  95. update_value(row['maintainer'], row['player'], property, new_value)
  96. new_properties = []
  97. for item in properties:
  98. if item not in retrieved_properties:
  99. new_properties.append(item)
  100. if len(new_properties) > 0:
  101. for item in new_properties:
  102. query_third = """SELECT parent FROM properties where property = ?;"""
  103. cur.execute(query_third, (item,))
  104. parent = cur.fetchone()['parent']
  105. if (parent):
  106. value = player_json[parent][item]
  107. else:
  108. value = player_json[item]
  109. print(f"item: {item} -> value: {value}")
  110. update_missing_value(row['maintainer'], row['player'], item, value)
  111. time.sleep(1)
  112. if __name__ == '__main__':
  113. cron()