summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--courses.go11
-rw-r--r--wsc.go11
-rw-r--r--wsm.go19
-rw-r--r--wsp.go15
4 files changed, 42 insertions, 14 deletions
diff --git a/courses.go b/courses.go
index 4e1ea51..17fa311 100644
--- a/courses.go
+++ b/courses.go
@@ -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 {
diff --git a/wsc.go b/wsc.go
index 982c1fb..312660e 100644
--- a/wsc.go
+++ b/wsc.go
@@ -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:
diff --git a/wsm.go b/wsm.go
index 5f271ff..b2d200f 100644
--- a/wsm.go
+++ b/wsm.go
@@ -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()
diff --git a/wsp.go b/wsp.go
index 7a1f6ab..d4b8f08 100644
--- a/wsp.go
+++ b/wsp.go
@@ -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
+}