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:
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