dkforest

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

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:
Mpkg/database/utils/utils.go | 18++++++++++--------
Mpkg/web/handlers/api/v1/handlers.go | 1+
Mpkg/web/handlers/api/v1/slashInterceptor.go | 45++++++++++++++++++++++++++++-----------------
Mpkg/web/public/views/pages/chat-help.gohtml | 7+++++++
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>