@@ -57,170 +57,176 @@ func NewTrackingHandler(
5757 }
5858}
5959
60- func (ch * TrackingHandler ) SetEventEmitter (eventEmitter EventEmitFn ) {
61- ch .eventEmitter = eventEmitter
60+ func (t * TrackingHandler ) SetEventEmitter (eventEmitter EventEmitFn ) {
61+ t .eventEmitter = eventEmitter
6262}
6363
64- func (ch * TrackingHandler ) StartTracking (userCode string , restore bool ) error {
65- slog . Info ( "started tracking" , slog . String ( "user_code" , userCode ), slog . Bool ( "restoring" , restore ) )
64+ func (t * TrackingHandler ) CreateSession (userCode string , restore bool ) ( * model. Session , error ) {
65+ ctx := context . Background ( )
6666
67- ctx , cancel := context .WithCancel (context .Background ())
68- ch .cancelPolling = cancel
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+ }
6974
7075 var session * model.Session
7176 if restore {
72- sesh , err := ch .sqlDb .GetLatestSession (ctx , userCode )
77+ sesh , err := t .sqlDb .GetLatestSession (ctx , userCode )
7378 if err != nil {
74- return model .WrapError (model .ErrGetLatestSession , err )
79+ return nil , model .WrapError (model .ErrGetLatestSession , err )
7580 }
7681 session = sesh
7782 } else {
78- sesh , err := ch .sqlDb .CreateSession (ctx , userCode )
83+ sesh , err := t .sqlDb .CreateSession (ctx , userCode )
7984 if err != nil {
80- return model .WrapError (model .ErrCreateSession , err )
85+ return nil , model .WrapError (model .ErrCreateSession , err )
8186 }
8287 session = sesh
8388 }
84- if session == nil {
85- return model .ErrCreateSession
86- }
8789
88- user , err := ch .gameTracker .GetUser (ctx , userCode )
89- if err != nil {
90- return model .WrapError (model .ErrGetUser , err )
91- }
92- if err := ch .sqlDb .SaveUser (ctx , * user ); err != nil {
93- return model .WrapError (model .ErrSaveUser , err )
94- }
9590 session .LP = user .LP
9691 session .MR = user .MR
9792 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+ }
9898
99- ch .eventEmitter ("match" , model.Match {
100- UserName : session .UserName ,
101- LP : session .LP ,
102- MR : session .MR ,
103- SessionId : session .Id ,
104- UserId : session .UserId ,
105- })
99+ func (t * TrackingHandler ) StartTracking (sessionId string ) error {
100+ slog .Info ("started tracking" , slog .String ("session_id" , sessionId ))
106101
107- ticker := time .NewTicker (30 * time .Second )
108- ch .forcePollChan = make (chan struct {})
109- defer func () {
110- ch .eventEmitter ("stopped-tracking" )
111- ticker .Stop ()
112- cancel ()
113- close (ch .forcePollChan )
114- ch .forcePollChan = nil
115- }()
116-
117- matchChan := make (chan model.Match )
102+ ctx , cancel := context .WithCancel (context .Background ())
103+ t .cancelPolling = cancel
118104
119- onNewMatch := func (match * model.Match ) {
120- if match == nil {
121- return
122- }
123- matchChan <- * match
124- for _ , mc := range ch .matchChans {
125- if mc != nil {
126- mc <- * match
127- }
128- }
105+ session , err := t .sqlDb .GetSession (ctx , sessionId )
106+ if err != nil {
107+ return model .WrapError (model .ErrCreateSession , err )
129108 }
130109
110+ // update the ui with the latest match
111+ // or with the user's base stats
112+ var initMatch * model.Match
131113 if len (session .Matches ) > 0 {
132- match := * session .Matches [0 ]
133- ch .eventEmitter ("match" , match )
134- for _ , mc := range ch .matchChans {
135- if mc != nil {
136- mc <- match
137- }
114+ initMatch = session .Matches [0 ]
115+ } else {
116+ initMatch = & model.Match {
117+ UserName : session .UserName ,
118+ LP : session .LP ,
119+ MR : session .MR ,
120+ SessionId : session .Id ,
121+ UserId : session .UserId ,
138122 }
139123 }
124+ t .onNewMatch (ctx , session , initMatch , true )
125+
126+ ticker := time .NewTicker (30 * time .Second )
127+ t .forcePollChan = make (chan struct {})
128+ defer func () {
129+ t .eventEmitter ("stopped-tracking" )
130+ ticker .Stop ()
131+ cancel ()
132+ close (t .forcePollChan )
133+ t .forcePollChan = nil
134+ }()
140135
141136 go func () {
142137 slog .Info ("polling" )
143- match , err := ch .gameTracker .Poll (ctx , session )
138+ match , err := t .gameTracker .Poll (ctx , session )
144139 if err != nil {
145140 cancel ()
146141 return
147142 }
148- onNewMatch (match )
143+ t . onNewMatch (ctx , session , match , false )
149144 for {
150145 select {
151- case <- ch .forcePollChan :
146+ case <- t .forcePollChan :
152147 slog .Info ("forced poll" )
153- match , err := ch .gameTracker .Poll (ctx , session )
148+ match , err := t .gameTracker .Poll (ctx , session )
154149 if err != nil {
155150 cancel ()
156151 return
157152 }
158- onNewMatch (match )
153+ t . onNewMatch (ctx , session , match , false )
159154 case <- ticker .C :
160155 slog .Info ("polling" )
161- match , err := ch .gameTracker .Poll (ctx , session )
156+ match , err := t .gameTracker .Poll (ctx , session )
162157 if err != nil {
163158 cancel ()
164159 return
165160 }
166- onNewMatch (match )
161+ t . onNewMatch (ctx , session , match , false )
167162 case <- ctx .Done ():
168- close (matchChan )
169163 return
170164 }
171165 }
172166 }()
173167
174- for match := range matchChan {
175- ch .eventEmitter ("match" , match )
176-
177- session .LP = match .LP
178- session .MR = match .MR
179- session .Matches = append ([]* model.Match {& match }, session .Matches ... )
168+ return nil
169+ }
180170
181- if err := ch .sqlDb .UpdateSession (ctx , session ); err != nil {
182- slog .Error ("update session:" , slog .Any ("error" , err ))
183- break
184- }
185- if err := ch .sqlDb .SaveMatch (ctx , match ); err != nil {
186- slog .Error ("save match to database" , slog .Any ("error" , err ))
187- break
188- }
189- if err := ch .txtDb .SaveMatch (match ); err != nil {
190- slog .Error ("save to text files:" , slog .Any ("error" , err ))
191- break
171+ func (t * TrackingHandler ) onNewMatch (ctx context.Context , session * model.Session , match * model.Match , dry bool ) {
172+ if match == nil {
173+ return
174+ }
175+ t .eventEmitter ("match" , * match )
176+ for _ , mc := range t .matchChans {
177+ if mc != nil {
178+ mc <- * match
192179 }
193180 }
194- return nil
181+ if dry {
182+ return
183+ }
184+
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+ }
193+ if err := t .sqlDb .SaveMatch (ctx , * match ); err != nil {
194+ slog .Error ("save match to database" , slog .Any ("error" , err ))
195+ return
196+ }
197+ if err := t .txtDb .SaveMatch (* match ); err != nil {
198+ slog .Error ("save to text files:" , slog .Any ("error" , err ))
199+ return
200+ }
195201}
196202
197- func (ch * TrackingHandler ) StopTracking () {
198- ch .cancelPolling ()
203+ func (t * TrackingHandler ) StopTracking () {
204+ t .cancelPolling ()
199205}
200206
201- func (ch * TrackingHandler ) SelectGame (game model.GameType ) error {
207+ func (t * TrackingHandler ) SelectGame (game model.GameType ) error {
202208 var username , password string
203209 switch game {
204210 case model .GameTypeT8 :
205- ch .gameTracker = t8 .NewT8Tracker (ch .wavuClient )
211+ t .gameTracker = t8 .NewT8Tracker (t .wavuClient )
206212 case model .GameTypeSF6 :
207- ch .gameTracker = sf6 .NewSF6Tracker (ch .cfnClient )
208- username = ch .cfg .CapIDEmail
209- password = ch .cfg .CapIDPassword
213+ t .gameTracker = sf6 .NewSF6Tracker (t .cfnClient )
214+ username = t .cfg .CapIDEmail
215+ password = t .cfg .CapIDPassword
210216 default :
211217 return model .WrapError (model .ErrSelectGame , fmt .Errorf ("game does not exist" ))
212218 }
213219
214220 authChan := make (chan tracker.AuthStatus )
215221 ctx , cancel := context .WithTimeout (context .Background (), 60 * time .Second )
216222 defer cancel ()
217- go ch .gameTracker .Authenticate (ctx , username , password , authChan )
223+ go t .gameTracker .Authenticate (ctx , username , password , authChan )
218224 for status := range authChan {
219225 if status .Err != nil {
220226 return model .WrapError (model .ErrAuth , status .Err )
221227 }
222228
223- ch .eventEmitter ("auth-progress" , status .Progress )
229+ t .eventEmitter ("auth-progress" , status .Progress )
224230
225231 if status .Progress >= 100 {
226232 close (authChan )
@@ -230,8 +236,8 @@ func (ch *TrackingHandler) SelectGame(game model.GameType) error {
230236 return nil
231237}
232238
233- func (ch * TrackingHandler ) ForcePoll () {
234- if ch .forcePollChan != nil {
235- ch .forcePollChan <- struct {}{}
239+ func (t * TrackingHandler ) ForcePoll () {
240+ if t .forcePollChan != nil {
241+ t .forcePollChan <- struct {}{}
236242 }
237243}
0 commit comments