Skip to content

Commit

Permalink
Merge branch 'master' into always-be-hashing
Browse files Browse the repository at this point in the history
  • Loading branch information
ornicar authored Feb 10, 2025
2 parents 0cf1cbd + 47624e2 commit f83f02f
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 56 deletions.
90 changes: 46 additions & 44 deletions app/controllers/Challenge.scala
Original file line number Diff line number Diff line change
Expand Up @@ -279,51 +279,53 @@ final class Challenge(env: Env) extends LilaController(env):

def apiCreate(username: UserStr) =
ScopedBody(_.Challenge.Write, _.Bot.Play, _.Board.Play, _.Web.Mobile) { ctx ?=> me ?=>
(!me
.is(username))
.so(
bindForm(env.setup.forms.api.user)(
doubleJsonFormError,
config =>
limit.challenge(req.ipAddress, rateLimited, cost = if me.isApiHog then 0 else 1):
env.user.repo.enabledById(username).flatMap {
case None => JsonBadRequest(jsonError(s"No such user: $username"))
case Some(destUser) if destUser.isBot && !config.rules.isEmpty =>
JsonBadRequest(jsonError("Rules not applicable for bots"))
case Some(destUser) =>
val cost = if me.isApiHog then 0 else if destUser.isBot then 1 else 5
limit.challengeBot(req.ipAddress, rateLimited, cost = if me.isBot then 1 else 0):
limit.challengeUser(me, rateLimited, cost = cost):
for
challenge <- makeOauthChallenge(config, me, destUser)
grant <- env.challenge.granter.isDenied(destUser, config.perfKey.some)
res <- grant match
case Some(denied) =>
fuccess:
JsonBadRequest:
jsonError(lila.challenge.ChallengeDenied.translated(denied))
case _ =>
env.challenge.api.create(challenge).flatMap {
if _ then
ctx.isMobileOauth
.so(env.challenge.version(challenge.id).dmap(some))
.map: socketVersion =>
val json = env.challenge.jsonView
.apiAndMobile(
challenge,
socketVersion,
lila.challenge.Direction.Out.some
)
if config.keepAliveStream then
jsOptToNdJson:
ndJson.addKeepAlive(env.challenge.keepAliveStream(challenge, json))
else JsonOk(json)
else JsonBadRequest(jsonError("Challenge not created")).toFuccess
}
yield res
}
)
(!me.is(username)).so(
bindForm(env.setup.forms.api.user)(
doubleJsonFormError,
config =>
limit.challenge(req.ipAddress, rateLimited, cost = if me.isApiHog then 0 else 1):
env.user.repo.enabledById(username).flatMap {
case None => JsonBadRequest(jsonError(s"No such user: $username"))
case Some(destUser) if destUser.isBot && !config.rules.isEmpty =>
JsonBadRequest(jsonError("Rules not applicable for bots"))
case Some(destUser) =>
env.relation.api
.fetchFollows(destUser.id, me.id)
.flatMap: isFriend =>
val cost = if isFriend || me.isApiHog then 0 else if destUser.isBot then 1 else 5
limit.challengeBot(req.ipAddress, rateLimited, cost = if me.isBot then 1 else 0):
limit.challengeUser(me, rateLimited, cost = cost):
for
challenge <- makeOauthChallenge(config, me, destUser)
grant <- env.challenge.granter.isDenied(destUser, config.perfKey.some)
res <- grant match
case Some(denied) =>
fuccess:
JsonBadRequest:
jsonError(lila.challenge.ChallengeDenied.translated(denied))
case _ =>
env.challenge.api.create(challenge).flatMap {
if _ then
ctx.isMobileOauth
.so(env.challenge.version(challenge.id).dmap(some))
.map: socketVersion =>
val json = env.challenge.jsonView
.apiAndMobile(
challenge,
socketVersion,
lila.challenge.Direction.Out.some
)
if config.keepAliveStream then
jsOptToNdJson:
ndJson
.addKeepAlive(env.challenge.keepAliveStream(challenge, json))
else JsonOk(json)
else JsonBadRequest(jsonError("Challenge not created")).toFuccess
}
yield res
}
)
)
}

private def makeOauthChallenge(config: ApiConfig, orig: lila.user.User, dest: lila.user.User) =
Expand Down
9 changes: 0 additions & 9 deletions modules/core/src/main/game/Game.scala
Original file line number Diff line number Diff line change
Expand Up @@ -151,18 +151,9 @@ case class Game(

def aiPov: Option[Pov] = players.findColor(_.isAi).map(pov)

def mapPlayers(f: Player => Player) = copy(players = players.map(f))

def swissPreventsDraw = isSwiss && playedTurns < 60
def rulePreventsDraw = hasRule(_.noEarlyDraw) && playedTurns < 60

def playerHasOfferedDrawRecently(color: Color) =
drawOffers.lastBy(color).exists(_ >= ply - 20)

def offerDraw(color: Color) = copy(
metadata = metadata.copy(drawOffers = drawOffers.add(color, ply))
).updatePlayer(color, _.copy(isOfferingDraw = true))

def boosted = rated && finished && bothPlayersHaveMoved && playedTurns < 10

def abortable = status == Status.Started && playedTurns < 2 && nonMandatory
Expand Down
3 changes: 3 additions & 0 deletions modules/game/src/main/Game.scala
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ object GameExt:
g.clock.map: c =>
g.start.withClock(c.start)

def playerHasOfferedDrawRecently(color: Color) =
g.drawOffers.lastBy(color).exists(_ >= g.ply - 20)

def playerCanOfferDraw(color: Color) =
g.started && g.playable &&
g.ply >= 2 &&
Expand Down
10 changes: 8 additions & 2 deletions modules/round/src/main/Drawer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package lila.round

import chess.Centis
import play.api.i18n.Lang
import monocle.syntax.all.*

import lila.common.Bus
import lila.core.i18n.{ I18nKey as trans, Translator, defaultLang }
import lila.game.GameExt.playerCanOfferDraw
import lila.game.GameExt.*
import lila.game.{ Event, Progress }
import lila.pref.{ Pref, PrefApi }

Expand Down Expand Up @@ -51,7 +52,7 @@ final private[round] class Drawer(
Messenger.SystemMessage.Persistent(trans.site.drawOfferAccepted.txt()).some
)
case Pov(g, color) if g.playerCanOfferDraw(color) =>
val progress = Progress(g).map { _.offerDraw(color) }
val progress = Progress(g).map(offerDraw(color))
messenger.system(g, color.fold(trans.site.whiteOffersDraw, trans.site.blackOffersDraw).txt())
for
_ <- proxy.save(progress)
Expand Down Expand Up @@ -85,6 +86,11 @@ final private[round] class Drawer(

def force(game: Game)(using GameProxy): Fu[Events] = finisher.other(game, _.Draw, None, None)

private def offerDraw(color: Color)(game: Game) = game
.updatePlayer(color, _.copy(isOfferingDraw = true))
.focus(_.metadata.drawOffers)
.modify(_.add(color, game.ply))

private def publishDrawOffer(game: Game): Unit = if game.nonAi then
if game.isCorrespondence then
Bus.publish(
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"url": "https://github.com/lichess-org/lila/issues"
},
"homepage": "https://lichess.org",
"packageManager": "pnpm@10.0.0+sha512.b8fef5494bd3fe4cbd4edabd0745df2ee5be3e4b0b8b08fa643aa3e4c6702ccc0f00d68fa8a8c9858a735a0032485a44990ed2810526c875e416f001b17df12b",
"packageManager": "pnpm@10.2.1+sha512.398035c7bd696d0ba0b10a688ed558285329d27ea994804a52bad9167d8e3a72bcb993f9699585d3ca25779ac64949ef422757a6c31102c12ab932e5cbe5cc92",
"engines": {
"node": ">=22.6",
"pnpm": "^10"
Expand Down

0 comments on commit f83f02f

Please sign in to comment.