Six4Win.WebApi

<back to all web services

GetDrawDignostics

The following routes are available for this service:
All Verbs/qry/rounds/draw/diagnostics
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 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


class SortingOrder(IntEnum):
    NONE = 0
    ASCENDING = 1
    DESCENDING = 2


@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 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 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


class ResponseStatus(IntEnum):
    FAILURE = 0
    SUCCESS = 1


@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 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 BettingApp:
    name: Optional[str] = None
    version: Optional[str] = None


@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 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 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 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)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AccumulatorConfiguration(AccumulatorConfiguration):
    id: Optional[str] = None
    updated_at: datetime.datetime = datetime.datetime(1, 1, 1)


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


@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


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class GetDrawDignostics:
    id: Optional[str] = None


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

Python GetDrawDignostics DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /qry/rounds/draw/diagnostics HTTP/1.1 
Host: s4w2.api.bettor.cc 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	id: String
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	id: String,
	initializationInfo: 
	{
		dataLoadDuration: 0,
		betsCollectionsCreationDuration: 0,
		combinationsOccuranceLookupInitializationDuration: 0
	},
	sequenceGenerationInfo: 
	{
		nrOfThreads: 0,
		nrOfResultsProbed: 0,
		duration: 0,
		avgSinglePassDuration: 0
	},
	bestFitFinderInfo: 
	{
		targetAmount: 0,
		awardedAmount: 0,
		deviation: 0,
		deviationPct: 0,
		sequenceResultType: String,
		isJackPot5Drawn: False,
		filteringPeriod: 0,
		winCountOrder: 0,
		minAmount: 0,
		maxAmount: 0
	},
	purgerInfo: 
	{
		prevalentStake: 0,
		poolPurger: String,
		qualifiedPools: 
		[
			{
				id: 0,
				name: String,
				coefficient: 0,
				availableAmount: 0,
				awardedAmount: 0,
				targetBet: 
				{
					isFound: False,
					betId: String,
					slipId: String,
					combStake: {}
				}
			}
		]
	},
	duration: 0,
	stimulationResponses: 
	[
		{
			stimulationId: String,
			status: 0,
			failureReason: String,
			slipId: String,
			betId: String,
			amountAwarded: 0
		}
	],
	localCodePot: 
	{
		durationInMs: 0
	},
	superWin: 
	{
		durationInMs: 0
	},
	happyHour: 
	{
		isHappyHour: False,
		oddsModifier: 0,
		roundPoolBonusPct: 0
	},
	reasoning: String,
	configuration: 
	{
		pools: 
		[
			{
				id: 0,
				name: String,
				rtp: 0,
				reserveRTP: 0,
				totalRTP: 0
			}
		],
		prevalentStake: 0,
		purgeThresholdModifier: 0,
		locationOptimizationLevel: 0,
		jackPot5ThresholdInterval: 
		{
			start: 0,
			end: 0
		},
		deviationCategorySpanInPct: 0,
		deviationCategoryThresholdAmount: 0,
		roundPoolCircuitBreakerThreshold: 0,
		lowWinCountAffinityInPct: 0,
		winCountOrderAffinity: 
		[
			{
				order: 0,
				probability: 0
			}
		],
		highRollerSettings: 
		{
			pools: 
			[
				{
					id: 0,
					name: String,
					isActive: False,
					contributionToRoundPoolPct: 0,
					caps: 
					{
						plusCoef: 0,
						minusCoef: 0,
						maxAmountInPrevalentStakes: 0
					}
				}
			],
			categoryThresholds: 
			[
				{
					category: 0,
					threshold: 0
				}
			]
		},
		overflowCoefficientPoolsToRound: False,
		antiSyphonProtectionOverride: False,
		fraudDetectionConfig: 
		{
			antiSyphon: 
			{
				combinationCountPerRoundThresholdPct: 0,
				excludedLocations: 
				[
					{
						id: String,
						val: String
					}
				],
				includeRoundPctAsBettorSyphonCriteria: False,
				isActive: False
			}
		},
		debugConfig: 
		{
			logLocationStats: False,
			logBettorSats: False
		}
	},
	syphonInfo: 
	{
		bettors: 
		{
			String: 
			{
				id: String,
				name: String,
				type: 0,
				nrOfCombinations: 0
			}
		},
		locations: 
		{
			String: 
			{
				id: String,
				name: String,
				type: 0,
				nrOfCombinations: 0
			}
		},
		hasSyphons: True,
		totalSyphonsInRound: 2
	}
}