From ff5cefa7acdc4ac24e936143c7e0ebc6002cf428 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Tue, 6 Sep 2022 19:26:05 +0200 Subject: [PATCH] Can ask student browser where they are in the page --- direct.go | 29 ++++++++++++- ui/src/routes/surveys/[sid]/admin.svelte | 54 +++++++++++++++++++++--- ui/src/routes/surveys/[sid]/live.svelte | 3 ++ 3 files changed, 79 insertions(+), 7 deletions(-) diff --git a/direct.go b/direct.go index 36ee796..0ccdf8a 100644 --- a/direct.go +++ b/direct.go @@ -35,7 +35,7 @@ func declareAPIAdminDirectRoutes(router *gin.RouterGroup) { } func WSSurveyStats(sid int64) map[string]interface{} { - var users []string + var users []map[string]interface{} var nb int WSClientsMutex.RLock() @@ -43,7 +43,10 @@ func WSSurveyStats(sid int64) map[string]interface{} { if w, ok := WSClients[sid]; ok { nb = len(w) for _, ws := range w { - users = append(users, ws.u.Login) + users = append(users, map[string]interface{}{ + "id": ws.u.Id, + "login": ws.u.Login, + }) } } @@ -139,6 +142,26 @@ func SurveyWS(c *gin.Context) { ch <- msgCurrentState(survey) go SurveyWS_run(ws, ch, survey.Id, u) + go func(c chan WSMessage, sid int) { + var v WSMessage + var err error + for { + err = wsjson.Read(context.Background(), ws, &v) + if err != nil { + log.Println("Error when receiving message:", err) + close(c) + break + } + + if v.Action == "myscroll" { + v.UserId = &u.Id + v.SurveyId = &survey.Id + WSAdminWriteAll(v) + } else { + log.Println("Unknown ws response:", v.Action) + } + } + }(ch, int(survey.Id)) } func WSWriteAll(message WSMessage) { @@ -423,6 +446,8 @@ func SurveyWSAdmin(c *gin.Context) { } } } + } else if v.Action == "where_are_you" { + survey.WSWriteAll(v) } else { log.Println("Unknown admin action:", v.Action) } diff --git a/ui/src/routes/surveys/[sid]/admin.svelte b/ui/src/routes/surveys/[sid]/admin.svelte index ef8a014..dbd3bd3 100644 --- a/ui/src/routes/surveys/[sid]/admin.svelte +++ b/ui/src/routes/surveys/[sid]/admin.svelte @@ -89,6 +89,16 @@ } updateUsers(); + let scroll_states = { }; + let scroll_mean = 0; + $: { + let mean = 0; + for (const k in scroll_states) { + mean += scroll_states[k]; + } + scroll_mean = mean / Object.keys(scroll_states).length; + } + let responsesbyid = { }; $: { const tmp = { }; @@ -200,6 +210,13 @@ } else if (data.action && data.action == "new_ask") { asks.push({"id": data.question, "content": data.value, "userid": data.user}); asks = asks; + } else if (data.action && data.action == "myscroll" && wsstats && wsstats.users) { + scroll_states[data.user] = parseFloat(data.value); + for (const k in wsstats.users) { + if (wsstats.users[k].id == data.user) { + wsstats.users[k].myscroll = scroll_states[data.user]; + } + } } else if (data.action && data.action == "end") { ws.close(); updateSurvey(); @@ -646,23 +663,50 @@ -

+ +

Connectés {#if wsstats} {wsstats.nb_clients} utilisateurs {/if} + {#if scroll_mean} + = 0 && scroll_mean < 0.2} + class:text-warning={scroll_mean >= 0.2 && scroll_mean < 0.6} + class:text-info={scroll_mean >= 0.6 && scroll_mean < 0.9} + class:text-success={scroll_mean >= 0.9} + >Avancement global : {Math.trunc(scroll_mean*10000)/100} % + {/if}

{#if wsstats && wsstats.users}
- {#each wsstats.users as login, lid (lid)} + {#each wsstats.users as user, lid (lid)}
- {login} + {user.login} + {#if user.myscroll != null} + + {/if}
{/each} diff --git a/ui/src/routes/surveys/[sid]/live.svelte b/ui/src/routes/surveys/[sid]/live.svelte index 1f8e3f9..cee5a60 100644 --- a/ui/src/routes/surveys/[sid]/live.svelte +++ b/ui/src/routes/surveys/[sid]/live.svelte @@ -118,6 +118,9 @@ } else { timer_init = null; } + + } else if (data.action && data.action == "where_are_you") { + ws.send('{"action":"myscroll", "value": "' + (window.scrollY/window.scrollMaxY) +'", "question": '+show_question+', "corrected": '+(survey.corrected==true)+'}') } else { show_question = null; if (timer_cancel) {