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
2021-06-17 22:10:32 +02:00

297 lines
6.2 KiB
PHP

<?php
include "../api_key.php";
if (!empty($_GET["username"]) || !empty($_GET["userid"]))
{
$id = -1;
$online = false;
$token = "";
if (!empty($_GET["username"]))
{
$username = strtolower($_GET["username"]);
$users = json_decode(file_get_contents(getcwd()."/../users.json"), true);
if (!empty($users[$username]))
{
$id = $users[$username];
}
else
{
$id = $username;
}
}
else if (!empty($_GET["userid"]))
{
$id = $_GET["userid"];
}
else if ($id != "~Unalike" && $id < 0)
{
echo "Unauthorized";
exit(0);
}
$base_url_v2 = "https://osu.ppy.sh/api/v2";
$base_url_v1 = "https://osu.ppy.sh/api";
$diffs_redirect = false;
$cross_mode = false; // single-output for Python
// d = all [d]ifficulties
// x = Python [x]ross mode (non-json output, single beatmapset)
if (!empty($_GET["b"]) || !empty($_GET["d"]) || !empty($_GET["x"]))
{
if (!empty($_GET["x"]))
{
$beatmap = $_GET["x"];
$cross_mode = true;
}
else if (!empty($_GET["d"]))
{
$beatmap = $_GET["d"];
$diffs_redirect = true;
}
else
{
$beatmap = $_GET["b"];
}
$url = $base_url_v2 . "/beatmaps/{$beatmap}";
$cache_as = array(
"type" => "beatmap-v2",
"id" => $beatmap,
);
}
if (!empty($_GET["u"]))
{
if (!empty($_GET["u"]))
{
$user = $_GET["u"];
}
$url = $base_url_v2 . "/users/{$user}/osu";
$cache_as = array(
"type" => "user",
"id" => $user,
);
}
$legacy_mode = false;
// y = [y] u do dis
if (!empty($_GET["y"]))
{
$beatmap = $_GET["y"];
$cross_mode = true;
$legacy_mode = true;
$url = $base_url_v1 . "/get_beatmaps?k={$api_key}&b={$beatmap}";
$cache_as = array(
"type" => "beatmap",
"id" => $beatmap,
);
}
$filter_diffs = false;
// f = difficulty id only [f]ilter
if (!empty($_GET["s"]) || !empty($_GET["f"]))
{
if (!empty($_GET["f"]))
{
$beatmapset = $_GET["f"];
$filter_diffs = true;
}
else
{
$beatmapset = $_GET["s"];
}
$url = $base_url_v1 . "/get_beatmaps?k={$api_key}&s={$beatmapset}";
$cache_as = array(
"type" => "beatmapset",
"id" => $beatmapset,
);
}
// m = [m]ultiplayer match
if (!empty($_GET["m"]))
{
$lobby = $_GET["m"];
$url = $base_url_v1 . "/get_match?k={$api_key}&mp={$lobby}";
}
if (strtolower($id) == "~unalike")
{
$token = "not-v2-so-no-key-needed-sry-peppy-for-including-this-field";
$online = true;
}
else
{
$token_file = getcwd() . "/../tokens/{$id}.json";
if (file_exists($token_file))
{
$token_json = json_decode(file_get_contents($token_file), true);
if (!empty($token_json["access_token"]))
{
$token = $token_json["access_token"];
$online = true;
}
}
}
// t = [t]est api access
if (!empty($_GET["t"]))
{
if (!empty($token_json["expires_at"]) && $token_json["expires_at"] > (time()+3600))
{
echo "YES";
}
else if (!empty($token_json["expires_at"]) && $token_json["expires_at"] > time())
{
echo "YES+EXPIRING";
}
else
{
echo "NO";
}
exit(0);
}
if (!empty($cache_as["type"]) && !empty($cache_as["id"]))
{
$cache_type = $cache_as["type"];
$cache_id = $cache_as["id"];
$cache_location = "./cache/{$cache_type}/{$cache_id}.json";
}
if (!empty($cache_location) && file_exists($cache_location))
{
$data = file_get_contents($cache_location);
}
else if ($online && isset($url) && !empty($token))
{
// echo '<html style="background:black;color:white;font-family:sans-serif;"><body><pre style="font-family:sans-serif;">';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer {$token}", "Content-type: application/json" ]);
$data = curl_exec($ch);
curl_close($ch);
if (!empty($cache_location) && ($data != "{\"authentication\":\"basic\"}"))
{
if (!file_exists(dirname($cache_location)))
{
mkdir(dirname($cache_location), 0777, true);
}
file_put_contents($cache_location, $data);
}
}
if (!empty($data))
{
if ($diffs_redirect || $cross_mode)
{
$json = json_decode($data, true);
if ($legacy_mode)
{
if (!empty($json[0]["beatmapset_id"]))
{
$json["beatmapset"] = array("id" => $json[0]["beatmapset_id"]);
}
}
if (!empty($json["beatmapset"]["id"]))
{
$beatmapset = $json["beatmapset"]["id"];
if ($cross_mode)
{
echo $beatmapset;
exit(0);
}
else if ($diffs_redirect)
{
header("Location: ../f/" . strval($beatmapset));
}
}
}
header("Content-type: application/json");
if ($filter_diffs)
{
$output = array(
"id" => $beatmapset,
"artist" => "",
"title" => "",
"creator" => "",
"beatmaps" => [],
);
$modes = array(
"0" => "osu",
"1" => "taiko",
"2" => "fruits",
"3" => "mania",
);
$temp_beatmaps = array();
$json = json_decode($data, true);
foreach ($json as $map)
{
if (!empty($map["beatmap_id"]) &&
!empty($map["approved"]) &&
!empty($map["difficultyrating"]) &&
!empty($map["artist"]) &&
!empty($map["title"]) &&
!empty($map["version"]) &&
!empty($map["max_combo"]))
{
$output["artist"] = $map["artist"];
$output["title"] = $map["title"];
$output["creator"] = $map["creator"];
$map_output = array(
"id" => intval($map["beatmap_id"]),
"ranked" => intval($map["approved"]),
"difficulty_rating" => floatval($map["difficultyrating"]),
"version" => $map["version"],
"artist" => $map["artist"],
"title" => $map["title"],
"creator" => $map["creator"],
"max_combo" => $map["max_combo"],
);
if (in_array($map["mode"], array_keys($modes))) // v2 compliance
{
$map_output["mode"] = $modes[$map["mode"]];
}
$temp_beatmaps[] = $map_output;
}
}
usort($temp_beatmaps, function($a, $b) {
return $a["difficulty_rating"] > $b["difficulty_rating"] ? 1 : ($a["difficulty_rating"] < $b["difficulty_rating"] ? -1 : 0);
});
$output["beatmaps"] = $temp_beatmaps;
echo json_encode($output);
}
else
{
echo $data;
}
}
else
{
echo json_encode([]);
}
}
else
{
echo "No authentication method was defined.";
}