troll player and spectator messages are hidden to others
This commit is contained in:
parent
156a149474
commit
7bdff5e676
|
@ -12,6 +12,7 @@ sealed trait Event {
|
||||||
def only: Option[Color] = None
|
def only: Option[Color] = None
|
||||||
def owner: Boolean = false
|
def owner: Boolean = false
|
||||||
def watcher: Boolean = false
|
def watcher: Boolean = false
|
||||||
|
def troll: Boolean = false
|
||||||
}
|
}
|
||||||
|
|
||||||
object Event {
|
object Event {
|
||||||
|
@ -112,18 +113,20 @@ object Event {
|
||||||
def data = JsString(pos.key)
|
def data = JsString(pos.key)
|
||||||
}
|
}
|
||||||
|
|
||||||
case class Message(author: String, text: String) extends Event {
|
case class Message(author: String, text: String, t: Boolean) extends Event {
|
||||||
def typ = "message"
|
def typ = "message"
|
||||||
def data = Json.obj("u" -> author, "t" -> escapeXml(text))
|
def data = Json.obj("u" -> author, "t" -> escapeXml(text))
|
||||||
override def owner = true
|
override def owner = true
|
||||||
|
override def troll = t
|
||||||
}
|
}
|
||||||
|
|
||||||
// it *IS* a username, and not a user ID
|
// it *IS* a username, and not a user ID
|
||||||
// immediately used for rendering
|
// immediately used for rendering
|
||||||
case class WatcherMessage(username: Option[String], text: String) extends Event {
|
case class WatcherMessage(username: Option[String], text: String, t: Boolean) extends Event {
|
||||||
def typ = "message"
|
def typ = "message"
|
||||||
def data = Json.obj("u" -> username, "t" -> escapeXml(text))
|
def data = Json.obj("u" -> username, "t" -> escapeXml(text))
|
||||||
override def watcher = true
|
override def watcher = true
|
||||||
|
override def troll = t
|
||||||
}
|
}
|
||||||
|
|
||||||
object End extends Empty {
|
object End extends Empty {
|
||||||
|
|
|
@ -37,7 +37,8 @@ private[round] final class History(ttl: Duration) extends Actor {
|
||||||
data = e.data,
|
data = e.data,
|
||||||
only = e.only,
|
only = e.only,
|
||||||
owner = e.owner,
|
owner = e.owner,
|
||||||
watcher = e.watcher) ~ { events.put(version, _) }
|
watcher = e.watcher,
|
||||||
|
troll = e.troll) ~ { events.put(version, _) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,28 +44,29 @@ final class Messenger(
|
||||||
_ ← nextWR.nonEmpty ?? $insert(nextWR)
|
_ ← nextWR.nonEmpty ?? $insert(nextWR)
|
||||||
} yield ()
|
} yield ()
|
||||||
|
|
||||||
def playerMessage(ref: PovRef, text: String): Fu[List[Event.Message]] =
|
def playerMessage(ref: PovRef, text: String, troll: Boolean): Fu[List[Event.Message]] =
|
||||||
cleanupText(text).future flatMap { t ⇒
|
cleanupText(text).future flatMap { t ⇒
|
||||||
RoomRepo.addMessage(ref.gameId, ref.color.name, t) inject {
|
(!troll ?? RoomRepo.addMessage(ref.gameId, ref.color.name, t)) inject {
|
||||||
Event.Message(ref.color.name, t) :: Nil
|
Event.Message(ref.color.name, t, troll) :: Nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def watcherMessage(
|
def watcherMessage(
|
||||||
gameId: String,
|
gameId: String,
|
||||||
userId: Option[String],
|
userId: Option[String],
|
||||||
text: String): Fu[List[Event.WatcherMessage]] = for {
|
text: String,
|
||||||
|
troll: Boolean): Fu[List[Event.WatcherMessage]] = for {
|
||||||
userOption ← userId.??(UserRepo.byId)
|
userOption ← userId.??(UserRepo.byId)
|
||||||
message ← userOrAnonMessage(userOption, text).future
|
message ← userOrAnonMessage(userOption, text).future
|
||||||
(u, t) = message
|
(u, t) = message
|
||||||
_ ← WatcherRoomRepo.addMessage(gameId, u, t)
|
_ ← !troll ?? WatcherRoomRepo.addMessage(gameId, u, t)
|
||||||
} yield Event.WatcherMessage(u, t) :: Nil
|
} yield Event.WatcherMessage(u, t, troll) :: Nil
|
||||||
|
|
||||||
def systemMessages(game: Game, messages: List[SelectI18nKey]): Fu[List[Event]] =
|
def systemMessages(game: Game, messages: List[SelectI18nKey]): Fu[List[Event]] =
|
||||||
game.hasChat ?? {
|
game.hasChat ?? {
|
||||||
(messages map { m ⇒ trans(m) }) |> { messageKeys ⇒
|
(messages map { m ⇒ trans(m) }) |> { messageKeys ⇒
|
||||||
RoomRepo.addSystemMessages(game.id, messageKeys) inject {
|
RoomRepo.addSystemMessages(game.id, messageKeys) inject {
|
||||||
messageKeys map { Event.Message("system", _) }
|
messageKeys map { Event.Message("system", _, false) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,7 +75,7 @@ final class Messenger(
|
||||||
game.hasChat ?? {
|
game.hasChat ?? {
|
||||||
trans(message) |> { messageKey ⇒
|
trans(message) |> { messageKey ⇒
|
||||||
RoomRepo.addSystemMessage(game.id, messageKey) inject {
|
RoomRepo.addSystemMessage(game.id, messageKey) inject {
|
||||||
Event.Message("system", messageKey) :: Nil
|
Event.Message("system", messageKey, false) :: Nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,7 +86,7 @@ final class Messenger(
|
||||||
status.fold("en", "dis") + "abled"
|
status.fold("en", "dis") + "abled"
|
||||||
) |> { message ⇒
|
) |> { message ⇒
|
||||||
RoomRepo.addSystemMessage(ref.gameId, message) inject {
|
RoomRepo.addSystemMessage(ref.gameId, message) inject {
|
||||||
Event.Message("system", message) :: Nil
|
Event.Message("system", message, false) :: Nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,14 +42,15 @@ private[round] final class SocketHandler(
|
||||||
} messenger.watcherMessage(
|
} messenger.watcherMessage(
|
||||||
ref.gameId,
|
ref.gameId,
|
||||||
member.userId,
|
member.userId,
|
||||||
txt) pipeTo socket
|
txt,
|
||||||
|
member.troll) pipeTo socket
|
||||||
}) { playerId ⇒
|
}) { playerId ⇒
|
||||||
{
|
{
|
||||||
case ("p", o) ⇒ o int "v" foreach { v ⇒ socket ! PingVersion(uid, v) }
|
case ("p", o) ⇒ o int "v" foreach { v ⇒ socket ! PingVersion(uid, v) }
|
||||||
case ("talk", o) ⇒ for {
|
case ("talk", o) ⇒ for {
|
||||||
txt ← o str "d"
|
txt ← o str "d"
|
||||||
if flood.allowMessage(uid, txt)
|
if flood.allowMessage(uid, txt)
|
||||||
} messenger.playerMessage(ref, txt) pipeTo socket
|
} messenger.playerMessage(ref, txt, member.troll) pipeTo socket
|
||||||
case ("rematch-yes", _) ⇒ round(RematchYes(playerId))
|
case ("rematch-yes", _) ⇒ round(RematchYes(playerId))
|
||||||
case ("rematch-no", _) ⇒ round(RematchNo(playerId))
|
case ("rematch-no", _) ⇒ round(RematchNo(playerId))
|
||||||
case ("takeback-yes", _) ⇒ round(TakebackYes(playerId))
|
case ("takeback-yes", _) ⇒ round(TakebackYes(playerId))
|
||||||
|
|
|
@ -12,7 +12,8 @@ case class VersionedEvent(
|
||||||
data: JsValue,
|
data: JsValue,
|
||||||
only: Option[Color],
|
only: Option[Color],
|
||||||
owner: Boolean,
|
owner: Boolean,
|
||||||
watcher: Boolean) {
|
watcher: Boolean,
|
||||||
|
troll: Boolean) {
|
||||||
|
|
||||||
def jsFor(m: Member): JsObject = visibleBy(m).fold(
|
def jsFor(m: Member): JsObject = visibleBy(m).fold(
|
||||||
Json.obj(
|
Json.obj(
|
||||||
|
@ -26,5 +27,6 @@ case class VersionedEvent(
|
||||||
private def visibleBy(m: Member): Boolean =
|
private def visibleBy(m: Member): Boolean =
|
||||||
if (watcher && m.owner) false
|
if (watcher && m.owner) false
|
||||||
else if (owner && m.watcher) false
|
else if (owner && m.watcher) false
|
||||||
|
else if (troll && !m.troll) false
|
||||||
else only.fold(true)(_ == m.color)
|
else only.fold(true)(_ == m.color)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue