diff --git a/README.md b/README.md index 3943af3..8572b64 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,41 @@ [**osu-api-v2-js**](https://github.com/TTTaevas/osu-api-v2-js) is a JavaScript & TypeScript package that helps you interact with [osu!api (v2)](https://docs.ppy.sh). -While it is currently unstable as it's under pretty heavy development, documentation is available on [osu-v2.taevas.xyz](https://osu-v2.taevas.xyz/)! +It is currently unstable as it's under development, but you can find documentation on [osu-v2.taevas.xyz](https://osu-v2.taevas.xyz/) if needed! + +## How to install and get started + +To install the package, use a command from your package manager: + +```bash +npm i osu-api-v2-js # if using npm +yarn add osu-api-v2-js # if using yarn +pnpm add osu-api-v2-js # if using pnpm +bun a osu-api-v2-js # if using bun +``` + +Make sure to add `"type": "module"` to your `package.json`! + +To use (import) the package in your project and start interacting with the API, you may do something like that: + +```typescript +// TypeScript +import * as osu from "osu-api-v2-js" + +async function logUserTopPlayBeatmap(username: string) { + // Because of how the API server works, it's more convenient to use `osu.API.createAsync()` instead of `new osu.API()`! + // In a proper application, you'd use this function as soon as the app starts so you can use that object everywhere + const api = await osu.API.createAsync({id: "", ""}) + + const user = await api.getUser({username}) // We need to get the id of the user in order to request what we want + const score = (await api.getUserScores(user, "best", 1, osu.Rulesets.osu))[0] // Specifying the Ruleset is optional + const beatmapDifficulty = await api.getBeatmapDifficultyAttributesOsu(score.beatmap, score.mods) // Specifying the mods so the SR is adapted to them + + let x = `${score.beatmapset.artist} - ${score.beatmapset.title} [${score.beatmap.version}]` + let y = `+${score.mods.toString()} (${beatmapDifficulty.star_rating.toFixed(2)}*)` + console.log(`${username}'s top play is on: ${x} ${y}`) + // Doomsday fanboy's top play is on: xi - FREEDOM DiVE [FOUR DIMENSIONS] +HR (8.07*) +} + +logUserTopPlayBeatmap("Doomsday fanboy") +``` diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 7266036..21943aa 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -1,20 +1,26 @@ :root { - --light-hl-0: #AF00DB; - --dark-hl-0: #C586C0; + --light-hl-0: #795E26; + --dark-hl-0: #DCDCAA; --light-hl-1: #000000; --dark-hl-1: #D4D4D4; - --light-hl-2: #001080; - --dark-hl-2: #9CDCFE; - --light-hl-3: #795E26; - --dark-hl-3: #DCDCAA; - --light-hl-4: #098658; - --dark-hl-4: #B5CEA8; - --light-hl-5: #A31515; - --dark-hl-5: #CE9178; - --light-hl-6: #0000FF; - --dark-hl-6: #569CD6; - --light-hl-7: #0070C1; - --dark-hl-7: #4FC1FF; + --light-hl-2: #A31515; + --dark-hl-2: #CE9178; + --light-hl-3: #008000; + --dark-hl-3: #6A9955; + --light-hl-4: #AF00DB; + --dark-hl-4: #C586C0; + --light-hl-5: #0000FF; + --dark-hl-5: #569CD6; + --light-hl-6: #001080; + --dark-hl-6: #9CDCFE; + --light-hl-7: #267F99; + --dark-hl-7: #4EC9B0; + --light-hl-8: #0070C1; + --dark-hl-8: #4FC1FF; + --light-hl-9: #098658; + --dark-hl-9: #B5CEA8; + --light-hl-10: #000000FF; + --dark-hl-10: #D4D4D4; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -28,6 +34,9 @@ --hl-5: var(--light-hl-5); --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); --code-background: var(--light-code-background); } } @@ -40,6 +49,9 @@ --hl-5: var(--dark-hl-5); --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); --code-background: var(--dark-code-background); } } @@ -52,6 +64,9 @@ --hl-5: var(--light-hl-5); --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); --code-background: var(--light-code-background); } @@ -64,6 +79,9 @@ --hl-5: var(--dark-hl-5); --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); --code-background: var(--dark-code-background); } @@ -75,4 +93,7 @@ .hl-5 { color: var(--hl-5); } .hl-6 { color: var(--hl-6); } .hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } pre, code { background: var(--code-background); } diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 65d9e59..d00a5ee 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA42S0WrCMBSG3yXXsjLZZHinQ1DmQCq9GrsIzbENS5OSnIBu+O5Lt6mtS4+9Pf//fT1J+vbFEPbIpiz1ChygYyNWcyzDBLSvXHKa35VYqRB+SC3Y9Ok4OpOzzeoC5Yo7By4Jwy5xP75iFtYaGwV/EoqeA8eK1xdYagS743ng/7IuPn6c/McXewQtQFCaU2eALnNgt7mxQPnOpQHCcOuUKsTDJEPO2apR0ueS6wKUKeZeqriwW6FkL14Y55fSobGHqKvToFRr4AJs1PEbUfCrVyhrxQ/U+12XKOEm1FRYeoVQRWXtAiVKjYkLmoAC+89xc/msFhxhixZ4/NvtAilyPS/SBLdA8p9tFyhRARps2HXmsTRWfnKURmfp+iLdeZ03Q5f0dbv+ycPx/Rt1sOPsMwUAAA==" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA6WXT3PTMBDFv0vOHUo7tEBvSWihQztkGgIHhoPqbGJNbMkjrZgEpt8dyW7jP5HXUnrVvvd7krVSlF//RghbHF2NHpjYzJGh0aOTUcEwtWMgTK5P68qbFPPMljdcLEdXH55OarfJQAMeep/H+53j2W1tSjKmNehTO9h2nJ13PNdKSeU1lhXKPQGGOStqMxcIasUS63+ute3nF5eH9k98teKJyXA3RlT80SBoCunTHxlzowzH6LDKdWTkPROcxSaWpiMDv2kTG2ctR4Z9Z3wjY+NKU0Dg9RZBLGFJ8V80EbifHNMbxjPkOd14XsOxQc81e6QhYlkDiIDJzFiyoZJcPQCz0KDmiVRAsfaiAKBbWb0gitpWRqOnKSQbbfJ7tk1k/kh2K+0MiB5YStj8rSqk9RuyOOgsM2Tfd6QUfJoysYZMrieGZ2W37kdA2PMO+gcozaXwB4bb4yaxKJbMXjSogOWhyS3PK+K6KzgmvsugpvPVLKU2X7hGqXbesJaCQt0BW4LyMqoSZb5nmKReb1kZtN6Klf9s7qskwv7E8CJjO+qa6opigP59PFBRyJnVZXYXbhFyL60poEDuXcnF2j+ll2IIYCqNbTB/13Q0Ibh5ITHj69R/Bx6oSKSU/m/kCpSxf/cHt7wUuLPY38ptSRDM/SjSLKcIRlFvcJ8wFjzwQ0ZbyDCyOYKaYi9yE5gxhTzhBROYuBalsT4HFVVdx/PyOvaSmwIS1Lf9Q7vu6uQzoCkIBbnP4P6R2kuGJ1od/PfswfttQ6G1ozegloTDymdCdSkpe6UEsDuOuChyAw+lQ/DGXHqpDU0Ebir/EDPtCmPBn5U0ha7XOzdFIZX/1EX4XzuNwRYOBYRMpHpIkVGVhHxYyMZxxl3hXhGye4Dffnx/dnHefDsoueIZTJgQzU2u/K3iEMne4AV0CeXgkNO+RkHZS29sMJWK/7WfUIrFw10NWxmRuEF92qdtZ1y+e/r9H1yhTxVJEwAA" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index aa78b4b..e74c9be 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA8WdW5PjupGg/0v3a09ZuFCX8zSXnY117Eysw17vywmHgqViVdEtiTJFVXePw/99CYCgEslMECTVZ55OnRaATCJxyfyQIP/+qa6+XT/98uvfP30tzy+fflnrL5/O+an49Munt+Jc1HlT/Mutea/q8r/ypqzOf/7jf3z68ulWH9sCr7fzwfzb9Xdc0af35nRsyx+O+fVatHI+ffrHFy9KyG0v61/+8Pt/r+uq7tvuavzO/xBtKROyb+nQ6tPUt0Mz1tjnsCRo+MunS14X5wbqBdReyXsfnYrrNX8rRiTdS82Tci3qj2LscfpC82QU55dLVbZF41JAsXly2oLtH01RX0ckBQXTZYWDipIRHUpype8NHOrCDOrrj/OBbehzWIhVdN5wnTRSuS4/HMuCNmzXvP89peV1lql13/R+3/y4kMMfNv3UF2MlPHVKMI9QviTKeLIlx8R4hdj51hp1tMO8xL70QqlN9bU4j/RnUGbyQCi+X8q6ICdeN7v7ApPbzg+HdpXbWwV5AajUZCl18drq9z4mBhebLOd2pddb13z36+RWr4fqEuv+/vfJLbcr/3N1jQyce4HpWrO7T+rGw62vx+qNb9b9eG+zub78U3n9p0tdfrTrbaKE6rnJy/P/jY+WsNBCid3QGxGJSk3uubr42624Rpaoe4GFz/NWNH8srtWtPhT/59s5Ng6IkpOfq23jz9Gpdy8wt+3I/AMl5rb+p0MVXWFxsbly/vftpbreRuX0xebI+Z91u2u9xB/mXmaOhH9tXadTfolKuJdZICH+EKDQAhn/o3x9LQ+3Y/PjX5qmLp9vzchAiNdboEk/wlLEw8KPkJn0zIvngDdZzE3DxRbI+UN++JoiqCu3UFJSF/qCc2T923t+fivaHfZfb+Ux4lpTRZfLiz/esOwiiX9q2vjslCjyXniOzD9W1Sm+PboCc9uOP4QvMbf1/yjyF+Mk5nV8QAzLzpH4h2P+41hem983xSlh2SCLz5H7n3lzeI+K8iVmtz7yKPcycyS4Df2P+bn9OeI8EyVnjYsEOcsk/OlSNcfy7b2Jd1pQLElOdocUgUdZnpuifs3bMPR35t/jhDIIcFunOa/3ppVYW5+DcrSqViEO1lS3c1P/2B+qlyIuCJWcLuqleM1bt2P/Vle3S1wWLjpdGCA4pITy5Z/EvIav+/zQlB8jvQWLzRLyXDWjElyZWc2/FMeiKcY6CZabJaY6H8vzeFf1xWYJud4ul6pOeRpYcrqotkKz/yiv5YhlgnLTxVxO+1cX5ph++RGXNSw8Q2BdvZbHop3ZxzacHpGHy04XZ3CW/TMqCJSaLiI/2NVq/97u4VU90oXDwnMEmrm+b9o+Mf/Stvacn88j+8DnSK3pKjznL2/AFyAF9mVmNO/CgP2ldY1sf1339j8jAvlaM1Q4VjBYoQX6MrO3wqRdMFVA9PgiJmDsDMNW8MqwD5S4p/ujhdGt/Qlpxwgen91I8OhETxR8qD7G5pwv8tPM1zbfaTniYTw5VbhHubWr0Wnc/wsFPgXVxmSP9OZU2Q8ROua4IZmR87dkka/5R7sCl02xf+75TcriFq03ff15rY7H6ltRJ4nGZWeIQ7iVljPCW2MC3ur8o/jRxuwTuzVab44abQwx8ph9mVn+Z11cm7o8pDigQdHpwr6GGJ6U8jXO4BevcK59PwNlfPp1yvAxbnnMn4/TJD7BaqOyR0/Bm3xklcPifZWloo/t0jR1brB1po+lU3Vu3o8/gGsWF02WnxFswPwlOsSI5S4tHr6mdW9LFbeiVYR5jI7jpAoiuA8lbWTE1Pm3KTJd8WUiL+3yX57fJg7TSK054WnxUVa3696HhCMDlSw/XWydn7+2MeHbOzz4JgWikrNFJcSqqORPmiNQih9OOj6UAsXYFWcsHiEFP51GwxKiHksh8yafo0RX7zFKmKKT136+0owRV5hl/Lr/Zk8HXvYpGwBbZ7r4qz1TaR/lmvTkVPHZQuviYEhLulhUYYbgJm/aYVEeRjo4KLdEzL6+HYt2gCTLgxV+0ppCCPOTK4vPK0pNpgtGneOYFk9jbjOlyZh7mZdfqwUq+foPVeq1vpUzxsZdq76Bh6p1ys/lyNIc1crXf6hS3YnB/lh8FCMOHy46g4yf6yJ/2V9OKavTsPA8FL/PD+9lq7LhzyODgio+U2jrpL0WbeHDmDdHlE4SiU9k//170zqlfIjuf08/oR3hxUGDSdy4V3HeOksKTOHIfcUFPDkmfJwrYw0W8OWoIqOceaIiUd6MNRnjzg82fzKHBs+8iEfHFEjl0qEu8/l0VJeHKsHz6qgOI9x6kgq2zETLJFuCjaNK4x4nPvy98HyB73nCSX8oFleZL9yKacMPdrMKBcPi84X+tSrP+xeXO58gFBafLzSOmEOJCaj5oYvaFPTc11yIoKMaJKJopMsSJB1XZxxNT1PlWB3s3do0bUDp+ePvlH/fxw/6Q6FB+WViR07EhnJTTsfGBFeHw+0yoZOD8vPFGpQT43GhUFB6mchr8yN1qsHiC4RWY4gJSa2SGNOo2C5Nqt30Uh1EXGW+8KZsUjvZF10oLN35gMUXCP1WNk1qx94Lzxf4rXi+lqkb8b3wfIHj6b+hTCYNuLuDV57fC5Oo8DJVjZT0YDLiGqYJL1UlKX0YuZ1sGvFSZVK9/kGa8WLBY+nHSD6ZhvwAJSLpyQMNcJryA8SPpC8PVKDSmB+gRjy9eaAFkeb8ACUmBkVsGvRSVcbTo5G7SKdJL1UjMX0abb6RNOrFCiWlV9POAJFmvVQdA1TTARoo/TgVEtOz0Q4XSdNertC09G2sWUIa91IV4+ndoUJEmvdi8RPTv5FCKWngi1WcEDUSEeNS8dOzSEOVErNJF6uZlGWKVOOzTRerMyXmpuLtpQpMz1INdUrMVl2uZiyLFas0yGZ9gJsxnuU68DOYbNfFjsakxEnMqEYTKJeql55YiYhSPMFysRsSSbxEzgdOwJwhej7kTU/Q7OvNTdSMCB5P2Aykz0/cjOkwlsA5RYWpiZxIL772Ix3l1ERP7CxHEz6XqpWSCBoqxCaEPkiVCV4zmzD6m87p6Qmlff2liaUJiownmJLaLEg0TVFqNOF0jlITE0+Hev7szXNaYirSbzxBdal6yYmroWbxBNYHKZWS2EqqxSa4LlZsNPEV6UMnwD5OjdHEWE4fOkH2N11DZyfQ9s08JpE2XavRhNqYZksSayeoOJ5gu0DJeKLtBC0TEm4XqBlNvJ2g5XgC7gIlkxJxkbJsQu5ihpqWqItQaiRh9xFQNymRd0h3+YTehyiVkOhL6MQl/M5QCSYCu5dU/S/egQ4KpKcC08eBw8Y+R9L+Qt0ioJrOFCGE9YWXCDxxA5wSeIomTiQJNL44Ob8Jeb7sAnHudeov+zz1GYMKCwS/lUzqMCHTl10gzuS1JErrik4TlurXMPLG0tTDalbDaUnBcbnRlOCh7DHfhMu/GVEinoyTogZc6/DLboEe3U/p6xsI+eilDrb4GZemn8frx+YX+9fU7uvWVwBvBeTEUjVmiU54xPnPxbGKoPkokBgRYFyrG7nXBiL6YrOE2ETT1rE6vzXvo6JQ4VkCrVeQYJh7uVli2nX2ymywgZh7uVli7jNkwmSaK+zwXhy+Xm+nUVGg4CxBr3l5bEoG2waSYMl5syj/3nrRp2cyBAynEiiZKopYRnvHkpcXuLFJy2p+ONzq/EB6olSjn0GF6LOM5juQngctknc8EoWlbh5kykDaJjKqwiU2+pHgy+gEGM+aPLcLRGxu45xJX36hWJMfcyjrwzE6B4mETVDrASpcj+UL/PJBmgr3Wo9Q4VKaFJzJOtyrLVNiguDFwrrkRiaGIYUGVZYJr/Mytl8iuV3pRSLfy2bc9QjlBlUWCTfpkwabc3eGSPGo0iIFbNrk7WIueqWvpqjSIgWMc7ovaShACgcVFgm+tHVZ3kZKhjWWifY5GemiQY1Fot2pW7LcvvgioUwUTUqMxc6pi8iEYA8tKNGgL4YLU+d7etcjP+UBwkeCxeE0e7QCo8Hk8Hjglk5sE5VIDDZDVdig8wEKjQejBNJ+/OgYD1ZDNaig9QFqJAWznHP/aGUSgl3kflFB7wMUSQmGcQIwFRQ/YhVJCJbRUkIGzfNUIYLp+FBpf50QQtfmHDGhtc99yehOZVSLitrfziV3G44WCWrMFW1f2RAbSb3IvuQEUansnpY1hu5BrU652ENOlvsUf7HKQHrKuzT+WX6fqcfe1nyQKjn9eo0RNWIfSZqjwrzOMAnxD+yLY+IkD7U4pk34dBVm9YWp+Mi+uB7L08y5Aqs+WJlZXdPXfui8MSe0VVrv9EXnrsz3Wztj4WEvdFhlrvCoC9rLi37qaFzI+fpKJq9jMV25uWJMvJzeh0Hp2SJN3njxjbtkP5AZFJ8r1H2xNkVeX3K2qLHg7S4q6TAwIoo98saS4mfciYKm+GC4wlzB4zFfLzLxDDIi7KN8KWLeei/KF5wryAdiKbJA2fl+rD3oSPRk+7Kzxd1qU3Z/rk7l2b4zJ00yWW2pEi7Xbvip3gRFhlXnKvNSXA91eeGSyLACYfHfIKQAAsdfXggqQ0Uf/uj3t/aBf5ys19h1kfJ6uF2vqWM0LD53OBQfXK4olteXnCvqrTjXSUPAF/wNRpsVNf46OVDNKbfIHQuFxl4EieXOfCvqiAJdtYeoYF642Lu3Sb0xqDF3fB3z89uNueKKhYKyv8Eo89LGL7WCmr2Ki8baQHQ73NIGOqq5dMwNFTE109bQVFWmbfKP2dwv+eHrvsnfkkTCwnMFukOuJHH3orOFuYth/fxME0tUmq/A0SZbGwcoUXhYYYm3n+rqTxND4/CE9DJQagIed+8nLY9lE8syw21/RvXGnm/BRbcUDdIRc99G8ACcy1V9Ox+r/GXfOlMmM2NK71P6PVENztJ47MJWVZuEiteqPrFvDp2iN9Hez1A7noU30DQhEY8eeghhn/fPxf691WuSfVG9xWqkQEmkQTKcfEiC2EB+eo5Yigp9vLI3r16aZguq8lKF3u0xhQuwp+hi6u3v9R6iRl387VbW0/rE6gEqLlUkMa9toMeU1LYENRKz2wZqTElwS1GjeMsPP/bNu72yOQqIkS5E5aUKJXu3oSrTvNyfsI0DBcZvqxONwAeIA7alWj1Nn9RPw3Z4T3b6FCe1nDHlp6g5lmw4UDIt3zBhhHdvF+G+dxCXH//uQboSKaczKOUt9ZRmPNWuqn88V6OH/jjjDtRarMLt+WTelT3dCoOaS1UZj6lRul9aWD26HU8AWGg/ngqyxu/ojGc24as6gwynhJStZFXSTt0olcjjt8eolpIZhS96DDKkZquydHcM8hmSaFhff3EuVVST5KwqpM9DsqsSNEvLF5mo3MSld6DYtEX4gRlY43r9jP4az8mK65WYnTVdqYX9lZ6vNU21xLytuHJTMrhmqrew+ybmdE1TclK6FU6v5tOuHrMXjZ3J4NsiEz4NMSFQHE3XQkEGTtt6jBqp6VzDS1M/zTzJ6V5IJybt6zFKpeRoPeKOTYrLPZ7DhXzuQS7XAxWZ423yuV6PUSwpB+whV38SlEnIEUPXfwa5Yo9R5LkrOUUXUOfxEUFKjhnew4hcswepMzUHDWk2kov2WCUn5ajRisZy1R6jbHIiFz7OoHPZ/tuCPyLDLCU1o2/kkTlv45pNzn2j9HxUDhx3PPQzhltKjlyoD5Er9xhVEnLoQk2GuXT/baM9yDpLSYHqqy/KuYspkZZ7F+qxOB8qqlBiLt4kldIS4/BpGpEg9982dHDyGP/meKKFpYl0I6qkJtQN9HnwQBoqlpxgN1W1xJw3FEWRuW+PWRaTcuLwqdEwN+5BykzLmUNqRXPnHqVgck4dVo7LrXtcdDU1tHqMGkROnnmZ8J9MXkNEo75Mej7epbqWI95Y2OpnUCM6ke8Kc6Rh0tN89sUnC4WdyfbgxG6jF2mgbWQnj3aK/SLDaOv3UjNERKABEDF2ZywqIvYeQSBj9O2BUSGniv5MGxDQFZnRODs4k0dkXPfYGzDgA4y+LDIq5tI2WRxI4glndF9qTkdFP6kBe4v+lkZMUKqfRkoZP8R01YBeLMAxb+LLVtNFP4GqaTqMnlea9sRqvi6u7gOVUQuUUY9W5q34Ws7Wpqv8QHW+5g352ZIkdbrKD1TnVF7TZylWp6v8EHXMa/DobBa4LPlCcxY+8jXjsPHLvIZNdtdI012RGY3H3/0PRCS8839s6xxbSKNv/B5tnHsdIxIQfQlj3A7201pjlvCFZjli1qEcdcR8qfkirvTLp4ZSrpFXbo8OWneKSX9kBA1eUHSusLdj9ZyTp5pYVl9yhqhvRfn2PtZ5faGZrnKCnzzXB2wO5OsDA//PlZmzmKQfocCVZeIN/we4bIzIsTtWrgVOX25foF8NnKzN0yXytuCoRvFvY/yxqsirSObfl0alfRuxoNQqMBH93RuOYuJY04d2G3tjPn10bx6Umi6CG4H35qPDLNZ0JJK+tz4WSMcEtA5V3VwZf+AuAhabLqQ4v4yLuBeaLsAEse1EKE4X+tjqLgWVnC7qYvJ7D+Ulj3138i6PKj5jEL/n53NxHB0JQbnpYszXsz5GhnJfZnrzJl/cuNzfKjrr9C4ElZwu6m+34lbsOSf0LigoN6PDbk21v34tSScO9BkoNsP4cLlnqREYBFT5JLGpW2tM1timausSKnJjhvmIFxgrsW93RWdy67lzCb1gAt9LTRfRHW6ARWBkeaIrJAmGm/1/FPkL7Ve6Xybcpo9wVtDWOGjtVOLERBbvQMzY0h0Xc6hOF3vDd0wOLDhHEE0HoIQIHog3XbdmZzYC2P692Bwh7lXi7GIDBYVF5wiLODlQ0JibMy4kRUJ683DC/aFbJX7fDk9KCvx9qbc9aCvmdQeKTR9RQ1lj4ypFYEcbkmUG5Rc8p/vsbvqjwvLzxebHY/WteNlzp0lDwajGgifubs5OkI2rzBdefL9w13+HYu+F5wusvp3ZhWQoEZSeL9J7B/vWUaXXl6HgQZ1l4lmaS0uOM90Js3fS1J0qEK6t/3k7NqVVnU9PwGWWrrFke7F1dqDk9L2Oljm266UKjizytOCxhT5VcD/cy9bEkzQgai5TJb7v0Eok7D3JJmBOdpj+jx3ypIoc8eNoySkeXaoCsfiBlj4aSaSKjmZA0LLHkyGShTMbLiM3ttemioznSdCCE1Imkuc5e+LKzO744euEp675E032qeuRw81U8TavbpJwUGNhh0cS65guH0usS+508+N1n9fV7TzB5LjaZCVSAVWC+DFONWgiVJ7DVeXbO+0Hpqv01DcyR7Ox1Pg2sFiqn2/jJ6jHRem8bzRnGG3vp2IuxLuvmMX5drr+zv9z3I28j8Tqeou18Nn9zmA8rwLZcpOXX6to277EnNZf61sZf/jPfZE57Z/yc5lHm/clkluHkcG/vefnt+JYvf3rrTyS61BYIj0qiOfJEK2ChJlIPiBSmL8TZm+FRz52R2kwrLZECdpHpuRGr4OkCXNvsdtfm7YTSX5GycWVFinA3QwgBUfftJsmcKJtH2PTH9WtuT0XTPxDyQ1qLBF98KX2ba26pLNEyHlFVJyoSKrXkCR+zG9AjQzVn5GnMEWxp9FUhjENU741NW1pZFUdTzJcqOxb2bzfnveX2/Fo3xzK332YpDjb7M98CKPygxR3Tf0UZR/Qu9Gvdy1U75T/lX4l8SQNfSs/RcW6sHHaI9aCoKmfoiz7BpVJesY/kbVUxQcs90+L1vyxoOcBE/snzuhTcb0yl6mnTZq+nZ+p5r7z8R+i634YMDx+WWdC3lnreiwgnq7uz3CcoKrjF6gSdQ6efySq4nJNFz/EE5LwsCf67d2D4LHu7T/WUOnT4+eZbCjkt3q8x3mh4RMtd0MnPER1vf1kAyEJv9WDRY5plz/T2JHuT3qcn7ZAgNZ/qwfqeEgyRQDlf0N44KWOv+sK1e7V5e5LFN+To++BEk9d7UmajF23NG+MrOi3OqYpBVpYqBgkxH+2jPBPLFeEv6fT4TFXYtDq5yTXIFB20rYxFBhZXpLEXPevRd7cmPwtQl5QYb7g9C5d3JXm1S7XZv/MnR0MRaIa80XbFZO9PTIUHJRPEfuXL22DL8X3T7/8vUfNv3yST+pp11Z6LYvjS9vAr767D9XpZJr5S/fb/ysOTVWbEq7I71afvvy6+pJtnzIp//KXL7/6GvYH+w+2WOsf/iqoYiIo1q6Dv8ovmXrSQgfFZFBMtf+nqGIqKKbb/9NUMR0Uy9r/yyjdsqDYuv2/NVVsHRTbtP+3oYptgmLb9v+2VLFtUGzHdcgu7F7T2zuyf5EdrCFWX+T2abXZhCVDUwjT5UJ8UeJJa9RmaA1hel1IUnpoEGE6XiiyZGgTYfpeaLJkaBZhul+Q9hOhZYSxgCBNKELjCGMEsfmi5ZOW27BkaB9h7CBIQ4rQRNIYQpA2kqGNpODGrUSzxU4XcvbJ0ETS2EGSE1CGJpLGDpI0pgxNJI0dJGlMGZpIGjtI0pgyNJE0dpCkMWVoImnsIEljytBE0s4hckrK0ETK2EGSxlShiZQxhCSNqUIbKWMIRdpIoUXNrmqkjVRoI2UMoUgbqdBGyhhCkTZSoY2UMYQibaRCGyljCEXaSIU2UsYQirSRCm2kjCEUaSMV2kgbQyjSRjq0kTaGUKSNdGgjbQyhSRvp0EbaGEKTNtJo77GbD2kjHdpIG0No0kY6tJE2htCkjXRoI20MoUkb6dBG2hhCkzbSoY20MYQmbaRDG5l3Dv2qSRtloY0yu9SRNspCG2WSXZKz0EaZMUS2otbPLLRRZgyRCbIkchGsj0BuxFloo2zNbptZaKPMGCIj3ZgstFFmDJGRO0IW2igzhsgysmRoo7UxRBsPESXXoY3WxhDZhiwZ2mhtDJFtyZKhjdbWRjuyZGijtTHEmrTmOrTR2hhiTVpzjTw568qR1lyHNlobQ6xJG61DG62NIdakjdahjdbGEGvSRuvQRhtjiDVpo01oo40xxJq00Sa00UayDuAmtNHGGGJNWnMT2mhjbbT7osWT2KzDkqGNNsYQm9UXvXnKFCoZ2miz5vVEDrf1uEm7b0IbbYwhNvKLztrVZheWDG202bGzeBPaaGsMsSFHyDa00dYYYkOOkG1oo60xxIYcIdvQRltjiA05QrahjbbGEBtyhGxDG22tjUi7b0MbbY0hNuQs3oY22m5Ya25RXGQDI3K+b0MbbY0htqTdt6GNdsYQWzqMCm20M4bYktbchTbaGUNsSWvuQhvtFPvsu9BGO2OILWn3XWijnTHElrT7LrTRzhhiS9p9F9poZwyxJe2+C220szYi7b5D4asxxI605g5HsCu2m9xvsKyxxU5QE9n9Bssaa+xI47vfYFljjx1pfvcbLGsssiMHgPsNljU22ZGGdb/BssYqO9K07jdY1thlt6GWU/cbLGsssyPN636DZXcRWyC7OfTQDobV00ojWwzgg6MPK7owMpwDECtBF0aWcwxiJenCyHQOQ6xoO2MQ4UjEijY0ZhEORqxoS2Mc4XjEijY1JhIOSaxI91tgKGHRA+0OCIQlhIzMOwQmhOUPtEsgJMZHknUKBKITwjII2i0QiE8IqSP6IttZDkG7BgIxCmFJBO0cCEQphGURHBtDhpPOcDQiQqhCSDfxaJKHaIWwTKKdYzR4Q6azWKKdY3RhZDvl2B+D9DD9U6wXIBC4ECpiPIQuhAUUtCcgELwQFlHQvoBA+EIoZzyaQiKCISynEAyIRBBDKOc10iwScQyhnfVoHIlQhtDOevTsRzRDaGc9esQhoCEsthA0lxQa41trPpo4CoQ1hIUX7bJAzihENoTlF4LmjgLBDWERhqDRo0B8Q1iKIWj6KBDiEBZk0OxAIMghLMqg6YFAmENYmEHzA4FAh8gi4B2hDuFYB72RIdghHO2g97EM03fLO+htDAEPYbEGTRIEQh7CMQ96Y0LQQzjqQW82CHsIxz3oNQiBD2HxBk0UBEIfwgIOmikIBD+ERRw0VRAIfwgLOWiuIBAAEY6A0HZDCEQ4BkLbbY3PTSwFoe2GMIiwsIOOcgUCIcLiDjrOFQiFCAs86EhXIBgiLPKgY12BcIiw0IOOdgUCIsJiDzreFQiJCAs+6EhSICgiLPqgY0mBsIiw8IOOJgUCIyJCRsQGn3jZmI7uXwRHhEUgdEwpEB4RFoLQUaVAgERYDELHlQIhEmFBCB1ZCgRJhEUhdGwpECYRWz4GFwiUCItDmOASoRJhgQgTXCJYIiwSYYJLhEuEhSJMcImAibBYhAkuETIRFowwwSWCJsKiESa4RNhEWDjCBJcInIgdTyAFQifCAhImuETwROycb0kHl4ifiJ2L6ujgEiEUsXMzjg4uEUUROxfV0XZGIEXsXHBAGxqxFLFzwQFtaYRTZIdTSFNLxFOkZSaCOXdFQEWueP9EIqAiVy41gD6mRURFrpx3SZ/UIqQiV867JJ1ciZiKXDnvckeNZYmgirTgRNBHthJRFWnJiaBPbSXCKjKCVSTCKtKiEzoclQirSIdVaE9bIqwiHVZR5GCWCKtIh1UUOZglwiqyy+5gMheQ/RxWoUcRoirSghN6RZYIqkgHVVRGmhpBFemgiqInCYIq0qV6qHZBbDtujQsj8zmqYs6piV7G+R4WnbQBIqnzIOfD2k+T+57EaR8WnghNOrASZ344sqIlrQayn3QJOnT6B87/sPykDRDplpEFHVyhD68lzgJxdIUZoDgRxNEVTZsb0RXp6Ap93i0RXZGOrtBH3hLRFenoCn3qLRFdkZagiIxejRBekQ6vZEyeD7KgZSiCDkolAixSuSwr2tyIsEhHWDI64QcRFukICx1rSkRYpCMsdLApEWGRjrDQ0aZEhEU6wpLRFkSERTrCktEWRIRFOsJCB5wSERZpIQqz7CPAIh1gYdZbBFik5vMSJOIr0iIUZr1FeEU6vMKstwivSL2LrLeIr8hsFVlvEWCRmYist4iwSEdYmPUWIRaZqch6ixiLzHRkvUWQRWZZZL1FlEW6vBJOZ2TAzGU6MmogC1qWImhwIRFokRamCJpcSERa5Jo/WpCItEhLU+gjAIlIi7Q0RdBIRCLUItdu+tHrC2It0vIUQUMRiWCLtEBF0McsEtEWaYmKoM9OJMItcu3sR8bBEvEWuXbJqvQARcBFWqgi6CMRiYiLtFRFbOiRgZCL3Ah+gUHIRbokFJonScRcpOUqggZKEkEXacGKoImSRNRFWrIiaKQkEXaRDrswCx3iLnLjCDW9hCLwIjfOgPQ4QuRFbmJeKEIvcusMSA86xF6k5SuCPsiRCL5IC1gEfTojEX2Rjr7QxzMS4RdpEYvY0vEJ4i/SMhaxVaRREICRWx6cSQRgpEtY4RrGqcjWgDS+kwjByK3LGKdHKGIw0nIWQUM5iSCM3PG5/RJBGLmLBPEIwkgLWuiTXIkgjHQQhiaDEkEY6SAMjQYlgjByF7EeYjByx5/PSoRgpKUs3NPhTHJnO3qKIAKjHIGhAaVCBEY5ArMjp4hCBEY5AkNjR4UQjHIIhuaOCiEY5RAMmWWrEIFRjsDs6JRxRGCUIzA7OmscERi14rPFFAIwygGYHZ1kjgCMcgBmR+eZIwKjhAsAybmnEIJRDsHs6LsDCMEoh2DoTVghBKMcgqHDNIUQjHIIZsdcTEAGtJhFrui7CYjBKMtZ5Iq+noAgjHIQho7pFIIwykEYOqZTCMIoy1nkir77gCCMchCGnq4KQRgl+dVTIQajuos39L0KxGCUu3uzoucJYjDKMRg6WFSIwSh3A2dFTyrEYJRjMLSzoxCDUe4ezoqeVYjBKHcVh05NUojBKHcbh06HUfg+jmMw9G6i8JUcx2DooEfhWzmOwdBBjxpczHEhBL2E4rs5kRQXhW/nKD4dWuH7OY7A0EGPwld0HIGhgx6Fb+k4AkMHPQpf1HEEhg56FCIwyhEYOuhRiMAoR2DooEchAqMcgaGDHoUIjHIEho5jFCIwyuW4kL6DQgRGOQJDxzEKERjlCAwdxyiEYJRLcaHjGIUYjIoxGIUYjHIMhg5NFGIwyjEYOjRRiMGojsGQoYlCDEZ193nooYEYjHIMhg5NFGIwyjEYOjRRiMEox2Do0EQhBqMcg6FDE4UYjMoiEYRCDEY5BkMvGgjBKIdguIaRAR2CoUMThRiMspyFCU0UgjDKQRg6NFEIwqg1f/6uEINR68gERAhGuXwX0nlXiMAoR2DoaEMhAqPWERcUARjlAAyjMDKeu/zDKIxst4kFEAi/qE0sgED8RW1iAQTiL2oTCyAQf1GbSACB8IvaOPeFdlYRflGWsEjBdAa+oWrdF0Ge7iuEX5QlLGxhZL/IxSCF6IuygEXSWbQK0Re1jS2eiL4oR1/o8zSF6IvaurvftP0QfVEWsHCdgeiL2kYAtkL0RW2dAWk3GOEXteUvNihEX9Q2snYi+KIsX5F0hq5C8EXtnP1oJxjBF2UBi6QzdBWiL8oSFkln6CqEX9TO2Y+eJoi/qJ27vk/HdIi/KItYpKTXDMRflGUsUtJrBgIwykIWKekxhwiMckkwdHaGQghGuRtFtPeCCIxeRQ4ANSIw2kIWSecJa0Rg9CqSRKERgdGOwNBHNxoRGL1yBqSvbiMEo1fOgPTtbYRg9MoZkL7AjRCMdgiGXMc1QjDaUhZJp+JohGC0QzC0D6URgtGCP0DSiMBo4ezH3PdH9rOQRdI5PhoRGO0IDLnmawRgtOCvwmrEX7TjL4qcfhrxF+34iyKnn0b8RXdJMORmohF/0RaxSPolERrxF+34C/2eCI34i7aIRdKvitCIv2jLWCT9tgiNAIx2AIZ+YYRGAEY7AMO8MwIBGO3ef8K8NgIBGO0ADPfmCGTB7i0o9MsjEIDRDsAw749AAEZLfgfUiL9ox1+Y100g/qLdC1GYN04g/qLdO1GYl04g/qItYpHMeycQf9GOv9Dujkb8RVvGIpn3VCAAo5UzID00EIHRKrIDakRgtHIGJFNXNSIw2kIWSd870YjAaBU5AdT4bSmOwNDrOH5fimUsks4e0viVKZo/QNL4pSkWsXB9MXhvirUfzbs1fnWKZSySTkvS+O0plrFIOi1J4xeoaPcmIno043eoaGc/ejTj16hYxiIzeoAiAKMtY5F0WpJGAEZnzoD02oUAjM5iLgwCMNoyFrmmFzoEYHTGB/Aa8Rft+AszmBF/0dk6Mo4Qf9EWscg1PZoRf9HZNjLoEIDRlrEwzq1GAEavV5GpjQCMdgCGWegQgNEOwNDRl0YARq8jQaBGBEZbykJHXxoRGL2OxBAaIRhtKYtc07saQjB67QxIz23EYPTaBfFMNyMDWtAi18yLlJABNxEfFEEYbTmLXDPvXUL2s5xFrulFA0EY3SXBkOs4YjDacha5phcYBGG05Sz0DQuNGIzubh6RNyw0YjDapcDQNyw0YjDapcDQNyw0YjB648xHr4kIwmiXAkMHlxpBGL119qMXUARh9DayAyIGox2D2dDrJ2Iw2jGYDb1yIQajHYOhEx81YjDaMZgNPf8Qg9GWs8gNPf8QhNERCKMRhNEOwjBxD4IwehezH4Iw2kGYDT2xEYTRDsLQRywaQRi9i8SAiMFox2A29MRGDEY7BrNhXquG7OdyYOizG40YjHYMhokYEYPRO/7VSBohGG0xC72TIAKTWcgiN8yr4NC74ByB2dBvg0MEJlvxt8gyBGAyy1gkfSKUIQCTOQBDD4sMAZjMAZgtOVUzBGCyVeTVcIi/ZJaxyC05UzMEYLLuEhLpRGUIwGSWscgtOa0zBGAy4d6ISU6oDBGYLPJu2QwBmMwBmC392l0EYDLh7EdOqAwRmMxSFrklJ1SGEEzmEAwzMhCCyUTEfojAZMLZjx74iMBkgk9ByxCAyRyA2TKvTETmcwBmR247WQdg7AuhPwrz2ePfuxdD//pr/zb7v3/ad2+Lbu1qGzXvjW6N+cvf//HlU+ukuP+u3X/bTcH+t10Q7X/Ne5u6P3bdH9L/i9TdH8r/4VsxF3LdH7uufemrm6xx98e2K2wSG7s/un8xGWLuD9n9pLwIc5Tq/lgr/4cvvO1+MlzR/SH9v2z8v/gyZoFxf7ie+Mf9Pdnm/0wv54dDcb3um+prcQ66MQPduOYrmzd679/Lq/tC171+6zv39de+w9aSb6j7YjrQQOt7E+byVff83SMZnuL+WPPP5j4VDdqUa9DmSkUqfgSjylC5vqJhcbGKbW/e7Oc+2q55zs9n80Uj0DMK9MzG9wzb4tF8q/hl776vDhTKQO8YKMBUP7lXrsMu2MAu0FzFSwlrgTobvkZR11XwrAIMIq5aWEFn0OisrNp88z2ouAayzNWRbkbxYk0L+9u5PFQv4QICh67sZ6Jix27TFKdLE1pHgw7Tiu3kW1Ptr1/LS1hXwKHGWvYjL4/5c3ksm3Da7EAPmozVaPVj8OhbsHb6NcS8wohtosm7z6bc28hAG5lfIPWOaeM5f3krgq5bg3G99jqsuR58LvLmlAf9Z1DR3X7CLxd+KTTIKNqW/a4NnGgSTjTtW9mOtGI+lmFXx6v/7AF4RmCitd9x1lw/dy0W35uirf4SThcFp8tIC0E/myyle9Wt34IybiHybRThtFOwFb+RycxviNnad/94u6jjzWVZYMduKEk50vFtQ2RP7TScFiM9Zb+PbD+5DkfCCjyryfvgmrjiRzG5Ffea2xVX81gdvoaTAWxXfncXa25OP19O4eCAm53sxpkSnPhDft4/F/v31qFCXQf2PsV6Eoe8DqvBUS57R0Zxa7qp/8/ye9gEfIK1944UNwTuHw6GOzdcTkXWjccttyIRX2sGjW3AmNRb9lF8G913VkADa+hHbGJKnIsjHkYK7iqSW8cO70U7jG5oLKzgWOinJzcrD8eyCNcsMPb5EYS2UviwG78XSHYAVafLsZ294TNr2GHsXnSoztemvplvvgS1wUM78WyPVza2CPsMekqKf2hbM1xc4U4qvctqkjq5NowbbV8fC1cNMPpNHk+srsJ1N7Au3+WmboaqQgeCnye26qGsD8dwjghoMck6YK7+W/G1DIXDtWbHDnFb+Wve3MLKcIHesWPbVj6V13BqyxWsHLfU9Vi+tDtE+NhwJ2S9xa7+pTRhQdgA9JykimqPYi3onXdbsHl9arSBPZ6sGVgnMx/rZvyo+wjDmg3QfpP5ue537XUf4vIzuG1wsP7DEHDtp5HiNkDbBnZIzStN70sX6z7YuqFBYKRm7ox30lnL2G/B59cf50PgVAOfOlrTfUUeRmpwRK18ALzz4f7Wh/v80mDaRRHZBsZJ694pYMcrGqOwNhvXtMF8jbYPcwnpPr34vcvV3J+rU3nOG/fBQ7iuQvmev5j893hz9utjbaBWl8+3Bi1XW7hJbHsC0zuu7DyCbQ+dRQ3DBjaQPdyuTXXCQxbaaOMRAevdv7RhWLBTS7hVd5PGvOWNqV685rdjuxTX1S0IpGDgk/kZnXHr+Uth9248hmEjUmV+uHFz6KW4HuryMuA2WzgVt10z0nM81cf7GWetl/L1tTy0z/ljX7fj6vwWhhpwnRHdGDCvJuEaM/YOvV0YHAjJq3FtTW4+Zrc3zj52tOH+JbjZdW8DDWT4ED58V2tucQg/6AhGLvRdslU3xzIR6Qzbjv9IX+DtggfSW3boVN/Oxyp/2bdNGSSBOgV6QStuCX2p8xIBTDhk2C3DBopo0Eq48Os1N3fbqpeqDJc54Dpx/dVWu2KBcPxpducuPtr/QzaHMdbWr+YsES2+X8oaOdgZ6F+TAxSriTweMOK5p33Ny2NTnnBNuIz3TgLrHr/mH9WtLptiD2jBgKrA2GzbB8uc9e5tDhoyN/Du6vm421zAY5qqLKStCZVAF3nEItZcH7+24eY5xLwbYF8fRog1N0Be61uJBsgKIlgPw8yLI93utuG6561o/VPjztya96ou/8vuxWibAusEt8i0zYT7ormIde/bne9b9mTgrWgIxqegrz5e9b740z4AJIasU3Nv7pIfvgbV4QrFGTesHooPYrXR+mFdYF/WMwV1Q3ynYKjHD4UmhsUgpmO9e6KN8DEgnePW6rYRnqwEBzT8cEQthErA3YpbQmETV/ut2qANyFl0ZGQSc10Guz9f9evtpbre6vz8FbkxwaFDZByd8vYRgopgGOjIMLAVQ8NBxshuHm1V4yIcy2vTLrinofnhUR97ltW2Qj00sDsbrZqqxbVd7w9F62uEgasMYsxIA1UVILXgmCYy80y9Y5G/FPVzhRAppPess9k1EfZXcCbBV7xequZYvr2HmwIkFaw/39Y2UzV0FeC2GK/nBmnoV0I/Ll47nBdwx4gMMXplCY472UlRNu+35/3ldjzu6+JvNwLhw61cs0CtawhtlBJu49pnC2Ts4atvBfc/PLIxiUajtYe+PYQ87CnIW4ngjoAbrlyxtq/zj+JHO8jjfhqwZ59CsWFHhAlLQ58IWNTH62LD9cZ7ft33vl4YWWyDodGfLnCamJYu+fX6DYV+Mtg3JGdUU/16u1yqGusRpKzw4tt5jMbDOli32R4om/2xOL81wZovYAKBZDf/9yo8Z5fBmsVOKPPN9wCCAU13vc1YoT8uxRMJkaDfx8YctrqZxoNYB3rDik1rQeeQ0IP2U7ejQ5s+XchTmv7k04MX6Y+cpPapQJs+FciX2Xl+4c+XVX/Y5c/AlZel/VGo1v2RdldY98kxPrMp89gw45/23BTtmonihuCpWW+kbCPZQa4MDLyzvl+4HbJt4rkKY2gwMH36hWBjw7Z+h56CNmAg7o3EYsK2jdd2wbrh4bKFvoXgRmtbuzofy3PYCWCR88lgImNtcN0bE9TlAT3HBtJjz+A2nF/ZNmM3QJzXIWB3SOVHVOyJyJUqAwumJ/oi41r5a1We9y9tDBkOLEgn2dht6D7Avc8n1Qk24nH1ibw0ETgx7B56bD38W/6GQld4sOVDaMUexx9zk2B0MT0QLihwbEjVI3jOtbHtfJTXMpwlQBl/MiLYrJRjq0TbyvA8ehv4gtxy7vzXcB+Ajj9rx2Pxlh9+7Jv3dlC+DNyiFYy7eeGDVC+4b6+9HdjI2dQfHCxBU/r8RMXGjcfqkA+YtFBwJHOzoA0Tw2eG5Iut81HEfSh4aOEhithws8HSqdBzgNZj15NT/ld0ng59N80ekp7ycxkcSQhoaSH6vFl/yLLhxu0gVJUyiPP5et/3ZGIeJB5acvY21YfZOCIgnizpMZXbf3uuQuQJmaJPKpb+XEX5xV2zJMw0S1ADEWTqspPgVFyvaD2D3Ma7DSPV99ivk5sg/Gb7E50176B3sfI7iXfmpfCekvZ+Ea9Y2/IeQXgB9ymp/TFpVLvwyBgOMsmGSYOcXLgiqG2fn8xNy1N1bt6PP0CqYDDFQWM+edx8j4trqzb98FrVp+FKtYOAkT3QPN2OTWl0oXLf1pBrsc4cjjfh+c/Gu/199pF3UqU/0lb9Yr7und2uVsZuj+fiexgkwFgjYw+22RNmeOi+85szu1Kcr6/fwrMDeOzkLx4olu5Uz03eDl+cfi+Dc3au7uFwuxD7ElijBbulIfcKHj0Kf7VAeAtpNtuxbYYhDfD0mCUGlsYNMm4hx2RBpsHo+yZ/C823gxGiv9ahWLpwQWsiPEP10ZlgH/6S123ZBvEq6PnzFZvyUF7yM7G3S3ieoNl0OYMihkdX0C2ULMQ2dVGsA0ec6s+H2KTkS7sPlee3uJMC7Oi3esHmPF6K+rU4hD0BN1y1ZXszPPmVMuD4bB+YQ2vi7A9iEZ+0qFgo3a/doRXgIsIeA9i1dnD4DOtqFs96nh765JBRsiDJV90bFo/nHrxGodnQrm+iqnFcAAegZoE8PA4Iq0P5/Phtq2OfQsCURxGtem1+oAAZph0K3mAn74GZiD+IK6HVfK6zYLNRLlUbzeFkCYgBlb9kptnT4gsicwIeBUrWMzbViGEPUycFe5xxCW+qSBi/9c48e353qYuPsvg2SNDbBOcKHnyxB1G2meoWul7wWDlj04t81X7LCj0uMAg8kRNstv6lrl7Lo0kfOFa38IYXMKTneILNw/HtDKaSgLGiYI95/nYrbsUezwYZHkRyy7g5UAtNCl1Y3wmaHcim/p5ISZUQs2j2oMNWfztWz3kYVcAjH83637a2xeLhTIAunHctBZt91LUyIEXQk/B+oNhyS4NpBWEeOAyk9jsJez7gWohuqDtIHHxmlmD3xa5FjODMi9jvNo4MDZMmh7wr6CT4uE2xJw91HvjGcI7uepjJLVR1cWj/9352gzSBS49n7YolGV1jwO9C9/XgcGVxd1281sX1nbgtC11ubt3qag99fUgG2NFRHG2K8OB0VMBBofygUCwLqguzA4byodvAIlFX8br/ZpMAXvbDiBVesRIrv/Cxt2TaBs02iO/rbIIsBnZ0ulPa0G8G/RirNzwWgm4mG275qsRdXDh62H0LJxBIeKiq2UDVVMNeGjzB18qv0n6N0ew5Q307FsObdhKe2Gg2VO0qo7N5aC2WTrSBygWnXYOxwu0uQwwBj6WUT41WG88PthEF2rm3z+t20CKHN0g9iWpy3du7fcNlGRK4lV/YttzC1rXVLUnD1uBa4o/vBHsP51ocanQnMzhhYavV6Iwf9oMTyoae12N5GlwAERD2yP59Bawj3jeC2Ty8SSL740/WKXdpPWEL8IDFX0ZRbHLPtcnrYeq6hPfANXvKYysPE3rhjGLRVVvX3EIvw0sWkNYJ/5II0adK+qR3zV6Kvje7p+YsvM4pVt4/YlNaTGuhsy0gRJei00fqrim56c9T+AdvV/1BOpT5jgtYh7l19Hp7PpVNQ3o2EHSyuULd2eb+WHwg7gsvqQiPHsWO0wTTJwmvGik2OaLJy6/h4QDMaxD+rSXCJ0roDTf42vgZBbIQ4wjtUw98k7JfMrUHrLto2+QLEuAOLfu1l431u4ZQ0Ae9HsHiFessDd/xAs3EzYKmasKoAuY++VR5wQartjqVNwPpnBR+zLOY0rUz3MngbT/tj+Q1GyU238yQR/Fh0A3sIEWdJ2G2s/ZHLZod5LezPbu9nAhqAB0n4RNdxI6beO4wfO/SZkOnD/bGltu0XH2iOiSNGTsi8C0r0A9+FAv/nhnpGbjsX/nAPxbK0wtAVNewzwtS3i9WHnToVe+/+ZMq1nl399gO72W7cpkfUK4/9EO8YQV7dGYbG9JnGPdm7LmHrYxf2ADXBeFfhZT5jvQJTCrzgaO/EqH9HqJ9NoT2B6MZC7KsBpc2qCrq4nxA3iXcSUS/Q7EngLYtnJ0AD+Ay9tTMVCVfOAH3IsG6ANTZCWSw/kRMsHd6hvmy8PqgZl3iD5OQfA3X1eDCKV8P3/MSMPle+ldnSW9nzd497NpCKA/mf7HvGvgoX4pwE4VH0dJfAFLs616+Fc9t9Il2T7iesd7Lt8KkVIchNAyD2Jfu/Khuze25GKQWwwWZpjl/+fLpUl4Km2X2y69/+cc//j+HDN62laMBAA=="; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/API.html b/docs/classes/API.html index 29fd6e3..44d9587 100644 --- a/docs/classes/API.html +++ b/docs/classes/API.html @@ -1,5 +1,5 @@ API | osu-api-v2-js

You can create an API instance using its createAsync function!

-

Hierarchy

  • API

Constructors

Hierarchy

  • API

Constructors

  • Use the API's createAsync instead of the default constructor if you don't have at least an access_token! createAsync should always be your way of creating API instances!!

    -

    Parameters

    • Optional client: {
          id: number;
          secret: string;
      }
      • id: number
      • secret: string
    • Optional token_type: string
    • Optional expires: Date
    • Optional access_token: string
    • Optional scopes: Scope[]
    • Optional refresh_token: string
    • Optional user: number
    • verbose: "all" | "none" | "errors" = "none"
    • server: string = "https://osu.ppy.sh"

    Returns API

Properties

access_token: string
client: {
    id: number;
    secret: string;
}

Type declaration

  • id: number
  • secret: string
expires: Date
refresh_token?: string

Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant! +

Parameters

  • Optional client: {
        id: number;
        secret: string;
    }
    • id: number
    • secret: string
  • Optional token_type: string
  • Optional expires: Date
  • Optional access_token: string
  • Optional scopes: Scope[]
  • Optional refresh_token: string
  • Optional user: number
  • verbose: "all" | "none" | "errors" = "none"
  • server: string = "https://osu.ppy.sh"

Returns API

Properties

access_token: string
client: {
    id: number;
    secret: string;
}

Type declaration

  • id: number
  • secret: string
expires: Date
refresh_token?: string

Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant! Use the API's refreshToken function to do that

-
scopes: Scope[]
server: string

(default https://osu.ppy.sh) The base url of the server where the requests should land

+
scopes: Scope[]
server: string

(default https://osu.ppy.sh) The base url of the server where the requests should land

Remarks

For tokens, requests will be sent to the oauth/token route, other requests will be sent to the api/v2 route

-
token_type: string

Should always be "Bearer"

-
user?: number

The osu! user id of the user who went through the Authorization Code Grant

-
verbose: "all" | "none" | "errors"

(default none) Which events should be logged

-

Methods

token_type: string

Should always be "Bearer"

+
user?: number

The osu! user id of the user who went through the Authorization Code Grant

+
verbose: "all" | "none" | "errors"

(default none) Which events should be logged

+

Methods

  • Get various data about the difficulty of a beatmap!

    +

Returns Promise<BeatmapExtendedWithFailtimesBeatmapsetextended>

  • Get various data about the difficulty of a beatmap!

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap in question

      -
    • Optional mods: number | string[] | Mod[]

      Defaults to No Mod, can be a bitset of mods, an array of mod acronyms ("DT" for DoubleTime), or an array of Mods

      -
    • Optional ruleset: Rulesets

      Defaults to the Ruleset the Beatmap was made for, useful to specify if you want a convert

      -

    Returns Promise<BeatmapDifficultyAttributes>

    The (beatmap) difficulty attributes of the Beatmap

    -

    Remarks

    Will ignore the customization of your mods

    -

    Example

    await api.getBeatmapDifficultyAttributes({id: 811925}, ["HR", "HD"])
    -
    -
  • Get data about a BeatmapPack using its tag!

    -

    Parameters

    • pack: BeatmapPack | {
          tag: string;
      }

      An object with the tag of the beatmappack you're trying to get

      -

    Returns Promise<BeatmapPack>

    Remarks

    Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its link with its tag should show up on your browser's bottom left

    -
  • Get an Array of up to 100 BeatmapPacks of a specific type!

    +
  • Optional mods: number | string[] | Mod[]

    Defaults to No Mod, can be a bitset of mods, an array of mod acronyms ("DT" for DoubleTime), or an array of Mods

    +

Returns Promise<BeatmapDifficultyAttributesFruits>

Remarks

Will ignore the customization of your mods

+
  • Get various data about the difficulty of a beatmap!

    +

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap in question

      +
    • Optional mods: number | string[] | Mod[]

      Defaults to No Mod, can be a bitset of mods, an array of mod acronyms ("DT" for DoubleTime), or an array of Mods

      +

    Returns Promise<BeatmapDifficultyAttributesMania>

    Remarks

    Will ignore the customization of your mods

    +
  • Get various data about the difficulty of a beatmap!

    +

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap in question

      +
    • Optional mods: number | string[] | Mod[]

      Defaults to No Mod, can be a bitset of mods, an array of mod acronyms ("DT" for DoubleTime), or an array of Mods

      +

    Returns Promise<BeatmapDifficultyAttributesOsu>

    Remarks

    Will ignore the customization of your mods

    +
  • Get various data about the difficulty of a beatmap!

    +

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap in question

      +
    • Optional mods: number | string[] | Mod[]

      Defaults to No Mod, can be a bitset of mods, an array of mod acronyms ("DT" for DoubleTime), or an array of Mods

      +

    Returns Promise<BeatmapDifficultyAttributesTaiko>

    Remarks

    Will ignore the customization of your mods

    +
  • Get data about a BeatmapPack using its tag!

    +

    Parameters

    • pack: BeatmapPack | {
          tag: string;
      }

      An object with the tag of the beatmappack you're trying to get

      +

    Returns Promise<BeatmapPack>

    Remarks

    Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its link with its tag should show up on your browser's bottom left

    +
  • Get an Array of up to 100 BeatmapPacks of a specific type!

    Parameters

    • type: "standard" | "featured" | "tournament" | "loved" | "chart" | "theme" | "artist" = "standard"

      The type of the BeatmapPacks, defaults to "standard"

      -

    Returns Promise<BeatmapPack[]>

  • Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)

    +

Returns Promise<BeatmapPack[]>

  • Get the top scores of a beatmap!

    +

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap in question

      +
    • Optional ruleset: Rulesets

      The Ruleset used to make the scores, useful if they were made on a convert

      +
    • Optional mods: string[]

      (2023-11-16) Currently doesn't do anything

      +
    • Optional type: string

      (2023-11-16) Currently doesn't do anything

      +

    Returns Promise<ScoreWithUser[]>

  • Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap the score was made on

    • user: User | {
          id: number;
      }

      The User who made the score

    • Optional mods: string[]

      The Mods used to make the score, defaults to any, you can use ["NM"] to filter out scores with mods

    • Optional ruleset: Rulesets

      The Ruleset used to make the score, useful if it was made on a convert

    Returns Promise<BeatmapUserScore>

    An Object with the position of the score according to the specified Mods and Ruleset, and with the score itself

    -
  • Get the score on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)

    +
  • Get the score on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap the scores were made on

    • user: User | {
          id: number;
      }

      The User who made the scores

    • Optional ruleset: Rulesets

      The Ruleset used to make the scores, defaults to the Ruleset the Beatmap was made for

      -

    Returns Promise<Score[]>

  • Get extensive beatmap data for up to 50 beatmaps at once!

    +

Returns Promise<Score[]>

  • Get extensive beatmap data for up to 50 beatmaps at once!

    Parameters

    • Optional ids: number[]

      An array composed of the ids of the beatmaps you want

      -

    Returns Promise<BeatmapExtended[]>

  • Get extensive beatmapset data about whichever beatmapset you want!

    +

Returns Promise<BeatmapExtended[]>

  • Get details about the version/update/build of something related to osu!

    +

Returns Promise<BeatmapsetExtendedPlus>

  • Get details about the version/update/build of something related to osu!

    Parameters

    • stream: string

      The name of the thing related to osu!, like lazer, web, cuttingedge, beta40, stable40

    • build: string

      The name of the version! Usually something like 2023.1026.0 for lazer, or 20230326 for stable

      -

    Returns Promise<ChangelogBuild>

  • Get up to 21 versions/updates/builds!

    +

Returns Promise<ChangelogBuildWithChangelogentriesVersions>

  • Get up to 21 versions/updates/builds!

    Parameters

    • Optional versions: {
          from?: string;
          to?: string;
      }

      Get builds that were released before/after (and including) those versions (use the name of the versions, e.g. 2023.1109.0)

      • Optional from?: string
      • Optional to?: string
    • Optional max_id: number

      Filter out builds that have an id higher than this (this takes priority over versions.to)

    • Optional stream: string

      Only get builds from a specific stream

    • message_formats: ("html" | "markdown")[] = ...

      Each element of changelog_entries will have a message property if markdown, message_html if html, defaults to both

      -

    Returns Promise<ChangelogBuild[]>

  • An effective way to get all available streams, as well as their latest version!

    -

    Returns Promise<UpdateStream[]>

    Example

    const names_of_streams = (await api.getChangelogStreams()).map(s => s.name)
    +

Returns Promise<ChangelogBuildWithUpdatestreamsChangelogentries[]>

  • An effective way to get all available streams, as well as their latest version!

    +

    Returns Promise<UpdateStream[]>

    Example

    const names_of_streams = (await api.getChangelogStreams()).map(s => s.name)
     
    -
  • Get user data of each friend of the authorized user

    -

    Returns Promise<User[]>

    Scope

    friends.read

    -
  • Get the top 50 players who have the most total kudosu!

    -

    Returns Promise<User[]>

  • Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches or mp

    +
  • Get the top countries of a specific ruleset!

    +

    Parameters

    • ruleset: Rulesets

      On which Ruleset should the countries be compared?

      +
    • page: number = 1

      (defaults to 1) Imagine Rankings as a page, it can only have a maximum of 50 countries, while 50 others may be on the next one

      +

    Returns Promise<RankingsCountry>

  • Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches or mp

    Parameters

    • id: number

      Can be found at the end of the URL of said match

      -

    Returns Promise<Match>

  • Gets the info of the 50 most recently created stable (non-lazer) matches, descending order (most recent is at index 0)

    -

    Returns Promise<MatchInfo[]>

  • Get the scores on a specific item of a room, for a maximum of 50!

    -

    Parameters

    • item: PlaylistItem | {
          id: number;
          room_id: number;
      }

    Returns Promise<MultiplayerScore[]>

    Remarks

    (2023-11-10) Items are broken for multiplayer (real-time) rooms, not for playlists (like spotlights), that's an osu! bug +

Returns Promise<Match>

  • Gets the info of the 50 most recently created stable (non-lazer) matches, descending order (most recent is at index 0)

    +

    Returns Promise<MatchInfo[]>

  • Get the scores on a specific item of a room!

    +

    Parameters

    • item: PlaylistItem | {
          id: number;
          room_id: number;
      }

      An object with the id of the item in question, as well as the id of the room

      +
    • limit: number = 50

      How many scores maximum? Defaults to 50, the maximum the API will return

      +
    • sort: "score_asc" | "score_desc" = "score_desc"

      Sort by scores, ascending or descending? Defaults to descending

      +
    • Optional cursor_string: string

      Use a MultiplayerScores' params and cursor_string to get the next page (scores 51 to 100 for example)

      +

    Returns Promise<MultiplayerScores>

    Remarks

    (2023-11-10) Items are broken for multiplayer (real-time) rooms, not for playlists (like spotlights), that's an osu! bug https://github.com/ppy/osu-web/issues/10725

    -
  • Get the top players of the game, with some filters!

    +
  • Get the top players of the game, with some filters!

    Parameters

    • ruleset: Rulesets

      Self-explanatory, is also known as "Gamemode"

      -
    • type: "country" | "performance" | "charts" | "score"

      charts is essentially for older spotlights, the rest should be obvious enough

      +
    • type: "performance" | "score"

      Rank players by their performance points or by their ranked score?

    • page: number = 1

      (defaults to 1) Imagine Rankings as a page, it can only have a maximum of 50 players, while 50 others may be on the next one

    • filter: "all" | "friends" = "all"

      What kind of players do you want to see? Defaults to all, friends has no effect if no authorized user

    • Optional country: string

      Only get players from a specific country, using its ISO 3166-1 alpha-2 country code! (France would be FR, United States US)

      -
    • Optional spotlight: Spotlight | {
          id: number;
      }

      If type is charts, you can specify the id of a spotlight! Defaults to the latest spotlight

    • Optional variant: "4k" | "7k"

      If type is performance and ruleset is mania, choose between 4k and 7k!

      -

    Returns Promise<Rankings>

    Scope

    public (only if there's an authorized user) (the friends.read scope isn't needed to use the friends filter)

    -
  • Get extensive user data about the authorized user

    +

Returns Promise<Rankings>

  • Get data about a lazer multiplayer room (realtime or playlists)!

    +

Returns Promise<UserExtendedWithStatisticsrulesets>

Scope

identify

+
  • Get data about a lazer multiplayer room (realtime or playlists)!

    Parameters

    • room: Room | {
          id: number;
      }

      An object with the id of the room, is at the end of its URL (after /multiplayer/rooms/)

      -

    Returns Promise<Room>

  • Get the room stats of all the users of that room!

    +

Returns Promise<Room>

  • Get the room stats of all the users of that room!

    Parameters

    • room: Room | {
          id: number;
      }

      An object with the id of the room in question

    Returns Promise<Leader[]>

    Scope

    public

    -
  • Get rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!

    +
  • Get rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!

    Parameters

    • mode: "all" | "active" | "ended" | "participated" | "owned" = "active"

      Self-explanatory enough, defaults to active

    Returns Promise<Room[]>

    Scope

    public

    -
  • Get ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)

    -

    Returns Promise<Spotlight[]>

    Remarks

    The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom() +

  • Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!

    +

    Parameters

    • ruleset: Rulesets

      Each spotlight has a different ranking (and often maps) depending on the ruleset

      +
    • spotlight: Spotlight | {
          id: number;
      }

      The spotlight in question

      +
    • filter: "all" | "friends" = "all"

      What kind of players do you want to see? Defaults to all, friends has no effect if no authorized user

      +

    Returns Promise<RankingsSpotlight>

  • Get extensive user data about whoever you want!

    Parameters

    • user: User | {
          id?: number;
          username?: string;
      }

      An object with either the id or the username of the user you're trying to get

    • Optional ruleset: Rulesets

      Defaults to the user's default/favourite Ruleset

      -

    Returns Promise<UserExtended>

  • Get data about the activity of a user kudosu-wise!

    +

Returns Promise<UserExtended>

  • Get data about the activity of a user kudosu-wise!

    Parameters

    • user: User | {
          id: number;
      }

      The user in question

    • Optional limit: number

      The maximum amount of activities in the returned array, defaults to 5

    • Optional offset: number

      How many elements that would be at the top of the returned array get skipped (while still filling the array up to the limit)

      -

    Returns Promise<KudosuHistory[]>

  • Get "notable" scores from a user

    +

Returns Promise<KudosuHistory[]>

  • Get "notable" scores from a user

    Parameters

    • user: User | {
          id: number;
      }

      The user who set the scores

    • type: "best" | "firsts" | "recent"

      Do you want scores: in the user's top 100, that are top 1 on a beatmap, that have been recently set?

    • Optional limit: number

      The maximum amount of scores to be returned

    • Optional ruleset: Rulesets

      The Ruleset the scores were made in, defaults to the user's default/favourite Ruleset

    • include_fails: boolean = false

      Do you want scores where the user didn't survive or quit the map? Defaults to false

    • Optional offset: number

      How many elements that would be at the top of the returned array get skipped (while still filling the array up to the limit)

      -

    Returns Promise<Score[]>

  • Get user data for up to 50 users at once!

    +

Returns Promise<ScoreWithUserBeatmapBeatmapset[]>

  • Use this instead of console.log to log any information

    +

Returns Promise<UserWithCountryCoverGroupsStatisticsrulesets[]>

  • Use this instead of console.log to log any information

    Parameters

    • is_error: boolean

      Is the logging happening because of an error?

    • Rest ...to_log: any[]

      Whatever you would put between the parentheses of console.log()

      -

    Returns void

  • Parameters

    • body: any
    • api: API

    Returns Promise<API>

  • Returns Promise<boolean>

  • Parameters

    • method: "get" | "post"
    • endpoint: string

      What comes in the URL after api/

      +

    Returns void

  • Parameters

    • body: any
    • api: API

    Returns Promise<API>

  • Returns Promise<boolean>

  • Parameters

    • method: "get" | "post"
    • endpoint: string

      What comes in the URL after api/

    • Optional parameters: {
          [k: string]: any;
      }

      The things to specify in the request, such as the beatmap_id when looking for a beatmap

      • [k: string]: any
    • number_try: number = 1

      How many attempts there's been to get the data

    Returns Promise<any>

    A Promise with either the API's response or false upon failing

    -
  • The normal way to create an API instance! Make sure to await it

    +
  • The normal way to create an API instance! Make sure to await it

    Parameters

    • client: {
          id: number;
          secret: string;
      }

      The ID and the secret of your client, can be found on https://osu.ppy.sh/home/account/edit#new-oauth-application

      • id: number
      • secret: string
    • Optional user: {
          code: string;
          redirect_uri: string;
      }

      If the instance is supposed to represent a user, use their Authorization Code and the Application Callback URL of your application!

      • code: string
      • redirect_uri: string
    • verbose: "all" | "none" | "errors" = "none"
    • server: string = "https://osu.ppy.sh"

    Returns Promise<API>

    A promise with an API instance

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/APIError.html b/docs/classes/APIError.html index b1019d2..6083f3a 100644 --- a/docs/classes/APIError.html +++ b/docs/classes/APIError.html @@ -1,5 +1,5 @@ APIError | osu-api-v2-js

Class APIError

If the API throws an error, it should always be an APIError!

-

Hierarchy

  • APIError

Constructors

Hierarchy

  • APIError

Constructors

Properties

endpoint message parameters @@ -8,4 +8,4 @@
  • server: string

    The server to which the request was sent

  • endpoint: string

    The type of resource that was requested from the server

  • parameters: string

    The filters that were used to specify what resource was wanted

    -
  • Returns APIError

    Properties

    endpoint: string
    message: string
    parameters: string
    server: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns APIError

    Properties

    endpoint: string
    message: string
    parameters: string
    server: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/enums/RankStatus.html b/docs/enums/RankStatus.html new file mode 100644 index 0000000..dddc0ee --- /dev/null +++ b/docs/enums/RankStatus.html @@ -0,0 +1,8 @@ +RankStatus | osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/enums/Rulesets.html b/docs/enums/Rulesets.html index 2909605..7bf1a6b 100644 --- a/docs/enums/Rulesets.html +++ b/docs/enums/Rulesets.html @@ -1,5 +1,5 @@ -Rulesets | osu-api-v2-js

    Enumeration Rulesets

    Enumeration Members

    fruits +Rulesets | osu-api-v2-js

    Enumeration Rulesets

    Enumeration Members

    Enumeration Members

    fruits: 2
    mania: 3
    osu: 0
    taiko: 1

    Generated using TypeDoc

    \ No newline at end of file +

    Enumeration Members

    fruits: 2
    mania: 3
    osu: 0
    taiko: 1

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/functions/generateAuthorizationURL.html b/docs/functions/generateAuthorizationURL.html index 28901e5..5316ac4 100644 --- a/docs/functions/generateAuthorizationURL.html +++ b/docs/functions/generateAuthorizationURL.html @@ -1,6 +1,6 @@ generateAuthorizationURL | osu-api-v2-js

    Function generateAuthorizationURL

    • Generates a link for users to click on in order to use your application!

      Parameters

      • client_id: number
      • redirect_uri: string

        The specified Application Callback URL, aka where the user will be redirected upon clicking the button to authorize

        -
      • scopes: Scope[]

        What you want to do with/as the user

        +
      • scopes: Scope[]

        What you want to do with/as the user

      Returns string

      The link people should click on

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index d6103ac..b2b12f1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,3 +1,10 @@ osu-api-v2-js

    osu-api-v2-js

    osu-api-v2-js

    osu-api-v2-js is a JavaScript & TypeScript package that helps you interact with osu!api (v2).

    -

    While it is currently unstable as it's under pretty heavy development, documentation is available on osu-v2.taevas.xyz!

    -

    Generated using TypeDoc

    \ No newline at end of file +

    It is currently unstable as it's under development, but you can find documentation on osu-v2.taevas.xyz if needed!

    +

    How to install and get started

    To install the package, use a command from your package manager:

    +
    npm i osu-api-v2-js # if using npm
    yarn add osu-api-v2-js # if using yarn
    pnpm add osu-api-v2-js # if using pnpm
    bun a osu-api-v2-js # if using bun +
    +

    Make sure to add "type": "module" to your package.json!

    +

    To use (import) the package in your project and start interacting with the API, you may do something like that:

    +
    // TypeScript
    import * as osu from "osu-api-v2-js"

    async function logUserTopPlayBeatmap(username: string) {
    // Because of how the API server works, it's more convenient to use `osu.API.createAsync()` instead of `new osu.API()`!
    // In a proper application, you'd use this function as soon as the app starts so you can use that object everywhere
    const api = await osu.API.createAsync({id: "<client_id>", "<client_secret>"})

    const user = await api.getUser({username}) // We need to get the id of the user in order to request what we want
    const score = (await api.getUserScores(user, "best", 1, osu.Rulesets.osu))[0] // Specifying the Ruleset is optional
    const beatmapDifficulty = await api.getBeatmapDifficultyAttributesOsu(score.beatmap, score.mods) // Specifying the mods so the SR is adapted to them

    let x = `${score.beatmapset.artist} - ${score.beatmapset.title} [${score.beatmap.version}]`
    let y = `+${score.mods.toString()} (${beatmapDifficulty.star_rating.toFixed(2)}*)`
    console.log(`${username}'s top play is on: ${x} ${y}`)
    // Doomsday fanboy's top play is on: xi - FREEDOM DiVE [FOUR DIMENSIONS] +HR (8.07*)
    }

    logUserTopPlayBeatmap("Doomsday fanboy") +
    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Beatmap.html b/docs/interfaces/Beatmap.html index 1277546..b8d548d 100644 --- a/docs/interfaces/Beatmap.html +++ b/docs/interfaces/Beatmap.html @@ -1,14 +1,9 @@ -Beatmap | osu-api-v2-js

    Interface Beatmap

    Hierarchy

    Properties

    beatmapset? -beatmapset_id -checksum? +Beatmap | osu-api-v2-js

    Interface Beatmap

    Hierarchy

    Properties

    beatmapset?: null | BeatmapsetExtended | Beatmapset

    Beatmapset for Beatmap object, BeatmapsetExtended for BeatmapExtended object, null if the beatmap doesn't have associated beatmapset (e.g. deleted)

    -
    beatmapset_id: number
    checksum?: string
    difficulty_rating: number
    failtimes?: Failtimes
    id: number
    max_combo?: number
    mode: string
    status: string
    total_length: number
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    beatmapset_id: number
    difficulty_rating: number
    id: number
    mode: string
    status: string
    total_length: number
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapDifficultyAttributes.html b/docs/interfaces/BeatmapDifficultyAttributes.html new file mode 100644 index 0000000..fc3242e --- /dev/null +++ b/docs/interfaces/BeatmapDifficultyAttributes.html @@ -0,0 +1,3 @@ +BeatmapDifficultyAttributes | osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapDifficultyAttributesFruits.html b/docs/interfaces/BeatmapDifficultyAttributesFruits.html new file mode 100644 index 0000000..b259e71 --- /dev/null +++ b/docs/interfaces/BeatmapDifficultyAttributesFruits.html @@ -0,0 +1,5 @@ +BeatmapDifficultyAttributesFruits | osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapDifficultyAttributesMania.html b/docs/interfaces/BeatmapDifficultyAttributesMania.html new file mode 100644 index 0000000..2051527 --- /dev/null +++ b/docs/interfaces/BeatmapDifficultyAttributesMania.html @@ -0,0 +1,7 @@ +BeatmapDifficultyAttributesMania | osu-api-v2-js

    Interface BeatmapDifficultyAttributesMania

    Expected from api.getBeatmapDifficultyAttributesMania()

    +

    Hierarchy

    Properties

    great_hit_window: number
    max_combo: number
    score_multiplier?: number

    Remarks

    (2023-11-20) Doesn't exist anymore?

    +
    star_rating: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapDifficultyAttributesOsu.html b/docs/interfaces/BeatmapDifficultyAttributesOsu.html new file mode 100644 index 0000000..0552176 --- /dev/null +++ b/docs/interfaces/BeatmapDifficultyAttributesOsu.html @@ -0,0 +1,11 @@ +BeatmapDifficultyAttributesOsu | osu-api-v2-js

    Interface BeatmapDifficultyAttributesOsu

    Expected from api.getBeatmapDifficultyAttributesOsu()

    +

    Hierarchy

    Properties

    aim_difficulty: number
    approach_rate: number
    flashlight_difficulty: number
    max_combo: number
    overall_difficulty: number
    slider_factor: number
    speed_difficulty: number
    speed_note_count: number
    star_rating: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapDifficultyAttributesTaiko.html b/docs/interfaces/BeatmapDifficultyAttributesTaiko.html new file mode 100644 index 0000000..004f6b3 --- /dev/null +++ b/docs/interfaces/BeatmapDifficultyAttributesTaiko.html @@ -0,0 +1,9 @@ +BeatmapDifficultyAttributesTaiko | osu-api-v2-js

    Interface BeatmapDifficultyAttributesTaiko

    Expected from api.getBeatmapDifficultyAttributesTaiko()

    +

    Hierarchy

    Properties

    colour_difficulty: number
    great_hit_window: number
    max_combo: number
    peak_difficulty: number
    rhythm_difficulty: number
    stamina_difficulty: number
    star_rating: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapExtended.html b/docs/interfaces/BeatmapExtended.html index b8780e9..a84af39 100644 --- a/docs/interfaces/BeatmapExtended.html +++ b/docs/interfaces/BeatmapExtended.html @@ -1,9 +1,9 @@ -BeatmapExtended | osu-api-v2-js

    Interface BeatmapExtended

    Hierarchy

    Properties

    accuracy +BeatmapExtended | osu-api-v2-js

    Interface BeatmapExtended

    Expected from ScoreWithUserBeatmapBeatmapset

    +

    Hierarchy

    Properties

    accuracy: number
    ar: number
    beatmapset?: null | BeatmapsetExtended | Beatmapset

    Beatmapset for Beatmap object, BeatmapsetExtended for BeatmapExtended object, null if the beatmap doesn't have associated beatmapset (e.g. deleted)

    -
    beatmapset_id: number
    bpm: null | number
    checksum?: string
    convert: boolean
    count_circles: number
    count_sliders: number
    count_spinners: number
    cs: number
    deleted_at: null | Date
    difficulty_rating: number
    drain: number
    failtimes?: Failtimes
    hit_length: number
    id: number
    is_scoreable: boolean
    last_updated: Date
    max_combo?: number
    mode: string
    mode_int: number
    passcount: number
    playcount: number
    ranked: RankStatus
    status: string
    total_length: number
    url: string
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    accuracy: number
    ar: number
    beatmapset_id: number
    bpm: number
    checksum: string
    convert: boolean
    count_circles: number
    count_sliders: number
    count_spinners: number
    cs: number
    deleted_at: null | Date
    difficulty_rating: number
    drain: number
    hit_length: number
    id: number
    is_scoreable: boolean
    last_updated: Date
    mode: string
    mode_int: number
    passcount: number
    playcount: number
    ranked: RankStatus
    status: string
    total_length: number
    url: string
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapExtendedWithFailtimes.html b/docs/interfaces/BeatmapExtendedWithFailtimes.html new file mode 100644 index 0000000..baa187f --- /dev/null +++ b/docs/interfaces/BeatmapExtendedWithFailtimes.html @@ -0,0 +1,30 @@ +BeatmapExtendedWithFailtimes | osu-api-v2-js

    Interface BeatmapExtendedWithFailtimes

    Expected from BeatmapsetExtendedPlus

    +

    Hierarchy

    Properties

    accuracy: number
    ar: number
    beatmapset_id: number
    bpm: number
    checksum: string
    convert: boolean
    count_circles: number
    count_sliders: number
    count_spinners: number
    cs: number
    deleted_at: null | Date
    difficulty_rating: number
    drain: number
    failtimes: {
        exit: number[];
        fail: number[];
    }

    Type declaration

    • exit: number[]
    • fail: number[]
    hit_length: number
    id: number
    is_scoreable: boolean
    last_updated: Date
    mode: string
    mode_int: number
    passcount: number
    playcount: number
    ranked: RankStatus
    status: string
    total_length: number
    url: string
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapExtendedWithFailtimesBeatmapsetextended.html b/docs/interfaces/BeatmapExtendedWithFailtimesBeatmapsetextended.html new file mode 100644 index 0000000..424cea2 --- /dev/null +++ b/docs/interfaces/BeatmapExtendedWithFailtimesBeatmapsetextended.html @@ -0,0 +1,31 @@ +BeatmapExtendedWithFailtimesBeatmapsetextended | osu-api-v2-js

    Interface BeatmapExtendedWithFailtimesBeatmapsetextended

    Expected from api.getBeatmap()

    +

    Hierarchy

    Properties

    accuracy: number
    ar: number
    beatmapset: BeatmapsetExtended
    beatmapset_id: number
    bpm: number
    checksum: string
    convert: boolean
    count_circles: number
    count_sliders: number
    count_spinners: number
    cs: number
    deleted_at: null | Date
    difficulty_rating: number
    drain: number
    failtimes: {
        exit: number[];
        fail: number[];
    }

    Type declaration

    • exit: number[]
    • fail: number[]
    hit_length: number
    id: number
    is_scoreable: boolean
    last_updated: Date
    mode: string
    mode_int: number
    passcount: number
    playcount: number
    ranked: RankStatus
    status: string
    total_length: number
    url: string
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapPack.html b/docs/interfaces/BeatmapPack.html new file mode 100644 index 0000000..d0ce2cf --- /dev/null +++ b/docs/interfaces/BeatmapPack.html @@ -0,0 +1,14 @@ +BeatmapPack | osu-api-v2-js

    Interface BeatmapPack

    Expected from api.getBeatmapPack(), api.getBeatmapPacks()

    +

    Hierarchy

    • BeatmapPack

    Properties

    author: string
    beatmapsets?: BeatmapsetExtended[]
    date: Date
    name: string
    no_diff_reduction: boolean

    Are difficulty reduction mods unable to be used to clear this pack? (is false if you can use such mods)

    +
    ruleset_id: null | number
    tag: string
    url: string
    user_completion_data?: {
        beatmapset_ids: number[];
        completed: boolean;
    }

    Type declaration

    • beatmapset_ids: number[]

      IDs of beatmapsets completed by the user (according to the requirements of the pack)

      +
    • completed: boolean

      Whether all beatmapsets are completed by the user or not

      +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapUserScore.html b/docs/interfaces/BeatmapUserScore.html index c4732a5..3bf6d24 100644 --- a/docs/interfaces/BeatmapUserScore.html +++ b/docs/interfaces/BeatmapUserScore.html @@ -1,4 +1,5 @@ -BeatmapUserScore | osu-api-v2-js

    Interface BeatmapUserScore

    Hierarchy

    • BeatmapUserScore

    Properties

    position +BeatmapUserScore | osu-api-v2-js

    Interface BeatmapUserScore

    Expected from api.getBeatmapUserScore()

    +

    Hierarchy

    • BeatmapUserScore

    Properties

    Properties

    position: number

    Value depends on the requested mode and mods!

    -
    score: Score

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapWithBeatmapset.html b/docs/interfaces/BeatmapWithBeatmapset.html new file mode 100644 index 0000000..af5d3b3 --- /dev/null +++ b/docs/interfaces/BeatmapWithBeatmapset.html @@ -0,0 +1,11 @@ +BeatmapWithBeatmapset | osu-api-v2-js

    Interface BeatmapWithBeatmapset

    Expected from Match

    +

    Hierarchy

    Properties

    beatmapset: Beatmapset
    beatmapset_id: number
    difficulty_rating: number
    id: number
    mode: string
    status: string
    total_length: number
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapWithBeatmapsetChecksumMaxcombo.html b/docs/interfaces/BeatmapWithBeatmapsetChecksumMaxcombo.html new file mode 100644 index 0000000..bee7f5d --- /dev/null +++ b/docs/interfaces/BeatmapWithBeatmapsetChecksumMaxcombo.html @@ -0,0 +1,13 @@ +BeatmapWithBeatmapsetChecksumMaxcombo | osu-api-v2-js

    Interface BeatmapWithBeatmapsetChecksumMaxcombo

    Expected from PlaylistItem

    +

    Hierarchy

    Properties

    beatmapset: Beatmapset
    beatmapset_id: number
    checksum: string
    difficulty_rating: number
    id: number
    max_combo: number
    mode: string
    status: string
    total_length: number
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Beatmapset.html b/docs/interfaces/Beatmapset.html index 28ad73c..f20aa6e 100644 --- a/docs/interfaces/Beatmapset.html +++ b/docs/interfaces/Beatmapset.html @@ -1,32 +1,24 @@ -Beatmapset | osu-api-v2-js

    Interface Beatmapset

    Hierarchy

    Properties

    artist +Beatmapset | osu-api-v2-js

    Interface Beatmapset

    Expected from BeatmapWithBeatmapset, Score

    +

    Hierarchy

    Properties

    artist: string
    artist_unicode: string
    beatmaps?: BeatmapExtended[]
    converts?: 0 | BeatmapExtended[]
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    current_nominations?: {
        beatmapset_id: number;
        reset: boolean;
        rulesets: null | Rulesets[];
        user_id: number;
    }[]

    Type declaration

    • beatmapset_id: number
    • reset: boolean
    • rulesets: null | Rulesets[]
    • user_id: number
    current_user_attributes?: any
    description?: {
        description: string;
    }

    Type declaration

    • description: string
    discussions?: any
    events?: any
    favourite_count: number
    genre?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    has_favourited?: boolean
    id: number
    language?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    nominations?: any
    nsfw: boolean
    pack_tags?: string[]
    play_count: number
    preview_url: string
    ratings?: number[]
    recent_favourites?: User[]
    related_users?: User[]
    source: string
    status: string
    title: string
    title_unicode: string
    user?: User
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    artist: string
    artist_unicode: string
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    favourite_count: number
    id: number
    nsfw: boolean
    offset: number
    play_count: number
    preview_url: string

    A string like that, where id is the id of the beatmapset: //b.ppy.sh/preview/58951.mp3

    +
    source: string | 0

    Can be/Is 0 if there is no source

    +
    spotlight: boolean
    status: string

    Is it ranked, is it graveyarded, etc

    +
    title: string

    A title readable by any english-speaking person, so it'd be romaji if the song's title is in Japanese

    +
    title_unicode: string

    Basically the title is the original language, so with hiraganas and kanji if Japanese

    +
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapsetExtended.html b/docs/interfaces/BeatmapsetExtended.html index 63cade1..8edf266 100644 --- a/docs/interfaces/BeatmapsetExtended.html +++ b/docs/interfaces/BeatmapsetExtended.html @@ -1,47 +1,41 @@ -BeatmapsetExtended | osu-api-v2-js

    Interface BeatmapsetExtended

    Hierarchy

    Properties

    artist +BeatmapsetExtended | osu-api-v2-js

    Interface BeatmapsetExtended

    Expected from RankingsSpotlight, BeatmapExtendedWithFailtimesBeatmapsetextended

    +

    Hierarchy

    Properties

    artist: string
    artist_unicode: string
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    }

    Type declaration

    • download_disabled: boolean
    • more_information: null | string
    beatmaps?: BeatmapExtended[]
    bpm: number
    can_be_hyped: boolean
    converts?: 0 | BeatmapExtended[]
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    current_nominations?: {
        beatmapset_id: number;
        reset: boolean;
        rulesets: null | Rulesets[];
        user_id: number;
    }[]

    Type declaration

    • beatmapset_id: number
    • reset: boolean
    • rulesets: null | Rulesets[]
    • user_id: number
    current_user_attributes?: any
    deleted_at: null | string
    description?: {
        description: string;
    }

    Type declaration

    • description: string
    discussion_locked: boolean
    discussions?: any
    events?: any
    favourite_count: number
    genre?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    has_favourited?: any
    hype.current: number
    hype.required: number
    id: number
    is_scoreable: boolean
    language?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    last_updated: Date
    legacy_thread_url: null | string
    nominations: {
        current: number;
        required: number;
    }

    Type declaration

    • current: number
    • required: number
    nsfw: boolean
    pack_tags?: string[]
    play_count: number
    preview_url: string
    ranked: RankStatus
    ranked_date: null | Date
    ratings?: number[]
    recent_favourites?: User[]
    related_users?: User[]
    source: string
    status: string
    storyboard: boolean
    submitted_date: null | Date
    tags: string
    title: string
    title_unicode: string
    user?: User
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    artist: string
    artist_unicode: string
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    }

    Type declaration

    • download_disabled: boolean

      So it's false if you can download it

      +
    • more_information: null | string
    bpm: number
    can_be_hyped: boolean
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    deleted_at: null | string
    discussion_locked: boolean
    favourite_count: number
    hype: null | {
        current: number;
        required: number;
    }

    Type declaration

    • current: number
    • required: number
    id: number
    is_scoreable: boolean
    last_updated: Date
    legacy_thread_url: string
    nominations_summary: {
        current: number;
        required: number;
    }

    Type declaration

    • current: number
    • required: number
    nsfw: boolean
    offset: number
    play_count: number
    preview_url: string

    A string like that, where id is the id of the beatmapset: //b.ppy.sh/preview/58951.mp3

    +
    ranked: RankStatus
    ranked_date: null | Date
    source: string

    Can be/Is 0 if there is no source

    +
    spotlight: boolean
    status: string

    Is it ranked, is it graveyarded, etc

    +
    storyboard: boolean
    submitted_date: null | Date
    tags: string | 0

    0 if no tags at all, a string with tags separated from each other by a whitespace

    +
    title: string

    A title readable by any english-speaking person, so it'd be romaji if the song's title is in Japanese

    +
    title_unicode: string

    Basically the title is the original language, so with hiraganas and kanji if Japanese

    +
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapsetExtendedPlus.html b/docs/interfaces/BeatmapsetExtendedPlus.html new file mode 100644 index 0000000..08d4a31 --- /dev/null +++ b/docs/interfaces/BeatmapsetExtendedPlus.html @@ -0,0 +1,57 @@ +BeatmapsetExtendedPlus | osu-api-v2-js

    Interface BeatmapsetExtendedPlus

    Expected from api.getBeatmapset()

    +

    Hierarchy

    Properties

    artist: string
    artist_unicode: string
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    }

    Type declaration

    • download_disabled: boolean

      So it's false if you can download it

      +
    • more_information: null | string

    The different beatmaps/difficulties this beatmapset has

    +
    bpm: number
    can_be_hyped: boolean

    The different beatmaps made for osu!, but converted to the other Rulesets

    +
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    current_nominations: {
        beatmapset_id: number;
        reset: boolean;
        rulesets: Rulesets[];
        user_id: number;
    }[]

    Type declaration

    • beatmapset_id: number
    • reset: boolean
    • rulesets: Rulesets[]
    • user_id: number
    deleted_at: null | string
    description: {
        description: string;
    }

    Type declaration

    • description: string

      In HTML

      +
    discussion_locked: boolean
    favourite_count: number
    genre: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    has_favourited?: boolean

    Only exists if authorized user

    +
    hype: null | {
        current: number;
        required: number;
    }

    Type declaration

    • current: number
    • required: number
    id: number
    is_scoreable: boolean
    language: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    last_updated: Date
    legacy_thread_url: string
    nominations_summary: {
        current: number;
        required: number;
    }

    Type declaration

    • current: number
    • required: number
    nsfw: boolean
    offset: number
    pack_tags: string[]
    play_count: number
    preview_url: string

    A string like that, where id is the id of the beatmapset: //b.ppy.sh/preview/58951.mp3

    +
    ranked: RankStatus
    ranked_date: null | Date
    ratings: number[]
    recent_favourites: User[]
    related_users: User[]
    source: string

    Can be/Is 0 if there is no source

    +
    spotlight: boolean
    status: string

    Is it ranked, is it graveyarded, etc

    +
    storyboard: boolean
    submitted_date: null | Date
    tags: string | 0

    0 if no tags at all, a string with tags separated from each other by a whitespace

    +
    title: string

    A title readable by any english-speaking person, so it'd be romaji if the song's title is in Japanese

    +
    title_unicode: string

    Basically the title is the original language, so with hiraganas and kanji if Japanese

    +
    user: User
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ChangelogBuild.html b/docs/interfaces/ChangelogBuild.html deleted file mode 100644 index c11719f..0000000 --- a/docs/interfaces/ChangelogBuild.html +++ /dev/null @@ -1,18 +0,0 @@ -ChangelogBuild | osu-api-v2-js

    Interface ChangelogBuild

    Hierarchy

    • ChangelogBuild

    Properties

    changelog_entries?: {
        category: string;
        created_at: null | Date;
        github_pull_request_id: null | number;
        github_url: null | string;
        github_user?: {
            display_name: string;
            github_url: null | string;
            github_username: null | string;
            id: null | number;
            osu_username: null | string;
            user_id: null | number;
            user_url: null | string;
        };
        id: null | number;
        major: boolean;
        message?: null | string;
        message_html?: null | string;
        repository: null | string;
        title: null | string;
        type: string;
        url: null | string;
    }

    Type declaration

    • category: string
    • created_at: null | Date

      Can be January 1st 1970!

      -
    • github_pull_request_id: null | number
    • github_url: null | string
    • Optional github_user?: {
          display_name: string;
          github_url: null | string;
          github_username: null | string;
          id: null | number;
          osu_username: null | string;
          user_id: null | number;
          user_url: null | string;
      }
      • display_name: string
      • github_url: null | string
      • github_username: null | string
      • id: null | number
      • osu_username: null | string
      • user_id: null | number
      • user_url: null | string
    • id: null | number
    • major: boolean
    • Optional message?: null | string

      Entry message in Markdown format, embedded HTML is allowed, exists only if Markdown was requested

      -
    • Optional message_html?: null | string

      Entry message in HTML format, exists only if HTML was requested

      -
    • repository: null | string
    • title: null | string
    • type: string
    • url: null | string
    created_at: Date
    display_version: string
    id: number
    update_stream: null | UpdateStream
    users: number

    How many users are playing on this version of the game? (if lazer/web, should be 0, lazer doesn't show such stats)

    -
    version: null | string

    The name of the version

    -
    versions?: {
        next: null | ChangelogBuild;
        previous: null | ChangelogBuild;
    }

    The ChangelogBuilds in versions will not have changelog_entries or versions, and users will be 0

    -

    Type declaration

    youtube_id: null | string

    If a video is showcased on the changelog

    -

    Remarks

    The ID of a Youtube video is whatever comes after /watch?v= in its url

    -

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ChangelogBuildWithChangelogentriesVersions.html b/docs/interfaces/ChangelogBuildWithChangelogentriesVersions.html new file mode 100644 index 0000000..69cd651 --- /dev/null +++ b/docs/interfaces/ChangelogBuildWithChangelogentriesVersions.html @@ -0,0 +1,18 @@ +ChangelogBuildWithChangelogentriesVersions | osu-api-v2-js

    Interface ChangelogBuildWithChangelogentriesVersions

    Expected from api.getChangelogBuild()

    +

    Hierarchy

    • ChangelogBuildWithChangelogentries
      • ChangelogBuildWithChangelogentriesVersions

    Properties

    changelog_entries: {
        category: string;
        created_at: Date;
        github_pull_request_id: null | number;
        github_url: null | string;
        github_user?: {
            display_name: string;
            github_url: null | string;
            github_username: null | string;
            id: null | number;
            osu_username: null | string;
            user_id: null | number;
            user_url: null | string;
        };
        id: null | number;
        major: boolean;
        message?: null | string;
        message_html?: null | string;
        repository: null | string;
        title: null | string;
        type: string;
        url: null | string;
    }[]

    Type declaration

    • category: string
    • created_at: Date

      Can be January 1st 1970!

      +
    • github_pull_request_id: null | number
    • github_url: null | string
    • Optional github_user?: {
          display_name: string;
          github_url: null | string;
          github_username: null | string;
          id: null | number;
          osu_username: null | string;
          user_id: null | number;
          user_url: null | string;
      }

      Doesn't exist if no github user is associated with who's credited with the change

      +
      • display_name: string
      • github_url: null | string
      • github_username: null | string
      • id: null | number
      • osu_username: null | string
      • user_id: null | number
      • user_url: null | string
    • id: null | number
    • major: boolean
    • Optional message?: null | string

      Entry message in Markdown format, embedded HTML is allowed, exists only if Markdown was requested

      +
    • Optional message_html?: null | string

      Entry message in HTML format, exists only if HTML was requested

      +
    • repository: null | string
    • title: null | string
    • type: string
    • url: null | string
    created_at: Date
    display_version: string
    id: number
    users: number

    How many users are playing on this version of the game? (if lazer/web, should be 0, lazer doesn't show such stats)

    +
    version: null | string

    The name of the version

    +
    versions: {
        next: null | ChangelogBuildWithUpdatestreams;
        previous: null | ChangelogBuildWithUpdatestreams;
    }

    Type declaration

    youtube_id: null | string

    If a video is showcased on the changelog

    +

    Remarks

    The ID of a Youtube video is whatever comes after /watch?v= in its url

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ChangelogBuildWithUpdatestreams.html b/docs/interfaces/ChangelogBuildWithUpdatestreams.html new file mode 100644 index 0000000..f1d2725 --- /dev/null +++ b/docs/interfaces/ChangelogBuildWithUpdatestreams.html @@ -0,0 +1,13 @@ +ChangelogBuildWithUpdatestreams | osu-api-v2-js

    Interface ChangelogBuildWithUpdatestreams

    Expected from ChangelogBuildWithChangelogentriesVersions

    +

    Hierarchy

    Properties

    created_at: Date
    display_version: string
    id: number
    update_stream: UpdateStream
    users: number

    How many users are playing on this version of the game? (if lazer/web, should be 0, lazer doesn't show such stats)

    +
    version: null | string

    The name of the version

    +
    youtube_id: null | string

    If a video is showcased on the changelog

    +

    Remarks

    The ID of a Youtube video is whatever comes after /watch?v= in its url

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ChangelogBuildWithUpdatestreamsChangelogentries.html b/docs/interfaces/ChangelogBuildWithUpdatestreamsChangelogentries.html new file mode 100644 index 0000000..ba84656 --- /dev/null +++ b/docs/interfaces/ChangelogBuildWithUpdatestreamsChangelogentries.html @@ -0,0 +1,18 @@ +ChangelogBuildWithUpdatestreamsChangelogentries | osu-api-v2-js

    Interface ChangelogBuildWithUpdatestreamsChangelogentries

    Expected from api.getChangelogBuilds()

    +

    Hierarchy

    Properties

    changelog_entries: {
        category: string;
        created_at: Date;
        github_pull_request_id: null | number;
        github_url: null | string;
        github_user?: {
            display_name: string;
            github_url: null | string;
            github_username: null | string;
            id: null | number;
            osu_username: null | string;
            user_id: null | number;
            user_url: null | string;
        };
        id: null | number;
        major: boolean;
        message?: null | string;
        message_html?: null | string;
        repository: null | string;
        title: null | string;
        type: string;
        url: null | string;
    }[]

    Type declaration

    • category: string
    • created_at: Date

      Can be January 1st 1970!

      +
    • github_pull_request_id: null | number
    • github_url: null | string
    • Optional github_user?: {
          display_name: string;
          github_url: null | string;
          github_username: null | string;
          id: null | number;
          osu_username: null | string;
          user_id: null | number;
          user_url: null | string;
      }

      Doesn't exist if no github user is associated with who's credited with the change

      +
      • display_name: string
      • github_url: null | string
      • github_username: null | string
      • id: null | number
      • osu_username: null | string
      • user_id: null | number
      • user_url: null | string
    • id: null | number
    • major: boolean
    • Optional message?: null | string

      Entry message in Markdown format, embedded HTML is allowed, exists only if Markdown was requested

      +
    • Optional message_html?: null | string

      Entry message in HTML format, exists only if HTML was requested

      +
    • repository: null | string
    • title: null | string
    • type: string
    • url: null | string
    created_at: Date
    display_version: string
    id: number
    update_stream: UpdateStream
    users: number

    How many users are playing on this version of the game? (if lazer/web, should be 0, lazer doesn't show such stats)

    +
    version: null | string

    The name of the version

    +
    youtube_id: null | string

    If a video is showcased on the changelog

    +

    Remarks

    The ID of a Youtube video is whatever comes after /watch?v= in its url

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/KudosuHistory.html b/docs/interfaces/KudosuHistory.html index 37e580b..f9946c6 100644 --- a/docs/interfaces/KudosuHistory.html +++ b/docs/interfaces/KudosuHistory.html @@ -1,8 +1,8 @@ -KudosuHistory | osu-api-v2-js

    Interface KudosuHistory

    Hierarchy

    • KudosuHistory

    Properties

    action +KudosuHistory | osu-api-v2-js

    Interface KudosuHistory

    Hierarchy

    • KudosuHistory

    Properties

    action: "reset" | "give" | "vote.give" | "vote.reset" | "revoke" | "vote.revoke"
    amount: number
    created_at: Date
    giver: null | {
        url: string;
        username: string;
    }

    Type declaration

    • url: string
    • username: string
    id: number
    model: string
    post: {
        title: string;
        url: null | string;
    }

    Type declaration

    • title: string
    • url: null | string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    action: "reset" | "give" | "vote.give" | "vote.reset" | "revoke" | "vote.revoke"
    amount: number
    created_at: Date
    giver: null | {
        url: string;
        username: string;
    }

    Type declaration

    • url: string
    • username: string
    id: number
    model: string
    post: {
        title: string;
        url: null | string;
    }

    Type declaration

    • title: string
    • url: null | string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Leader.html b/docs/interfaces/Leader.html index 9304d26..f0c59fb 100644 --- a/docs/interfaces/Leader.html +++ b/docs/interfaces/Leader.html @@ -1,4 +1,4 @@ -Leader | osu-api-v2-js

    Interface Leader

    Hierarchy

    • Leader

    Properties

    accuracy +Leader | osu-api-v2-js

    Interface Leader

    Hierarchy

    • Leader

    Properties

    Properties

    accuracy: number
    attempts: number
    completed: number
    pp: number
    room_id: number
    total_score: number
    user: User
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

    +
    attempts: number
    completed: number
    pp: number
    room_id: number
    total_score: number
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Match.html b/docs/interfaces/Match.html new file mode 100644 index 0000000..287d545 --- /dev/null +++ b/docs/interfaces/Match.html @@ -0,0 +1,10 @@ +Match | osu-api-v2-js

    Interface Match

    Expected from api.getMatch()

    +

    Hierarchy

    • Match

    Properties

    current_game_id: null | number
    events: {
        detail: {
            text?: string;
            type: string;
        };
        game?: {
            beatmap: BeatmapWithBeatmapset;
            beatmap_id: number;
            end_time: null | Date;
            id: number;
            mode: string;
            mode_int: Rulesets;
            mods: string[];
            scores: ScoreWithMatch[];
            scoring_type: string;
            start_time: Date;
            team_type: string;
        };
        id: number;
        timestamp: Date;
        user_id: null | number;
    }[]

    Type declaration

    • detail: {
          text?: string;
          type: string;
      }
      • Optional text?: string

        If detail.type is other, this exists and will be the name of the room

        +
      • type: string
    • Optional game?: {
          beatmap: BeatmapWithBeatmapset;
          beatmap_id: number;
          end_time: null | Date;
          id: number;
          mode: string;
          mode_int: Rulesets;
          mods: string[];
          scores: ScoreWithMatch[];
          scoring_type: string;
          start_time: Date;
          team_type: string;
      }

      If detail.type is other, then this should exist!

      +
    • id: number
    • timestamp: Date
    • user_id: null | number
    first_event_id: number
    latest_event_id: number
    match: MatchInfo

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/MatchInfo.html b/docs/interfaces/MatchInfo.html new file mode 100644 index 0000000..127c760 --- /dev/null +++ b/docs/interfaces/MatchInfo.html @@ -0,0 +1,6 @@ +MatchInfo | osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/MultiplayerScore.html b/docs/interfaces/MultiplayerScore.html index 5065dde..e526214 100644 --- a/docs/interfaces/MultiplayerScore.html +++ b/docs/interfaces/MultiplayerScore.html @@ -1,18 +1,26 @@ -MultiplayerScore | osu-api-v2-js

    Interface MultiplayerScore

    Hierarchy

    • MultiplayerScore

    Properties

    accuracy +MultiplayerScore | osu-api-v2-js

    Interface MultiplayerScore

    Expected from MultiplayerScores

    +

    Remarks

    This particular interface seems really unstable, beware

    +

    Hierarchy

    • MultiplayerScore

    Properties

    accuracy: number
    beatmap_id: number
    ended_at?: Date
    id: number
    max_combo: number
    mods: Mod[]
    passed: boolean
    playlist_item_id: number
    position?: null | number
    rank: string
    room_id: number
    scores_around: {
        higher: MultiplayerScores;
        lower: MultiplayerScores;
    }

    Type declaration

    • higher: MultiplayerScores
    • lower: MultiplayerScores
    started_at?: Date
    statistics: any
    total_score: number
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (and no number afterwards)

    +
    beatmap_id: number
    ended_at: Date
    id: number
    max_combo: number
    maximum_statistics: {
        great: number;
        ignore_hit: number;
        large_tick_hit: number;
        small_tick_hit: number;
    }

    Type declaration

    • great: number
    • ignore_hit: number
    • large_tick_hit: number
    • small_tick_hit: number
    mods: Mod[]
    passed: boolean
    playlist_item_id: number
    pp: null | number
    rank: string
    replay: boolean
    room_id: number
    ruleset_id: number
    started_at: Date
    statistics: {
        great?: number;
        large_bonus?: number;
        large_tick_hit?: number;
        meh?: number;
        miss?: number;
        ok?: number;
        small_bonus?: number;
        small_tick_hit?: number;
        small_tick_miss?: number;
    }

    All of its properties are optional because instead of being 0, the property actually disappears instead! +(so if the score has no miss, the miss property is simply not there)

    +

    Type declaration

    • Optional great?: number
    • Optional large_bonus?: number
    • Optional large_tick_hit?: number
    • Optional meh?: number
    • Optional miss?: number
    • Optional ok?: number
    • Optional small_bonus?: number
    • Optional small_tick_hit?: number
    • Optional small_tick_miss?: number
    total_score: number
    type: string
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/MultiplayerScores.html b/docs/interfaces/MultiplayerScores.html new file mode 100644 index 0000000..ece6f44 --- /dev/null +++ b/docs/interfaces/MultiplayerScores.html @@ -0,0 +1,10 @@ +MultiplayerScores | osu-api-v2-js

    Interface MultiplayerScores

    Expected from api.getPlaylistItemScores()

    +

    Hierarchy

    • MultiplayerScores

    Properties

    cursor_string: null | string

    Will be null if there is no next page

    +
    params: {
        limit: number;
        sort: string;
    }

    Type declaration

    • limit: number
    • sort: string
    total: number

    How many scores there are across all pages, not necessarily scores.length

    +
    user_score: null | MultiplayerScore

    Will be null if not an authorized user or if the authorized user has no score

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/PlaylistItem.html b/docs/interfaces/PlaylistItem.html index d23e1a8..7cd606e 100644 --- a/docs/interfaces/PlaylistItem.html +++ b/docs/interfaces/PlaylistItem.html @@ -1,6 +1,5 @@ -PlaylistItem | osu-api-v2-js

    Interface PlaylistItem

    Remarks

    This is entirely absent from the official documentation -even though it's essential to get scores, due to the playlist system

    -

    Hierarchy

    • PlaylistItem

    Properties

    allowed_mods +PlaylistItem | osu-api-v2-js

    Interface PlaylistItem

    Expected from Room

    +

    Hierarchy

    • PlaylistItem

    Properties

    allowed_mods: Mod[]
    beatmap: Beatmap
    beatmap_id: number
    expired: boolean
    id: number
    owner_id: number
    played_at: Date
    playlist_order: number
    required_mods: Mod[]
    room_id: number
    ruleset_id: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    allowed_mods: Mod[]
    beatmap_id: number
    expired: boolean
    id: number
    owner_id: number
    played_at: null | Date

    Should be null if the room isn't the realtime multiplayer kind

    +
    playlist_order: null | number

    Should be null if the room isn't the realtime multiplayer kind

    +
    required_mods: Mod[]
    room_id: number
    ruleset_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Rankings.html b/docs/interfaces/Rankings.html new file mode 100644 index 0000000..d70a2dd --- /dev/null +++ b/docs/interfaces/Rankings.html @@ -0,0 +1,7 @@ +Rankings | osu-api-v2-js

    Interface Rankings

    Expected from api.getRanking()

    +

    Hierarchy

    • RankingsBare
      • Rankings

    Properties

    Properties

    cursor: {
        page: null | number;
    }

    Type declaration

    • page: null | number

      The number of the next page, is null if no more results are available

      +
    total: number

    Total amount of elements available across all pages, not on this specific page! Maximum of 10000

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/RankingsCountry.html b/docs/interfaces/RankingsCountry.html new file mode 100644 index 0000000..a23bc2c --- /dev/null +++ b/docs/interfaces/RankingsCountry.html @@ -0,0 +1,10 @@ +RankingsCountry | osu-api-v2-js

    Interface RankingsCountry

    Expected from api.getCountryRanking()

    +

    Remarks

    Not in the API's documentation

    +

    Hierarchy

    • RankingsBare
      • RankingsCountry

    Properties

    Properties

    cursor: {
        page: null | number;
    }

    Type declaration

    • page: null | number

      The number of the next page, is null if no more results are available

      +
    ranking: {
        active_users: number;
        code: string;
        country: {
            code: string;
            name: string;
        };
        performance: number;
        play_count: number;
        ranked_score: number;
    }[]

    Type declaration

    • active_users: number
    • code: string

      Same as country.code

      +
    • country: {
          code: string;
          name: string;
      }
      • code: string

        The country's ISO 3166-1 alpha-2 code! (France would be FR, United States US)

        +
      • name: string
    • performance: number
    • play_count: number
    • ranked_score: number
    total: number

    Total amount of elements available across all pages, not on this specific page! Maximum of 10000

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/RankingsSpotlight.html b/docs/interfaces/RankingsSpotlight.html new file mode 100644 index 0000000..efe85ed --- /dev/null +++ b/docs/interfaces/RankingsSpotlight.html @@ -0,0 +1,5 @@ +RankingsSpotlight | osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Room.html b/docs/interfaces/Room.html index e38a850..d2834f7 100644 --- a/docs/interfaces/Room.html +++ b/docs/interfaces/Room.html @@ -1,10 +1,9 @@ -Room | osu-api-v2-js

    Interface Room

    Remarks

    This is entirely absent from the official documentation -even though it's essential to get scores, due to the playlist system

    -

    Hierarchy

    • Room

    Properties

    active +Room | osu-api-v2-js

    Interface Room

    Expected from api.getRoom()

    +

    Hierarchy

    • Room

    Properties

    active: boolean
    auto_skip: boolean
    category: string
    channel_id: number
    current_user_score: {
        [k: string]: any;
    }

    Type declaration

    • [k: string]: any
    ends_at: null | Date
    has_password: boolean
    host: User
    id: number
    max_attempts: null | number
    name: string
    participant_count: number
    playlist: PlaylistItem[]
    queue_mode: string
    recent_participants: User[]
    starts_at: Date
    type: string
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file +user_id +

    Properties

    active: boolean
    auto_skip: boolean
    category: string
    channel_id: number
    current_user_score?: {
        accuracy: number;
        attempts: number;
        completed: number;
        playlist_item_attempts: {
            attempts: number;
            id: number;
        }[];
        pp: number;
        room_id: number;
        total_score: number;
        user_id: number;
    }

    Only exists if authorized user

    +

    Type declaration

    • accuracy: number

      In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

      +
    • attempts: number
    • completed: number
    • playlist_item_attempts: {
          attempts: number;
          id: number;
      }[]

      How many (completed?) attempts on each item? Empty array if the multiplayer room is the realtime kind

      +
    • pp: number
    • room_id: number
    • total_score: number
    • user_id: number
    ends_at: null | Date
    has_password: boolean
    id: number
    max_attempts: null | number
    name: string
    participant_count: number
    playlist: PlaylistItem[]
    queue_mode: string
    recent_participants: User[]
    starts_at: Date
    type: string
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Score.html b/docs/interfaces/Score.html index a7ff022..12f7997 100644 --- a/docs/interfaces/Score.html +++ b/docs/interfaces/Score.html @@ -1,11 +1,8 @@ -Score | osu-api-v2-js

    Interface Score

    Hierarchy

    • Score

    Properties

    accuracy -beatmap? -beatmapset? +Score | osu-api-v2-js

    Interface Score

    Expected from api.getBeatmapUserScores()

    +

    Hierarchy

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

    -
    beatmap?: Beatmap
    beatmapset?: Beatmapset
    best_id: number
    created_at: Date
    current_user_attributes?: {
        pin: null;
    }

    Type declaration

    • pin: null

      Remarks

      Seems to remain null even if the score is pinned on the user's profile

      -

    Remarks

    Not in the API's documentation, expect it to either be unreliable or disappear

    -
    id: number
    match?: any
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: 0 | string[]

    0 when NoMod

    -
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    -
    rank: string
    rank_country?: any
    rank_global?: any
    replay: boolean
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    user?: any
    user_id: number

    The ID of the user who made the score

    -
    weight?: any

    Remarks

    Should only exist from the returned object of getUserScores if type is set to best

    -

    Generated using TypeDoc

    \ No newline at end of file +
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    +
    rank: string

    Also known as a grade, for example this is X (SS) if accuracy is 1 (100.00%)

    +
    replay: boolean

    Can this score's replay be downloaded from the website?

    +
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    weight?: {
        percentage: number;
        pp: number;
    }

    Type declaration

    • percentage: number
    • pp: number

    Remarks

    Only if type is set to best on getUserScores

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ScoreWithMatch.html b/docs/interfaces/ScoreWithMatch.html new file mode 100644 index 0000000..c5d3fae --- /dev/null +++ b/docs/interfaces/ScoreWithMatch.html @@ -0,0 +1,27 @@ +ScoreWithMatch | osu-api-v2-js

    Interface ScoreWithMatch

    Expected from Match

    +

    Hierarchy

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

    +
    best_id: null | number
    created_at: Date
    id: null | number
    match: {
        pass: boolean;
        slot: number;
        team: string;
    }

    Type declaration

    • pass: boolean
    • slot: number
    • team: string
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    +
    rank: string

    Also known as a grade, for example this is X (SS) if accuracy is 1 (100.00%)

    +
    replay: boolean

    Can this score's replay be downloaded from the website?

    +
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    weight?: {
        percentage: number;
        pp: number;
    }

    Type declaration

    • percentage: number
    • pp: number

    Remarks

    Only if type is set to best on getUserScores

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ScoreWithUser.html b/docs/interfaces/ScoreWithUser.html new file mode 100644 index 0000000..a4268e1 --- /dev/null +++ b/docs/interfaces/ScoreWithUser.html @@ -0,0 +1,27 @@ +ScoreWithUser | osu-api-v2-js

    Interface ScoreWithUser

    Expected from api.getBeatmapScores()

    +

    Hierarchy

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

    +
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    +
    rank: string

    Also known as a grade, for example this is X (SS) if accuracy is 1 (100.00%)

    +
    replay: boolean

    Can this score's replay be downloaded from the website?

    +
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    weight?: {
        percentage: number;
        pp: number;
    }

    Type declaration

    • percentage: number
    • pp: number

    Remarks

    Only if type is set to best on getUserScores

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ScoreWithUserBeatmap.html b/docs/interfaces/ScoreWithUserBeatmap.html new file mode 100644 index 0000000..cbc2a69 --- /dev/null +++ b/docs/interfaces/ScoreWithUserBeatmap.html @@ -0,0 +1,28 @@ +ScoreWithUserBeatmap | osu-api-v2-js

    Interface ScoreWithUserBeatmap

    Expected from BeatmapUserScore

    +

    Hierarchy

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

    +
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    +
    rank: string

    Also known as a grade, for example this is X (SS) if accuracy is 1 (100.00%)

    +
    replay: boolean

    Can this score's replay be downloaded from the website?

    +
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    type: string
    user: User
    user_id: number

    The ID of the user who made the score

    +
    weight?: {
        percentage: number;
        pp: number;
    }

    Type declaration

    • percentage: number
    • pp: number

    Remarks

    Only if type is set to best on getUserScores

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ScoreWithUserBeatmapBeatmapset.html b/docs/interfaces/ScoreWithUserBeatmapBeatmapset.html new file mode 100644 index 0000000..8456a2c --- /dev/null +++ b/docs/interfaces/ScoreWithUserBeatmapBeatmapset.html @@ -0,0 +1,29 @@ +ScoreWithUserBeatmapBeatmapset | osu-api-v2-js

    Interface ScoreWithUserBeatmapBeatmapset

    Expected from api.getUserScores()

    +

    Hierarchy

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

    +
    beatmapset: Beatmapset
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    +
    rank: string

    Also known as a grade, for example this is X (SS) if accuracy is 1 (100.00%)

    +
    replay: boolean

    Can this score's replay be downloaded from the website?

    +
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    type: string
    user: User
    user_id: number

    The ID of the user who made the score

    +
    weight?: {
        percentage: number;
        pp: number;
    }

    Type declaration

    • percentage: number
    • pp: number

    Remarks

    Only if type is set to best on getUserScores

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Spotlight.html b/docs/interfaces/Spotlight.html new file mode 100644 index 0000000..132abf9 --- /dev/null +++ b/docs/interfaces/Spotlight.html @@ -0,0 +1,9 @@ +Spotlight | osu-api-v2-js

    Interface Spotlight

    Expected from api.getSpotlights()

    +

    Hierarchy

    Properties

    end_date: Date
    id: number
    mode_specific: boolean

    Pretty sure this is only true when the spotlight has different beatmaps for each ruleset

    +
    name: string
    start_date: Date
    type: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/SpotlightWithParticipantcount.html b/docs/interfaces/SpotlightWithParticipantcount.html new file mode 100644 index 0000000..d9de0b0 --- /dev/null +++ b/docs/interfaces/SpotlightWithParticipantcount.html @@ -0,0 +1,10 @@ +SpotlightWithParticipantcount | osu-api-v2-js

    Interface SpotlightWithParticipantcount

    Expected from RankingsSpotlight

    +

    Hierarchy

    Properties

    end_date: Date
    id: number
    mode_specific: boolean

    Pretty sure this is only true when the spotlight has different beatmaps for each ruleset

    +
    name: string
    participant_count: number
    start_date: Date
    type: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UpdateStream.html b/docs/interfaces/UpdateStream.html index e1670f4..0d352ce 100644 --- a/docs/interfaces/UpdateStream.html +++ b/docs/interfaces/UpdateStream.html @@ -1,8 +1,6 @@ -UpdateStream | osu-api-v2-js

    Interface UpdateStream

    Hierarchy

    • UpdateStream

    Properties

    display_name +UpdateStream | osu-api-v2-js

    Interface UpdateStream

    Expected from ChangelogBuildWithUpdatestreams

    +

    Hierarchy

    • UpdateStream

    Properties

    display_name: null | string
    id: number
    is_featured: boolean
    latest_build: null | ChangelogBuild
    name: string
    user_count: number

    How many users are playing on this? (if lazer/web, should be 0, lazer doesn't show such stats)

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    display_name: null | string
    id: number
    is_featured: boolean
    name: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/User.html b/docs/interfaces/User.html index 9a57bdb..307b716 100644 --- a/docs/interfaces/User.html +++ b/docs/interfaces/User.html @@ -1,46 +1,15 @@ -User | osu-api-v2-js

    Interface User

    Hierarchy

    Properties

    account_history? -active_tournament_banner? -avatar_url -badges? -beatmap_playcounts_count? -blocks? -country? +User | osu-api-v2-js

    Interface User

    Expected from BeatmapsetExtendedPlus, Room

    +

    Hierarchy

    Properties

    account_history?: 0 | {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banner?: null | ProfileBanner
    avatar_url: string
    badges?: 0 | UserBadge[]
    beatmap_playcounts_count?: number
    blocks?: any
    country?: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover?: {
        custom_url: null | string;
        id: null | string;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | string
    • url: string
    default_group: string
    favourite_beatmapset_count?: number
    follower_count?: number
    friends?: any
    graveyard_beatmapset_count?: number
    groups?: 0 | {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_restricted?: null | boolean
    is_supported: boolean
    kudosu?: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    loved_beatmapset_count?: number
    monthly_playcounts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    page?: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string
    pending_beatmapset_count?: number
    pm_friends_only: boolean
    previous_usernames?: string[]
    profile_colour: null | string
    rank_highest?: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history?: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    ranked_beatmapset_count?: number
    replays_watched_counts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count?: number
    scores_recent_count?: number
    statistics?: UserStatistics
    statistics_rulesets?: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    • fruits: UserStatistics
    • mania: UserStatistics
    • osu: UserStatistics
    • taiko: UserStatistics
    support_level?: number
    unread_pm_count?: number

    Remarks

    ...I actually don't know its type and have been unable to figure it out, I'm only presuming it is number

    -
    user_achievements?: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    user_preferences?: any
    username: string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    avatar_url: string
    country_code: string
    default_group: string
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    last_visit: null | Date
    pm_friends_only: boolean
    profile_colour: null | string
    username: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserExtended.html b/docs/interfaces/UserExtended.html index 5f72770..3a1d442 100644 --- a/docs/interfaces/UserExtended.html +++ b/docs/interfaces/UserExtended.html @@ -1,20 +1,22 @@ -UserExtended | osu-api-v2-js

    Interface UserExtended

    Hierarchy

    Properties

    account_history? -active_tournament_banner? +UserExtended | osu-api-v2-js

    Interface UserExtended

    Expected from api.getUser()

    +

    Hierarchy

    Properties

    account_history?: 0 | {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banner?: null | ProfileBanner
    avatar_url: string
    badges?: 0 | UserBadge[]
    beatmap_playcounts_count?: number
    blocks?: any
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | string;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | string
    • url: string
    cover_url: string
    default_group: string
    discord: null | string
    favourite_beatmapset_count?: number
    follower_count?: number
    friends?: any
    graveyard_beatmapset_count?: number
    groups?: 0 | {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]
    has_supported: boolean
    id: number
    interests: null | string
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_restricted?: null | boolean
    is_supported: boolean
    join_date: Date
    kudosu: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    location: null | string
    loved_beatmapset_count?: number
    max_blocks: number
    max_friends: number
    monthly_playcounts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    occupation: null | string
    page?: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string
    pending_beatmapset_count?: number
    playmode: string
    playstyle: string[]
    pm_friends_only: boolean
    post_count: number
    previous_usernames?: string[]
    profile_colour: null | string
    profile_order: ProfilePage[]
    rank_highest?: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history?: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    ranked_beatmapset_count?: number
    replays_watched_counts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count?: number
    scores_recent_count?: number
    statistics?: UserStatistics
    statistics_rulesets?: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    • fruits: UserStatistics
    • mania: UserStatistics
    • osu: UserStatistics
    • taiko: UserStatistics
    support_level?: number
    title: null | string
    title_url: null | string
    twitter: null | string
    unread_pm_count?: number

    Remarks

    ...I actually don't know its type and have been unable to figure it out, I'm only presuming it is number

    -
    user_achievements?: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    user_preferences?: any
    username: string
    website: null | string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    account_history: {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]

    Type declaration

    • description: null | string
    • id: number
    • length: number
    • permanent: boolean
    • timestamp: Date
    • type: "note" | "restriction" | "silence"
    active_tournament_banner: null | ProfileBanner
    active_tournament_banners: ProfileBanner[]

    This is not documented by osu!, likely because support for multiple banners has been recently added (OWC2023)

    +
    avatar_url: string
    badges: {
        awarded_at: Date;
        description: string;
        image_url: string;
        url: string;
    }[]

    Type declaration

    • awarded_at: Date
    • description: string
    • image_url: string
    • url: string
    beatmap_playcounts_count: number
    comments_count: number
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | number;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | number
    • url: string
    cover_url: string
    default_group: string
    discord: null | string
    favourite_beatmapset_count: number
    follower_count: number
    graveyard_beatmapset_count: number
    groups: {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]

    Type declaration

    • colour: null | string
    • has_listing: boolean
    • has_playmodes: boolean
    • id: number
    • identifier: string
    • is_probationary: boolean
    • name: string
    • playmodes: null | string[]
    • short_name: string
    guest_beatmapset_count: number
    has_supported: boolean
    id: number
    interests: null | string
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    join_date: Date
    kudosu: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    location: null | string
    loved_beatmapset_count: number
    mapping_follower_count: number
    max_blocks: number
    max_friends: number
    monthly_playcounts: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    nominated_beatmapset_count: number
    occupation: null | string
    page: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string

      Basically the text with the BBCode

      +
    pending_beatmapset_count: number
    playmode: string
    playstyle: string[]
    pm_friends_only: boolean
    post_count: number
    previous_usernames: string[]
    profile_colour: null | string
    profile_order: ("me" | "recent_activity" | "beatmaps" | "historical" | "kudosu" | "top_ranks" | "medals")[]
    rank_highest: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    replays_watched_counts: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count: number
    scores_first_count: number
    scores_pinned_count: number

    Specific to the Ruleset (playmode)

    +
    scores_recent_count: number
    support_level: number
    title: null | string
    title_url: null | string
    twitter: null | string
    user_achievements: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    username: string
    website: null | string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserExtendedWithStatisticsrulesets.html b/docs/interfaces/UserExtendedWithStatisticsrulesets.html new file mode 100644 index 0000000..c0bb570 --- /dev/null +++ b/docs/interfaces/UserExtendedWithStatisticsrulesets.html @@ -0,0 +1,67 @@ +UserExtendedWithStatisticsrulesets | osu-api-v2-js

    Interface UserExtendedWithStatisticsrulesets

    Expected from api.getResourceOwner()

    +

    Hierarchy

    Properties

    account_history: {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]

    Type declaration

    • description: null | string
    • id: number
    • length: number
    • permanent: boolean
    • timestamp: Date
    • type: "note" | "restriction" | "silence"
    active_tournament_banner: null | ProfileBanner
    active_tournament_banners: ProfileBanner[]

    This is not documented by osu!, likely because support for multiple banners has been recently added (OWC2023)

    +
    avatar_url: string
    badges: {
        awarded_at: Date;
        description: string;
        image_url: string;
        url: string;
    }[]

    Type declaration

    • awarded_at: Date
    • description: string
    • image_url: string
    • url: string
    beatmap_playcounts_count: number
    comments_count: number
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | number;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | number
    • url: string
    cover_url: string
    default_group: string
    discord: null | string
    favourite_beatmapset_count: number
    follower_count: number
    graveyard_beatmapset_count: number
    groups: {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]

    Type declaration

    • colour: null | string
    • has_listing: boolean
    • has_playmodes: boolean
    • id: number
    • identifier: string
    • is_probationary: boolean
    • name: string
    • playmodes: null | string[]
    • short_name: string
    guest_beatmapset_count: number
    has_supported: boolean
    id: number
    interests: null | string
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    join_date: Date
    kudosu: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    location: null | string
    loved_beatmapset_count: number
    mapping_follower_count: number
    max_blocks: number
    max_friends: number
    monthly_playcounts: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    nominated_beatmapset_count: number
    occupation: null | string
    page: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string

      Basically the text with the BBCode

      +
    pending_beatmapset_count: number
    playmode: string
    playstyle: string[]
    pm_friends_only: boolean
    post_count: number
    previous_usernames: string[]
    profile_colour: null | string
    profile_order: ("me" | "recent_activity" | "beatmaps" | "historical" | "kudosu" | "top_ranks" | "medals")[]
    rank_highest: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    replays_watched_counts: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count: number
    scores_first_count: number
    scores_pinned_count: number

    Specific to the Ruleset (playmode)

    +
    scores_recent_count: number
    statistics_rulesets: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    support_level: number
    title: null | string
    title_url: null | string
    twitter: null | string
    user_achievements: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    username: string
    website: null | string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserStatistics.html b/docs/interfaces/UserStatistics.html new file mode 100644 index 0000000..f17f989 --- /dev/null +++ b/docs/interfaces/UserStatistics.html @@ -0,0 +1,22 @@ +UserStatistics | osu-api-v2-js

    Interface UserStatistics

    Hierarchy

    Properties

    count_100: number
    count_300: number
    count_50: number
    count_miss: number
    global_rank: null | number
    global_rank_exp: null | number
    grade_counts: {
        a: number;
        s: number;
        sh: number;
        ss: number;
        ssh: number;
    }

    Type declaration

    • a: number
    • s: number
    • sh: number
    • ss: number
    • ssh: number
    hit_accuracy: number

    Accuracy in the normal format, where 96.56% would be 96.56

    +
    is_ranked: boolean

    Hasn't went inactive in the rankings

    +
    level: {
        current: number;
        progress: number;
    }

    Type declaration

    • current: number
    • progress: number
    maximum_combo: number
    play_count: number
    play_time: null | number
    pp: null | number
    pp_exp: number
    ranked_score: number
    replays_watched_by_others: number
    total_hits: number
    total_score: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserStatisticsWithCountryrank.html b/docs/interfaces/UserStatisticsWithCountryrank.html new file mode 100644 index 0000000..ad3dd08 --- /dev/null +++ b/docs/interfaces/UserStatisticsWithCountryrank.html @@ -0,0 +1,24 @@ +UserStatisticsWithCountryrank | osu-api-v2-js

    Interface UserStatisticsWithCountryrank

    Expected from UserExtended

    +

    Hierarchy

    Properties

    count_100: number
    count_300: number
    count_50: number
    count_miss: number
    country_rank: number
    global_rank: null | number
    global_rank_exp: null | number
    grade_counts: {
        a: number;
        s: number;
        sh: number;
        ss: number;
        ssh: number;
    }

    Type declaration

    • a: number
    • s: number
    • sh: number
    • ss: number
    • ssh: number
    hit_accuracy: number

    Accuracy in the normal format, where 96.56% would be 96.56

    +
    is_ranked: boolean

    Hasn't went inactive in the rankings

    +
    level: {
        current: number;
        progress: number;
    }

    Type declaration

    • current: number
    • progress: number
    maximum_combo: number
    play_count: number
    play_time: null | number
    pp: null | number
    pp_exp: number
    ranked_score: number
    replays_watched_by_others: number
    total_hits: number
    total_score: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserStatisticsWithUser.html b/docs/interfaces/UserStatisticsWithUser.html new file mode 100644 index 0000000..2df5331 --- /dev/null +++ b/docs/interfaces/UserStatisticsWithUser.html @@ -0,0 +1,24 @@ +UserStatisticsWithUser | osu-api-v2-js

    Interface UserStatisticsWithUser

    Expected from Rankings

    +

    Hierarchy

    Properties

    count_100: number
    count_300: number
    count_50: number
    count_miss: number
    global_rank: null | number
    global_rank_exp: null | number
    grade_counts: {
        a: number;
        s: number;
        sh: number;
        ss: number;
        ssh: number;
    }

    Type declaration

    • a: number
    • s: number
    • sh: number
    • ss: number
    • ssh: number
    hit_accuracy: number

    Accuracy in the normal format, where 96.56% would be 96.56

    +
    is_ranked: boolean

    Hasn't went inactive in the rankings

    +
    level: {
        current: number;
        progress: number;
    }

    Type declaration

    • current: number
    • progress: number
    maximum_combo: number
    play_count: number
    play_time: null | number
    pp: null | number
    pp_exp: number
    ranked_score: number
    replays_watched_by_others: number
    total_hits: number
    total_score: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserWithCountry.html b/docs/interfaces/UserWithCountry.html new file mode 100644 index 0000000..384d17f --- /dev/null +++ b/docs/interfaces/UserWithCountry.html @@ -0,0 +1,16 @@ +UserWithCountry | osu-api-v2-js

    Interface UserWithCountry

    Expected from api.getMatch(), Leader

    +

    Hierarchy

    Properties

    avatar_url: string
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    default_group: string
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    last_visit: null | Date
    pm_friends_only: boolean
    profile_colour: null | string
    username: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserWithCountryCover.html b/docs/interfaces/UserWithCountryCover.html new file mode 100644 index 0000000..4746ea5 --- /dev/null +++ b/docs/interfaces/UserWithCountryCover.html @@ -0,0 +1,17 @@ +UserWithCountryCover | osu-api-v2-js

    Interface UserWithCountryCover

    Expected from UserStatisticsWithUser, MultiplayerScore, ScoreWithUser

    +

    Hierarchy

    Properties

    avatar_url: string
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | number;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | number
    • url: string
    default_group: string
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    last_visit: null | Date
    pm_friends_only: boolean
    profile_colour: null | string
    username: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserWithCountryCoverGroupsStatisticsSupport.html b/docs/interfaces/UserWithCountryCoverGroupsStatisticsSupport.html new file mode 100644 index 0000000..bebc89e --- /dev/null +++ b/docs/interfaces/UserWithCountryCoverGroupsStatisticsSupport.html @@ -0,0 +1,20 @@ +UserWithCountryCoverGroupsStatisticsSupport | osu-api-v2-js

    Interface UserWithCountryCoverGroupsStatisticsSupport

    Expected from api.getFriends()

    +

    Hierarchy

    • UserWithCountryCoverGroups

    Properties

    avatar_url: string
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | number;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | number
    • url: string
    default_group: string
    groups: {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]

    Type declaration

    • colour: null | string
    • has_listing: boolean
    • has_playmodes: boolean
    • id: number
    • identifier: string
    • is_probationary: boolean
    • name: string
    • playmodes: null | string[]
    • short_name: string
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    last_visit: null | Date
    pm_friends_only: boolean
    profile_colour: null | string
    statistics: UserStatistics
    support_level: number
    username: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserWithCountryCoverGroupsStatisticsrulesets.html b/docs/interfaces/UserWithCountryCoverGroupsStatisticsrulesets.html new file mode 100644 index 0000000..be64c69 --- /dev/null +++ b/docs/interfaces/UserWithCountryCoverGroupsStatisticsrulesets.html @@ -0,0 +1,19 @@ +UserWithCountryCoverGroupsStatisticsrulesets | osu-api-v2-js

    Interface UserWithCountryCoverGroupsStatisticsrulesets

    Expected from api.getUsers()

    +

    Hierarchy

    Properties

    avatar_url: string
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | number;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | number
    • url: string
    default_group: string
    groups: {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]

    Type declaration

    • colour: null | string
    • has_listing: boolean
    • has_playmodes: boolean
    • id: number
    • identifier: string
    • is_probationary: boolean
    • name: string
    • playmodes: null | string[]
    • short_name: string
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    last_visit: null | Date
    pm_friends_only: boolean
    profile_colour: null | string
    statistics_rulesets: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    username: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserWithKudosu.html b/docs/interfaces/UserWithKudosu.html new file mode 100644 index 0000000..fb9e0f0 --- /dev/null +++ b/docs/interfaces/UserWithKudosu.html @@ -0,0 +1,16 @@ +UserWithKudosu | osu-api-v2-js

    Interface UserWithKudosu

    Expected from api.getKudosuRanking()

    +

    Hierarchy

    Properties

    avatar_url: string
    country_code: string
    default_group: string
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_supporter: boolean
    kudosu: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    pm_friends_only: boolean
    profile_colour: null | string
    username: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index 164feec..f34f503 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,20 +1,58 @@ -osu-api-v2-js

    osu-api-v2-js

    Index

    Enumerations

    Rulesets +osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/types/Mod.html b/docs/types/Mod.html new file mode 100644 index 0000000..d59e6a1 --- /dev/null +++ b/docs/types/Mod.html @@ -0,0 +1 @@ +Mod | osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/types/ProfileBanner.html b/docs/types/ProfileBanner.html new file mode 100644 index 0000000..e26949a --- /dev/null +++ b/docs/types/ProfileBanner.html @@ -0,0 +1,2 @@ +ProfileBanner | osu-api-v2-js

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/types/Scope.html b/docs/types/Scope.html new file mode 100644 index 0000000..5e06a06 --- /dev/null +++ b/docs/types/Scope.html @@ -0,0 +1,3 @@ +Scope | osu-api-v2-js

    Type alias Scope

    Scope: "chat.read" | "chat.write" | "chat.write_manage" | "delegate" | "forum.write" | "friends.read" | "identify" | "public"

    Scopes determine what the API instance can do as a user!

    +

    Remarks

    "identify" is always implicity provided, "public" is implicitly needed for almost everything

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/lib/beatmap.ts b/lib/beatmap.ts index 5370c96..6385b55 100644 --- a/lib/beatmap.ts +++ b/lib/beatmap.ts @@ -44,7 +44,7 @@ export interface BeatmapWithBeatmapsetChecksumMaxcombo extends BeatmapWithBeatma } /** - * Expected from Score + * Expected from ScoreWithUserBeatmapBeatmapset */ export interface BeatmapExtended extends BeatmapWithChecksum { accuracy: number diff --git a/lib/index.ts b/lib/index.ts index d1cee8c..128efb6 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,25 +1,36 @@ import fetch, { FetchError } from "node-fetch" import querystring from "querystring" -import { User, UserExtended, KudosuHistory, UserWithKudosu, UserWithCountryCoverGroupsStatisticsSupport, UserExtendedWithStatisticsrulesets, UserWithCountryCoverGroupsStatisticsrulesets } from "./user.js" -import { Beatmap, BeatmapExtended, BeatmapDifficultyAttributes, BeatmapPack, Beatmapset, BeatmapsetExtended, BeatmapExtendedWithFailtimesBeatmapsetextended, BeatmapsetExtendedPlus, BeatmapDifficultyAttributesOsu, BeatmapDifficultyAttributesFruits, BeatmapDifficultyAttributesMania, BeatmapDifficultyAttributesTaiko } from "./beatmap.js" -import { Leader, Match, MatchInfo, MultiplayerScore, MultiplayerScores, PlaylistItem, Room } from "./multiplayer.js" -import { Rulesets, Mod } from "./misc.js" -import { BeatmapUserScore, Score, ScoreWithUser, ScoreWithUserBeatmapBeatmapset } from "./score.js" -import { Rankings, RankingsCountry, RankingsSpotlight, Spotlight } from "./ranking.js" -import { ChangelogBuildWithChangelogentriesVersions, ChangelogBuildWithUpdatestreamsChangelogentries, UpdateStream } from "./changelog.js" - -export {User, UserExtended, KudosuHistory} -export {Beatmap, BeatmapExtended, Beatmapset, BeatmapsetExtended} -export {BeatmapUserScore, Score} -export {Room, Leader, PlaylistItem, MultiplayerScore} -export {Rulesets} -export {UpdateStream} -/** - * Scopes determine what the API instance can do as a user! - * @remarks "identify" is always implicity provided, "public" is implicitly needed for almost everything - */ -type Scope = "chat.read" | "chat.write" | "chat.write_manage" | "delegate" | "forum.write" | "friends.read" | "identify" | "public" +import { User, UserWithKudosu, UserWithCountry, UserWithCountryCover, UserWithCountryCoverGroupsStatisticsrulesets, UserWithCountryCoverGroupsStatisticsSupport, + UserExtended, UserExtendedWithStatisticsrulesets, + UserStatistics, UserStatisticsWithUser, UserStatisticsWithCountryrank, KudosuHistory, ProfileBanner } from "./user.js" +import { Beatmap, BeatmapExtendedWithFailtimesBeatmapsetextended, BeatmapWithBeatmapset, BeatmapWithBeatmapsetChecksumMaxcombo, BeatmapExtended, + BeatmapDifficultyAttributes, BeatmapDifficultyAttributesOsu, BeatmapDifficultyAttributesTaiko, BeatmapDifficultyAttributesFruits, BeatmapDifficultyAttributesMania, + Beatmapset, BeatmapsetExtended, BeatmapExtendedWithFailtimes, BeatmapsetExtendedPlus, BeatmapPack, RankStatus } from "./beatmap.js" + +import { Room, Leader, PlaylistItem, MultiplayerScore, MultiplayerScores, Match, MatchInfo } from "./multiplayer.js" +import { Score, ScoreWithMatch, ScoreWithUser, ScoreWithUserBeatmap, ScoreWithUserBeatmapBeatmapset, BeatmapUserScore } from "./score.js" +import { Rankings, RankingsCountry, Spotlight, SpotlightWithParticipantcount, RankingsSpotlight } from "./ranking.js" + +import { ChangelogBuildWithUpdatestreams, ChangelogBuildWithUpdatestreamsChangelogentries, ChangelogBuildWithChangelogentriesVersions, + UpdateStream } from "./changelog.js" +import { Rulesets, Mod, Scope } from "./misc.js" + +export { User, UserWithKudosu, UserWithCountry, UserWithCountryCover, UserWithCountryCoverGroupsStatisticsrulesets, UserWithCountryCoverGroupsStatisticsSupport, + UserExtended, UserExtendedWithStatisticsrulesets, + UserStatistics, UserStatisticsWithUser, UserStatisticsWithCountryrank, KudosuHistory, ProfileBanner } from "./user.js" +export { Beatmap, BeatmapExtendedWithFailtimesBeatmapsetextended, BeatmapWithBeatmapset, BeatmapWithBeatmapsetChecksumMaxcombo, BeatmapExtended, + BeatmapDifficultyAttributes, BeatmapDifficultyAttributesOsu, BeatmapDifficultyAttributesTaiko, BeatmapDifficultyAttributesFruits, BeatmapDifficultyAttributesMania, + Beatmapset, BeatmapsetExtended, BeatmapExtendedWithFailtimes, BeatmapsetExtendedPlus, BeatmapPack, RankStatus } from "./beatmap.js" + +export { Room, Leader, PlaylistItem, MultiplayerScore, MultiplayerScores, Match, MatchInfo } from "./multiplayer.js" +export { Score, ScoreWithMatch, ScoreWithUser, ScoreWithUserBeatmap, ScoreWithUserBeatmapBeatmapset, BeatmapUserScore } from "./score.js" +export { Rankings, RankingsCountry, Spotlight, SpotlightWithParticipantcount, RankingsSpotlight } from "./ranking.js" + +export { ChangelogBuildWithUpdatestreams, ChangelogBuildWithUpdatestreamsChangelogentries, ChangelogBuildWithChangelogentriesVersions, + UpdateStream } from "./changelog.js" +export { Rulesets, Mod, Scope } from "./misc.js" + /** * Generates a link for users to click on in order to use your application! diff --git a/lib/misc.ts b/lib/misc.ts index 8b0a4be..de0b6cb 100644 --- a/lib/misc.ts +++ b/lib/misc.ts @@ -9,3 +9,9 @@ export type Mod = { acronym: string settings?: {[k: string]: any} } + +/** + * Scopes determine what the API instance can do as a user! + * @remarks "identify" is always implicity provided, "public" is implicitly needed for almost everything + */ +export type Scope = "chat.read" | "chat.write" | "chat.write_manage" | "delegate" | "forum.write" | "friends.read" | "identify" | "public" diff --git a/lib/user.ts b/lib/user.ts index 597b26f..2a5bf25 100644 --- a/lib/user.ts +++ b/lib/user.ts @@ -1,13 +1,7 @@ -type ProfilePage = "me" | "recent_activity" | "beatmaps" | "historical" | "kudosu" | "top_ranks" | "medals" - -type UserBadge = { - awarded_at: Date - description: string - image_url: string - url: string -} - -type ProfileBanner = { +/** + * Expected from UserExtended + */ +export type ProfileBanner = { id: number tournament_id: number image: string @@ -113,7 +107,7 @@ export interface UserExtended extends UserWithCountryCoverGroupsStatisticsSuppor playmode: string playstyle: string[] post_count: number - profile_order: ProfilePage[] + profile_order: ("me" | "recent_activity" | "beatmaps" | "historical" | "kudosu" | "top_ranks" | "medals")[] title: string | null title_url: string | null twitter: string | null @@ -131,7 +125,12 @@ export interface UserExtended extends UserWithCountryCoverGroupsStatisticsSuppor * This is not documented by osu!, likely because support for multiple banners has been recently added (OWC2023) */ active_tournament_banners: ProfileBanner[] - badges: UserBadge[] + badges: { + awarded_at: Date + description: string + image_url: string + url: string + }[] beatmap_playcounts_count: number comments_count: number favourite_beatmapset_count: number diff --git a/package.json b/package.json index ce23498..d36be8a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "osu-api-v2-js", - "version": "0.3.2", + "version": "0.4.0", "description": "Package to easily access osu!api version 2.0", "type": "module", "main": "dist/index.js",