monitored mod actions

pull/6103/head
Thibault Duplessis 2020-02-27 20:50:36 -06:00
parent 36823fa851
commit 1da3937eb9
6 changed files with 50 additions and 6 deletions

View File

@ -179,7 +179,7 @@ lazy val event = module("event",
)
lazy val mod = module("mod",
Seq(common, db, user, hub, security, tournament, simul, game, analyse, evaluation, report, notifyModule, history, perfStat),
Seq(common, db, user, hub, security, tournament, simul, game, analyse, evaluation, report, notifyModule, history, perfStat, slack),
reactivemongo.bundle
)

View File

@ -43,6 +43,7 @@ final class Env(
rankingApi: lila.user.RankingApi,
noteApi: lila.user.NoteApi,
cacheApi: lila.memo.CacheApi,
slackApi: lila.slack.SlackApi,
securityStore: lila.security.Store
)(implicit ec: scala.concurrent.ExecutionContext, system: ActorSystem) {

View File

@ -3,9 +3,11 @@ package lila.mod
import lila.db.dsl._
import lila.report.{ Mod, ModId, Report, Suspect }
import lila.security.Permission
import lila.user.User
import lila.user.{ User, UserRepo }
final class ModlogApi(repo: ModlogRepo)(implicit ec: scala.concurrent.ExecutionContext) {
final class ModlogApi(repo: ModlogRepo, userRepo: UserRepo, slackApi: lila.slack.SlackApi)(
implicit ec: scala.concurrent.ExecutionContext
) {
private def coll = repo.coll
@ -213,6 +215,29 @@ final class ModlogApi(repo: ModlogRepo)(implicit ec: scala.concurrent.ExecutionC
private def add(m: Modlog): Funit = {
lila.mon.mod.log.create.increment()
lila.log("mod").info(m.toString)
coll.insert.one(m).void
coll.insert.one(m) >>
slackMonitor(m)
}
private def slackMonitor(m: Modlog): Funit = {
import lila.mod.{ Modlog => M }
userRepo.isMonitoredMod(m.mod) flatMap {
_ ?? slackApi.monitorMod(
m.mod,
icon = m.action match {
case M.alt | M.engine | M.booster | M.troll | M.closeAccount => "thorhammer"
case M.unalt | M.unengine | M.unbooster | M.ipunban | M.untroll | M.reopenAccount =>
"large_blue_circle"
case M.deletePost | M.deleteTeam | M.terminateTournament => "x"
case M.chatTimeout => "hourglass_flowing_sand"
case M.ban | M.ipban => "ripp"
case M.closeTopic => "lock"
case M.openTopic => "unlock"
case M.modMessage => "left_speech_bubble"
case _ => "gear"
},
text = s"""${m.showAction.capitalize} ${m.user.??(u => s"@$u ")}${~m.details}"""
)
}
}
}

View File

@ -55,6 +55,7 @@ object Permission {
case object Streamers extends Permission("ROLE_STREAMERS")
case object Verified extends Permission("ROLE_VERIFIED")
case object Prismic extends Permission("ROLE_PRISMIC")
case object MonitoredMod extends Permission("ROLE_MONITORED_MOD")
case object LichessTeam
extends Permission(
@ -163,7 +164,8 @@ object Permission {
Streamers,
DisableTwoFactor,
Verified,
Prismic
Prismic,
MonitoredMod
)
private lazy val all: List[Permission] = SuperAdmin :: allButSuperAdmin

View File

@ -90,6 +90,19 @@ final class SlackApi(
)
)
def monitorMod(modId: User.ID, icon: String, text: String): Funit = lightUser(modId) flatMap {
_ ?? { mod =>
client(
SlackMessage(
username = mod.name,
icon = icon,
text = linkifyUsers(text),
channel = "tavern-monitor"
)
)
}
}
def chatPanic(mod: User, v: Boolean): Funit =
client(
SlackMessage(
@ -130,7 +143,7 @@ final class SlackApi(
client(
SlackMessage(
username = "Board API game",
icon = "robot_face",
icon = "electric_plug",
text = s"${userLink(user)} is playing ${gameLink(path)} with the Board API",
channel = rooms.tavernBots
)

View File

@ -374,6 +374,9 @@ final class UserRepo(val coll: Coll)(implicit ec: scala.concurrent.ExecutionCont
}
)
def isMonitoredMod(userId: User.ID) =
coll.exists($id(userId) ++ $doc(F.roles -> "ROLE_MONITORED_MOD"))
import Authenticator._
def getPasswordHash(id: User.ID): Fu[Option[String]] =
coll.byId[AuthData](id, authProjection) map {