dkforest

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

commit 542a16fd971200319a895fd3e5f2c6fa72fc2855
parent dba1f410b790badcb3d1deecf199d2793fcc9433
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon, 22 May 2023 07:28:10 -0700

Allow "edit" to be reflected in the "stream" chat; old message hidden

Diffstat:
Acmd/dkf/migrations/131.sql | 4++++
Mpkg/database/tableChatMessages.go | 15++++++++++++---
Mpkg/web/handlers/api/v1/messages.qtpl | 2+-
Mpkg/web/handlers/api/v1/messages.qtpl.go | 10+++++++++-
Mpkg/web/handlers/handlers.go | 7++++++-
5 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/cmd/dkf/migrations/131.sql b/cmd/dkf/migrations/131.sql @@ -0,0 +1,4 @@ +-- +migrate Up +ALTER TABLE chat_messages ADD COLUMN rev INTEGER NOT NULL DEFAULT 0; + +-- +migrate Down diff --git a/pkg/database/tableChatMessages.go b/pkg/database/tableChatMessages.go @@ -76,6 +76,7 @@ type ChatMessage struct { System bool Moderators bool IsHellbanned bool + Rev int64 // Revision, is incr every time a message is edited } func (m *ChatMessage) GetProfile(authUser *User) string { @@ -471,7 +472,7 @@ func (d *DkfDB) CreateSysMsg(raw, txt, roomKey string, roomID RoomID, userID Use msg := makeMsg(raw, txt, roomID, userID) msg.System = true err := d.db.Create(&msg).Error - MsgPubSub.Pub("room_"+utils.FormatInt64(int64(roomID)), &msg) + MsgPubSub.Pub("room_"+utils.FormatInt64(int64(roomID)), ChatMessageType{Typ: 0, Msg: &msg}) return err } @@ -513,9 +514,12 @@ func (d *DkfDB) CreateOrEditMessage( } } + typ := 0 if editMsg != nil { + typ = 1 editMsg.Message = message editMsg.RawMessage = raw + editMsg.Rev++ // Delete inboxes, we'll create new ones bellow _ = d.DeleteChatInboxMessageByChatMessageID(editMsg.ID) } else { @@ -531,11 +535,16 @@ func (d *DkfDB) CreateOrEditMessage( } } editMsg.DoSave(d) - MsgPubSub.Pub("room_"+utils.FormatInt64(int64(roomID)), editMsg) + MsgPubSub.Pub("room_"+utils.FormatInt64(int64(roomID)), ChatMessageType{Typ: typ, Msg: editMsg}) return editMsg.ID, nil } -var MsgPubSub = pubsub.NewPubSub[*ChatMessage]() +type ChatMessageType struct { + Typ int + Msg *ChatMessage +} + +var MsgPubSub = pubsub.NewPubSub[ChatMessageType]() func encryptMessages(html, origMessage, roomKey string) (string, string, error) { var err error diff --git a/pkg/web/handlers/api/v1/messages.qtpl b/pkg/web/handlers/api/v1/messages.qtpl @@ -284,7 +284,7 @@ {%- func RenderMessage(idx int, e database.ChatMessage, AuthUser *database.User, Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) -%} {%- if e.UserCanSee(*AuthUser) -%} - <div id="msgid-{%s e.UUID %}" class="msg + <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 %} diff --git a/pkg/web/handlers/api/v1/messages.qtpl.go b/pkg/web/handlers/api/v1/messages.qtpl.go @@ -668,7 +668,15 @@ func StreamRenderMessage(qw422016 *qt422016.Writer, idx int, e database.ChatMess //line messages.qtpl:287 qw422016.E().S(e.UUID) //line messages.qtpl:287 - qw422016.N().S(`" class="msg + qw422016.N().S(`" class="msgidc-`) +//line messages.qtpl:287 + qw422016.E().S(e.UUID) +//line messages.qtpl:287 + qw422016.N().S(`-`) +//line messages.qtpl:287 + qw422016.N().DL(e.Rev) +//line messages.qtpl:287 + qw422016.N().S(` msg `) //line messages.qtpl:288 if (e.User.IsHellbanned || e.IsHellbanned) && AuthUser.DisplayHellbanned { diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -4972,13 +4972,15 @@ Loop: } managers.ActiveUsers.UpdateUserInRoom(room, managers.NewUserInfo(*authUser, nil)) - _, msg, err := sub.ReceiveTimeout(1 * time.Second) + _, msgTyp, err := sub.ReceiveTimeout(1 * time.Second) if err != nil { continue } i++ + msg := msgTyp.Msg + user, _ := db.GetUserByID(msg.UserID) msg.User = user if msg.ToUserID != nil { @@ -4993,6 +4995,9 @@ Loop: isFirstMsg := false s := v1.RenderMessage(1, *msg, authUser, data, baseTopBarURL, &readMarkerRendered, &isFirstMsg, csrf, config.NullUsername) _, _ = c.Response().Write([]byte(fmt.Sprintf(`%s`, s))) + if msgTyp.Typ == 1 { + _, _ = c.Response().Write([]byte(fmt.Sprintf(`<style>.msgidc-%s-%d{display:none;}</style>`, msg.UUID, msg.Rev-1))) + } c.Response().Flush() // Refresh the page to prevent having it growing infinitely bigger