blob: 6e63c0aceddc47dbe4efefb9ee9b4209cee42375 [file] [log] [blame]
Yash Chainani87d06442022-04-16 20:59:47 -07001package rankings
2
3import (
4 "github.com/frc971/971-Robot-Code/scouting/db"
5 "github.com/frc971/971-Robot-Code/scouting/scraping"
6 "log"
7 "strconv"
8 "strings"
9 "time"
10)
11
Yash Chainani37261d42022-04-19 16:21:27 -070012type RankingScraper struct {
Yash Chainani87d06442022-04-16 20:59:47 -070013 doneChan chan<- bool
14 checkStopped chan<- bool
15}
16
17type Database interface {
18 AddOrUpdateRankings(db.Ranking) error
19}
20
21func parseTeamKey(teamKey string) (int, error) {
22 // TBA prefixes teams with "frc". Not sure why. Get rid of that.
23 teamKey = strings.TrimPrefix(teamKey, "frc")
24 return strconv.Atoi(teamKey)
25}
26
27func getRankings(database Database, year int32, eventCode string, blueAllianceConfig string) {
28 rankings, err := scraping.AllRankings(year, eventCode, blueAllianceConfig)
29 if err != nil {
30 log.Println("Failed to scrape ranking list: ", err)
31 return
32 }
33
34 for _, rank := range rankings.Rankings {
35 teamKey, err := parseTeamKey(rank.TeamKey)
36
37 if err != nil {
38 log.Println("Failed to parse team key: ", err)
39 continue
40 }
41
42 rankingInfo := db.Ranking{
43 TeamNumber: teamKey,
44 Losses: rank.Records.Losses, Wins: rank.Records.Wins, Ties: rank.Records.Ties,
45 Rank: rank.Rank, Dq: rank.Dq,
46 }
47 err = database.AddOrUpdateRankings(rankingInfo)
48
49 if err != nil {
50 log.Println("Failed to add or update database: ", err)
51 }
52 }
53}
54
Yash Chainani37261d42022-04-19 16:21:27 -070055func (scraper *RankingScraper) Start(database Database, year int32, eventCode string, blueAllianceConfig string) {
Yash Chainani87d06442022-04-16 20:59:47 -070056 scraper.doneChan = make(chan bool, 1)
57 scraper.checkStopped = make(chan bool, 1)
58
59 go func(database Database, year int32, eventCode string) {
60 // Setting start time to 11 minutes prior so getRankings called instantly when Start() called
61 startTime := time.Now().Add(-11 * time.Minute)
62 for {
63 curTime := time.Now()
64 diff := curTime.Sub(startTime)
65
66 if diff.Minutes() > 10 {
67 getRankings(database, year, eventCode, blueAllianceConfig)
68 startTime = curTime
69 }
70
71 if len(scraper.doneChan) != 0 {
72 break
73 }
74
75 time.Sleep(time.Second)
76 }
77
78 scraper.checkStopped <- true
79 }(database, year, eventCode)
80}
81
Yash Chainani37261d42022-04-19 16:21:27 -070082func (scraper *RankingScraper) Stop() {
Yash Chainani87d06442022-04-16 20:59:47 -070083 scraper.doneChan <- true
84
85 for {
86 if len(scraper.checkStopped) != 0 {
87 close(scraper.doneChan)
88 close(scraper.checkStopped)
89 break
90 }
91 }
92}