Better lobby messenging, apply chat ban

This commit is contained in:
Thibault Duplessis 2012-05-08 22:07:07 +02:00
parent 6e1944de21
commit b60ce8d942
7 changed files with 59 additions and 31 deletions

View file

@ -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)

View file

@ -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")

View file

@ -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())

View file

@ -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
View 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")
)
}
}

View file

@ -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
View file

@ -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