58 lines
1.4 KiB
Scala
58 lines
1.4 KiB
Scala
package lila.lobby
|
|
|
|
import org.joda.time.DateTime
|
|
|
|
object HookRepo {
|
|
|
|
private var hooks = Vector[Hook]()
|
|
|
|
private val hardLimit = 150
|
|
|
|
def size = hooks.size
|
|
|
|
def findCompatible(hook: Hook): Vector[Hook] = hooks filter (_ compatibleWith hook)
|
|
|
|
def truncateIfNeeded = if (size >= hardLimit) {
|
|
logger.warn(s"Found ${size} hooks, cleaning up!")
|
|
cleanupOld
|
|
hooks = hooks.take(hardLimit / 2)
|
|
}
|
|
|
|
def vector = hooks
|
|
|
|
def byId(id: String) = hooks find (_.id == id)
|
|
|
|
def byIds(ids: Set[String]) = hooks filter { h => ids contains h.id }
|
|
|
|
def byUid(uid: String) = hooks find (_.uid == uid)
|
|
|
|
def bySid(sid: String) = hooks find (_.sid == sid.some)
|
|
|
|
def notInUids(uids: Set[String]): Vector[Hook] = hooks.filterNot(h => uids(h.uid))
|
|
|
|
def save(hook: Hook) {
|
|
hooks = hooks.filterNot(_.id == hook.id) :+ hook
|
|
}
|
|
|
|
def remove(hook: Hook) {
|
|
hooks = hooks filterNot (_.id == hook.id)
|
|
}
|
|
|
|
// returns removed hooks
|
|
def cleanupOld = {
|
|
val limit = DateTime.now minusMinutes 10
|
|
partition(_.createdAt isAfter limit)
|
|
}
|
|
|
|
def poolCandidates(clock: chess.Clock.Config): Vector[lila.pool.HookThieve.PoolHook] =
|
|
hooks.filter(_ compatibleWithPool clock).map(_.toPool)
|
|
|
|
// keeps hooks that hold true
|
|
// returns removed hooks
|
|
private def partition(f: Hook => Boolean): Vector[Hook] = {
|
|
val (kept, removed) = hooks partition f
|
|
hooks = kept
|
|
removed
|
|
}
|
|
}
|