summaryrefslogtreecommitdiff
path: root/http/api-inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'http/api-inc.php')
-rw-r--r--http/api-inc.php78
1 files changed, 68 insertions, 10 deletions
diff --git a/http/api-inc.php b/http/api-inc.php
index 565e66c..2606df7 100644
--- a/http/api-inc.php
+++ b/http/api-inc.php
@@ -28,9 +28,30 @@ function recursive_ksort(&$array, $flags = SORT_REGULAR) {
class ParametersException extends Exception {};
+function run($parameters) {
+ $versionClasses = array(
+ '1' => 'ApiPklV1', // RegKlas 2018.11.01
+ '2' => 'ApiPklV2', // RegKMP 2020.01.01
+ '3' => 'ApiPklV3', // local BNET 2020.05.01
+ '_default' => 'ApiPklV3'
+ );
+ $version = isset($parameters['version']) ? $parameters['version'] : '_default';
+ $apiClass = isset($versionClasses[$version]) ? $versionClasses[$version] : $versionClasses['_default'];
+ $api = new $apiClass($parameters);
+ if ($parameters['tournament_rank'] == ApiPkl::RANK_KMP) {
+ $result = $api->calculate_kmp_points();
+ } else if ($parameters['tournament_rank'] == ApiPkl::RANK_BNET) {
+ $result = $api->calculate_bridgenet_points();
+ } else {
+ $result = $api->calculate_points();
+ }
+ return $result;
+}
+
class ApiPkl {
const RANK_KMP = 101;
+ const RANK_BNET = 102;
protected $parameters;
@@ -74,7 +95,7 @@ class ApiPkl {
if (!isset($this->parameters['manual']) || !isset($this->parameters['manual']['min_points']) || !isset($this->parameters['manual']['tournament_weight'])) {
$this->ensure_parameters(array('tournament_rank', 'over39_boards'));
$this->check_values($this->parameters, array(
- 'tournament_rank' => function($r) { return ctype_digit($r) && ((intval($r) >= 0 && intval($r) <= 7) || intval($r) == ApiPkl::RANK_KMP); },
+ 'tournament_rank' => function($r) { return ctype_digit($r) && ((intval($r) >= 0 && intval($r) <= 7) || in_array(intval($r), array(ApiPkl::RANK_KMP, ApiPkl::RANK_BNET))); },
'over39_boards' => function($r) { return ctype_digit($r) && intval($r) >= 0 && intval($r) <= 1; }
));
} else {
@@ -99,17 +120,20 @@ class ApiPkl {
if ($return['type'] != 2 && $this->parameters['tournament_rank'] == ApiPkl::RANK_KMP) {
throw new ParametersException('Parameter: type has incorrect value (' . $return['type'] . ') for KMP tournament');
}
+ if (isset($this->parameters['boards'])) {
+ $return['boards'] = intval($this->parameters['boards']);
+ }
$return['contestants'] = intval($this->parameters['contestants']);
$return['players'] = isset($this->parameters['players']) ? intval($this->parameters['players']) : intval($this->parameters['contestants']) * $return['type'];
$return['title_sum'] = floatval($this->parameters['title_sum']);
$weights = array(
- array(1, 2, 4, 5, 7, 10, 15, 25, ApiPkl::RANK_KMP => 0),
- array(2, 3, 5, 7, 10, 15, 25, 40, ApiPkl::RANK_KMP => 0)
+ array(1, 2, 4, 5, 7, 10, 15, 25, ApiPkl::RANK_KMP => 0, ApiPkl::RANK_BNET => 1),
+ array(2, 3, 5, 7, 10, 15, 25, 40, ApiPkl::RANK_KMP => 0, ApiPkl::RANK_BNET => 1) // not 2, according to MarcinW
);
$return['tournament_weight'] = (isset($this->parameters['manual']) && isset($this->parameters['manual']['tournament_weight'])) ? intval($this->parameters['manual']['tournament_weight']) : $weights[intval($this->parameters['over39_boards'])][intval($this->parameters['tournament_rank'])];
$min_points = array(
- array(0, 0, 0, 0, 50, 75, 150, 200, ApiPkl::RANK_KMP => 0),
- array(0, 0, 0, 0, 70, 100, 200, 300, ApiPkl::RANK_KMP => 0)
+ array(0, 0, 0, 0, 50, 75, 150, 200, ApiPkl::RANK_KMP => 0, ApiPkl::RANK_BNET => 0),
+ array(0, 0, 0, 0, 70, 100, 200, 300, ApiPkl::RANK_KMP => 0, ApiPkl::RANK_BNET => 0)
);
$return['min_points'] = (isset($this->parameters['manual']) && isset($this->parameters['manual']['min_points'])) ? intval($this->parameters['manual']['min_points']) : $min_points[intval($this->parameters['over39_boards'])][intval($this->parameters['tournament_rank'])];
$return['players_coefficient'] = (isset($this->parameters['manual']) && isset($this->parameters['manual']['players_coefficient'])) ? floatval($this->parameters['manual']['players_coefficient']) : 0.05;
@@ -167,18 +191,20 @@ class ApiPkl {
return 0.0;
}
- function calculate_points() {
+ function calculate_points($min_points=1, $scale_factor=1.0) {
$max_points = safe_ceil(max(
$this->parameters['min_points'],
(1 + 0.25 * ($this->parameters['type'] > 2)) * (max(0.15, $this->parameters['title_sum'] / $this->parameters['players']) * $this->parameters['tournament_weight'] + $this->parameters['players_coefficient'] * $this->parameters['contestants'] * $this->parameters['type'])
));
- $min_points = 1;
$result = array("sum" => 0, "points" => array());
for ($place = 1; $place <= $this->parameters['contestants']; $place++) {
$percentage = $this->get_percentage_from_position($place, $this->parameters['contestants'], $this->parameters['points_cutoffs']);
- $points = safe_ceil(floatval($max_points) * $percentage);
- $result['points'][$place] = max($min_points, intval($points));
- $result['sum'] += $this->parameters['type'] * $result['points'][$place];
+ $points = safe_ceil(floatval($max_points) * $percentage * $scale_factor);
+ $points = max($min_points, intval($points));
+ if ($points > 0) {
+ $result['points'][$place] = $points;
+ $result['sum'] += $this->parameters['type'] * $result['points'][$place];
+ }
}
return $result;
}
@@ -199,6 +225,10 @@ class ApiPkl {
}
return $result;
}
+
+ function calculate_bridgenet_points() {
+ throw new ParametersException('BridgeNET points not supported in this API version');
+ }
}
class ApiPklV1 extends ApiPkl {}
@@ -217,4 +247,32 @@ class ApiPklV2 extends ApiPklV1 {
}
+class ApiPklV3 extends ApiPklV2 {
+
+ function check_parameters() {
+ if (isset($this->parameters['tournament_rank']) && $this->parameters['tournament_rank'] == ApiPkl::RANK_BNET) {
+ $this->ensure_parameters(array('boards', 'type'));
+ if ($this->parameters['type'] == 4) {
+ throw new ParametersException('Parameter: type has incorrect value (' . $this->parameters['type'] . ') for BridgeNET tournament');
+ }
+ if (isset($this->parameters['manual'])) {
+ unset($this->parameters['manual']);
+ }
+ }
+ if (isset($this->parameters['boards'])) {
+ $this->check_values($this->parameters, array(
+ 'boards' => function($r) { return ctype_digit($r); }
+ ));
+ $this->parameters['over39_boards'] = strval(intval($this->parameters['boards'] > 39));
+ }
+ return parent::check_parameters();
+ }
+
+ function calculate_bridgenet_points() {
+ $factor = min($this->parameters['boards'] / 27.0, 1.0);
+ return $this->calculate_points(0, $factor);
+ }
+
+}
+
?>