cron.py 6.5 KB

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