@@ -256,24 +256,23 @@ def _get_optimal_speedups(self, need_seconds, speedup_type):
256
256
counts [each .get ('code' )] += 1
257
257
used_seconds += each .get ('second' )
258
258
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 :
263
262
logger .info (f'cannot find optimal speedups for { speedup_type } ' )
264
263
return False
265
264
266
265
return {
267
- 'counts' : { k : v for k , v in counts . items () if v > 0 } ,
266
+ 'counts' : counts ,
268
267
'used_seconds' : used_seconds
269
268
}
270
269
271
- def _do_speedup (self , expected_ended , task_id ):
270
+ def _do_speedup (self , expected_ended , task_id , speedup_type ):
272
271
need_seconds = self .calc_time_diff_in_seconds (expected_ended )
273
272
274
273
if need_seconds > 60 * 5 :
275
274
# 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 )
277
276
if speedups :
278
277
counts = speedups .get ('counts' )
279
278
used_seconds = speedups .get ('used_seconds' )
@@ -307,7 +306,7 @@ def _upgrade_building(self, building, buildings, speedup):
307
306
self ._update_kingdom_enter_building (building )
308
307
309
308
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' )
311
310
312
311
def _alliance_gift_claim_all (self ):
313
312
try :
@@ -659,6 +658,8 @@ def on_task_update(data):
659
658
if data .get ('status' ) == STATUS_FINISHED :
660
659
if data .get ('code' ) in (TASK_CODE_SILVER_HAMMER , TASK_CODE_GOLD_HAMMER ):
661
660
self .building_queue_available .set ()
661
+
662
+ if data .get ('status' ) == STATUS_CLAIMED :
662
663
if data .get ('code' ) == TASK_CODE_ACADEMY :
663
664
self .research_queue_available .set ()
664
665
if data .get ('code' ) == TASK_CODE_CAMP :
@@ -937,21 +938,9 @@ def building_farmer_thread(self, speedup=False):
937
938
silver_in_use = [t for t in kingdom_tasks if t .get ('code' ) == TASK_CODE_SILVER_HAMMER ]
938
939
gold_in_use = [t for t in kingdom_tasks if t .get ('code' ) == TASK_CODE_GOLD_HAMMER ]
939
940
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 ):
944
942
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' )
955
944
threading .Timer (7200 , self .building_farmer_thread ).start ()
956
945
return
957
946
@@ -1002,7 +991,7 @@ def academy_farmer_thread(self, to_max_level=False, speedup=False):
1002
991
continue
1003
992
1004
993
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' )
1006
995
1007
996
self .research_queue_available .wait () # wait for research queue available from `sock_thread`
1008
997
self .research_queue_available .clear ()
@@ -1083,7 +1072,16 @@ def train_troop_thread(self, troop_code, speedup=False):
1083
1072
if troop_training_capacity > total_troops_capacity_according_to_resources :
1084
1073
troop_training_capacity = total_troops_capacity_according_to_resources
1085
1074
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
+
1087
1085
self .train_queue_available .wait () # wait for train queue available from `sock_thread`
1088
1086
self .train_queue_available .clear ()
1089
1087
threading .Thread (target = self .train_troop_thread , args = [troop_code , speedup ]).start ()
0 commit comments