dkforest

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

commit 65a604c74db8ad36d9a78f69f347c12f4ccb84ca
parent 1892085e29d84d7487843220d832b2ed3a227071
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 19 Jan 2023 19:16:45 -0800

simplify code

Diffstat:
Mpkg/web/handlers/api/v1/slashInterceptor.go | 94++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 53 insertions(+), 41 deletions(-)

diff --git a/pkg/web/handlers/api/v1/slashInterceptor.go b/pkg/web/handlers/api/v1/slashInterceptor.go @@ -824,7 +824,53 @@ func handleEditLastCmd(c *Command) (handled bool) { return } -var ErrPMDenied = errors.New("you cannot /pm this user") +var ErrPMDenied = errors.New("you cannot pm/inbox this user") +var Err20Msgs = errors.New("you need 20 public messages to unlock PMs/Inbox; or be whitelisted") + +func canUserInboxOther(user, other database.User) error { + doesNotMatter := false + _, err := canUserPmOther(user, other, doesNotMatter) + return err +} + +func canUserPmOther(user, other database.User, roomIsPrivate bool) (skipInbox bool, err error) { + errPMDenied := ErrPMDenied + + if database.IsUserPmWhitelisted(user.ID, other.ID) { + return false, nil + } + + // Other doesn't want PM from new users + if !user.AccountOldEnough() && other.BlockNewUsersPm { + return false, errPMDenied + } + + switch other.PmMode { + case database.PmModeWhitelist: + // We are in whitelist mode, and user is not whitelisted + return false, errPMDenied + + case database.PmModeStandard: + // User on blacklist cannot PM/Inbox + if database.IsUserPmBlacklisted(user.ID, other.ID) { + return false, errPMDenied + } + + if !user.CanSendPM() { + // In private rooms, can send PM but inboxes will be skipped if not enough public messages + if roomIsPrivate { + return true, nil + } + // Need at least 20 public messages to send PM in a public room + return false, Err20Msgs + } + + return false, nil + } + + // Should never go here + return false, nil +} func handlePMCmd(c *Command) (handled bool) { if m := pmRgx.FindStringSubmatch(c.message); len(m) == 3 { @@ -842,29 +888,9 @@ func handlePMCmd(c *Command) (handled bool) { return true } - if !database.IsUserPmWhitelisted(c.authUser.ID, user.ID) { - if user.PmMode == database.PmModeWhitelist { - c.err = ErrPMDenied - return true - } else if user.PmMode == database.PmModeStandard { - if !c.authUser.CanSendPM() { - if c.room.IsOwned() { - // In private rooms, can send PM but inboxes will be skipped if not enough karma - c.skipInboxes = true - } else { - // Need at least 1 karma to send PM from a public room - c.err = errors.New(`you need 20 public messages to unlock PMs; or be whitelisted`) - return true - } - } - if database.IsUserPmBlacklisted(c.authUser.ID, user.ID) { - c.err = ErrPMDenied - return true - } else if !c.authUser.AccountOldEnough() && user.BlockNewUsersPm { - c.err = ErrPMDenied - return true - } - } + c.skipInboxes, c.err = canUserPmOther(*c.authUser, user, c.room.IsOwned()) + if c.err != nil { + return true } if user.ID == c.authUser.ID { @@ -1125,23 +1151,9 @@ func handleInboxCmd(c *Command) (handled bool) { return true } - if !database.IsUserPmWhitelisted(c.authUser.ID, toUser.ID) { - if toUser.PmMode == database.PmModeWhitelist { - c.err = errors.New("you cannot inbox this user") - return true - } else if toUser.PmMode == database.PmModeStandard { - if !c.authUser.CanSendPM() { - c.err = errors.New("you need 20 public messages to unlock inboxes; or be whitelisted") - return true - } - if database.IsUserPmBlacklisted(c.authUser.ID, toUser.ID) { - c.err = errors.New("you cannot inbox this user") - return true - } else if !c.authUser.AccountOldEnough() && toUser.BlockNewUsersPm { - c.err = errors.New("you cannot inbox this user") - return true - } - } + if err := canUserInboxOther(*c.authUser, toUser); err != nil { + c.err = err + return true } html := message