cron.py 7.1 KB

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