send impersonation events to lila-ws
parent
6eb430e163
commit
106c20f397
|
@ -435,7 +435,7 @@ private[controllers] trait LilaController
|
|||
case d => d
|
||||
} flatMap {
|
||||
case None => fuccess(None -> None)
|
||||
case Some(d) => lila.mod.Impersonate.impersonating(d.user) map {
|
||||
case Some(d) => Env.mod.impersonate.impersonating(d.user) map {
|
||||
_.fold[RestoredUser](d.some -> None) { impersonated =>
|
||||
FingerPrintedUser(impersonated, FingerHash.impersonate.some).some -> d.user.some
|
||||
}
|
||||
|
|
|
@ -120,12 +120,12 @@ object Mod extends LilaController {
|
|||
}(actionResult(username))
|
||||
|
||||
def impersonate(username: String) = Auth { implicit ctx => me =>
|
||||
if (username == "-" && lila.mod.Impersonate.isImpersonated(me)) fuccess {
|
||||
lila.mod.Impersonate.stop(me)
|
||||
if (username == "-" && Env.mod.impersonate.isImpersonated(me)) fuccess {
|
||||
Env.mod.impersonate.stop(me)
|
||||
Redirect(routes.User.show(me.username))
|
||||
}
|
||||
else if (isGranted(_.Impersonate)) OptionFuRedirect(UserRepo named username) { user =>
|
||||
lila.mod.Impersonate.start(me, user)
|
||||
Env.mod.impersonate.start(me, user)
|
||||
fuccess(routes.User.show(user.username))
|
||||
}
|
||||
else notFound
|
||||
|
|
|
@ -82,6 +82,7 @@ package mod {
|
|||
case class KickFromRankings(userId: String)
|
||||
case class SetPermissions(userId: String, permissions: List[String])
|
||||
case class AutoWarning(userId: String, subject: String)
|
||||
case class Impersonate(userId: String, by: Option[String])
|
||||
}
|
||||
|
||||
package playban {
|
||||
|
|
|
@ -44,6 +44,8 @@ final class Env(
|
|||
|
||||
lazy val logApi = new ModlogApi(logColl)
|
||||
|
||||
lazy val impersonate = new ImpersonateApi(system.lilaBus)
|
||||
|
||||
private lazy val notifier = new ModNotifier(notifyApi, reportApi)
|
||||
|
||||
private lazy val ratingRefund = new RatingRefund(
|
||||
|
|
|
@ -2,8 +2,9 @@ package lila.mod
|
|||
|
||||
import lila.user.{ User, UserRepo }
|
||||
import lila.security.Granter
|
||||
import lila.hub.actorApi.mod.Impersonate
|
||||
|
||||
object Impersonate {
|
||||
final class ImpersonateApi(bus: lila.common.Bus) {
|
||||
|
||||
private var modToUser = Map.empty[User.ID, User.ID]
|
||||
private var userToMod = Map.empty[User.ID, User.ID]
|
||||
|
@ -13,12 +14,14 @@ object Impersonate {
|
|||
modToUser = modToUser + (mod.id -> user.id)
|
||||
userToMod = userToMod + (user.id -> mod.id)
|
||||
logger.info(s"${mod.username} starts impersonating ${user.username}")
|
||||
bus.publish(Impersonate(user.id, mod.id.some), 'impersonate)
|
||||
}
|
||||
|
||||
def stop(user: User): Unit = userToMod.get(user.id) ?? { modId =>
|
||||
modToUser = modToUser - modId
|
||||
userToMod = userToMod - user.id
|
||||
logger.info(s"${modId} stops impersonating ${user.username}")
|
||||
bus.publish(Impersonate(user.id, none), 'impersonate)
|
||||
}
|
||||
|
||||
def impersonating(mod: User): Fu[Option[User]] = modToUser.get(mod.id) ?? UserRepo.byId
|
||||
|
|
|
@ -77,7 +77,7 @@ final class RemoteSocket(
|
|||
})
|
||||
}
|
||||
|
||||
bus.subscribeFun('moveEvent, 'socketUsers, 'deploy, 'announce, 'mlat, 'sendToFlag, 'remoteSocketOut, 'accountClose, 'shadowban) {
|
||||
bus.subscribeFun('moveEvent, 'socketUsers, 'deploy, 'announce, 'mlat, 'sendToFlag, 'remoteSocketOut, 'accountClose, 'shadowban, 'impersonate) {
|
||||
case MoveEvent(gameId, fen, move) =>
|
||||
if (watchedGameIds(gameId)) send(Out.move(gameId, move, fen))
|
||||
case SendTos(userIds, payload) =>
|
||||
|
@ -101,6 +101,8 @@ final class RemoteSocket(
|
|||
f(connectedUserIds.get)
|
||||
case lila.hub.actorApi.mod.Shadowban(userId, v) =>
|
||||
send(Out.setTroll(userId, v))
|
||||
case lila.hub.actorApi.mod.Impersonate(userId, modId) =>
|
||||
send(Out.impersonate(userId, modId))
|
||||
}
|
||||
|
||||
private def tick(nbConn: Int): Unit = {
|
||||
|
@ -252,11 +254,14 @@ object RemoteSocket {
|
|||
def disconnectUser(userId: String) =
|
||||
s"disconnect/user $userId"
|
||||
def setTroll(userId: String, v: Boolean) =
|
||||
s"troll/set $userId ${boolean(v)}"
|
||||
s"mod/troll/set $userId ${boolean(v)}"
|
||||
def impersonate(userId: String, by: Option[String]) =
|
||||
s"mod/impersonate $userId ${optional(by)}"
|
||||
|
||||
def commas(strs: Iterable[Any]): String = if (strs.isEmpty) "-" else strs mkString ","
|
||||
def boolean(v: Boolean): String = if (v) "+" else "-"
|
||||
def color(c: chess.Color): String = c.fold("w", "b")
|
||||
def optional(str: Option[String]) = str getOrElse "-"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue