Better lobby messenging, apply chat ban
This commit is contained in:
parent
6e1944de21
commit
b60ce8d942
|
@ -53,8 +53,12 @@ final class SystemEnv(application: Application) {
|
|||
lazy val lobbyHistory = new lobby.History(
|
||||
timeout = getMilliseconds("lobby.message.lifetime"))
|
||||
|
||||
lazy val lobbyHub = Akka.system.actorOf(Props(new lobby.Hub(
|
||||
lazy val lobbyMessenger = new lobby.Messenger(
|
||||
messageRepo = messageRepo,
|
||||
userRepo = userRepo)
|
||||
|
||||
lazy val lobbyHub = Akka.system.actorOf(Props(new lobby.Hub(
|
||||
messenger = lobbyMessenger,
|
||||
history = lobbyHistory,
|
||||
timeout = getMilliseconds("site.uid.timeout")
|
||||
)), name = "lobby_hub")
|
||||
|
@ -97,7 +101,7 @@ final class SystemEnv(application: Application) {
|
|||
fisherman = lobbyFisherman,
|
||||
gameRepo = gameRepo,
|
||||
gameSocket = gameSocket,
|
||||
messenger = messenger,
|
||||
gameMessenger = messenger,
|
||||
starter = starter,
|
||||
lobbySocket = lobbySocket)
|
||||
|
||||
|
|
|
@ -6,27 +6,13 @@ import model.Message
|
|||
import com.mongodb.casbah.MongoCollection
|
||||
import com.mongodb.casbah.Imports._
|
||||
import scalaz.effects._
|
||||
import org.apache.commons.lang3.StringEscapeUtils.escapeXml
|
||||
|
||||
final class MessageRepo(collection: MongoCollection, max: Int)
|
||||
extends CappedRepo[Message](collection, max) {
|
||||
|
||||
private val urlRegex = """lichess\.org/([\w-]{8})[\w-]{4}""".r
|
||||
|
||||
def add(text: String, username: String): Valid[IO[Message]] =
|
||||
if (username.isEmpty || username == "Anonymous")
|
||||
!!("Invalid username " + username)
|
||||
else escapeXml(text.trim take 140) |> { escaped ⇒
|
||||
if (escaped.isEmpty) !!("Empty message")
|
||||
else success {
|
||||
val t = urlRegex.replaceAllIn(
|
||||
escaped,
|
||||
m ⇒ "lichess.org/" + (m group 1))
|
||||
io {
|
||||
Message(username, t) ~ { collection += encode(_) }
|
||||
}
|
||||
}
|
||||
}
|
||||
def add(message: Message): IO[Unit] = io {
|
||||
collection += encode(message)
|
||||
}
|
||||
|
||||
def decode(obj: DBObject): Option[Message] = for {
|
||||
u ← obj.getAs[String]("u")
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package lila
|
||||
package lobby
|
||||
|
||||
import lila.{ Messenger ⇒ GameMessenger }
|
||||
import model._
|
||||
import memo._
|
||||
import db._
|
||||
|
@ -12,7 +13,7 @@ final class Api(
|
|||
fisherman: Fisherman,
|
||||
gameRepo: GameRepo,
|
||||
gameSocket: game.Socket,
|
||||
messenger: Messenger,
|
||||
gameMessenger: GameMessenger,
|
||||
starter: Starter,
|
||||
lobbySocket: lobby.Socket) {
|
||||
|
||||
|
@ -34,7 +35,7 @@ final class Api(
|
|||
(color, game) ⇒ {
|
||||
for {
|
||||
p1 ← starter.start(game, entryData)
|
||||
p2 ← messenger.systemMessages(game, messageString) map p1.++
|
||||
p2 ← gameMessenger.systemMessages(game, messageString) map p1.++
|
||||
_ ← gameRepo save p2
|
||||
_ ← gameSocket send p2
|
||||
_ ← hook.fold(h ⇒ fisherman.bite(h, p2.game), io())
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package lila
|
||||
package lobby
|
||||
|
||||
import db.MessageRepo
|
||||
import socket._
|
||||
|
||||
import akka.actor._
|
||||
|
@ -9,9 +8,9 @@ import play.api.libs.json._
|
|||
import play.api.libs.iteratee._
|
||||
|
||||
final class Hub(
|
||||
messageRepo: MessageRepo,
|
||||
history: History,
|
||||
timeout: Int) extends HubActor[Member](timeout) {
|
||||
messenger: Messenger,
|
||||
history: History,
|
||||
timeout: Int) extends HubActor[Member](timeout) {
|
||||
|
||||
def receiveSpecific = {
|
||||
|
||||
|
@ -23,8 +22,7 @@ final class Hub(
|
|||
sender ! Connected(channel)
|
||||
}
|
||||
|
||||
case Talk(txt, u) ⇒ messageRepo.add(txt, u) foreach { save ⇒
|
||||
val message = save.unsafePerformIO
|
||||
case Talk(txt, u) ⇒ messenger(txt, u).unsafePerformIO foreach { message ⇒
|
||||
notifyVersion("talk", Seq(
|
||||
"txt" -> JsString(message.text),
|
||||
"u" -> JsString(message.username)
|
||||
|
|
38
app/lobby/Messenger.scala
Normal file
38
app/lobby/Messenger.scala
Normal file
|
@ -0,0 +1,38 @@
|
|||
package lila
|
||||
package lobby
|
||||
|
||||
import db.{ MessageRepo, UserRepo }
|
||||
import model.{ Message, User }
|
||||
|
||||
import scalaz.effects._
|
||||
import org.apache.commons.lang3.StringEscapeUtils.escapeXml
|
||||
|
||||
final class Messenger(
|
||||
messageRepo: MessageRepo,
|
||||
userRepo: UserRepo) {
|
||||
|
||||
private val urlRegex = """lichess\.org/([\w-]{8})[\w-]{4}""".r
|
||||
|
||||
def apply(text: String, username: String): IO[Valid[Message]] = for {
|
||||
userOption ← userRepo byUsername username
|
||||
message = for {
|
||||
user ← userOption toValid "Unknown user"
|
||||
msg ← createMessage(text, user)
|
||||
} yield msg
|
||||
_ ← message.fold(err ⇒ io(failure(err)), messageRepo.add)
|
||||
} yield message
|
||||
|
||||
def createMessage(text: String, user: User): Valid[Message] =
|
||||
if (user.isChatBan) !!("Chat banned " + user)
|
||||
else if (user.disabled) !!("User disabled " + user)
|
||||
else escapeXml(text.trim take 140) |> { escaped ⇒
|
||||
(escaped.nonEmpty).fold(
|
||||
success(Message(
|
||||
user.username,
|
||||
urlRegex.replaceAllIn(escaped, m ⇒ "lichess.org/" + (m group 1))
|
||||
)),
|
||||
!!("Empty message")
|
||||
)
|
||||
}
|
||||
|
||||
}
|
|
@ -11,7 +11,11 @@ case class User(
|
|||
isOnline: Boolean,
|
||||
elo: Int,
|
||||
nbGames: Int,
|
||||
nbRatedGames: Int) {
|
||||
nbRatedGames: Int,
|
||||
isChatBan: Boolean = false,
|
||||
enabled: Boolean = true) {
|
||||
|
||||
def disabled = !enabled
|
||||
}
|
||||
|
||||
object User {
|
||||
|
|
3
todo
3
todo
|
@ -1,11 +1,8 @@
|
|||
ping nbm
|
||||
extract chess
|
||||
chat ban
|
||||
chat should autoscroll only when at bottom
|
||||
any link in-game
|
||||
back button to game -> old status
|
||||
home list of current games not translated
|
||||
registered user disconnection delay
|
||||
bad visibility of online indicators during game
|
||||
force resign
|
||||
finish flagged game
|
||||
|
|
Loading…
Reference in a new issue