volleyball support
This commit is contained in:
parent
7e1a126ead
commit
0ae3154334
|
|
@ -210,6 +210,45 @@ type CricketResultResponse struct {
|
||||||
Bet365ID string `json:"bet365_id"`
|
Bet365ID string `json:"bet365_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type VolleyballResultResponse struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
SportID string `json:"sport_id"`
|
||||||
|
Time string `json:"time"`
|
||||||
|
TimeStatus string `json:"time_status"`
|
||||||
|
League struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
CC string `json:"cc"`
|
||||||
|
} `json:"league"`
|
||||||
|
Home struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
ImageID string `json:"image_id"`
|
||||||
|
CC string `json:"cc"`
|
||||||
|
} `json:"home"`
|
||||||
|
Away struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
ImageID string `json:"image_id"`
|
||||||
|
CC string `json:"cc"`
|
||||||
|
} `json:"away"`
|
||||||
|
SS string `json:"ss"`
|
||||||
|
Scores struct {
|
||||||
|
FirstSet Score `json:"1"`
|
||||||
|
SecondSet Score `json:"2"`
|
||||||
|
ThirdSet Score `json:"3"`
|
||||||
|
FourthSet Score `json:"4"`
|
||||||
|
FivethSet Score `json:"5"`
|
||||||
|
} `json:"scores"`
|
||||||
|
Stats struct {
|
||||||
|
PointsWonOnServe []string `json:"points_won_on_serve"`
|
||||||
|
LongestStreak []string `json:"longest_streak"`
|
||||||
|
} `json:"stats"`
|
||||||
|
InplayCreatedAt string `json:"inplay_created_at"`
|
||||||
|
InplayUpdatedAt string `json:"inplay_updated_at"`
|
||||||
|
Bet365ID string `json:"bet365_id"`
|
||||||
|
}
|
||||||
|
|
||||||
type Score struct {
|
type Score struct {
|
||||||
Home string `json:"home"`
|
Home string `json:"home"`
|
||||||
Away string `json:"away"`
|
Away string `json:"away"`
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,17 @@ const (
|
||||||
CRICKET_TOP_MATCH_BOWLER CricketMarket = 30246
|
CRICKET_TOP_MATCH_BOWLER CricketMarket = 30246
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type VolleyballMarket int64
|
||||||
|
|
||||||
|
const (
|
||||||
|
VOLLEYBALL_GAME_LINES VolleyballMarket = 910000
|
||||||
|
VOLLEYBALL_CORRECT_SET_SCORE VolleyballMarket = 910201
|
||||||
|
VOLLEYBALL_MATCH_TOTAL_ODD_EVEN VolleyballMarket = 910217
|
||||||
|
VOLLEYBALL_SET_ONE_LINES VolleyballMarket = 910204
|
||||||
|
VOLLEYBALL_SET_ONE_TO_GO_TO_EXTRA_POINTS VolleyballMarket = 910209
|
||||||
|
VOLLEYBALL_SET_ONE_TOTAL_ODD_EVEN VolleyballMarket = 910218
|
||||||
|
)
|
||||||
|
|
||||||
// TODO: Move this into the database so that it can be modified dynamically
|
// TODO: Move this into the database so that it can be modified dynamically
|
||||||
|
|
||||||
var SupportedMarkets = map[int64]bool{
|
var SupportedMarkets = map[int64]bool{
|
||||||
|
|
@ -189,16 +200,26 @@ var SupportedMarkets = map[int64]bool{
|
||||||
int64(ICE_HOCKEY_ALTERNATIVE_TOTAL_TWO_WAY): false,
|
int64(ICE_HOCKEY_ALTERNATIVE_TOTAL_TWO_WAY): false,
|
||||||
|
|
||||||
// Cricket Markets
|
// Cricket Markets
|
||||||
int64(CRICKET_TO_WIN_THE_MATCH): true,
|
int64(CRICKET_TO_WIN_THE_MATCH): true,
|
||||||
int64(CRICKET_FIRST_OVER_TOTAL_RUNS_Odd_Even): true,
|
|
||||||
int64(CRICKET_FIRST_INNINIGS_SCORE): true,
|
|
||||||
|
|
||||||
int64(CRICKET_INNINGS_OF_MATCH_BOWLED_OUT): false,
|
int64(CRICKET_FIRST_OVER_TOTAL_RUNS_Odd_Even): false,
|
||||||
int64(CRICKET_FIRST_OVER_TOTAL_RUNS): false,
|
int64(CRICKET_FIRST_INNINIGS_SCORE): false,
|
||||||
int64(CRICKET_TEAM_TOP_BATTER): false,
|
int64(CRICKET_INNINGS_OF_MATCH_BOWLED_OUT): false,
|
||||||
int64(CRICKET_TEAM_TOP_BOWLE): false,
|
int64(CRICKET_FIRST_OVER_TOTAL_RUNS): false,
|
||||||
int64(CRICKET_PLAYER_OF_THE_MATCH): false,
|
int64(CRICKET_TEAM_TOP_BATTER): false,
|
||||||
int64(CRICKET_FIRST_WICKET_METHOD): false,
|
int64(CRICKET_TEAM_TOP_BOWLE): false,
|
||||||
int64(CRICKET_TOP_MATCH_BATTER): false,
|
int64(CRICKET_PLAYER_OF_THE_MATCH): false,
|
||||||
int64(CRICKET_TOP_MATCH_BOWLER): false,
|
int64(CRICKET_FIRST_WICKET_METHOD): false,
|
||||||
|
int64(CRICKET_TOP_MATCH_BATTER): false,
|
||||||
|
int64(CRICKET_TOP_MATCH_BOWLER): false,
|
||||||
|
|
||||||
|
// Volleyball Markets
|
||||||
|
int64(VOLLEYBALL_GAME_LINES): false,
|
||||||
|
|
||||||
|
int64(VOLLEYBALL_CORRECT_SET_SCORE): true,
|
||||||
|
int64(VOLLEYBALL_MATCH_TOTAL_ODD_EVEN): true,
|
||||||
|
|
||||||
|
int64(VOLLEYBALL_SET_ONE_LINES): false,
|
||||||
|
int64(VOLLEYBALL_SET_ONE_TO_GO_TO_EXTRA_POINTS): false,
|
||||||
|
int64(VOLLEYBALL_SET_ONE_TOTAL_ODD_EVEN): false,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -708,47 +708,3 @@ func evaluateTiedAfterRegulation(outcome domain.BetOutcome, scores []struct{ Hom
|
||||||
|
|
||||||
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid oddname: %s", outcome.OddName)
|
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid oddname: %s", outcome.OddName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cricket evalations
|
|
||||||
func evaluateInningScore(outcome domain.BetOutcome, score struct{ Home, Away int }) (domain.OutcomeStatus, error) {
|
|
||||||
var inningsScore int
|
|
||||||
if outcome.OddName == "1" {
|
|
||||||
inningsScore = score.Home
|
|
||||||
} else if outcome.OddName == "2" {
|
|
||||||
inningsScore = score.Away
|
|
||||||
} else {
|
|
||||||
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid odd header: %s", outcome.OddHeader)
|
|
||||||
}
|
|
||||||
|
|
||||||
parts := strings.Fields(outcome.OddHeader)
|
|
||||||
if len(parts) != 2 {
|
|
||||||
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid odd format: %s", outcome.OddHeader)
|
|
||||||
}
|
|
||||||
|
|
||||||
evalType := parts[0]
|
|
||||||
|
|
||||||
threshold, err := strconv.ParseFloat(parts[1], 64)
|
|
||||||
if err != nil {
|
|
||||||
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid threshold value: %s", parts[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
switch evalType {
|
|
||||||
case "Over":
|
|
||||||
if float64(inningsScore) > threshold {
|
|
||||||
return domain.OUTCOME_STATUS_WIN, nil
|
|
||||||
}
|
|
||||||
return domain.OUTCOME_STATUS_LOSS, nil
|
|
||||||
case "Under":
|
|
||||||
if float64(inningsScore) < threshold {
|
|
||||||
return domain.OUTCOME_STATUS_WIN, nil
|
|
||||||
}
|
|
||||||
return domain.OUTCOME_STATUS_LOSS, nil
|
|
||||||
case "Exactly":
|
|
||||||
if float64(inningsScore) == threshold {
|
|
||||||
return domain.OUTCOME_STATUS_WIN, nil
|
|
||||||
}
|
|
||||||
return domain.OUTCOME_STATUS_LOSS, nil
|
|
||||||
default:
|
|
||||||
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid comparison operator: %s", evalType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,12 @@ func (s *Service) fetchResult(ctx context.Context, eventID, oddID, marketID, spo
|
||||||
s.logger.Error("Failed to parse cricket", "event id", eventID, "market_id", marketID, "error", err)
|
s.logger.Error("Failed to parse cricket", "event id", eventID, "market_id", marketID, "error", err)
|
||||||
return domain.CreateResult{}, err
|
return domain.CreateResult{}, err
|
||||||
}
|
}
|
||||||
|
case domain.VOLLEYBALL:
|
||||||
|
result, err = s.parseVolleyball(resultResp.Results[0], eventID, oddID, marketID, outcome)
|
||||||
|
if err != nil {
|
||||||
|
s.logger.Error("Failed to parse cricket", "event id", eventID, "market_id", marketID, "error", err)
|
||||||
|
return domain.CreateResult{}, err
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
s.logger.Error("Unsupported sport", "sport", sportID)
|
s.logger.Error("Unsupported sport", "sport", sportID)
|
||||||
return domain.CreateResult{}, fmt.Errorf("unsupported sport: %v", sportID)
|
return domain.CreateResult{}, fmt.Errorf("unsupported sport: %v", sportID)
|
||||||
|
|
@ -271,9 +277,6 @@ func (s *Service) parseFootball(resultRes json.RawMessage, eventID, oddID, marke
|
||||||
func (s *Service) parseBasketball(response json.RawMessage, eventID, oddID, marketID int64, outcome domain.BetOutcome) (domain.CreateResult, error) {
|
func (s *Service) parseBasketball(response json.RawMessage, eventID, oddID, marketID int64, outcome domain.BetOutcome) (domain.CreateResult, error) {
|
||||||
var basketBallRes domain.BasketballResultResponse
|
var basketBallRes domain.BasketballResultResponse
|
||||||
|
|
||||||
// TODO: here !!
|
|
||||||
fmt.Println(string(response))
|
|
||||||
|
|
||||||
if err := json.Unmarshal(response, &basketBallRes); err != nil {
|
if err := json.Unmarshal(response, &basketBallRes); err != nil {
|
||||||
s.logger.Error("Failed to unmarshal football result", "event_id", eventID, "error", err)
|
s.logger.Error("Failed to unmarshal football result", "event_id", eventID, "error", err)
|
||||||
return domain.CreateResult{}, err
|
return domain.CreateResult{}, err
|
||||||
|
|
@ -355,6 +358,34 @@ func (s *Service) parseCricket(response json.RawMessage, eventID, oddID, marketI
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Service) parseVolleyball(response json.RawMessage, eventID, oddID, marketID int64, outcome domain.BetOutcome) (domain.CreateResult, error) {
|
||||||
|
var volleyballRes domain.VolleyballResultResponse
|
||||||
|
|
||||||
|
if err := json.Unmarshal(response, &volleyballRes); err != nil {
|
||||||
|
s.logger.Error("Failed to unmarshal football result", "event_id", eventID, "error", err)
|
||||||
|
return domain.CreateResult{}, err
|
||||||
|
}
|
||||||
|
if volleyballRes.TimeStatus != "3" {
|
||||||
|
s.logger.Warn("Match not yet completed", "event_id", eventID)
|
||||||
|
return domain.CreateResult{}, fmt.Errorf("match not yet completed")
|
||||||
|
}
|
||||||
|
|
||||||
|
status, err := s.evaluateVolleyballOutcome(outcome, volleyballRes)
|
||||||
|
if err != nil {
|
||||||
|
s.logger.Error("Failed to evaluate outcome", "event_id", eventID, "market_id", marketID, "error", err)
|
||||||
|
return domain.CreateResult{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return domain.CreateResult{
|
||||||
|
BetOutcomeID: 0,
|
||||||
|
EventID: eventID,
|
||||||
|
OddID: oddID,
|
||||||
|
MarketID: marketID,
|
||||||
|
Status: status,
|
||||||
|
}, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func parseScore(home string, away string) struct{ Home, Away int } {
|
func parseScore(home string, away string) struct{ Home, Away int } {
|
||||||
homeVal, _ := strconv.Atoi(strings.TrimSpace(home))
|
homeVal, _ := strconv.Atoi(strings.TrimSpace(home))
|
||||||
awaVal, _ := strconv.Atoi(strings.TrimSpace(away))
|
awaVal, _ := strconv.Atoi(strings.TrimSpace(away))
|
||||||
|
|
@ -537,10 +568,26 @@ func (s *Service) evaluateCricketOutcome(outcome domain.BetOutcome, res domain.C
|
||||||
switch outcome.MarketID {
|
switch outcome.MarketID {
|
||||||
case int64(domain.CRICKET_TO_WIN_THE_MATCH):
|
case int64(domain.CRICKET_TO_WIN_THE_MATCH):
|
||||||
return evaluateFullTimeResult(outcome, score)
|
return evaluateFullTimeResult(outcome, score)
|
||||||
case int64(domain.CRICKET_FIRST_OVER_TOTAL_RUNS_Odd_Even):
|
}
|
||||||
return evaluateGoalsOddEven(outcome, score)
|
|
||||||
case int64(domain.CRICKET_FIRST_INNINIGS_SCORE):
|
return domain.OUTCOME_STATUS_PENDING, nil
|
||||||
return evaluateInningScore(outcome, score)
|
}
|
||||||
|
|
||||||
|
func (s *Service) evaluateVolleyballOutcome(outcome domain.BetOutcome, res domain.VolleyballResultResponse) (domain.OutcomeStatus, error) {
|
||||||
|
if !domain.SupportedMarkets[outcome.MarketID] {
|
||||||
|
s.logger.Warn("Unsupported market type", "market_name", outcome.MarketName)
|
||||||
|
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("unsupported market type: %s", outcome.MarketName)
|
||||||
|
}
|
||||||
|
|
||||||
|
score := parseSS(res.SS)
|
||||||
|
|
||||||
|
switch outcome.MarketID {
|
||||||
|
// TODO: new Game Lines for volleyball
|
||||||
|
|
||||||
|
case int64(domain.VOLLEYBALL_CORRECT_SET_SCORE):
|
||||||
|
return evaluateCorrectScore(outcome, score)
|
||||||
|
case int64(domain.VOLLEYBALL_MATCH_TOTAL_ODD_EVEN):
|
||||||
|
return evaluateGoalsOddEven(outcome, score)
|
||||||
}
|
}
|
||||||
|
|
||||||
return domain.OUTCOME_STATUS_PENDING, nil
|
return domain.OUTCOME_STATUS_PENDING, nil
|
||||||
|
|
|
||||||
256
q
Normal file
256
q
Normal file
|
|
@ -0,0 +1,256 @@
|
||||||
|
[1mdiff --git a/internal/domain/result.go b/internal/domain/result.go[m
|
||||||
|
[1mindex e43476b..def8719 100644[m
|
||||||
|
[1m--- a/internal/domain/result.go[m
|
||||||
|
[1m+++ b/internal/domain/result.go[m
|
||||||
|
[36m@@ -210,6 +210,45 @@[m [mtype CricketResultResponse struct {[m
|
||||||
|
Bet365ID string `json:"bet365_id"`[m
|
||||||
|
}[m
|
||||||
|
[m
|
||||||
|
[32m+[m[32mtype VolleyballResultResponse struct {[m
|
||||||
|
[32m+[m [32mID string `json:"id"`[m
|
||||||
|
[32m+[m [32mSportID string `json:"sport_id"`[m
|
||||||
|
[32m+[m [32mTime string `json:"time"`[m
|
||||||
|
[32m+[m [32mTimeStatus string `json:"time_status"`[m
|
||||||
|
[32m+[m [32mLeague struct {[m
|
||||||
|
[32m+[m [32mID string `json:"id"`[m
|
||||||
|
[32m+[m [32mName string `json:"name"`[m
|
||||||
|
[32m+[m [32mCC string `json:"cc"`[m
|
||||||
|
[32m+[m [32m} `json:"league"`[m
|
||||||
|
[32m+[m [32mHome struct {[m
|
||||||
|
[32m+[m [32mID string `json:"id"`[m
|
||||||
|
[32m+[m [32mName string `json:"name"`[m
|
||||||
|
[32m+[m [32mImageID string `json:"image_id"`[m
|
||||||
|
[32m+[m [32mCC string `json:"cc"`[m
|
||||||
|
[32m+[m [32m} `json:"home"`[m
|
||||||
|
[32m+[m [32mAway struct {[m
|
||||||
|
[32m+[m [32mID string `json:"id"`[m
|
||||||
|
[32m+[m [32mName string `json:"name"`[m
|
||||||
|
[32m+[m [32mImageID string `json:"image_id"`[m
|
||||||
|
[32m+[m [32mCC string `json:"cc"`[m
|
||||||
|
[32m+[m [32m} `json:"away"`[m
|
||||||
|
[32m+[m [32mSS string `json:"ss"`[m
|
||||||
|
[32m+[m [32mScores struct {[m
|
||||||
|
[32m+[m [32mFirstSet Score `json:"1"`[m
|
||||||
|
[32m+[m [32mSecondSet Score `json:"2"`[m
|
||||||
|
[32m+[m [32mThirdSet Score `json:"3"`[m
|
||||||
|
[32m+[m [32mFourthSet Score `json:"4"`[m
|
||||||
|
[32m+[m [32mFivethSet Score `json:"5"`[m
|
||||||
|
[32m+[m [32m} `json:"scores"`[m
|
||||||
|
[32m+[m [32mStats struct {[m
|
||||||
|
[32m+[m [32mPointsWonOnServe []string `json:"points_won_on_serve"`[m
|
||||||
|
[32m+[m [32mLongestStreak []string `json:"longest_streak"`[m
|
||||||
|
[32m+[m [32m} `json:"stats"`[m
|
||||||
|
[32m+[m [32mInplayCreatedAt string `json:"inplay_created_at"`[m
|
||||||
|
[32m+[m [32mInplayUpdatedAt string `json:"inplay_updated_at"`[m
|
||||||
|
[32m+[m [32mBet365ID string `json:"bet365_id"`[m
|
||||||
|
[32m+[m[32m}[m
|
||||||
|
[32m+[m
|
||||||
|
type Score struct {[m
|
||||||
|
Home string `json:"home"`[m
|
||||||
|
Away string `json:"away"`[m
|
||||||
|
[1mdiff --git a/internal/domain/sportmarket.go b/internal/domain/sportmarket.go[m
|
||||||
|
[1mindex f442f9c..fc25e36 100644[m
|
||||||
|
[1m--- a/internal/domain/sportmarket.go[m
|
||||||
|
[1m+++ b/internal/domain/sportmarket.go[m
|
||||||
|
[36m@@ -114,6 +114,17 @@[m [mconst ([m
|
||||||
|
CRICKET_TOP_MATCH_BOWLER CricketMarket = 30246[m
|
||||||
|
)[m
|
||||||
|
[m
|
||||||
|
[32m+[m[32mtype VolleyballMarket int64[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m[32mconst ([m
|
||||||
|
[32m+[m [32mVOLLEYBALL_GAME_LINES VolleyballMarket = 910000[m
|
||||||
|
[32m+[m [32mVOLLEYBALL_CORRECT_SET_SCORE VolleyballMarket = 910201[m
|
||||||
|
[32m+[m [32mVOLLEYBALL_MATCH_TOTAL_ODD_EVEN VolleyballMarket = 910217[m
|
||||||
|
[32m+[m [32mVOLLEYBALL_SET_ONE_LINES VolleyballMarket = 910204[m
|
||||||
|
[32m+[m [32mVOLLEYBALL_SET_ONE_TO_GO_TO_EXTRA_POINTS VolleyballMarket = 910209[m
|
||||||
|
[32m+[m [32mVOLLEYBALL_SET_ONE_TOTAL_ODD_EVEN VolleyballMarket = 910218[m
|
||||||
|
[32m+[m[32m)[m
|
||||||
|
[32m+[m
|
||||||
|
// TODO: Move this into the database so that it can be modified dynamically[m
|
||||||
|
[m
|
||||||
|
var SupportedMarkets = map[int64]bool{[m
|
||||||
|
[36m@@ -189,16 +200,26 @@[m [mvar SupportedMarkets = map[int64]bool{[m
|
||||||
|
int64(ICE_HOCKEY_ALTERNATIVE_TOTAL_TWO_WAY): false,[m
|
||||||
|
[m
|
||||||
|
// Cricket Markets[m
|
||||||
|
[31m- int64(CRICKET_TO_WIN_THE_MATCH): true,[m
|
||||||
|
[31m- int64(CRICKET_FIRST_OVER_TOTAL_RUNS_Odd_Even): true,[m
|
||||||
|
[31m- int64(CRICKET_FIRST_INNINIGS_SCORE): true,[m
|
||||||
|
[31m-[m
|
||||||
|
[31m- int64(CRICKET_INNINGS_OF_MATCH_BOWLED_OUT): false,[m
|
||||||
|
[31m- int64(CRICKET_FIRST_OVER_TOTAL_RUNS): false,[m
|
||||||
|
[31m- int64(CRICKET_TEAM_TOP_BATTER): false,[m
|
||||||
|
[31m- int64(CRICKET_TEAM_TOP_BOWLE): false,[m
|
||||||
|
[31m- int64(CRICKET_PLAYER_OF_THE_MATCH): false,[m
|
||||||
|
[31m- int64(CRICKET_FIRST_WICKET_METHOD): false,[m
|
||||||
|
[31m- int64(CRICKET_TOP_MATCH_BATTER): false,[m
|
||||||
|
[31m- int64(CRICKET_TOP_MATCH_BOWLER): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_TO_WIN_THE_MATCH): true,[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mint64(CRICKET_FIRST_OVER_TOTAL_RUNS_Odd_Even): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_FIRST_INNINIGS_SCORE): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_INNINGS_OF_MATCH_BOWLED_OUT): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_FIRST_OVER_TOTAL_RUNS): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_TEAM_TOP_BATTER): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_TEAM_TOP_BOWLE): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_PLAYER_OF_THE_MATCH): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_FIRST_WICKET_METHOD): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_TOP_MATCH_BATTER): false,[m
|
||||||
|
[32m+[m [32mint64(CRICKET_TOP_MATCH_BOWLER): false,[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32m// Volleyball Markets[m
|
||||||
|
[32m+[m [32mint64(VOLLEYBALL_GAME_LINES): false,[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mint64(VOLLEYBALL_CORRECT_SET_SCORE): true,[m
|
||||||
|
[32m+[m [32mint64(VOLLEYBALL_MATCH_TOTAL_ODD_EVEN): true,[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mint64(VOLLEYBALL_SET_ONE_LINES): false,[m
|
||||||
|
[32m+[m [32mint64(VOLLEYBALL_SET_ONE_TO_GO_TO_EXTRA_POINTS): false,[m
|
||||||
|
[32m+[m [32mint64(VOLLEYBALL_SET_ONE_TOTAL_ODD_EVEN): false,[m
|
||||||
|
}[m
|
||||||
|
[1mdiff --git a/internal/services/result/eval.go b/internal/services/result/eval.go[m
|
||||||
|
[1mindex 8c21390..5d7cd66 100644[m
|
||||||
|
[1m--- a/internal/services/result/eval.go[m
|
||||||
|
[1m+++ b/internal/services/result/eval.go[m
|
||||||
|
[36m@@ -708,47 +708,3 @@[m [mfunc evaluateTiedAfterRegulation(outcome domain.BetOutcome, scores []struct{ Hom[m
|
||||||
|
[m
|
||||||
|
return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid oddname: %s", outcome.OddName)[m
|
||||||
|
}[m
|
||||||
|
[31m-[m
|
||||||
|
[31m-// Cricket evalations[m
|
||||||
|
[31m-func evaluateInningScore(outcome domain.BetOutcome, score struct{ Home, Away int }) (domain.OutcomeStatus, error) {[m
|
||||||
|
[31m- var inningsScore int[m
|
||||||
|
[31m- if outcome.OddName == "1" {[m
|
||||||
|
[31m- inningsScore = score.Home[m
|
||||||
|
[31m- } else if outcome.OddName == "2" {[m
|
||||||
|
[31m- inningsScore = score.Away[m
|
||||||
|
[31m- } else {[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid odd header: %s", outcome.OddHeader)[m
|
||||||
|
[31m- }[m
|
||||||
|
[31m-[m
|
||||||
|
[31m- parts := strings.Fields(outcome.OddHeader)[m
|
||||||
|
[31m- if len(parts) != 2 {[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid odd format: %s", outcome.OddHeader)[m
|
||||||
|
[31m- }[m
|
||||||
|
[31m-[m
|
||||||
|
[31m- evalType := parts[0][m
|
||||||
|
[31m-[m
|
||||||
|
[31m- threshold, err := strconv.ParseFloat(parts[1], 64)[m
|
||||||
|
[31m- if err != nil {[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid threshold value: %s", parts[1])[m
|
||||||
|
[31m- }[m
|
||||||
|
[31m-[m
|
||||||
|
[31m- switch evalType {[m
|
||||||
|
[31m- case "Over":[m
|
||||||
|
[31m- if float64(inningsScore) > threshold {[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_WIN, nil[m
|
||||||
|
[31m- }[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_LOSS, nil[m
|
||||||
|
[31m- case "Under":[m
|
||||||
|
[31m- if float64(inningsScore) < threshold {[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_WIN, nil[m
|
||||||
|
[31m- }[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_LOSS, nil[m
|
||||||
|
[31m- case "Exactly":[m
|
||||||
|
[31m- if float64(inningsScore) == threshold {[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_WIN, nil[m
|
||||||
|
[31m- }[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_LOSS, nil[m
|
||||||
|
[31m- default:[m
|
||||||
|
[31m- return domain.OUTCOME_STATUS_PENDING, fmt.Errorf("invalid comparison operator: %s", evalType)[m
|
||||||
|
[31m- }[m
|
||||||
|
[31m-}[m
|
||||||
|
[1mdiff --git a/internal/services/result/service.go b/internal/services/result/service.go[m
|
||||||
|
[1mindex fcbff6b..92886c3 100644[m
|
||||||
|
[1m--- a/internal/services/result/service.go[m
|
||||||
|
[1m+++ b/internal/services/result/service.go[m
|
||||||
|
[36m@@ -226,6 +226,12 @@[m [mfunc (s *Service) fetchResult(ctx context.Context, eventID, oddID, marketID, spo[m
|
||||||
|
s.logger.Error("Failed to parse cricket", "event id", eventID, "market_id", marketID, "error", err)[m
|
||||||
|
return domain.CreateResult{}, err[m
|
||||||
|
}[m
|
||||||
|
[32m+[m [32mcase domain.VOLLEYBALL:[m
|
||||||
|
[32m+[m [32mresult, err = s.parseVolleyball(resultResp.Results[0], eventID, oddID, marketID, outcome)[m
|
||||||
|
[32m+[m [32mif err != nil {[m
|
||||||
|
[32m+[m [32ms.logger.Error("Failed to parse cricket", "event id", eventID, "market_id", marketID, "error", err)[m
|
||||||
|
[32m+[m [32mreturn domain.CreateResult{}, err[m
|
||||||
|
[32m+[m [32m}[m
|
||||||
|
default:[m
|
||||||
|
s.logger.Error("Unsupported sport", "sport", sportID)[m
|
||||||
|
return domain.CreateResult{}, fmt.Errorf("unsupported sport: %v", sportID)[m
|
||||||
|
[36m@@ -271,9 +277,6 @@[m [mfunc (s *Service) parseFootball(resultRes json.RawMessage, eventID, oddID, marke[m
|
||||||
|
func (s *Service) parseBasketball(response json.RawMessage, eventID, oddID, marketID int64, outcome domain.BetOutcome) (domain.CreateResult, error) {[m
|
||||||
|
var basketBallRes domain.BasketballResultResponse[m
|
||||||
|
[m
|
||||||
|
[31m- // TODO: here !![m
|
||||||
|
[31m- fmt.Println(string(response))[m
|
||||||
|
[31m-[m
|
||||||
|
if err := json.Unmarshal(response, &basketBallRes); err != nil {[m
|
||||||
|
s.logger.Error("Failed to unmarshal football result", "event_id", eventID, "error", err)[m
|
||||||
|
return domain.CreateResult{}, err[m
|
||||||
|
[36m@@ -355,6 +358,34 @@[m [mfunc (s *Service) parseCricket(response json.RawMessage, eventID, oddID, marketI[m
|
||||||
|
}, nil[m
|
||||||
|
}[m
|
||||||
|
[m
|
||||||
|
[32m+[m[32mfunc (s *Service) parseVolleyball(response json.RawMessage, eventID, oddID, marketID int64, outcome domain.BetOutcome) (domain.CreateResult, error) {[m
|
||||||
|
[32m+[m [32mvar volleyballRes domain.VolleyballResultResponse[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mif err := json.Unmarshal(response, &volleyballRes); err != nil {[m
|
||||||
|
[32m+[m [32ms.logger.Error("Failed to unmarshal football result", "event_id", eventID, "error", err)[m
|
||||||
|
[32m+[m [32mreturn domain.CreateResult{}, err[m
|
||||||
|
[32m+[m [32m}[m
|
||||||
|
[32m+[m [32mif volleyballRes.TimeStatus != "3" {[m
|
||||||
|
[32m+[m [32ms.logger.Warn("Match not yet completed", "event_id", eventID)[m
|
||||||
|
[32m+[m [32mreturn domain.CreateResult{}, fmt.Errorf("match not yet completed")[m
|
||||||
|
[32m+[m [32m}[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mstatus, err := s.evaluateVolleyballOutcome(outcome, volleyballRes)[m
|
||||||
|
[32m+[m [32mif err != nil {[m
|
||||||
|
[32m+[m [32ms.logger.Error("Failed to evaluate outcome", "event_id", eventID, "market_id", marketID, "error", err)[m
|
||||||
|
[32m+[m [32mreturn domain.CreateResult{}, err[m
|
||||||
|
[32m+[m [32m}[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mreturn domain.CreateResult{[m
|
||||||
|
[32m+[m [32mBetOutcomeID: 0,[m
|
||||||
|
[32m+[m [32mEventID: eventID,[m
|
||||||
|
[32m+[m [32mOddID: oddID,[m
|
||||||
|
[32m+[m [32mMarketID: marketID,[m
|
||||||
|
[32m+[m [32mStatus: status,[m
|
||||||
|
[32m+[m [32m}, nil[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m[32m}[m
|
||||||
|
[32m+[m
|
||||||
|
func parseScore(home string, away string) struct{ Home, Away int } {[m
|
||||||
|
homeVal, _ := strconv.Atoi(strings.TrimSpace(home))[m
|
||||||
|
awaVal, _ := strconv.Atoi(strings.TrimSpace(away))[m
|
||||||
|
[36m@@ -537,10 +568,27 @@[m [mfunc (s *Service) evaluateCricketOutcome(outcome domain.BetOutcome, res domain.C[m
|
||||||
|
switch outcome.MarketID {[m
|
||||||
|
case int64(domain.CRICKET_TO_WIN_THE_MATCH):[m
|
||||||
|
return evaluateFullTimeResult(outcome, score)[m
|
||||||
|
[31m- case int64(domain.CRICKET_FIRST_OVER_TOTAL_RUNS_Odd_Even):[m
|
||||||
|
[32m+[m [32m}[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mreturn domain.OUTCOME_STATUS_PENDING, nil[m
|
||||||
|
[32m+[m[32m}[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m[32mfunc (s *Service) evaluateVolleyballOutcome(outcome domain.BetOutcome, res domain.VolleyballResultResponse) (domain.OutcomeStatus, error) {[m
|
||||||
|
[32m+[m [32mif !domain.SupportedMarkets[outcome.MarketID] {[m
|
||||||
|
[32m+[m [32ms.logger.Warn("Unsupported market type", "market_name", outcome.MarketName)[m
|
||||||
|
[32m+[m [32mreturn domain.OUTCOME_STATUS_PENDING, fmt.Errorf("unsupported market type: %s", outcome.MarketName)[m
|
||||||
|
[32m+[m [32m}[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mscore := parseSS(res.SS)[m
|
||||||
|
[32m+[m
|
||||||
|
[32m+[m [32mswitch outcome.MarketID {[m
|
||||||
|
[32m+[m [32m// new Game line since its different from basket ball[m
|
||||||
|
[32m+[m [32mcase int64(domain.VOLLEYBALL_GAME_LINES):[m
|
||||||
|
[32m+[m [32mreturn evaluateGameLines(outcome, score)[m
|
||||||
|
[32m+[m [32mcase int64(domain.VOLLEYBALL_CORRECT_SET_SCORE):[m
|
||||||
|
[32m+[m [32mreturn evaluateCorrectScore(outcome, score)[m
|
||||||
|
[32m+[m [32mcase int64(domain.VOLLEYBALL_MATCH_TOTAL_ODD_EVEN):[m
|
||||||
|
return evaluateGoalsOddEven(outcome, score)[m
|
||||||
|
[31m- case int64(domain.CRICKET_FIRST_INNINIGS_SCORE):[m
|
||||||
|
[31m- return evaluateInningScore(outcome, score)[m
|
||||||
|
}[m
|
||||||
|
[m
|
||||||
|
return domain.OUTCOME_STATUS_PENDING, nil[m
|
||||||
Loading…
Reference in New Issue
Block a user