|
@@ -4,7 +4,7 @@ from datetime import datetime, timedelta, timezone
|
|
|
|
|
|
from sqlalchemy.orm import joinedload
|
|
|
|
|
|
-from app import SESSION
|
|
|
+from app import SESSION, RESOURCE_MAX
|
|
|
from app.models import ResourceTrack, ResourceStat, Region
|
|
|
|
|
|
|
|
@@ -69,17 +69,20 @@ def get_resources(region_id, date, resource_type):
|
|
|
return new_resource
|
|
|
|
|
|
|
|
|
-def _get_state_stat(session, state_id, resource_type, date_time):
|
|
|
+def _get_state_stat(session, state_id, resource_type, date_time, deep_exploration):
|
|
|
"""Get state stats from date"""
|
|
|
ten_minutes = timedelta(minutes=10)
|
|
|
- stats = session.query(ResourceStat) \
|
|
|
+ query = session.query(ResourceStat) \
|
|
|
.options(joinedload(ResourceStat.resource_track), joinedload(ResourceStat.region)) \
|
|
|
.join(ResourceStat.resource_track) \
|
|
|
.filter(ResourceTrack.state_id == state_id) \
|
|
|
.filter(ResourceTrack.resource_type == resource_type) \
|
|
|
.filter(ResourceTrack.date_time >= date_time - ten_minutes) \
|
|
|
.filter(ResourceTrack.date_time <= date_time + ten_minutes) \
|
|
|
- .all()
|
|
|
+ .filter(ResourceTrack.date_time <= date_time + ten_minutes)
|
|
|
+ if deep_exploration:
|
|
|
+ query = query.filter(ResourceStat.deep_exploration > 0)
|
|
|
+ stats = query.all()
|
|
|
stats_dict = {}
|
|
|
for stat in stats:
|
|
|
stats_dict[stat.region_id] = stat
|
|
@@ -88,19 +91,20 @@ def _get_state_stat(session, state_id, resource_type, date_time):
|
|
|
def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
|
|
|
"""Get work percentage for state in last x hours"""
|
|
|
end_date_time = end_date_time.replace(minute=0, second=0, microsecond=0)
|
|
|
+ deep = bool(resource_type)
|
|
|
|
|
|
session = SESSION()
|
|
|
data = {
|
|
|
0: {
|
|
|
'date': end_date_time,
|
|
|
- 'stats': _get_state_stat(session, state_id, resource_type, end_date_time)
|
|
|
+ 'stats': _get_state_stat(session, state_id, resource_type, end_date_time, deep)
|
|
|
}
|
|
|
}
|
|
|
for i in range(times, 0, -1):
|
|
|
current_date_time = end_date_time - timedelta(hours=hours*i)
|
|
|
data[i] = {
|
|
|
'date': current_date_time,
|
|
|
- 'stats': _get_state_stat(session, state_id, resource_type, current_date_time)
|
|
|
+ 'stats': _get_state_stat(session, state_id, resource_type, current_date_time, deep)
|
|
|
}
|
|
|
session.close()
|
|
|
|
|
@@ -112,39 +116,41 @@ def get_work_percentage(state_id, resource_type, end_date_time, hours, times):
|
|
|
data[i]['progress'] = {}
|
|
|
reset_date_time = data[i+1]['date']
|
|
|
if reset_date_time.hour >= 19:
|
|
|
- reset_date_time = reset_date_time.replace(hour=19) + timedelta(1)
|
|
|
- else:
|
|
|
- reset_date_time = reset_date_time.replace(hour=19)
|
|
|
+ reset_date_time = reset_date_time + timedelta(1)
|
|
|
+ reset_date_time = reset_date_time.replace(hour=19)
|
|
|
time_left = reset_date_time - data[i]['date']
|
|
|
if time_left.seconds != 0:
|
|
|
seconds_left = time_left.seconds
|
|
|
else:
|
|
|
seconds_left = 86400
|
|
|
- # print('{} time left: {} uur'.format(data[i]['date'], seconds_left // 60))
|
|
|
for region_id, stat in data[i]['stats'].items():
|
|
|
+ if i+1 not in data or stat.region_id not in data[i+1]['stats']:
|
|
|
+ continue
|
|
|
next_stat = data[i+1]['stats'][stat.region_id]
|
|
|
- if seconds_left != 86400:
|
|
|
- mined = next_stat.total() - stat.total()
|
|
|
+ if seconds_left == 82800:
|
|
|
+ mined = RESOURCE_MAX[resource_type] + next_stat.explored - stat.total()
|
|
|
required = next_stat.total() / (seconds_left / (hours * 3600))
|
|
|
else:
|
|
|
- mined = 2500 + next_stat.explored - stat.total()
|
|
|
- required = next_stat.total()
|
|
|
+ mined = next_stat.total() - stat.total()
|
|
|
+ required = next_stat.total() / (seconds_left / (hours * 3600))
|
|
|
+
|
|
|
if required != 0:
|
|
|
- percentage = (mined / required - 1) * 0.04 * next_stat.total()
|
|
|
+ coefficient = 100 / RESOURCE_MAX[resource_type]
|
|
|
+ percentage = (mined / required - 1) * next_stat.total() * coefficient + 100
|
|
|
else:
|
|
|
- percentage = 0
|
|
|
+ percentage = 100
|
|
|
+ data[i]['progress'][stat.region_id] = percentage
|
|
|
# print('{:4} left: {:3} mined: {:3} required: {:6.2f} percentage: {:6.2f}'.format(
|
|
|
# stat.region_id, next_stat.total(), mined, required, percentage
|
|
|
# ))
|
|
|
- data[i]['progress'][stat.region_id] = percentage
|
|
|
|
|
|
message_text = ''
|
|
|
- message_text += '{:21}: {:9}\n'.format('region', 'workers')
|
|
|
+ message_text += '{:15}: {:>8}\n'.format('region', 'workers')
|
|
|
for date in data.values():
|
|
|
if 'progress' in date:
|
|
|
for region_id, progress in sorted(date['progress'].items(), key=lambda x: x[1]):
|
|
|
- message_text += '{:21}: {:7.2f}\n'.format(
|
|
|
- regions[region_id],
|
|
|
+ message_text += '{:15}: {:6.2f} %\n'.format(
|
|
|
+ regions[region_id].replace('Netherlands', 'NL'),
|
|
|
progress
|
|
|
)
|
|
|
return message_text
|