logger.debug(f"ZIP file no longer available on server (404): {zip_filename or 'unknown'} for match {match_number} - continuing with normal operations")
# Don't add to errors list, just skip this download
else:
# Other HTTP errors are actual failures
error_msg=f"HTTP error downloading ZIP for match {match_number}: {http_err}"
logger.error(error_msg)
processed_data['errors'].append(error_msg)
exceptExceptionase:
exceptExceptionase:
error_msg=f"Failed to download ZIP for match {match_data.get('match_number', 'unknown')}: {e}"
error_msg=f"Failed to download ZIP for match {match_number}: {e}"
logger.error(error_msg)
logger.error(error_msg)
processed_data['errors'].append(error_msg)
processed_data['errors'].append(error_msg)
# Continue with other downloads even if this one fails
# Continue with other downloads even if this one fails
continue
continue
logger.debug(f"ZIP download summary: {processed_data['downloaded_zips']}/{processed_data['expected_zips']} ZIP files downloaded successfully from {total_matches_with_zips} matches")
logger.info(f"Synchronized {processed_data['synchronized_matches']} matches, downloaded {processed_data['downloaded_zips']} ZIP files")
logger.info(f"Synchronized {processed_data['synchronized_matches']} matches, downloaded {processed_data['downloaded_zips']} ZIP files")
returnprocessed_data
returnprocessed_data
...
@@ -377,13 +418,16 @@ class UpdatesResponseHandler(ResponseHandler):
...
@@ -377,13 +418,16 @@ class UpdatesResponseHandler(ResponseHandler):
logger.info(f"💵 [DEBUG] Total payin calculated: {total_payin:.2f}")
# Get redistribution CAP percentage
# Step 2.6: Get Redistribution CAP
logger.info(f"🎯 [DEBUG] Step 2.6: Retrieving redistribution CAP percentage")
cap_percentage=self._get_redistribution_cap()
cap_percentage=self._get_redistribution_cap()
logger.info(f"🎯 [DEBUG] CAP percentage: {cap_percentage}%")
# Check CAP logic
# Step 2.7: Calculate CAP Threshold
logger.info(f"📏 [DEBUG] Step 2.7: Calculating CAP threshold")
max_payout=max(under_payout,over_payout)
max_payout=max(under_payout,over_payout)
cap_threshold=total_payin*(cap_percentage/100.0)
cap_threshold=total_payin*(cap_percentage/100.0)
logger.info(f"📏 [DEBUG] Max payout: {max_payout:.2f}, CAP threshold: {cap_threshold:.2f}")
logger.info(f"Match {match_id}: UNDER payout={under_payout:.2f}, OVER payout={over_payout:.2f}, total_payin={total_payin:.2f}, CAP={cap_percentage}%, threshold={cap_threshold:.2f}")
# Step 2.8: CAP Logic Decision
logger.info(f"🧠 [DEBUG] Step 2.8: Evaluating CAP logic")
logger.info(f"📊 [DEBUG] Summary - UNDER payout: {under_payout:.2f}, OVER payout: {over_payout:.2f}, total_payin: {total_payin:.2f}, CAP: {cap_percentage}%, threshold: {cap_threshold:.2f}")
ifmax_payout>cap_threshold:
ifmax_payout>cap_threshold:
# CAP exceeded - select outcome with lower payout to minimize losses
# CAP exceeded - select outcome with lower payout to minimize losses
logger.info(f"🚨 [DEBUG] CAP exceeded! Max payout ({max_payout:.2f}) > threshold ({cap_threshold:.2f})")
ifunder_payout<=over_payout:
ifunder_payout<=over_payout:
result='UNDER'
result='UNDER'
logger.info(f"CAP exceeded, selecting UNDER (lower payout: {under_payout:.2f} vs {over_payout:.2f})")
logger.info(f"✅ [DEBUG] Selecting UNDER (lower payout: {under_payout:.2f} vs {over_payout:.2f})")
else:
else:
result='OVER'
result='OVER'
logger.info(f"CAP exceeded, selecting OVER (lower payout: {over_payout:.2f} vs {under_payout:.2f})")
logger.info(f"✅ [DEBUG] Selecting OVER (lower payout: {over_payout:.2f} vs {under_payout:.2f})")
else:
else:
# CAP not exceeded - use weighted random selection
# CAP not exceeded - use weighted random selection
logger.info(f"✅ [DEBUG] CAP not exceeded. Max payout ({max_payout:.2f}) <= threshold ({cap_threshold:.2f})")
logger.info(f"🎲 [DEBUG] Step 2.9: Performing weighted random selection")