diff options
Diffstat (limited to '')
-rw-r--r-- | courses.go | 11 | ||||
-rw-r--r-- | wsc.go | 11 | ||||
-rw-r--r-- | wsm.go | 19 | ||||
-rw-r--r-- | wsp.go | 15 |
4 files changed, 42 insertions, 14 deletions
@@ -25,6 +25,8 @@ import ( "errors" "fmt" "sync" + + "github.com/coder/websocket" ) type ( @@ -213,13 +215,18 @@ func populateUserCourseGroups(ctx context.Context, userCourseGroups *userCourseG return nil } -func (course *courseT) decrementSelectedAndPropagate() { +func (course *courseT) decrementSelectedAndPropagate(ctx context.Context, conn *websocket.Conn) error { func() { course.SelectedLock.Lock() defer course.SelectedLock.Unlock() course.Selected-- }() - propagateSelectedUpdate(course.ID) + go propagateSelectedUpdate(course.ID) + err := sendSelectedUpdate(ctx, conn, course.ID) + if err != nil { + return fmt.Errorf("error sending selected update on decrement: %w", err) + } + return nil } func getCourseByID(courseID int) *courseT { @@ -211,16 +211,9 @@ func handleConn( * closed page which should explain it. */ case courseID := <-usemParent: - var selected int - func() { - course := courses[courseID] - course.SelectedLock.RLock() - defer course.SelectedLock.RUnlock() - selected = course.Selected - }() - err := writeText(newCtx, c, fmt.Sprintf("M %d %d", courseID, selected)) + err := sendSelectedUpdate(newCtx, c, courseID) if err != nil { - return fmt.Errorf("error sending to websocket for course selected update: %w", err) + return fmt.Errorf("error acting on usem: %w", err) } continue case errbytes := <-recv: @@ -132,7 +132,10 @@ func messageChooseCourse(ctx context.Context, c *websocket.Conn, reportError rep go propagateSelectedUpdate(courseID) err := tx.Commit(ctx) if err != nil { - go course.decrementSelectedAndPropagate() + err := course.decrementSelectedAndPropagate(ctx, c) + if err != nil { + return fmt.Errorf("error decrementing and notifying: %w", err) + } return reportError("Database error while committing transaction") } var thisCourseGroup courseGroupT @@ -142,7 +145,10 @@ func messageChooseCourse(ctx context.Context, c *websocket.Conn, reportError rep thisCourseGroup = courses[courseID].Group }() if (*userCourseGroups)[thisCourseGroup] { - go course.decrementSelectedAndPropagate() + err := course.decrementSelectedAndPropagate(ctx, c) + if err != nil { + return fmt.Errorf("error decrementing and notifying: %w", err) + } return reportError("inconsistent user course groups") } (*userCourseGroups)[thisCourseGroup] = true @@ -150,6 +156,10 @@ func messageChooseCourse(ctx context.Context, c *websocket.Conn, reportError rep if err != nil { return fmt.Errorf("error affirming course choice: %w", err) } + err = sendSelectedUpdate(ctx, c, courseID) + if err != nil { + return fmt.Errorf("error notifying after increment: %w", err) + } } else { err := tx.Rollback(ctx) if err != nil { @@ -202,7 +212,10 @@ func messageUnchooseCourse(ctx context.Context, c *websocket.Conn, reportError r } if ct.RowsAffected() != 0 { - go course.decrementSelectedAndPropagate() + err := course.decrementSelectedAndPropagate(ctx, c) + if err != nil { + return fmt.Errorf("error decrementing and notifying: %w", err) + } var thisCourseGroup courseGroupT func() { coursesLock.RLock() @@ -83,3 +83,18 @@ func propagateSelectedUpdate(courseID int) { usem.set() } } + +func sendSelectedUpdate(ctx context.Context, conn *websocket.Conn, courseID int) error { + var selected int + func() { + course := courses[courseID] + course.SelectedLock.RLock() + defer course.SelectedLock.RUnlock() + selected = course.Selected + }() + err := writeText(ctx, conn, fmt.Sprintf("M %d %d", courseID, selected)) + if err != nil { + return fmt.Errorf("error sending to websocket for course selected update: %w", err) + } + return nil +} |