database.py 5.9 KB

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