only one hook per player

This commit is contained in:
Thibault Duplessis 2013-06-04 12:53:43 +02:00
parent 7a1b9a3a36
commit 01960c4769
8 changed files with 18 additions and 7 deletions

View file

@ -41,7 +41,7 @@ object Setup extends LilaController with TheftPrevention {
def hook(uid: String) = OpenBody { implicit ctx
implicit val req = ctx.body
env.forms.hook(ctx).bindFromRequest.value ?? { config
env.processor.hook(config, uid)
env.processor.hook(config, uid, lila.common.HTTPRequest sid req)
}
}

View file

@ -16,4 +16,7 @@ object HTTPRequest {
def userAgent(req: RequestHeader): Option[String] =
req.headers get HeaderNames.USER_AGENT
def sid(req: RequestHeader): Option[String] =
req.session get "sid"
}

View file

@ -11,6 +11,7 @@ import lila.user.User
case class Hook(
id: String,
uid: String, // owner socket uid
sid: Option[String], // owner cookie (used to prevent multiple hooks)
variant: Int,
hasClock: Boolean,
time: Option[Int],
@ -68,6 +69,7 @@ object Hook {
mode: Mode,
color: String,
user: Option[User],
sid: Option[String],
eloRange: EloRange): Hook = new Hook(
id = Random nextString idSize,
uid = uid,
@ -79,6 +81,7 @@ object Hook {
color = color,
userId = user map (_.id),
username = user.fold(User.anonymous)(_.username),
sid = sid,
elo = user map (_.elo),
eloRange = eloRange.toString,
engine = user.??(_.engine),

View file

@ -13,6 +13,8 @@ object HookRepo {
def byUid(uid: String) = hooks find (_.uid == uid)
def bySid(sid: String) = hooks find (_.sid == sid.some)
def allOpen: List[Hook] = list.filter(_.open)
def allOpenCasual = list.filter(h h.open && h.mode == 0)

View file

@ -23,6 +23,7 @@ private[lobby] final class Lobby(
case msg @ AddHook(hook) {
HookRepo byUid hook.uid foreach remove
hook.sid ?? { sid HookRepo bySid sid foreach remove }
HookRepo save hook
socket ! msg
}

View file

@ -18,13 +18,14 @@ case class HookConfig(
def >> = (variant.id, clock, time, increment, mode.id.some, eloRange.toString.some, color.name).some
def hook(uid: String, user: Option[User]) = Hook.make(
def hook(uid: String, user: Option[User], sid: Option[String]) = Hook.make(
uid = uid,
variant = variant,
clock = makeClock,
mode = mode,
color = color.name,
user = user,
sid = sid,
eloRange = eloRange)
def encode = RawHookConfig(

View file

@ -50,9 +50,11 @@ private[setup] final class Processor(
friendConfigMemo.set(pov.game.id, config) inject pov
}
def hook(config: HookConfig, uid: String)(implicit ctx: Context): Funit = {
val hook = config.hook(uid, ctx.me)
saveConfig(_ withHook config) >>- (lobby ! AddHook(hook))
def hook(config: HookConfig, uid: String, sid: Option[String])(implicit ctx: Context): Funit = {
val hook = config.hook(uid, ctx.me, sid)
saveConfig(_ withHook config) >>- {
lobby ! AddHook(hook)
}
}
def api(implicit ctx: Context): Fu[JsObject] = {

3
todo
View file

@ -59,9 +59,8 @@ check team average elo http://en.lichess.org/inbox/benuegti#bottom
if game ends during move -> bug
challenge friends
computer players ranks once a day
lobby don't show duplicated entries
prevent double lobby entry per browser
players world map
signin button in chrome (light)
---