commit 59c216876d75983994e0a39076fb444a784474bd
parent 925e5c5c100a6545496cc959c02cc0913407cc97
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Fri, 16 Jun 2023 21:13:09 -0700
remove duplicated code
Diffstat:
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("@", "@", "#", "#")
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)