database.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. """Main application"""
  2. from datetime import datetime, timedelta, timezone
  3. from sqlalchemy.orm import joinedload
  4. from app import SESSION
  5. from app.models import ResourceTrack, ResourceStat, Region
  6. def save_resources(state_id, regions, resource_id):
  7. """Save resources to database"""
  8. session = SESSION()
  9. resource_track = ResourceTrack()
  10. resource_track.state_id = state_id
  11. resource_track.resource_type = resource_id
  12. resource_track.date_time = datetime.now()
  13. session.add(resource_track)
  14. session.commit()
  15. for region_id, region_dict in regions.items():
  16. region = session.query(Region).get(region_id)
  17. if not region:
  18. region = save_region(session, region_id, region_dict)
  19. resource_stat = ResourceStat()
  20. resource_stat.resource_track_id = resource_track.id
  21. resource_stat.region_id = region.id
  22. resource_stat.explored = region_dict['explored']
  23. resource_stat.deep_exploration = region_dict['deep_exploration']
  24. resource_stat.limit_left = region_dict['limit_left']
  25. session.add(resource_stat)
  26. session.commit()
  27. session.close()
  28. def save_region(session, region_id, region_dict):
  29. """Save player to database"""
  30. region = Region()
  31. region.id = region_id
  32. region.name = region_dict['region_name']
  33. session.add(region)
  34. return region
  35. def get_resources(region_id, date, resource_type):
  36. """Get resources on a date"""
  37. end_date_time = date.replace(hour=18, minute=0, second=0, microsecond=0)
  38. start_date_time = end_date_time - timedelta(1)
  39. session = SESSION()
  40. resource = {}
  41. resource_stats = session.query(ResourceStat) \
  42. .options(joinedload(ResourceStat.resource_track)) \
  43. .join(ResourceStat.resource_track) \
  44. .filter(ResourceStat.region_id == region_id) \
  45. .filter(ResourceTrack.resource_type == resource_type) \
  46. .filter(ResourceTrack.date_time >= start_date_time) \
  47. .filter(ResourceTrack.date_time <= end_date_time) \
  48. .all()
  49. start_limit = resource_stats[0].explored
  50. for resource_stat in resource_stats:
  51. time = resource_stat.resource_track.date_time
  52. resource[time] = resource_stat.explored + resource_stat.limit_left
  53. session.close()
  54. new_resource = {}
  55. for time, amount in resource.items():
  56. new_time = time.replace(tzinfo=timezone.utc).astimezone(tz=None) + timedelta(hours=1)
  57. new_resource[new_time] = amount - start_limit
  58. return new_resource
  59. def _get_state_stat(session, state_id, resource_type, date_time):
  60. """Get state stats from date"""
  61. ten_minutes = timedelta(minutes=10)
  62. stats = session.query(ResourceStat) \
  63. .options(joinedload(ResourceStat.resource_track), joinedload(ResourceStat.region)) \
  64. .join(ResourceStat.resource_track) \
  65. .filter(ResourceTrack.state_id == state_id) \
  66. .filter(ResourceTrack.resource_type == resource_type) \
  67. .filter(ResourceTrack.date_time >= date_time - ten_minutes) \
  68. .filter(ResourceTrack.date_time <= date_time + ten_minutes) \
  69. .all()
  70. stats_dict = {}
  71. for stat in stats:
  72. stats_dict[stat.region_id] = stat
  73. return stats_dict
  74. def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
  75. """Get work percentage for state in last x hours"""
  76. end_date_time = end_date_time.replace(minute=0, second=0, microsecond=0)
  77. session = SESSION()
  78. data = {
  79. 0: {
  80. 'date': end_date_time,
  81. 'stats': _get_state_stat(session, state_id, resource_type, end_date_time)
  82. }
  83. }
  84. for i in range(times, 0, -1):
  85. current_date_time = end_date_time - timedelta(hours=hours*i)
  86. data[i] = {
  87. 'date': current_date_time,
  88. 'stats': _get_state_stat(session, state_id, resource_type, current_date_time)
  89. }
  90. session.close()
  91. regions = {}
  92. for region_id, stat in data[0]['stats'].items():
  93. regions[region_id] = stat.region.name
  94. for i in range(0, times):
  95. data[i]['progress'] = {}
  96. reset_date_time = data[i+1]['date']
  97. if reset_date_time.hour >= 18:
  98. reset_date_time = reset_date_time.replace(hour=18) + timedelta(1)
  99. else:
  100. reset_date_time = reset_date_time.replace(hour=18)
  101. time_left = reset_date_time - data[i]['date']
  102. if time_left.seconds != 0:
  103. seconds_left = time_left.seconds
  104. else:
  105. seconds_left = 86400
  106. # print('{} time left: {} uur'.format(data[i]['date'], seconds_left // 60))
  107. for region_id, stat in data[i]['stats'].items():
  108. next_stat = data[i+1]['stats'][stat.region_id]
  109. if seconds_left != 86400:
  110. mined = next_stat.total() - stat.total()
  111. required = next_stat.total() / (seconds_left / (hours * 3600))
  112. else:
  113. mined = 2500 + next_stat.explored - stat.total()
  114. required = next_stat.total()
  115. if required != 0:
  116. percentage = (mined / required - 1) * 0.04 * next_stat.total()
  117. else:
  118. percentage = 0
  119. # print('{:4} left: {:3} mined: {:3} required: {:6.2f} percentage: {:6.2f}'.format(
  120. # stat.region_id, next_stat.total(), mined, required, percentage
  121. # ))
  122. data[i]['progress'][stat.region_id] = percentage
  123. message_text = ''
  124. for date in data.values():
  125. if 'progress' in date:
  126. for region_id, progress in sorted(date['progress'].items(), key=lambda x: x[1]):
  127. message_text += '{:21}: {:6.2f}\n'.format(
  128. regions[region_id],
  129. progress
  130. )
  131. return message_text