""" Options: Date: 2025-11-09 11:12:02 Version: 8.80 Tip: To override a DTO option, remove "#" prefix before updating BaseUrl: https://s4w2.api.bettor.cc #GlobalNamespace: #AddServiceStackTypes: True #AddResponseStatus: False #AddImplicitVersion: #AddDescriptionAsComments: True IncludeTypes: GetDrawDignostics.* #ExcludeTypes: #DefaultImports: datetime,decimal,marshmallow.fields:*,servicestack:*,typing:*,dataclasses:dataclass/field,dataclasses_json:dataclass_json/LetterCase/Undefined/config,enum:Enum/IntEnum #DataClass: #DataClassJson: """ import datetime import decimal from marshmallow.fields import * from servicestack import * from typing import * from dataclasses import dataclass, field from dataclasses_json import dataclass_json, LetterCase, Undefined, config from enum import Enum, IntEnum @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Ref: id: Optional[str] = None val: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BettingApp: name: Optional[str] = None version: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class RefEx(Ref): data: Optional[RecordDictionary[str, str]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Origin: application: Optional[BettingApp] = None ip: Optional[str] = None organization: Optional[RefEx] = None region: Optional[Ref] = None location_group: Optional[Ref] = None location: Optional[RefEx] = None device: Optional[RefEx] = None clerk: Optional[Ref] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Bet: id: Optional[str] = None ordinal_of_available_round_to_assign_to: int = 0 content: Optional[str] = None stake: Decimal = decimal.Decimal(0) payload: Optional[Dict[str, str]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Pool: id: int = 0 name: Optional[str] = None treshold: Decimal = decimal.Decimal(0) class LocationOptimizationLevel(IntEnum): NONE = 0 LOW = 1 MEDIUM = 2 HIGH = 3 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class ThresholdInterval: start: Decimal = decimal.Decimal(0) end: Decimal = decimal.Decimal(0) class SortingOrder(IntEnum): NONE = 0 ASCENDING = 1 DESCENDING = 2 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class WinCountOrderProbability: order: Optional[SortingOrder] = None probability: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class PoolCaps: plus_coef: Decimal = decimal.Decimal(0) minus_coef: Decimal = decimal.Decimal(0) max_amount_in_prevalent_stakes: Decimal = decimal.Decimal(0) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class PoolSettings: id: int = 0 name: Optional[str] = None is_active: bool = False contribution_to_round_pool_pct: Decimal = decimal.Decimal(0) caps: Optional[PoolCaps] = None class StakeCategory(IntEnum): PICKEREL = 0 FISH = 1 SALMON = 2 TUNA = 3 SHARK = 4 WHALE = 5 NONE = -1 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CategoryThreshold: category: Optional[StakeCategory] = None threshold: Decimal = decimal.Decimal(0) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class HighRollerSettings: pools: Optional[RecordList[PoolSettings]] = None category_thresholds: Optional[RecordList[CategoryThreshold]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class AntiSyphonConfig: combination_count_per_round_threshold_pct: Decimal = decimal.Decimal(0) excluded_locations: Optional[RecordList[Ref]] = None include_round_pct_as_bettor_syphon_criteria: bool = False is_active: bool = False @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class FraudDetectionConfiguration: anti_syphon: Optional[AntiSyphonConfig] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class DebugConfiguration: log_location_stats: bool = False log_bettor_sats: bool = False @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class AccumulatorConfiguration: pools: Optional[RecordList[Pool]] = None prevalent_stake: Decimal = decimal.Decimal(0) purge_threshold_modifier: Decimal = decimal.Decimal(0) location_optimization_level: Optional[LocationOptimizationLevel] = None jack_pot5_threshold_interval: Optional[ThresholdInterval] = None deviation_category_span_in_pct: int = 0 deviation_category_threshold_amount: Decimal = decimal.Decimal(0) round_pool_circuit_breaker_threshold: Decimal = decimal.Decimal(0) low_win_count_affinity_in_pct: int = 0 win_count_order_affinity: Optional[RecordList[WinCountOrderProbability]] = None high_roller_settings: Optional[HighRollerSettings] = None overflow_coefficient_pools_to_round: bool = False anti_syphon_protection_override: bool = False fraud_detection_config: Optional[FraudDetectionConfiguration] = None debug_config: Optional[DebugConfiguration] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Pool: id: int = 0 name: Optional[str] = None coefficient: Decimal = decimal.Decimal(0) rtp: Decimal = decimal.Decimal(0) threshold: Decimal = decimal.Decimal(0) balance: Decimal = decimal.Decimal(0) rrtp: Decimal = decimal.Decimal(0) r_balance: Decimal = decimal.Decimal(0) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Bet: id: Optional[str] = None slip_id: Optional[str] = None bettor: Optional[Ref] = None origin: Optional[Origin] = None placed_at: datetime.datetime = datetime.datetime(1, 1, 1) round_id: Optional[str] = None content: Optional[str] = None stake: Decimal = decimal.Decimal(0) outcome: Optional[BetOutcome] = None win: Decimal = decimal.Decimal(0) processing_status: Optional[BetProcessingStatus] = None validity: Optional[BetValidity] = None results: Optional[Dict[str, str]] = None payload: Optional[Dict[str, str]] = None T = TypeVar('T') @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class RecordList(Generic[T], List[T]): pass @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Pool: id: int = 0 name: Optional[str] = None rtp: Decimal = decimal.Decimal(0) reserve_r_t_p: Decimal = decimal.Decimal(0) total_r_t_p: Decimal = decimal.Decimal(0) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SuperWinInfo: is_active: bool = False winner: Optional[SuperWinWinner] = None available_amount: Decimal = decimal.Decimal(0) all_prizes_awarded: bool = False @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CurrentRoundInfo: round_id: Optional[str] = None amount: Decimal = decimal.Decimal(0) inert_code: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class WinnerByCode: round_id: Optional[str] = None drawn_at_utc: datetime.datetime = datetime.datetime(1, 1, 1) slip_id: Optional[str] = None bet_id: Optional[str] = None code: Optional[str] = None amount: Decimal = decimal.Decimal(0) origin: Optional[Origin] = None bettor: Optional[Ref] = None location_address_or_bettor_info: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class LocalCodePotInfo: is_active: bool = False current: Optional[CurrentRoundInfo] = None winners: Optional[List[WinnerByCode]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Initialization: data_load_duration: int = 0 bets_collections_creation_duration: int = 0 combinations_occurance_lookup_initialization_duration: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SequenceGeneration: nr_of_threads: int = 0 nr_of_results_probed: int = 0 duration: int = 0 avg_single_pass_duration: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BestFitFinder: target_amount: Decimal = decimal.Decimal(0) awarded_amount: Decimal = decimal.Decimal(0) deviation: Decimal = decimal.Decimal(0) deviation_pct: Decimal = decimal.Decimal(0) sequence_result_type: Optional[str] = None is_jack_pot5_drawn: bool = False filtering_period: int = 0 win_count_order: Optional[SortingOrder] = None min_amount: Decimal = decimal.Decimal(0) max_amount: Decimal = decimal.Decimal(0) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class QualifiedPool: id: int = 0 name: Optional[str] = None coefficient: Decimal = decimal.Decimal(0) available_amount: Decimal = decimal.Decimal(0) awarded_amount: Decimal = decimal.Decimal(0) target_bet: Optional[Bet] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Purger: prevalent_stake: Decimal = decimal.Decimal(0) pool_purger: Optional[str] = None qualified_pools: Optional[List[QualifiedPool]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class StimulationResponse: stimulation_id: Optional[str] = None status: Optional[ResponseStatus] = None failure_reason: Optional[str] = None slip_id: Optional[str] = None bet_id: Optional[str] = None amount_awarded: Decimal = decimal.Decimal(0) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SuperWinInfo: duration_in_ms: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class HappyHourInfo: is_happy_hour: bool = False odds_modifier: Decimal = decimal.Decimal(0) round_pool_bonus_pct: Decimal = decimal.Decimal(0) class SyphonType(IntEnum): LOCATION = 0 BETTOR = 1 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Syphon: id: Optional[str] = None name: Optional[str] = None type: Optional[SyphonType] = None nr_of_combinations: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SyphonInfo: bettors: Optional[Dict[str, Syphon]] = None locations: Optional[Dict[str, Syphon]] = None has_syphons: bool = False total_syphons_in_round: int = 0 TKey = TypeVar('TKey') TVal = TypeVar('TVal') @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class RecordDictionary(Generic[TKey, TVal], Dict[TKey,TVal]): pass @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Bet: is_found: bool = False bet_id: Optional[str] = None slip_id: Optional[str] = None comb_stake: Optional[Object] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class DrawDiagnostics: id: Optional[str] = None initialization_info: Optional[Initialization] = None sequence_generation_info: Optional[SequenceGeneration] = None best_fit_finder_info: Optional[BestFitFinder] = None purger_info: Optional[Purger] = None duration: int = 0 stimulation_responses: Optional[List[StimulationResponse]] = None local_code_pot: Optional[LocalCodePotInfo] = None super_win: Optional[SuperWinInfo] = None happy_hour: Optional[HappyHourInfo] = None reasoning: Optional[str] = None configuration: Optional[AccumulatorConfiguration] = None syphon_info: Optional[SyphonInfo] = None # @Route("/qry/rounds/draw/diagnostics") @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class GetDrawDignostics(IReturn[DrawDiagnostics]): id: Optional[str] = None