dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 188cac20261586e782bf9705fdc6a6b578efe69b
parent cbb8bb303e66bed80ec607a4e8dfc8dbc174b1d3
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Sat, 27 May 2023 17:51:28 -0700

fix read-marker for stream chat

Diffstat:
Mpkg/web/handlers/api/v1/messages.qtpl | 8++++----
Mpkg/web/handlers/api/v1/messages.qtpl.go | 49++++++++++++++++++++++---------------------------
Mpkg/web/handlers/api/v1/msgInterceptor.go | 1+
Mpkg/web/handlers/handlers.go | 12++++++++++++
4 files changed, 39 insertions(+), 31 deletions(-)

diff --git a/pkg/web/handlers/api/v1/messages.qtpl b/pkg/web/handlers/api/v1/messages.qtpl @@ -314,13 +314,13 @@ {%- func RenderMessage(idx int, e database.ChatMessage, AuthUser *database.User, Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) -%} {%- if e.UserCanSee(*AuthUser) -%} + {%- if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered %} + <div class="read-marker read-marker-0"></div> + {%- code *readMarkerRendered = true -%} + {%- endif -%} <div id="msgid-{%s e.UUID %}" class="msgidc-{%s e.UUID %}-{%dl e.Rev %} msg {%- if (e.User.IsHellbanned || e.IsHellbanned) && AuthUser.DisplayHellbanned %} hb-row {%- elseif AuthUser.ID == e.User.ID && AuthUser.HighlightOwnMessages %} own-highlight{%- endif -%} - {%- if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered %} - {%- if idx > 0 -%} read-marker{%- endif -%} - {%- code *readMarkerRendered = true -%} - {%- endif -%} "> {%- if e.UserCanDelete(*AuthUser) -%} {%- if !e.TooOldToDelete() -%} diff --git a/pkg/web/handlers/api/v1/messages.qtpl.go b/pkg/web/handlers/api/v1/messages.qtpl.go @@ -693,46 +693,41 @@ func StreamRenderMessage(qw422016 *qt422016.Writer, idx int, e database.ChatMess Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) { //line messages.qtpl:316 if e.UserCanSee(*AuthUser) { -//line messages.qtpl:316 - qw422016.N().S(` <div id="msgid-`) //line messages.qtpl:317 - qw422016.E().S(e.UUID) + if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered { //line messages.qtpl:317 + qw422016.N().S(` + <div class="read-marker read-marker-0"></div> +`) +//line messages.qtpl:319 + *readMarkerRendered = true + +//line messages.qtpl:320 + } +//line messages.qtpl:320 + qw422016.N().S(` <div id="msgid-`) +//line messages.qtpl:321 + qw422016.E().S(e.UUID) +//line messages.qtpl:321 qw422016.N().S(`" class="msgidc-`) -//line messages.qtpl:317 +//line messages.qtpl:321 qw422016.E().S(e.UUID) -//line messages.qtpl:317 +//line messages.qtpl:321 qw422016.N().S(`-`) -//line messages.qtpl:317 +//line messages.qtpl:321 qw422016.N().DL(e.Rev) -//line messages.qtpl:317 +//line messages.qtpl:321 qw422016.N().S(` msg `) -//line messages.qtpl:318 +//line messages.qtpl:322 if (e.User.IsHellbanned || e.IsHellbanned) && AuthUser.DisplayHellbanned { -//line messages.qtpl:318 +//line messages.qtpl:322 qw422016.N().S(` hb-row `) -//line messages.qtpl:319 +//line messages.qtpl:323 } else if AuthUser.ID == e.User.ID && AuthUser.HighlightOwnMessages { -//line messages.qtpl:319 +//line messages.qtpl:323 qw422016.N().S(` own-highlight`) -//line messages.qtpl:319 - } -//line messages.qtpl:320 - if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered { -//line messages.qtpl:320 - qw422016.N().S(` -`) -//line messages.qtpl:321 - if idx > 0 { -//line messages.qtpl:321 - qw422016.N().S(`read-marker`) -//line messages.qtpl:321 - } -//line messages.qtpl:322 - *readMarkerRendered = true - //line messages.qtpl:323 } //line messages.qtpl:323 diff --git a/pkg/web/handlers/api/v1/msgInterceptor.go b/pkg/web/handlers/api/v1/msgInterceptor.go @@ -54,6 +54,7 @@ func (i MsgInterceptor) InterceptMsg(cmd *Command) { // Update chat read marker cmd.db.UpdateChatReadMarker(cmd.authUser.ID, cmd.room.ID) + database.MsgPubSub.Pub("readmarker_"+string(cmd.authUser.Username), database.ChatMessageType{Typ: database.ForceRefresh}) // Update user activity isPM := cmd.toUser != nil diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -5079,13 +5079,17 @@ func ChatStreamMessagesHandler(c echo.Context) error { c.Response().Flush() selfRefreshTopic := "refresh_" + string(authUser.Username) + readMarkerTopic := "readmarker_" + string(authUser.Username) authorizedChannels := []string{ "refresh", selfRefreshTopic, + readMarkerTopic, "room_" + room.ID.String()} sub := database.MsgPubSub.Subscribe(authorizedChannels) defer sub.Close() + readMarkerRev := 0 + var indicatorSelector bool Loop: for { @@ -5122,6 +5126,14 @@ Loop: continue } + if topic == readMarkerTopic { + send(fmt.Sprintf(`<style>.read-marker-%d{display:none}</style>`, readMarkerRev)) + send(fmt.Sprintf(`<div class="read-marker read-marker-%d"></div>`, readMarkerRev+1)) + readMarkerRev++ + c.Response().Flush() + continue + } + if topic == selfRefreshTopic || msgTyp.Typ == database.ForceRefresh { send(`<meta http-equiv="refresh" content="0" />`) return nil