Skip to content
This repository was archived by the owner on Nov 30, 2023. It is now read-only.

Commit 04eff5b

Browse files
committed
feat(farmer): imp building_farmer_thread
Signed-off-by: hldh214 <hldh214@gmail.com>
1 parent 67d7dae commit 04eff5b

File tree

1 file changed

+22
-24
lines changed

1 file changed

+22
-24
lines changed

lokbot/farmer.py

+22-24
Original file line numberDiff line numberDiff line change
@@ -256,24 +256,23 @@ def _get_optimal_speedups(self, need_seconds, speedup_type):
256256
counts[each.get('code')] += 1
257257
used_seconds += each.get('second')
258258

259-
if used_seconds - need_seconds > 60 * 10:
260-
# 10 minutes max waste tolerance
261-
# seems never happen since we have `remaining_seconds >= each.get('second')` check
262-
# will remove it later
259+
counts = {k: v for k, v in counts.items() if v > 0}
260+
261+
if not counts:
263262
logger.info(f'cannot find optimal speedups for {speedup_type}')
264263
return False
265264

266265
return {
267-
'counts': {k: v for k, v in counts.items() if v > 0},
266+
'counts': counts,
268267
'used_seconds': used_seconds
269268
}
270269

271-
def _do_speedup(self, expected_ended, task_id):
270+
def _do_speedup(self, expected_ended, task_id, speedup_type):
272271
need_seconds = self.calc_time_diff_in_seconds(expected_ended)
273272

274273
if need_seconds > 60 * 5:
275274
# try speedup only when need_seconds > 5 minutes
276-
speedups = self._get_optimal_speedups(need_seconds, 'building')
275+
speedups = self._get_optimal_speedups(need_seconds, speedup_type)
277276
if speedups:
278277
counts = speedups.get('counts')
279278
used_seconds = speedups.get('used_seconds')
@@ -307,7 +306,7 @@ def _upgrade_building(self, building, buildings, speedup):
307306
self._update_kingdom_enter_building(building)
308307

309308
if speedup:
310-
self._do_speedup(res.get('newTask').get('expectedEnded'), res.get('newTask').get('_id'))
309+
self._do_speedup(res.get('newTask').get('expectedEnded'), res.get('newTask').get('_id'), 'building')
311310

312311
def _alliance_gift_claim_all(self):
313312
try:
@@ -659,6 +658,8 @@ def on_task_update(data):
659658
if data.get('status') == STATUS_FINISHED:
660659
if data.get('code') in (TASK_CODE_SILVER_HAMMER, TASK_CODE_GOLD_HAMMER):
661660
self.building_queue_available.set()
661+
662+
if data.get('status') == STATUS_CLAIMED:
662663
if data.get('code') == TASK_CODE_ACADEMY:
663664
self.research_queue_available.set()
664665
if data.get('code') == TASK_CODE_CAMP:
@@ -937,21 +938,9 @@ def building_farmer_thread(self, speedup=False):
937938
silver_in_use = [t for t in kingdom_tasks if t.get('code') == TASK_CODE_SILVER_HAMMER]
938939
gold_in_use = [t for t in kingdom_tasks if t.get('code') == TASK_CODE_GOLD_HAMMER]
939940

940-
if silver_in_use:
941-
excepted_ended = silver_in_use[0].get('expectedEnded')
942-
logger.info(f'task_code({TASK_CODE_SILVER_HAMMER}) is busy, excepted_ended: {excepted_ended}')
943-
else:
941+
if not silver_in_use or (self.has_additional_building_queue and not gold_in_use):
944942
if not self._building_farmer_worker(speedup):
945-
logger.info('no building to upgrade, sleep for 2h')
946-
threading.Timer(7200, self.building_farmer_thread).start()
947-
return
948-
949-
if gold_in_use:
950-
excepted_ended = gold_in_use[0].get('expectedEnded')
951-
logger.info(f'task_code({TASK_CODE_GOLD_HAMMER}) is busy, excepted_ended: {excepted_ended}')
952-
else:
953-
if not self._building_farmer_worker(speedup):
954-
logger.info('no building to upgrade, sleep for 2h')
943+
logger.info(f'no building to upgrade, sleep for 2h')
955944
threading.Timer(7200, self.building_farmer_thread).start()
956945
return
957946

@@ -1002,7 +991,7 @@ def academy_farmer_thread(self, to_max_level=False, speedup=False):
1002991
continue
1003992

1004993
if speedup:
1005-
self._do_speedup(res.get('newTask').get('expectedEnded'), res.get('newTask').get('_id'))
994+
self._do_speedup(res.get('newTask').get('expectedEnded'), res.get('newTask').get('_id'), 'research')
1006995

1007996
self.research_queue_available.wait() # wait for research queue available from `sock_thread`
1008997
self.research_queue_available.clear()
@@ -1083,7 +1072,16 @@ def train_troop_thread(self, troop_code, speedup=False):
10831072
if troop_training_capacity > total_troops_capacity_according_to_resources:
10841073
troop_training_capacity = total_troops_capacity_according_to_resources
10851074

1086-
self.api.train_troop(troop_code, troop_training_capacity)
1075+
if not troop_training_capacity:
1076+
logger.info('train_troop: no resource, sleep for 3h')
1077+
threading.Timer(3 * 3600, self.train_troop_thread, [troop_code, speedup]).start()
1078+
return
1079+
1080+
res = self.api.train_troop(troop_code, troop_training_capacity)
1081+
1082+
if speedup:
1083+
self._do_speedup(res.get('newTask').get('expectedEnded'), res.get('newTask').get('_id'), 'train')
1084+
10871085
self.train_queue_available.wait() # wait for train queue available from `sock_thread`
10881086
self.train_queue_available.clear()
10891087
threading.Thread(target=self.train_troop_thread, args=[troop_code, speedup]).start()

0 commit comments

Comments
 (0)