219 lines
5.0 KiB
Go
219 lines
5.0 KiB
Go
package onexbet
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"time"
|
|
|
|
"gordenko.dev/dima/httpreq"
|
|
)
|
|
|
|
// champFilter - на входе имя чемпионата, на выходе true - если чемпионат удовлетворяет,
|
|
// false - если игнорируем
|
|
func SearchMatchCandidates(home, away string, sportID OnexbetSport) (candidates []MatchCandidate, err error) {
|
|
var (
|
|
lineSearchURL string
|
|
liveSearchURL string
|
|
requiredSportName string
|
|
champFilter func(string) bool
|
|
)
|
|
|
|
switch sportID {
|
|
case Football:
|
|
lineSearchURL = stdLineSearchURL
|
|
liveSearchURL = stdLiveSearchURL
|
|
requiredSportName = "football"
|
|
champFilter = FootballChampFilter
|
|
|
|
case Handball:
|
|
lineSearchURL = stdLineSearchURL
|
|
liveSearchURL = stdLiveSearchURL
|
|
requiredSportName = "handball"
|
|
champFilter = HandballChampFilter
|
|
|
|
case Tennis:
|
|
lineSearchURL = tennisLineSearchURL
|
|
liveSearchURL = tennisLiveSearchURL
|
|
requiredSportName = "tennis"
|
|
champFilter = TennisChampFilter
|
|
}
|
|
|
|
// 2 запроса к Line и Live матчам
|
|
homeLineMatches, err := SearchTeamMatches(lineSearchURL, home)
|
|
if err != nil {
|
|
// log
|
|
}
|
|
|
|
homeLiveMatches, err := SearchTeamMatches(liveSearchURL, home)
|
|
if err != nil {
|
|
// log
|
|
}
|
|
|
|
awayLineMatches, err := SearchTeamMatches(lineSearchURL, away)
|
|
if err != nil {
|
|
// log
|
|
}
|
|
|
|
awayLiveMatches, err := SearchTeamMatches(liveSearchURL, away)
|
|
if err != nil {
|
|
// log
|
|
}
|
|
|
|
lists := [][]MatchCandidate{
|
|
homeLineMatches,
|
|
homeLiveMatches,
|
|
awayLineMatches,
|
|
awayLiveMatches,
|
|
}
|
|
|
|
requiredSportName = strings.ToLower(requiredSportName)
|
|
|
|
candidates = filterMatchesBySportAndChamps(lists, requiredSportName, champFilter)
|
|
return
|
|
}
|
|
|
|
// champFilter - на входе имя чемпионата, на выходе true - если чемпионат удовлетворяет,
|
|
// false - если игнорируем
|
|
func SearchTeamCandidates(team string, sportID OnexbetSport) (candidates []MatchCandidate, err error) {
|
|
var (
|
|
lineSearchURL string
|
|
liveSearchURL string
|
|
requiredSportName string
|
|
champFilter func(string) bool
|
|
)
|
|
|
|
switch sportID {
|
|
case Football:
|
|
lineSearchURL = stdLineSearchURL
|
|
liveSearchURL = stdLiveSearchURL
|
|
requiredSportName = "football"
|
|
champFilter = FootballChampFilter
|
|
|
|
case Handball:
|
|
lineSearchURL = stdLineSearchURL
|
|
liveSearchURL = stdLiveSearchURL
|
|
requiredSportName = "handball"
|
|
champFilter = HandballChampFilter
|
|
|
|
case Tennis:
|
|
lineSearchURL = tennisLineSearchURL
|
|
liveSearchURL = tennisLiveSearchURL
|
|
requiredSportName = "tennis"
|
|
champFilter = TennisChampFilter
|
|
}
|
|
|
|
// 2 запроса к Line и Live матчам
|
|
teamLineMatches, err := SearchTeamMatches(lineSearchURL, team)
|
|
if err != nil {
|
|
// log
|
|
}
|
|
|
|
teamLiveMatches, err := SearchTeamMatches(liveSearchURL, team)
|
|
if err != nil {
|
|
// log
|
|
}
|
|
|
|
lists := [][]MatchCandidate{
|
|
teamLineMatches,
|
|
teamLiveMatches,
|
|
}
|
|
|
|
candidates = filterMatchesBySportAndChamps(lists, requiredSportName, champFilter)
|
|
return
|
|
}
|
|
|
|
func filterMatchesBySportAndChamps(lists [][]MatchCandidate, requiredSportName string, champFilter func(string) bool) (candidates []MatchCandidate) {
|
|
// Для отсева матчей дубликатов
|
|
matchIDs := make(map[string]bool)
|
|
|
|
requiredSportName = strings.ToLower(requiredSportName)
|
|
|
|
for _, list := range lists {
|
|
for _, match := range list {
|
|
if !matchIDs[match.MatchID] {
|
|
sportName := strings.ToLower(match.Sport)
|
|
|
|
if !strings.Contains(sportName, requiredSportName) {
|
|
continue
|
|
}
|
|
|
|
if requiredSportName == "football" {
|
|
// Доп проверка на Американский футбол
|
|
if strings.Contains(sportName, "american football") {
|
|
continue
|
|
}
|
|
}
|
|
|
|
if champFilter != nil {
|
|
if !champFilter(match.ChampName) {
|
|
continue
|
|
}
|
|
}
|
|
|
|
// FIX - добавить проверку для тенниса по / и ()
|
|
|
|
candidates = append(candidates, match)
|
|
matchIDs[match.MatchID] = true
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func SearchTeamMatches(searchURL string, teamName string) (matches []MatchCandidate, err error) {
|
|
if teamName == "" {
|
|
err = fmt.Errorf("Empty teamName")
|
|
return
|
|
}
|
|
|
|
if searchURL == "" {
|
|
err = fmt.Errorf("Empty searchURL")
|
|
return
|
|
}
|
|
|
|
// 2 запроса к Line и Live матчам
|
|
|
|
params := url.Values{}
|
|
params.Set("text", teamName)
|
|
params.Set("limit", "50")
|
|
params.Set("mode", "4")
|
|
params.Set("partner", defaultPartnerID)
|
|
params.Set("lng", "en")
|
|
params.Set("userId", "0")
|
|
|
|
queryString := params.Encode()
|
|
|
|
req, err := http.NewRequest("GET", searchURL+"?"+queryString, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
resp, err := httpreq.Send(req, 10*time.Second)
|
|
if err != nil {
|
|
err = fmt.Errorf("httpreq.Send: %s", err)
|
|
return
|
|
}
|
|
|
|
var result searchResponse
|
|
|
|
err = json.Unmarshal(resp.Body, &result)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, match := range result.Value {
|
|
matches = append(matches, MatchCandidate{
|
|
Sport: match.Sport,
|
|
ChampName: match.ChampName,
|
|
StartTime: match.StartTime,
|
|
Home: match.Home,
|
|
Away: match.Away,
|
|
MatchID: match.MatchID,
|
|
})
|
|
}
|
|
return
|
|
}
|