process and log reports on self close account - closes #4091

chatSourceComplex
Thibault Duplessis 2018-03-06 15:19:41 -05:00
parent 31145148d0
commit a4861af479
4 changed files with 30 additions and 16 deletions

View File

@ -89,7 +89,8 @@ final class Env(
_ <- Env.lobby.seekApi.removeByUser(user)
_ <- Env.security.store.disconnect(user.id)
_ <- Env.streamer.api.onClose(user)
_ <- Env.mod.logApi.selfCloseAccount(user.id)
reports <- Env.report.api.processAndGetBySuspect(lila.report.Suspect(user))
_ <- Env.mod.logApi.selfCloseAccount(user.id, reports)
} yield {
system.lilaBus.publish(lila.hub.actorApi.security.CloseAccount(user.id), 'accountClose)
}

View File

@ -1,8 +1,8 @@
package lila.mod
import lila.db.dsl._
import lila.report.{ Report, Mod, Suspect, ModId }
import lila.security.Permission
import lila.report.{ Mod, Suspect, ModId }
final class ModlogApi(coll: Coll) {
@ -37,8 +37,9 @@ final class ModlogApi(coll: Coll) {
Modlog(mod, user.some, Modlog.closeAccount)
}
def selfCloseAccount(user: String) = add {
Modlog(ModId.lichess.value, user.some, Modlog.selfCloseAccount)
def selfCloseAccount(user: String, openReports: List[Report]) = add {
Modlog(ModId.lichess.value, user.some, Modlog.selfCloseAccount,
details = openReports.map(r => s"${r.reason.name} report").mkString(", ").some.filter(_.nonEmpty))
}
def reopenAccount(mod: String, user: String) = add {

View File

@ -99,6 +99,12 @@ final class ReportApi(
case _ => funit
}
def processAndGetBySuspect(suspect: Suspect): Fu[List[Report]] = for {
all <- recent(suspect, 10)
open = all.filter(_.open)
_ <- doProcessReport($inIds(open.map(_.id)), ModId.lichess)
} yield open
def autoBoostReport(winnerId: User.ID, loserId: User.ID): Funit =
securityApi.shareIpOrPrint(winnerId, loserId) zip
UserRepo.byId(winnerId) zip UserRepo.byId(loserId) zip getLichessReporter flatMap {
@ -133,20 +139,23 @@ final class ReportApi(
val reportSelector = reportId.orElse(inquiry.map(_.id)).fold(relatedSelector) { id =>
$or($id(id), relatedSelector)
}
accuracy.invalidate(reportSelector) >> coll.update(
reportSelector,
$set(
"open" -> false,
"processedBy" -> mod.user.id
) ++ $unset("inquiry"),
multi = true
).void >>- {
accuracy.invalidate(reportSelector) >>
doProcessReport(reportSelector, mod.id).void >>- {
monitorOpen
lila.mon.mod.report.close()
rooms.flatMap(Room.toReasons) foreach { publishProcessed(sus, _) }
}
}
private def doProcessReport(selector: Bdoc, by: ModId) = coll.update(
selector,
$set(
"open" -> false,
"processedBy" -> by.value
) ++ $unset("inquiry"),
multi = true
)
def autoInsultReport(userId: String, text: String): Funit = {
getSuspect(userId) zip getLichessReporter flatMap {
case (Some(suspect), reporter) => create(Report.Candidate(
@ -181,8 +190,8 @@ final class ReportApi(
def nbOpen = nbOpenCache.get
def recent(user: User, nb: Int, readPreference: ReadPreference = ReadPreference.secondaryPreferred): Fu[List[Report]] =
coll.find($doc("user" -> user.id)).sort(sortLastAtomAt).list[Report](nb, readPreference)
def recent(suspect: Suspect, nb: Int, readPreference: ReadPreference = ReadPreference.secondaryPreferred): Fu[List[Report]] =
coll.find($doc("user" -> suspect.id)).sort(sortLastAtomAt).list[Report](nb, readPreference)
def moreLike(report: Report, nb: Int): Fu[List[Report]] =
coll.find($doc("user" -> report.user, "_id" $ne report.id)).sort(sortLastAtomAt).list[Report](nb)
@ -191,7 +200,7 @@ final class ReportApi(
by <- coll.find(
$doc("atoms.by" -> user.id)
).sort(sortLastAtomAt).list[Report](nb, ReadPreference.secondaryPreferred)
about <- recent(user, nb, ReadPreference.secondaryPreferred)
about <- recent(Suspect(user), nb, ReadPreference.secondaryPreferred)
} yield Report.ByAndAbout(by, about)
def recentReportersOf(sus: Suspect): Fu[List[User.ID]] =

View File

@ -2,7 +2,9 @@ package lila.report
import lila.user.User
case class Mod(user: User) extends AnyVal
case class Mod(user: User) extends AnyVal {
def id = ModId(user.id)
}
case class ModId(value: User.ID) extends AnyVal
object ModId {
@ -12,6 +14,7 @@ object ModId {
}
case class Suspect(user: User) extends AnyVal {
def id = user.id
def set(f: User => User) = copy(user = f(user))
}
case class SuspectId(value: User.ID) extends AnyVal