-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathhandler.go
93 lines (81 loc) · 2.45 KB
/
handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package challenger
import (
"fmt"
"sort"
"github.com/getsentry/sentry-go"
challengerdb "github.com/initia-labs/opinit-bots/challenger/db"
challengertypes "github.com/initia-labs/opinit-bots/challenger/types"
"github.com/initia-labs/opinit-bots/sentry_integration"
"github.com/initia-labs/opinit-bots/types"
"go.uber.org/zap"
)
func (c *Challenger) challengeHandler(ctx types.Context) error {
defer close(c.challengeChStopped)
for {
select {
case <-ctx.Done():
return nil
case challenge := <-c.challengeCh:
c.stage.Reset()
// Remove the pending challenge that was stored by the client or host
err := challengerdb.DeletePendingChallenge(c.stage, challenge)
if err != nil {
return err
}
err = challengerdb.SaveChallenge(c.stage, challenge)
if err != nil {
return err
}
err = c.handleChallenge(ctx, challenge)
if err != nil {
return err
}
err = c.stage.Commit()
if err != nil {
return err
}
c.insertLatestChallenges(challenge)
}
}
}
func (c *Challenger) insertLatestChallenges(challenge challengertypes.Challenge) {
c.latestChallengesMu.Lock()
defer c.latestChallengesMu.Unlock()
c.latestChallenges = append(c.latestChallenges, challenge)
sort.Slice(c.latestChallenges, func(i, j int) bool {
if c.latestChallenges[i].Time.Equal(c.latestChallenges[j].Time) {
if c.latestChallenges[i].Id.Type == c.latestChallenges[j].Id.Type {
return c.latestChallenges[i].Id.Id < c.latestChallenges[j].Id.Id
}
return c.latestChallenges[i].Id.Type < c.latestChallenges[j].Id.Type
}
return c.latestChallenges[i].Time.Before(c.latestChallenges[j].Time)
})
if len(c.latestChallenges) > 5 {
c.latestChallenges = c.latestChallenges[1:]
}
}
func (c *Challenger) getLatestChallenges() []challengertypes.Challenge {
c.latestChallengesMu.Lock()
defer c.latestChallengesMu.Unlock()
res := make([]challengertypes.Challenge, len(c.latestChallenges))
copy(res, c.latestChallenges)
return res
}
func (c *Challenger) handleChallenge(ctx types.Context, challenge challengertypes.Challenge) error {
sentry_integration.CaptureCurrentHubException(
fmt.Errorf("challenge: %v", challenge),
sentry.LevelWarning,
)
ctx.Logger().Error("challenge", zap.Any("challenge", challenge))
return nil
}
func (c *Challenger) SendPendingChallenges(challenges []challengertypes.Challenge) {
for _, challenge := range challenges {
select {
case <-c.challengeChStopped:
return
case c.challengeCh <- challenge:
}
}
}