dkforest

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

commit 59c216876d75983994e0a39076fb444a784474bd
parent 925e5c5c100a6545496cc959c02cc0913407cc97
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Fri, 16 Jun 2023 21:13:09 -0700

remove duplicated code

Diffstat:
Mpkg/database/utils/processMessage.go | 8++++----
Mpkg/database/utils/processMessage_test.go | 35+++++++++++++++++++++++++++++++++++
Mpkg/web/handlers/interceptors/chess.go | 2+-
Mpkg/web/handlers/interceptors/msgInterceptor.go | 65-----------------------------------------------------------------
Mpkg/web/handlers/interceptors/msgInterceptor_test.go | 40----------------------------------------
Mpkg/web/handlers/interceptors/slashInterceptor.go | 6+++---
6 files changed, 43 insertions(+), 113 deletions(-)

diff --git a/pkg/database/utils/processMessage.go b/pkg/database/utils/processMessage.go @@ -113,7 +113,7 @@ func ProcessRawMessage(db *database.DkfDB, in, roomKey string, authUserID databa html = convertArchiveLinks(db, html, roomID, authUserID) html = convertLinks(html, roomID, db.GetUserByUsername, db.GetLinkByShorthand, db.GetChatMessageByUUID) html = linkDefaultRooms(html) - html, taggedUsersIDsMap := colorifyTaggedUsers(html, db.GetUsersByUsername) + html, taggedUsersIDsMap := ColorifyTaggedUsers(html, db.GetUsersByUsername) html = linkRoomTags(db, html) html = emojiReplacer.Replace(html) html = styleQuote(html, quoted) @@ -405,7 +405,7 @@ var yewtubeBeIDRgx = youtubeComIDRgx var invidiousIDRgx = youtubeComIDRgx func makeHtmlLink(label, link string) string { - // We replace @ to prevent colorifyTaggedUsers from trying to generate html inside the links. + // We replace @ to prevent ColorifyTaggedUsers from trying to generate html inside the links. r := strings.NewReplacer("@", "&#64;", "#", "&#35;") label = r.Replace(label) link = r.Replace(link) @@ -696,9 +696,9 @@ func appendUploadLink(html string, upload *database.Upload) string { type getUsersByUsernameFn func(usernames []string) ([]database.User, error) -// Update the given html to add user style for tags. +// ColorifyTaggedUsers updates the given html to add user style for tags. // Return the new html, and a map[userID]User of tagged users. -func colorifyTaggedUsers(html string, getUsersByUsername getUsersByUsernameFn) (string, map[database.UserID]database.User) { +func ColorifyTaggedUsers(html string, getUsersByUsername getUsersByUsernameFn) (string, map[database.UserID]database.User) { tagRgxL := tagRgx usernameMatches := tagRgxL.FindAllStringSubmatch(html, -1) usernames := hashset.New[string]() diff --git a/pkg/database/utils/processMessage_test.go b/pkg/database/utils/processMessage_test.go @@ -124,3 +124,38 @@ func TestConvertLinks(t *testing.T) { expected = `this is <a href="/u/notExist" rel="noopener noreferrer" target="_blank">http://dkf.onion/u/notExist</a> a test` assert.Equal(t, expected, actual) } + +func TestColorifyTaggedUsers(t *testing.T) { + getUsersByUsername := func(usernames []string) ([]database.User, error) { + out := []database.User{ + {ID: 1, Username: "username1", ChatColor: "#001"}, + {ID: 2, Username: "username2", ChatColor: "#002"}, + } + return out, nil + } + msg := "@username1 @username1 @username2 @username3" + html, taggedUsersIDsMap := ColorifyTaggedUsers(msg, getUsersByUsername) + expected := `` + + `<span style="color: #001; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username1</span> ` + + `<span style="color: #001; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username1</span> ` + + `<span style="color: #002; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username2</span> ` + + `@username3` + assert.Equal(t, expected, html) + assert.Equal(t, 2, len(taggedUsersIDsMap)) + assert.Equal(t, database.Username("username1"), taggedUsersIDsMap[1].Username) + assert.Equal(t, database.Username("username2"), taggedUsersIDsMap[2].Username) +} + +func BenchmarkColorifyTaggedUsers(b *testing.B) { + getUsersByUsername := func(usernames []string) ([]database.User, error) { + out := []database.User{ + {ID: 1, Username: "username1", ChatColor: "#000"}, + {ID: 2, Username: "username2", ChatColor: "#001"}, + } + return out, nil + } + msg := "@username1 @username1 @username2 @username3" + for n := 0; n < b.N; n++ { + _, _ = ColorifyTaggedUsers(msg, getUsersByUsername) + } +} diff --git a/pkg/web/handlers/interceptors/chess.go b/pkg/web/handlers/interceptors/chess.go @@ -733,7 +733,7 @@ func (b *Chess) SendMove(gameKey string, userID database.UserID, g *ChessGame, c // Notify (pm) the opponent that you made a move if opponentPlayer.NotifyChessMove { msg := fmt.Sprintf("@%s played %s", currentPlayer.Username, moveStr) - msg, _ = colorifyTaggedUsers(msg, b.db.GetUsersByUsername) + msg, _ = dutils.ColorifyTaggedUsers(msg, b.db.GetUsersByUsername) chatMsg, _ := b.db.CreateMsg(msg, msg, "", config.GeneralRoomID, b.zeroID, &opponentPlayer.ID) go func() { time.Sleep(30 * time.Second) diff --git a/pkg/web/handlers/interceptors/msgInterceptor.go b/pkg/web/handlers/interceptors/msgInterceptor.go @@ -4,14 +4,11 @@ import ( "dkforest/pkg/config" "dkforest/pkg/database" dutils "dkforest/pkg/database/utils" - "dkforest/pkg/hashset" - "dkforest/pkg/levenshtein" "dkforest/pkg/managers" "dkforest/pkg/utils" "dkforest/pkg/web/handlers/interceptors/command" "errors" "fmt" - "math" "regexp" "strings" ) @@ -300,65 +297,3 @@ func checkCPLinks(db *database.DkfDB, html string) bool { } return false } - -type getUsersByUsernameFn func(usernames []string) ([]database.User, error) - -// Update the given html to add user style for tags. -// Return the new html, and a map[userID]User of tagged users. -func colorifyTaggedUsers(html string, getUsersByUsername getUsersByUsernameFn) (string, map[database.UserID]database.User) { - tagRgxL := tagRgx - usernameMatches := tagRgxL.FindAllStringSubmatch(html, -1) - usernames := hashset.New[string]() - for _, usernameMatch := range usernameMatches { - if strings.HasPrefix(usernameMatch[0], `\`) { - continue - } - usernames.Insert(usernameMatch[1]) - } - taggedUsers, _ := getUsersByUsername(usernames.ToArray()) - - taggedUsersMap := make(map[string]database.User) - taggedUsersIDsMap := make(map[database.UserID]database.User) - for _, taggedUser := range taggedUsers { - taggedUsersMap[strings.ToLower(taggedUser.Username.AtStr())] = taggedUser - if taggedUser.Username != config.NullUsername { - taggedUsersIDsMap[taggedUser.ID] = taggedUser - } - } - - if len(usernameMatches) > 0 { - html = tagRgxL.ReplaceAllStringFunc(html, func(s string) string { - if strings.HasPrefix(s, `\`) { - return strings.TrimPrefix(s, `\`) - } - lowerS := strings.ToLower(s) - if user, ok := taggedUsersMap[lowerS]; ok { - return fmt.Sprintf("<span %s>@%s</span>", user.GenerateChatStyle1(), user.Username) - } - - // Not found, try to fix typos using levenshtein - activeUsers := managers.ActiveUsers.GetActiveUsers() - if len(activeUsers) > 0 { - minDist := math.MaxInt - minAu := activeUsers[0] - for _, au := range activeUsers { - lowerAu := strings.ToLower(string(au.Username)) - d := levenshtein.ComputeDistance(lowerS, lowerAu) - if d < minDist { - minDist = d - minAu = au - } - } - if minDist <= 3 { - if users, _ := getUsersByUsername([]string{minAu.Username.String()}); len(users) > 0 { - user := users[0] - return fmt.Sprintf("<span %s>@%s</span>", user.GenerateChatStyle1(), user.Username) - } - } - } - - return s - }) - } - return html, taggedUsersIDsMap -} diff --git a/pkg/web/handlers/interceptors/msgInterceptor_test.go b/pkg/web/handlers/interceptors/msgInterceptor_test.go @@ -1,42 +1,2 @@ package interceptors -import ( - "dkforest/pkg/database" - "github.com/stretchr/testify/assert" - "testing" -) - -func TestColorifyTaggedUsers(t *testing.T) { - getUsersByUsername := func(usernames []string) ([]database.User, error) { - out := []database.User{ - {ID: 1, Username: "username1", ChatColor: "#001"}, - {ID: 2, Username: "username2", ChatColor: "#002"}, - } - return out, nil - } - msg := "@username1 @username1 @username2 @username3" - html, taggedUsersIDsMap := colorifyTaggedUsers(msg, getUsersByUsername) - expected := `` + - `<span style="color: #001; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username1</span> ` + - `<span style="color: #001; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username1</span> ` + - `<span style="color: #002; font-weight: normal; font-style: normal; font-family: Arial,Helvetica,sans-serif;">@username2</span> ` + - `@username3` - assert.Equal(t, expected, html) - assert.Equal(t, 2, len(taggedUsersIDsMap)) - assert.Equal(t, database.Username("username1"), taggedUsersIDsMap[1].Username) - assert.Equal(t, database.Username("username2"), taggedUsersIDsMap[2].Username) -} - -func BenchmarkColorifyTaggedUsers(b *testing.B) { - getUsersByUsername := func(usernames []string) ([]database.User, error) { - out := []database.User{ - {ID: 1, Username: "username1", ChatColor: "#000"}, - {ID: 2, Username: "username2", ChatColor: "#001"}, - } - return out, nil - } - msg := "@username1 @username1 @username2 @username3" - for n := 0; n < b.N; n++ { - _, _ = colorifyTaggedUsers(msg, getUsersByUsername) - } -} diff --git a/pkg/web/handlers/interceptors/slashInterceptor.go b/pkg/web/handlers/interceptors/slashInterceptor.go @@ -438,7 +438,7 @@ func handleDiceCmd(c *command.Command) (handled bool) { dice := utils.RandInt(1, 6) raw := fmt.Sprintf(`rolling dice for @%s ... "%d"`, c.AuthUser.Username, dice) msg := fmt.Sprintf(`rolling dice for @%s ... "<span style="color: white;">%d</span>"`, c.AuthUser.Username, dice) - msg, _ = colorifyTaggedUsers(msg, c.DB.GetUsersByUsername) + msg, _ = dutils.ColorifyTaggedUsers(msg, c.DB.GetUsersByUsername) go func() { time.Sleep(time.Second) c.ZeroPublicMsg(raw, msg) @@ -476,7 +476,7 @@ func handleRandCmd(c *command.Command) (handled bool) { dice = utils.RandInt(min, max) raw := fmt.Sprintf(`rolling dice for @%s ... "%d"`, c.AuthUser.Username, dice) msg := fmt.Sprintf(`rolling dice for @%s ... "<span style="color: white;">%d</span>"`, c.AuthUser.Username, dice) - msg, _ = colorifyTaggedUsers(msg, c.DB.GetUsersByUsername) + msg, _ = dutils.ColorifyTaggedUsers(msg, c.DB.GetUsersByUsername) go func() { time.Sleep(time.Second) c.ZeroPublicMsg(raw, msg) @@ -493,7 +493,7 @@ func handleChoiceCmd(c *command.Command) (handled bool) { answer := utils.RandChoice(words) raw := fmt.Sprintf(`@%s choice %s ... "%s"`, c.AuthUser.Username, words, answer) msg := fmt.Sprintf(`@%s choice %s ... "<span style="color: white;">%s</span>"`, c.AuthUser.Username, words, answer) - msg, _ = colorifyTaggedUsers(msg, c.DB.GetUsersByUsername) + msg, _ = dutils.ColorifyTaggedUsers(msg, c.DB.GetUsersByUsername) go func() { time.Sleep(time.Second) c.ZeroPublicMsg(raw, msg)