Merge pull request #9987 from kraktus/preset_by_perms2

Preset by permissions
pull/10013/head
Thibault Duplessis 2021-10-19 08:12:56 +02:00 committed by GitHub
commit 4177457428
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 36 additions and 12 deletions

View File

@ -101,7 +101,7 @@ final class Mod(
def warn(username: String, subject: String) =
OAuthModBody(_.ModMessage) { me =>
env.mod.presets.pmPresets.get().named(subject) ?? { preset =>
env.mod.presets.getPmPresets(me.user).named(subject) ?? { preset =>
withSuspect(username) { prev =>
for {
inquiry <- env.report.api.inquiries ofModId me.id

View File

@ -401,7 +401,7 @@ final class User(
val rageSit = env.playban.api.getRageSit(user.id).map(view.showRageSit)
val actions = env.user.repo.isErased(user) map { erased =>
html.user.mod.actions(user, emails, erased, env.mod.presets.pmPresets.get())
html.user.mod.actions(user, emails, erased, env.mod.presets.getPmPresets(holder.user))
}
val userLoginsFu = env.security.userLogins(user, nbOthers)
val others = for {
@ -450,7 +450,7 @@ final class User(
env.user.repo withEmails username orFail s"No such user $username" flatMap {
case UserModel.WithEmails(user, emails) =>
env.user.repo.isErased(user) map { erased =>
Ok(html.user.mod.actions(user, emails, erased, env.mod.presets.pmPresets.get()))
Ok(html.user.mod.actions(user, emails, erased, env.mod.presets.getPmPresets(ctx.me)))
}
}

View File

@ -154,7 +154,7 @@ object discussion {
div(
select(cls := "appeal-presets")(
option(st.value := "")("Presets"),
ps.value.map { case ModPreset(name, text) =>
ps.value.map { case ModPreset(name, text, _) =>
option(
st.value := text,
st.title := text

View File

@ -152,7 +152,7 @@ object inquiry {
isGranted(_.ModMessage) option div(cls := "dropper warn buttons")(
iconTag(""),
div(
env.mod.presets.pmPresets.get().value.map { preset =>
env.mod.presets.getPmPresets(ctx.me).value.map { preset =>
postForm(action := routes.Mod.warn(in.user.username, preset.name))(
submitButton(cls := "fbt", title := preset.text)(preset.name),
autoNextInput

View File

@ -34,7 +34,7 @@ object presets {
form("v"),
raw(""),
help = frag(
"First line is the preset name, next lines are the content. Separate presets with a line of 3 or more dashes: ---."
"First line is the permissions needed to use the preset (If a list, separated by commas is given, any user having at least one of these permissions will be able to send it), second is the preset name, next lines are the content. Separate presets with a line of 3 or more dashes: ---."
).some
)(form3.textarea(_)(rows := 20)),
form3.action(

View File

@ -5,6 +5,8 @@ import play.api.data.Forms._
import scala.concurrent.ExecutionContext
import lila.memo.SettingStore.{ Formable, StringReader }
import lila.user.User
import lila.security.{ Granter, Permission }
import reactivemongo.api.bson.BSONHandler
final class ModPresetsApi(
@ -20,7 +22,13 @@ final class ModPresetsApi(
case _ => none
}
lazy val pmPresets = settingStore[ModPresets](
def getPmPresets(mod: User): ModPresets =
ModPresets(pmPresets.get().value.filter(_.permissions.exists(Granter(_)(mod))))
def getPmPresets(mod: Option[User]): ModPresets =
mod.map(getPmPresets).getOrElse(ModPresets(Nil))
private lazy val pmPresets = settingStore[ModPresets](
"modPmPresets",
default = ModPresets(Nil),
text = "Moderator PM presets".some
@ -42,7 +50,7 @@ case class ModPresets(value: List[ModPreset]) {
value.find(_.text.filter(_.isLetter) == clean)
}
}
case class ModPreset(name: String, text: String)
case class ModPreset(name: String, text: String, permissions: Set[Permission])
object ModPresets {
@ -51,8 +59,8 @@ object ModPresets {
private[mod] object setting {
private def write(presets: ModPresets): String =
presets.value.map { case ModPreset(name, text) =>
s"$name\n\n$text"
presets.value.map { case ModPreset(name, text, permissions) =>
s"${permissions.map(_.key) mkString ","}\n\n$name\n\n$text"
} mkString "\n\n----------\n\n"
private def read(s: String): ModPresets =
@ -63,11 +71,27 @@ object ModPresets {
.map(_.linesIterator.toList)
.filter(_.nonEmpty)
.flatMap {
case name :: text => ModPreset(name, text.dropWhile(_.isEmpty) mkString "\n").some
case _ => none
case perms :: rest => {
val cleanRest = rest.dropWhile(_.isEmpty)
for {
name <- cleanRest.headOption
text <- cleanRest.tail.some
} yield ModPreset(
name,
text.dropWhile(_.isEmpty) mkString "\n",
toPermisssions(perms)
)
}
case _ => none
}
}
private def toPermisssions(s: String): Set[Permission] =
Permission(s.split(",").map(key => s"ROLE_${key.trim.toUpperCase}").toList) match {
case set if set.nonEmpty => set
case _ => Set(Permission.Admin)
}
private val presetsIso = lila.common.Iso[String, ModPresets](read, write)
implicit val presetsBsonHandler: BSONHandler[ModPresets] = lila.db.dsl.isoHandler(presetsIso)