cron.py 5.6 KB

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