display username when rate limiting the lobby socket

This commit is contained in:
Thibault Duplessis 2016-03-21 14:41:03 +07:00
parent eeb1df56b4
commit a5252db5a7
3 changed files with 33 additions and 26 deletions

View file

@ -20,7 +20,8 @@ private[controllers] trait LilaController
extends Controller
with ContentTypes
with RequestGetter
with ResponseWriter {
with ResponseWriter
with LilaSocket {
import Results._
@ -62,8 +63,8 @@ private[controllers] trait LilaController
}
protected def SocketOptionLimited[A: FrameFormatter](consumer: TokenBucket.Consumer, name: String)(f: Context => Fu[Option[(Iteratee[A, _], Enumerator[A])]]) =
LilaSocket.rateLimited[A](consumer, name) { req =>
reqToCtx(req) flatMap f map {
rateLimitedSocket[A](consumer, name) { ctx =>
f(ctx) map {
case None => Left(NotFound(jsonError("socket resource not found")))
case Some(pair) => Right(pair)
}

View file

@ -6,36 +6,40 @@ import play.api.libs.json._
import play.api.mvc._, Results._
import play.api.mvc.WebSocket.FrameFormatter
import lila.api.TokenBucket
import lila.api.{ Context, TokenBucket }
import lila.app._
import lila.common.HTTPRequest
object LilaSocket extends RequestGetter {
trait LilaSocket { self: LilaController =>
private type AcceptType[A] = RequestHeader => Fu[Either[Result, (Iteratee[A, _], Enumerator[A])]]
private type AcceptType[A] = Context => Fu[Either[Result, (Iteratee[A, _], Enumerator[A])]]
private val logger = lila.log("ratelimit")
def rateLimited[A: FrameFormatter](consumer: TokenBucket.Consumer, name: String)(f: AcceptType[A]): WebSocket[A, A] =
def rateLimitedSocket[A: FrameFormatter](consumer: TokenBucket.Consumer, name: String)(f: AcceptType[A]): WebSocket[A, A] =
WebSocket[A, A] { req =>
val ip = HTTPRequest lastRemoteAddress req
def mobileInfo = lila.api.Mobile.Api.requestVersion(req).fold("nope") { v =>
val sri = get("sri", req) | "none"
s"$v sri:$sri"
}
f(req).map { resultOrSocket =>
resultOrSocket.right.map {
case (readIn, writeOut) => (e, i) => {
writeOut |>> i
e &> Enumeratee.mapInputM { in =>
consumer(ip).map { credit =>
if (credit >= 0) in
else {
logger.info(s"socket:$name socket close $ip mobile:$mobileInfo $in")
Input.EOF
reqToCtx(req) flatMap { ctx =>
val ip = HTTPRequest lastRemoteAddress req
def mobileInfo = lila.api.Mobile.Api.requestVersion(req).fold("nope") { v =>
val sri = get("sri", req) | "none"
val username = ctx.usernameOrAnon
s"$v user:$username sri:$sri"
}
// logger.info(s"socket:$name socket connect $ip mobile:$mobileInfo")
f(ctx).map { resultOrSocket =>
resultOrSocket.right.map {
case (readIn, writeOut) => (e, i) => {
writeOut |>> i
e &> Enumeratee.mapInputM { in =>
consumer(ip).map { credit =>
if (credit >= 0) in
else {
logger.info(s"socket:$name socket close $ip mobile:$mobileInfo $in")
Input.EOF
}
}
}
} |>> readIn
} |>> readIn
}
}
}
}

View file

@ -14,9 +14,11 @@ sealed trait UserContext {
def is(user: User): Boolean = me ?? (user ==)
def userId = me map (_.id)
def userId = me.map(_.id)
def username = me map (_.username)
def username = me.map(_.username)
def usernameOrAnon = username | "Anonymous"
def troll = me.??(_.troll)