display username when rate limiting the lobby socket
This commit is contained in:
parent
eeb1df56b4
commit
a5252db5a7
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue