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