dkforest

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

commit 33a68c6007d6d7e5e7f80fcc1a331172886b2e63
parent 0a5d9b8a6ad12279e208898a8fb49d5aeb9011c7
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 25 May 2023 19:19:02 -0700

literal black magic makes edit works perfectly and keep order in stream chat

Diffstat:
Mpkg/database/database.go | 2+-
Mpkg/database/tableChatMessages.go | 15++++++++++++---
Mpkg/web/handlers/api/v1/handlers.go | 4++--
Mpkg/web/handlers/handlers.go | 30++++++++++++++++++++++++------
4 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/pkg/database/database.go b/pkg/database/database.go @@ -100,7 +100,7 @@ type IDkfDB interface { DoCreateSession(userID UserID, userAgent string) Session GetActiveUserSessions(userID UserID) (out []Session) GetCategories() (out []CategoriesResult, err error) - GetChatMessages(roomID RoomID, username string, userID UserID, displayPms PmDisplayMode, mentionsOnly, displayHellbanned, displayIgnored, displayModerators, displayIgnoredMessages bool) (out ChatMessages, err error) + GetChatMessages(roomID RoomID, username string, userID UserID, displayPms PmDisplayMode, mentionsOnly, displayHellbanned, displayIgnored, displayModerators, displayIgnoredMessages bool, minID1 int64) (out ChatMessages, err error) GetChatRoomByID(roomID RoomID) (out ChatRoom, err error) GetChatRoomByName(roomName string) (out ChatRoom, err error) GetChessSubscribers() (out []User, err error) diff --git a/pkg/database/tableChatMessages.go b/pkg/database/tableChatMessages.go @@ -316,7 +316,7 @@ const ( PmNone ) -func (d *DkfDB) GetChatMessages(roomID RoomID, username string, userID UserID, displayPms PmDisplayMode, mentionsOnly, displayHellbanned, displayIgnored, displayModerators, displayIgnoredMessages bool) (out ChatMessages, err error) { +func (d *DkfDB) GetChatMessages(roomID RoomID, username string, userID UserID, displayPms PmDisplayMode, mentionsOnly, displayHellbanned, displayIgnored, displayModerators, displayIgnoredMessages bool, minID1 int64) (out ChatMessages, err error) { cmp := func(t, t2 ChatMessage) bool { return t.ID > t2.ID } @@ -326,8 +326,13 @@ func (d *DkfDB) GetChatMessages(roomID RoomID, username string, userID UserID, d Preload("Room"). Preload("Group"). Limit(150). - Where(`room_id = ?`, roomID). - Order("id DESC") + Where(`room_id = ?`, roomID) + if minID1 > 0 { + q = q.Where("id >= ?", minID1) + q = q.Order("id ASC") + } else { + q = q.Order("id DESC") + } q = q.Where(`group_id IS NULL OR group_id IN (SELECT group_id FROM chat_room_user_groups g WHERE g.room_id = ? AND g.user_id = ?)`, roomID, userID) if !displayIgnoredMessages { q = q.Where(`id NOT IN (SELECT message_id FROM ignored_messages WHERE user_id = ?)`, userID) @@ -370,6 +375,9 @@ func (d *DkfDB) GetChatMessages(roomID RoomID, username string, userID UserID, d var out2 []ChatMessage if displayHellbanned { q2 := q.Where("is_hellbanned = 1 AND id > ?", minID) + if minID1 > 0 { + q2 = q.Where("is_hellbanned = 1") + } err = q2.Find(&out2).Error } @@ -535,6 +543,7 @@ func (d *DkfDB) CreateOrEditMessage( typ := CreateMsg if editMsg != nil { typ = EditMsg + _ = d.RoomChatMessagesGeIncrRev(roomID, editMsg.ID) editMsg.Message = message editMsg.RawMessage = raw editMsg.Rev++ diff --git a/pkg/web/handlers/api/v1/handlers.go b/pkg/web/handlers/api/v1/handlers.go @@ -157,7 +157,7 @@ func chatMessages(c echo.Context) (status int, data ChatMessagesData) { displayHellbanned := authUser.DisplayHellbanned || authUser.IsHellbanned displayIgnoredMessages := false - msgs, _ := db.GetChatMessages(room.ID, authUser.Username, authUser.ID, pmOnlyQuery, mentionsOnlyQuery, displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages) + msgs, _ := db.GetChatMessages(room.ID, authUser.Username, authUser.ID, pmOnlyQuery, mentionsOnlyQuery, displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages, 0) if room.IsProtected() { key, err := hutils.GetRoomKeyCookie(c, int64(room.ID)) if err != nil { @@ -297,7 +297,7 @@ func RoomNotifierHandler(c echo.Context) error { displayHellbanned := authUser.DisplayHellbanned || authUser.IsHellbanned displayIgnoredMessages := false - msgs, _ := db.GetChatMessages(roomID, authUser.Username, authUser.ID, database.PmNoFilter, false, displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages) + msgs, _ := db.GetChatMessages(roomID, authUser.Username, authUser.ID, database.PmNoFilter, false, displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages, 0) if room.IsProtected() { key, err := hutils.GetRoomKeyCookie(c, int64(room.ID)) if err != nil { diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -5075,7 +5075,7 @@ func ChatStreamMessagesHandler(c echo.Context) error { mentionsOnlyQuery := utils.DoParseBool(c.QueryParam("mentionsOnly")) displayHellbanned := authUser.DisplayHellbanned || authUser.IsHellbanned displayIgnoredMessages := false - msgs, _ := db.GetChatMessages(room.ID, authUser.Username, authUser.ID, pmOnlyQuery, mentionsOnlyQuery, displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages) + msgs, _ := db.GetChatMessages(room.ID, authUser.Username, authUser.ID, pmOnlyQuery, mentionsOnlyQuery, displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages, 0) if room.IsProtected() { if err := msgs.DecryptAll(roomKey); err != nil { return c.Redirect(http.StatusFound, "/") @@ -5141,6 +5141,29 @@ Loop: continue } + if msgTyp.Typ == database.EditMsg { + msgs, _ := db.GetChatMessages(room.ID, authUser.Username, authUser.ID, pmOnlyQuery, mentionsOnlyQuery, + displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages, + msgTyp.Msg.ID) + if room.IsProtected() { + if err := msgs.DecryptAll(roomKey); err != nil { + return c.Redirect(http.StatusFound, "/") + } + } + + var toHide []string + for _, msg := range msgs { + toHide = append(toHide, fmt.Sprintf(".msgidc-%s-%d", msg.UUID, msg.Rev-1)) + } + send(fmt.Sprintf(`<style>%s{display:none;}</style>`, strings.Join(toHide, ","))) + + data.Messages = msgs + data.NbButtons = authUser.CountUIButtons() + send(v1.RenderMessages(authUser, data, csrf, config.NullUsername)) + c.Response().Flush() + continue + } + msg := msgTyp.Msg if room.IsProtected() { if err := msg.Decrypt(roomKey); err != nil { @@ -5162,11 +5185,6 @@ Loop: send(renderedMsg) - // When editing a message, hide previous revision of the message - if msgTyp.Typ == database.EditMsg { - send(fmt.Sprintf(`<style>.msgidc-%s-%d{display:none;}</style>`, msg.UUID, msg.Rev-1)) - } - // Sound notifications var newMessageSound, taggedSound, pmSound bool if msg.User.ID != authUser.ID {