Skip to content

Commit 607f2b7

Browse files
wip
1 parent ea36e69 commit 607f2b7

File tree

6 files changed

+111
-143
lines changed

6 files changed

+111
-143
lines changed

cmd/tracking.go

Lines changed: 39 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -61,52 +61,17 @@ func (t *TrackingHandler) SetEventEmitter(eventEmitter EventEmitFn) {
6161
t.eventEmitter = eventEmitter
6262
}
6363

64-
func (t *TrackingHandler) CreateSession(userCode string, restore bool) (*model.Session, error) {
65-
ctx := context.Background()
66-
67-
user, err := t.gameTracker.GetUser(ctx, userCode)
68-
if err != nil {
69-
return nil, model.WrapError(model.ErrGetUser, err)
70-
}
71-
if err := t.sqlDb.SaveUser(ctx, *user); err != nil {
72-
return nil, model.WrapError(model.ErrSaveUser, err)
73-
}
74-
75-
var session *model.Session
76-
if restore {
77-
sesh, err := t.sqlDb.GetLatestSession(ctx, userCode)
78-
if err != nil {
79-
return nil, model.WrapError(model.ErrGetLatestSession, err)
80-
}
81-
session = sesh
82-
} else {
83-
sesh, err := t.sqlDb.CreateSession(ctx, userCode)
84-
if err != nil {
85-
return nil, model.WrapError(model.ErrCreateSession, err)
86-
}
87-
session = sesh
88-
}
89-
90-
session.LP = user.LP
91-
session.MR = user.MR
92-
session.UserName = user.DisplayName
93-
if err := t.sqlDb.UpdateSession(ctx, session); err != nil {
94-
slog.Error("update session:", slog.Any("error", err))
95-
}
96-
return session, nil
97-
}
98-
99-
func (t *TrackingHandler) StartTracking(sessionId string) error {
100-
slog.Info("started tracking", slog.String("session_id", sessionId))
101-
64+
func (t *TrackingHandler) StartTracking(userCode string, restore bool) error {
10265
ctx, cancel := context.WithCancel(context.Background())
10366
t.cancelPolling = cancel
10467

105-
session, err := t.sqlDb.GetSession(ctx, sessionId)
68+
session, err := t.makeSession(ctx, userCode, restore)
10669
if err != nil {
10770
return model.WrapError(model.ErrCreateSession, err)
10871
}
10972

73+
slog.Info("started tracking", slog.Int("session_id", int(session.Id)))
74+
11075
// update the ui with the latest match
11176
// or with the user's base stats
11277
var initMatch *model.Match
@@ -115,13 +80,13 @@ func (t *TrackingHandler) StartTracking(sessionId string) error {
11580
} else {
11681
initMatch = &model.Match{
11782
UserName: session.UserName,
118-
LP: session.LP,
119-
MR: session.MR,
83+
LP: session.EndingLP,
84+
MR: session.EndingMR,
12085
SessionId: session.Id,
12186
UserId: session.UserId,
12287
}
12388
}
124-
t.onNewMatch(ctx, session, initMatch, true)
89+
t.onNewMatch(ctx, initMatch, true)
12590

12691
ticker := time.NewTicker(30 * time.Second)
12792
t.forcePollChan = make(chan struct{})
@@ -140,7 +105,7 @@ func (t *TrackingHandler) StartTracking(sessionId string) error {
140105
cancel()
141106
return
142107
}
143-
t.onNewMatch(ctx, session, match, false)
108+
t.onNewMatch(ctx, match, false)
144109
for {
145110
select {
146111
case <-t.forcePollChan:
@@ -150,15 +115,15 @@ func (t *TrackingHandler) StartTracking(sessionId string) error {
150115
cancel()
151116
return
152117
}
153-
t.onNewMatch(ctx, session, match, false)
118+
t.onNewMatch(ctx, match, false)
154119
case <-ticker.C:
155120
slog.Info("polling")
156121
match, err := t.gameTracker.Poll(ctx, session)
157122
if err != nil {
158123
cancel()
159124
return
160125
}
161-
t.onNewMatch(ctx, session, match, false)
126+
t.onNewMatch(ctx, match, false)
162127
case <-ctx.Done():
163128
return
164129
}
@@ -168,11 +133,11 @@ func (t *TrackingHandler) StartTracking(sessionId string) error {
168133
return nil
169134
}
170135

171-
func (t *TrackingHandler) onNewMatch(ctx context.Context, session *model.Session, match *model.Match, dry bool) {
136+
func (t *TrackingHandler) onNewMatch(ctx context.Context, match *model.Match, dry bool) {
172137
if match == nil {
173138
return
174139
}
175-
t.eventEmitter("match", *match)
140+
t.eventEmitter("match")
176141
for _, mc := range t.matchChans {
177142
if mc != nil {
178143
mc <- *match
@@ -182,14 +147,6 @@ func (t *TrackingHandler) onNewMatch(ctx context.Context, session *model.Session
182147
return
183148
}
184149

185-
session.LP = match.LP
186-
session.MR = match.MR
187-
session.Matches = append([]*model.Match{match}, session.Matches...)
188-
189-
if err := t.sqlDb.UpdateSession(ctx, session); err != nil {
190-
slog.Error("update session:", slog.Any("error", err))
191-
return
192-
}
193150
if err := t.sqlDb.SaveMatch(ctx, *match); err != nil {
194151
slog.Error("save match to database", slog.Any("error", err))
195152
return
@@ -200,6 +157,33 @@ func (t *TrackingHandler) onNewMatch(ctx context.Context, session *model.Session
200157
}
201158
}
202159

160+
func (t *TrackingHandler) makeSession(ctx context.Context, userCode string, restore bool) (*model.Session, error) {
161+
user, err := t.gameTracker.GetUser(ctx, userCode)
162+
if err != nil {
163+
return nil, model.WrapError(model.ErrGetUser, err)
164+
}
165+
if err := t.sqlDb.SaveUser(ctx, *user); err != nil {
166+
return nil, model.WrapError(model.ErrSaveUser, err)
167+
}
168+
169+
var session *model.Session
170+
if restore {
171+
sesh, err := t.sqlDb.GetLatestSession(ctx, userCode)
172+
if err != nil {
173+
return nil, model.WrapError(model.ErrGetLatestSession, err)
174+
}
175+
session = sesh
176+
} else {
177+
sesh, err := t.sqlDb.CreateSession(ctx, userCode)
178+
if err != nil {
179+
return nil, model.WrapError(model.ErrCreateSession, err)
180+
}
181+
session = sesh
182+
}
183+
session.UserName = user.DisplayName
184+
return session, nil
185+
}
186+
203187
func (t *TrackingHandler) StopTracking() {
204188
t.cancelPolling()
205189
}

pkg/model/match.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ type Match struct {
77
ReplayID string `db:"replay_id" json:"replayId"`
88
Character string `db:"character" json:"character"`
99
LP int `db:"lp" json:"lp"`
10-
LPGain int `db:"lp_gain" json:"lpGain"`
1110
MR int `db:"mr" json:"mr"`
12-
MRGain int `db:"mr_gain" json:"mrGain"`
1311
Opponent string `db:"opponent" json:"opponent"`
1412
OpponentCharacter string `db:"opponent_character" json:"opponentCharacter"`
1513
OpponentLP int `db:"opponent_lp" json:"opponentLp"`
@@ -19,7 +17,4 @@ type Match struct {
1917
Date string `db:"date" json:"date"`
2018
Time string `db:"time" json:"time"`
2119
WinStreak int `db:"win_streak" json:"winStreak"`
22-
Wins int `db:"wins" json:"wins"`
23-
Losses int `db:"losses" json:"losses"`
24-
WinRate int `db:"win_rate" json:"winRate"`
2520
}

pkg/model/session.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ type Session struct {
55
UserId string `db:"user_id" json:"userId"`
66
UserName string `db:"user_name" json:"userName"`
77
CreatedAt string `db:"created_at" json:"createdAt"`
8-
LP int `db:"lp" json:"lp"`
9-
MR int `db:"mr" json:"mr"`
108
Matches []*Match `json:"matches"`
119
MatchesWon int `db:"matches_won" json:"matchesWon"`
1210
MatchesLost int `db:"matches_lost" json:"matchesLost"`
11+
WinRate int `db:"win_rate" json:"winRate"`
1312
EndingLP int `db:"ending_lp" json:"endingLp"`
1413
EndingMR int `db:"ending_mr" json:"endingMr"`
1514
StartingLP int `db:"starting_lp" json:"startingLp"`

pkg/storage/sql/session.go

Lines changed: 60 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ type SessionStorage interface {
1515
GetSession(ctx context.Context, sessionId string) (*model.Session, error)
1616
GetSessions(ctx context.Context, userId string, date string, limit uint8, offset uint16) ([]*model.Session, error)
1717
GetSessionsStatistics(ctx context.Context, userId string) (*model.SessionsStatistics, error)
18-
UpdateSession(ctx context.Context, session *model.Session) error
1918
}
2019

2120
func (s *Storage) CreateSession(ctx context.Context, userId string) (*model.Session, error) {
@@ -52,22 +51,6 @@ func (s *Storage) CreateSession(ctx context.Context, userId string) (*model.Sess
5251
return &sesh, nil
5352
}
5453

55-
func (s *Storage) GetSession(ctx context.Context, sessionId string) (*model.Session, error) {
56-
query, args, err := sqlx.In(`
57-
SELECT * FROM sessions
58-
WHERE id = (?)
59-
LIMIT 1
60-
`, sessionId)
61-
if err != nil {
62-
return nil, fmt.Errorf("prepare get user clause: %w", err)
63-
}
64-
var session *model.Session
65-
if err := s.db.GetContext(ctx, session, query, args...); err != nil {
66-
return nil, fmt.Errorf("get session: %w", err)
67-
}
68-
return session, nil
69-
}
70-
7154
type monthlySessionCount struct {
7255
Month string `db:"month"`
7356
Count uint16 `db:"count"`
@@ -114,6 +97,48 @@ func (s *Storage) GetSessionsStatistics(ctx context.Context, userId string) (*mo
11497
}, nil
11598
}
11699

100+
func (s *Storage) GetSession(ctx context.Context, sessionId string) (*model.Session, error){
101+
query, args, err := sqlx.In(`
102+
SELECT
103+
s.id,
104+
s.created_at,
105+
u.display_name AS user_name,
106+
s.user_id,
107+
108+
COUNT(IIF(m.victory, 1, NULL)) AS matches_won,
109+
COUNT(IIF(m.victory = false, 1, NULL)) AS matches_lost,
110+
(100 * COUNT(IIF(m.victory, 1, NULL)) / COUNT(*)) AS win_rate,
111+
112+
m.lp AS starting_lp,
113+
IIF(m.lp != MAX(m.lp), MAX(m.lp), MIN(m.lp)) AS ending_lp,
114+
(MAX(m.lp) - MIN(m.lp)) AS lp_gain,
115+
116+
m.mr AS starting_mr,
117+
IIF(m.mr != MAX(m.mr), MAX(m.mr), MIN(m.mr)) AS ending_mr,
118+
(MAX(m.mr) - MIN(m.mr)) AS mr_gain
119+
FROM sessions AS s
120+
JOIN users u ON u.code = s.user_id
121+
JOIN matches m on s.id = m.session_id
122+
WHERE s.session_id = (?)
123+
GROUP BY s.id
124+
ORDER BY s.id DESC
125+
`, sessionId)
126+
if err != nil {
127+
return nil, fmt.Errorf("prepare get sessions query: %w", err)
128+
}
129+
var session *model.Session
130+
err = s.db.SelectContext(ctx, &session, query, args...)
131+
if err != nil {
132+
return nil, fmt.Errorf("excute get session query: %w", err)
133+
}
134+
matches, err := s.GetMatches(ctx, session.Id, session.UserId, 0, 0)
135+
if err != nil {
136+
return nil, fmt.Errorf("get matches by session: %w", err)
137+
}
138+
session.Matches = matches
139+
return session, nil
140+
}
141+
117142
func (s *Storage) GetSessions(ctx context.Context, userId string, date string, limit uint8, offset uint16) ([]*model.Session, error) {
118143
pagination := ``
119144
if limit != 0 || offset != 0 {
@@ -136,20 +161,24 @@ func (s *Storage) GetSessions(ctx context.Context, userId string, date string, l
136161
query, args, err := sqlx.In(fmt.Sprintf(`
137162
SELECT
138163
s.id,
139-
s.created_at,
140-
u.display_name as user_name,
141-
s.user_id,
142-
COUNT(IIF(m.victory, 1, NULL)) as matches_won,
143-
COUNT(IIF(m.victory = false, 1, NULL)) as matches_lost,
144-
m.lp as starting_lp,
145-
s.lp as ending_lp,
146-
(s.lp - m.lp) as lp_gain,
147-
m.mr as starting_mr,
148-
s.mr as ending_mr,
149-
(s.mr - m.mr) as mr_gain
150-
FROM sessions as s
151-
JOIN users u on u.code = s.user_id
152-
JOIN matches m on s.id = m.session_id
164+
s.created_at,
165+
u.display_name AS user_name,
166+
s.user_id,
167+
168+
COUNT(IIF(m.victory, 1, NULL)) AS matches_won,
169+
COUNT(IIF(m.victory = false, 1, NULL)) AS matches_lost,
170+
(100 * COUNT(IIF(m.victory, 1, NULL)) / COUNT(*)) AS win_rate,
171+
172+
m.lp AS starting_lp,
173+
IIF(m.lp != MAX(m.lp), MAX(m.lp), MIN(m.lp)) AS ending_lp,
174+
(MAX(m.lp) - MIN(m.lp)) AS lp_gain,
175+
176+
m.mr AS starting_mr,
177+
IIF(m.mr != MAX(m.mr), MAX(m.mr), MIN(m.mr)) AS ending_mr,
178+
(MAX(m.mr) - MIN(m.mr)) AS mr_gain
179+
FROM sessions AS s
180+
JOIN users u ON u.code = s.user_id
181+
JOIN matches m on s.id = m.session_id
153182
%s
154183
GROUP BY s.id
155184
ORDER BY s.id DESC
@@ -166,21 +195,6 @@ func (s *Storage) GetSessions(ctx context.Context, userId string, date string, l
166195
return sessions, nil
167196
}
168197

169-
func (s *Storage) UpdateSession(ctx context.Context, session *model.Session) error {
170-
query := `
171-
UPDATE sessions
172-
SET
173-
lp = :lp,
174-
mr = :mr
175-
WHERE id = :id
176-
`
177-
_, err := s.db.NamedExecContext(ctx, query, session)
178-
if err != nil {
179-
return fmt.Errorf("excute query: %w", err)
180-
}
181-
return nil
182-
}
183-
184198
func (s *Storage) GetLatestSession(ctx context.Context, userId string) (*model.Session, error) {
185199
sessions, err := s.GetSessions(ctx, userId, "", 1, 0)
186200
if err != nil {

pkg/tracker/sf6/track.go

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func (t *SF6Tracker) Poll(ctx context.Context, session *model.Session) (*model.M
4343
if bl == nil || len(bl.ReplayList) == 0 {
4444
return nil, nil
4545
}
46+
4647
lastReplay := bl.ReplayList[0]
4748
var prevMatch model.Match
4849
if len(session.Matches) > 0 {
@@ -61,16 +62,6 @@ func (t *SF6Tracker) Poll(ctx context.Context, session *model.Session) (*model.M
6162
opponent = lastReplay.Player1Info
6263
}
6364
victory := !isVictory(opponent.RoundResults)
64-
wins := prevMatch.Wins
65-
losses := prevMatch.Losses
66-
winStreak := prevMatch.WinStreak
67-
if victory {
68-
wins++
69-
winStreak++
70-
} else {
71-
losses++
72-
winStreak = 0
73-
}
7465

7566
return &model.Match{
7667
Character: bl.GetCharacter(),
@@ -82,14 +73,14 @@ func (t *SF6Tracker) Poll(ctx context.Context, session *model.Session) (*model.M
8273
OpponentLeague: getLeagueFromLP(opponent.LeaguePoint),
8374
OpponentMR: opponent.MasterRating,
8475
Victory: victory,
85-
Wins: wins,
86-
Losses: losses,
87-
WinStreak: winStreak,
76+
WinStreak: func() int {
77+
if victory {
78+
return prevMatch.WinStreak + 1
79+
}
80+
return 0
81+
}(),
8882
Date: time.Now().Format(`2006-01-02`),
8983
Time: time.Now().Format(`15:04`),
90-
LPGain: prevMatch.LPGain + bl.GetLP() - session.LP,
91-
MRGain: prevMatch.MRGain + bl.GetMR() - session.MR,
92-
WinRate: int((float64(wins) / float64(wins+losses)) * 100),
9384
UserId: session.UserId,
9485
UserName: session.UserName,
9586
SessionId: session.Id,

0 commit comments

Comments
 (0)