commit 65a604c74db8ad36d9a78f69f347c12f4ccb84ca
parent 1892085e29d84d7487843220d832b2ed3a227071
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 19 Jan 2023 19:16:45 -0800
simplify code
Diffstat:
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