This repository has been archived on 2026-05-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
unalike/compose/index.php
T
2021-06-17 22:10:22 +02:00

270 lines
6.6 KiB
PHP

<?php
include "../api_key.php";
include "../local_secret.php";
$trusted = false;
if (!empty($_GET["secret"]) && $_GET["secret"] == $local_secret)
{
$trusted = true;
}
if ($trusted)
{
$url_base = "http://localhost:80/Unalike/API/~Unalike/m/";
$source = array();
if (!empty($_GET["source"]))
{
foreach (explode(";", $_GET["source"]) as $list)
{
$entry = explode(",", $list);
$lobby = array();
if (isset($entry[0]) && isset($entry[1]))
{
$lobby["match"] = $entry[0];
$lobby["round"] = $entry[1];
$source[] = $lobby;
}
}
}
$beatmapset = -4;
if (isset($_GET["beatmapset"]))
{
$beatmapset = $_GET["beatmapset"];
}
if (!empty($source) && isset($beatmapset))
{
$beatmap_url_v1 = "https://osu.ppy.sh/api/get_beatmaps?k={$api_key}&";
$match_id = "ual" . strval(floor(time()));
$merged = array(
"match" => array(
"match_id" => $match_id,
),
"games" => array(),
);
$merged_game = array(
"game_id" => $match_id,
"beatmapset_id" => $beatmapset,
// "beatmapset" => [ "id" => $beatmapset ],
);
$modes = array(
"0" => "osu",
"1" => "taiko",
"2" => "fruits",
"3" => "mania",
);
$scores = array();
foreach ($source as $lobby)
{
$url = $url_base . $lobby["match"];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
$json = json_decode($data, true);
if (!empty($json) &&
!empty($json["match"]) &&
isset($json["match"]["name"]) &&
!empty($json["games"]))
{
$real_round = array_key_first($json["games"]);
$lobby["round"] = intval($lobby["round"]);
if ($lobby["round"] > 0)
{
$real_round = intval($lobby["round"]) - 1;
}
else if ($lobby["round"] == -1)
{
$real_round = array_key_last($json["games"]);
}
if (!empty($json["games"][$real_round]) &&
isset($json["games"][$real_round]["scores"]) )
{
$lobby_name = $json["match"]["name"];
$bancho_game = $json["games"][$real_round];
$lobby_beatmap = $bancho_game["beatmap_id"];
$api_url = $beatmap_url_v1 . "b=" . $lobby_beatmap;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$api_response = curl_exec($ch);
curl_close($ch);
$api_json = json_decode($api_response, true);
$mode = "osu";
if (!empty($api_response) && !empty($api_json) && isset($api_json[0]["mode"]))
{
$mode = "osu";
if ($api_json[0]["mode"] != "0")
{
$mode = $modes[$api_json[0]["mode"]];
}
else if (isset($bancho_game["play_mode"]) && $bancho_game["play_mode"] != "0")
{
$mode = $modes[$bancho_game["play_mode"]];
}
}
foreach ($bancho_game["scores"] as $souce_score)
{
$score = array(
"user_id" => $souce_score["user_id"],
"place" => 0,
"accuracy" => 0,
"maxcombo" => 0,
"beatmap_id" => "0",
"score" => 0,
"game" => [],
);
// $score["source"] = $souce_score;
$score["source_id"] = $lobby["match"];
$score["source_round"] = $real_round + 1;
$score["lobby_name"] = $lobby_name;
$score["beatmap_id"] = $lobby_beatmap;
// $score["beatmap"] = array("id" => $lobby_beatmap);
$score["game"]["play_mode"] = $bancho_game["play_mode"];
$score["game"]["mode"] = $mode;
$score["game"]["match_type"] = $bancho_game["match_type"];
$score["game"]["scoring_type"] = $bancho_game["scoring_type"];
$score["game"]["team_type"] = $bancho_game["team_type"];
$score["game"]["mods"] = $bancho_game["mods"];
$hit0 = intval($souce_score["countmiss"]);
$hit50 = intval($souce_score["count50"]);
$hit100 = intval($souce_score["count100"]);
$hit300 = intval($souce_score["count300"]);
$hitGeki = intval($souce_score["countgeki"]);
$hitKatsu = intval($souce_score["countkatu"]);
$score["countmiss"] = $hit0;
$score["count50"] = $hit50;
$score["count100"] = $hit100;
$score["count300"] = $hit300;
$score["countgeki"] = $hitGeki;
$score["countkatu"] = $hitKatsu;
if ($mode == "mania")
{
$all_notes = $hit0 + $hit50 + $hit100 + $hitKatsu + $hit300 + $hitGeki;
$flat_score = ($hit50 * 50) + ($hit100 * 100) + ($hitKatsu * 200) + (($hit300 + $hitGeki) * 300);
$max_score = $all_notes * 300;
}
else if ($mode == "fruits")
{
$all_notes = $hit0 + $hitKatsu + $hit50 + $hit100 + $hit300;
$flat_score = $hit50 + $hit100 + $hit300;
$max_score = $all_notes;
}
else if ($mode == "taiko")
{
$all_notes = $hit0 + $hit100 + $hit300;
$flat_score = $hit100 + ($hit300 * 2);
$max_score = $all_notes * 2;
}
else
{
$all_notes = $hit0 + $hit50 + $hit100 + $hit300;
$flat_score = ($hit50 * 50) + ($hit100 * 100) + ($hit300 * 300);
$max_score = $all_notes * 300;
}
$accuracy = round(($flat_score * 100) / $max_score, 2);
$score["all_notes"] = $all_notes;
$score["accuracy"] = $accuracy;
$score["maxcombo"] = intval($souce_score["maxcombo"]);
$score["score"] = intval($souce_score["score"]);
$score["pass"] = intval($souce_score["pass"]);
$scores[] = $score;
}
}
}
}
usort($scores, function($a, $b) {
if ($a["pass"] == $b["pass"])
{
if ($a["accuracy"] == $b["accuracy"])
{
if ($a["maxcombo"] == $b["maxcombo"])
{
return 0;
}
else if ($a["maxcombo"] < $b["maxcombo"])
{
return 1;
}
else
{
return -1;
}
}
else if ($a["accuracy"] < $b["accuracy"])
{
return 1;
}
else
{
return -1;
}
}
else if ($a["pass"] < $b["pass"])
{
return 1;
}
else
{
return -1;
}
});
$counter = 1;
foreach ($scores as $key => $score)
{
$scores[$key]["place"] = $counter++;
}
$merged_game["scores"] = $scores;
$merged["games"][] = $merged_game;
file_put_contents("../matches/{$match_id}.json", json_encode($merged));
header("Content-Type: application/json");
echo json_encode(["status" => "success"]);
// echo json_encode($merged);
}
else
{
echo json_encode(["status" => "error", "error" => "missing_argument"]);
}
}
else
{
echo json_encode(["status" => "error", "error" => "unauthenticated"]);
}