commit da11e65c46031b192a4f602f33e97a0d64e9d02a
parent 99c3c49d2ec94677bcc861d4e74086b8d268f207
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Sat, 7 Jan 2023 14:31:31 -0800
improve kick/unkick commands
Diffstat:
4 files changed, 42 insertions(+), 25 deletions(-)
diff --git a/pkg/database/utils/utils.go b/pkg/database/utils/utils.go
@@ -5,6 +5,7 @@ import (
"dkforest/pkg/database"
"dkforest/pkg/managers"
"dkforest/pkg/utils"
+ "errors"
"fmt"
"github.com/sirupsen/logrus"
)
@@ -54,20 +55,32 @@ func DoParseUserID(v string) (out database.UserID) {
return
}
-func Kick(kicked, kickedBy database.User, purge bool) {
+func Kick(kicked, kickedBy database.User, purge bool) error {
silent := kicked.IsHellbanned
- kick(kicked, kickedBy, silent, purge)
+ return kick(kicked, kickedBy, silent, purge)
}
-func SilentKick(kicked, kickedBy database.User) {
- kick(kicked, kickedBy, true, true)
+func SilentKick(kicked, kickedBy database.User) error {
+ return kick(kicked, kickedBy, true, true)
}
-func SelfKick(kicked database.User, silent bool) {
- kick(kicked, kicked, silent, true)
+func SelfKick(kicked database.User, silent bool) error {
+ return kick(kicked, kicked, silent, true)
}
-func kick(kicked, kickedBy database.User, silent, purge bool) {
+func kick(kicked, kickedBy database.User, silent, purge bool) error {
+ if !kicked.Verified {
+ return errors.New("user already kicked")
+ }
+ // Can't kick a vetted user (unless admin)
+ if !kickedBy.IsAdmin && kicked.Vetted {
+ return errors.New("cannot kick a vetted user")
+ }
+ // Can't kick another moderator (unless admin)
+ if !kickedBy.IsAdmin && kicked.IsModerator() {
+ return errors.New("cannot kick another moderator")
+ }
+
database.NewAudit(kickedBy, fmt.Sprintf("kick %s #%d", kicked.Username, kicked.ID))
kicked.Verified = false
kicked.DoSave()
@@ -87,4 +100,6 @@ func kick(kicked, kickedBy database.User, silent, purge bool) {
// Display kick message
database.CreateKickMsg(kicked, kickedBy)
}
+
+ return nil
}
diff --git a/pkg/web/handlers/api/v1/handlers.go b/pkg/web/handlers/api/v1/handlers.go
@@ -203,7 +203,7 @@ func KickHandler(c echo.Context) error {
if user.IsModerator() {
return c.Redirect(http.StatusFound, c.Request().Referer())
}
- dutils.SilentKick(user, *authUser)
+ _ = dutils.SilentKick(user, *authUser)
}
return c.Redirect(http.StatusFound, c.Request().Referer())
}
diff --git a/pkg/web/handlers/api/v1/slashInterceptor.go b/pkg/web/handlers/api/v1/slashInterceptor.go
@@ -168,7 +168,10 @@ func handleListModeratorsCmd(c *Command) (handled bool) {
func handleKickCmd(c *Command) (handled bool) {
if m := kickRgx.FindStringSubmatch(c.message); len(m) == 2 {
username := m[1]
- kickCmd(c, username, true)
+ if err := kickCmd(c, username, true); err != nil {
+ c.err = err
+ return true
+ }
c.err = ErrRedirect
return true
}
@@ -179,27 +182,22 @@ func handleKickCmd(c *Command) (handled bool) {
func handleKickKeepCmd(c *Command) (handled bool) {
if m := kickKeepRgx.FindStringSubmatch(c.message); len(m) == 2 {
username := m[1]
- kickCmd(c, username, false)
+ if err := kickCmd(c, username, false); err != nil {
+ c.err = err
+ return true
+ }
c.err = ErrRedirect
return true
}
return
}
-func kickCmd(c *Command, username string, purge bool) {
+func kickCmd(c *Command, username string, purge bool) error {
user, err := database.GetUserByUsername(username)
if err != nil {
- return
+ return ErrUsernameNotFound
}
- // Can't kick a vetted user (unless admin)
- if !c.authUser.IsAdmin && user.Vetted {
- return
- }
- // Can't kick another moderator (unless admin)
- if !c.authUser.IsAdmin && user.IsModerator() {
- return
- }
- dutils.Kick(user, *c.authUser, purge)
+ return dutils.Kick(user, *c.authUser, purge)
}
var ErrUsernameNotFound = errors.New("username not found")
@@ -213,6 +211,10 @@ func handleUnkickCmd(c *Command) (handled bool) {
c.err = ErrUsernameNotFound
return true
}
+ if user.Verified {
+ c.err = errors.New("user already not kicked")
+ return true
+ }
database.NewAudit(*c.authUser, fmt.Sprintf("unkick %s #%d", user.Username, user.ID))
user.Verified = true
_ = user.Save()
diff --git a/pkg/web/handlers/api/v1/spamInterceptor.go b/pkg/web/handlers/api/v1/spamInterceptor.go
@@ -38,13 +38,13 @@ func checkSpam(origMessage string, authUser *database.User) error {
strings.Contains(lowerCaseMessage, "i wanna see gore") ||
strings.Contains(lowerCaseMessage, "how can i make money") ||
strings.Contains(lowerCaseMessage, "any links for scary stuff") {
- dutils.SelfKick(*authUser, silentSelfKick)
+ _ = dutils.SelfKick(*authUser, silentSelfKick)
return ErrSpamFilterTriggered
}
}
if authUser.GeneralMessagesCount < 20 || time.Since(authUser.CreatedAt) < 5*time.Hour {
if strings.Contains(lowerCaseMessage, "cp link") {
- dutils.SelfKick(*authUser, silentSelfKick)
+ _ = dutils.SelfKick(*authUser, silentSelfKick)
return ErrSpamFilterTriggered
}
}
@@ -53,7 +53,7 @@ func checkSpam(origMessage string, authUser *database.User) error {
if authUser.IsModerator() {
return ErrSpamFilterTriggered
}
- dutils.SelfKick(*authUser, silentSelfKick)
+ _ = dutils.SelfKick(*authUser, silentSelfKick)
return ErrSpamFilterTriggered
}
@@ -89,7 +89,7 @@ func checkSpam(origMessage string, authUser *database.User) error {
if authUser.GeneralMessagesCount < 20 || time.Since(authUser.CreatedAt) < 5*time.Hour {
if wordsMap["cp"] > 0 && (wordsMap["link"] > 0 || wordsMap["links"] > 0) {
- dutils.SelfKick(*authUser, silentSelfKick)
+ _ = dutils.SelfKick(*authUser, silentSelfKick)
return ErrSpamFilterTriggered
}
}