commit a0150f09cfd4a2d1ee363d11b1c2b95a68b9253b
parent 6a4b3fccbbf5f80991917662f48ee3c148f47f4d
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Sat, 17 Dec 2022 15:09:56 -0800
Add /kk to kick but keep the msgs
Diffstat:
4 files changed, 46 insertions(+), 25 deletions(-)
diff --git a/pkg/database/utils/utils.go b/pkg/database/utils/utils.go
@@ -54,20 +54,20 @@ func DoParseUserID(v string) (out database.UserID) {
return
}
-func Kick(kicked, kickedBy database.User) {
+func Kick(kicked, kickedBy database.User, purge bool) {
silent := kicked.IsHellbanned
- kick(kicked, kickedBy, silent)
+ kick(kicked, kickedBy, silent, purge)
}
func SilentKick(kicked, kickedBy database.User) {
- kick(kicked, kickedBy, true)
+ kick(kicked, kickedBy, true, true)
}
func SelfKick(kicked database.User, silent bool) {
- kick(kicked, kicked, silent)
+ kick(kicked, kicked, silent, true)
}
-func kick(kicked, kickedBy database.User, silent bool) {
+func kick(kicked, kickedBy database.User, silent, purge bool) {
database.NewAudit(kickedBy, fmt.Sprintf("kick %s #%d", kicked.Username, kicked.ID))
kicked.Verified = false
kicked.DoSave()
@@ -75,9 +75,11 @@ func kick(kicked, kickedBy database.User, silent bool) {
// Remove user from the user cache
managers.ActiveUsers.RemoveUser(kicked.ID)
- // Purge user messages
- if err := database.DeleteUserChatMessages(kicked.ID); err != nil {
- logrus.Error(err)
+ if purge {
+ // Purge user messages
+ if err := database.DeleteUserChatMessages(kicked.ID); err != nil {
+ logrus.Error(err)
+ }
}
// If user is HB, do not display system message
diff --git a/pkg/web/handlers/api/v1/handlers.go b/pkg/web/handlers/api/v1/handlers.go
@@ -45,6 +45,7 @@ var chessRgx = regexp.MustCompile(`^/chess ` + optAtGUser)
var inboxRgx = regexp.MustCompile(`^/inbox ` + optAtGUser + `(\s-e)?\s(?s:(.*))`)
var profileRgx = regexp.MustCompile(`^/p ` + optAtGUserOr0)
var kickRgx = regexp.MustCompile(`^/(?:kick|k) ` + optAtGUser)
+var kickKeepRgx = regexp.MustCompile(`^/(?:kk) ` + optAtGUser)
var rtutoRgx = regexp.MustCompile(`^/(?:rtuto) ` + optAtGUser)
var logoutRgx = regexp.MustCompile(`^/(?:logout) ` + optAtGUser)
var forceCaptchaRgx = regexp.MustCompile(`^/(?:captcha) ` + optAtGUser)
diff --git a/pkg/web/handlers/api/v1/slashInterceptor.go b/pkg/web/handlers/api/v1/slashInterceptor.go
@@ -106,6 +106,7 @@ func handleModeratorCmd(c *Command) (handled bool) {
return handleModeratorGroupCmd(c) ||
handleListModeratorsCmd(c) ||
handleKickCmd(c) ||
+ handleKickKeepCmd(c) ||
handleUnkickCmd(c) ||
handleLogoutCmd(c) ||
handleForceCaptchaCmd(c) ||
@@ -165,30 +166,40 @@ func handleListModeratorsCmd(c *Command) (handled bool) {
func handleKickCmd(c *Command) (handled bool) {
if m := kickRgx.FindStringSubmatch(c.message); len(m) == 2 {
username := m[1]
- user, err := database.GetUserByUsername(username)
- if err != nil {
- c.err = ErrRedirect
- return true
- }
- // Can't kick a vetted user (unless admin)
- if !c.authUser.IsAdmin && user.Vetted {
- c.err = ErrRedirect
- return true
- }
- // Can't kick another moderator (unless admin)
- if !c.authUser.IsAdmin && user.IsModerator() {
- c.err = ErrRedirect
- return true
- }
-
- dutils.Kick(user, *c.authUser)
+ kickCmd(c, username, true)
+ c.err = ErrRedirect
+ return true
+ }
+ return
+}
+// Kick a user but keep the messages
+func handleKickKeepCmd(c *Command) (handled bool) {
+ if m := kickKeepRgx.FindStringSubmatch(c.message); len(m) == 2 {
+ username := m[1]
+ kickCmd(c, username, false)
c.err = ErrRedirect
return true
}
return
}
+func kickCmd(c *Command, username string, purge bool) {
+ user, err := database.GetUserByUsername(username)
+ if err != nil {
+ return
+ }
+ // 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)
+}
+
func handleUnkickCmd(c *Command) (handled bool) {
if m := unkickRgx.FindStringSubmatch(c.message); len(m) == 2 {
username := m[1]
diff --git a/pkg/web/public/views/pages/chat-help.gohtml b/pkg/web/public/views/pages/chat-help.gohtml
@@ -190,6 +190,13 @@
<div>
<div>
+ <code>/kk username</code>
+ </div>
+ <p>Same as /k but keeps the messages</p>
+ </div>
+
+ <div>
+ <div>
<code>/unkick username</code> (or: <code>/uk username</code>)
</div>
<p>Reactivate a user account</p>