From c732fea9ef0c11a8c67c897b1db3391c1069f26f Mon Sep 17 00:00:00 2001 From: Taevas <67872932+TTTaevas@users.noreply.github.com> Date: Sat, 10 Aug 2024 17:15:34 +0200 Subject: [PATCH] Update documentation for v1.0.5 --- docs/assets/icons.js | 31 +- docs/assets/icons.svg | 2 +- docs/assets/main.js | 9 +- docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- docs/assets/style.css | 98 ++- docs/classes/API.html | 668 ++++++++++++------ docs/classes/APIError.html | 20 +- docs/classes/ChildAPI.html | 583 +++++++++++---- docs/enums/Beatmapset.Genre.html | 4 +- docs/enums/Beatmapset.Language.html | 4 +- docs/enums/Beatmapset.RankStatus.html | 4 +- docs/enums/Ruleset.html | 4 +- .../Beatmap.DifficultyAttributes.get.html | 10 +- ...eatmap.DifficultyAttributes.getFruits.html | 6 +- ...Beatmap.DifficultyAttributes.getMania.html | 6 +- .../Beatmap.DifficultyAttributes.getOsu.html | 6 +- ...Beatmap.DifficultyAttributes.getTaiko.html | 6 +- docs/functions/Beatmap.Pack.getMultiple.html | 8 +- docs/functions/Beatmap.Pack.getOne.html | 10 +- .../Beatmap.UserScore.getMultiple.html | 6 +- docs/functions/Beatmap.UserScore.getOne.html | 6 +- docs/functions/Beatmap.getMultiple.html | 6 +- docs/functions/Beatmap.getOne.html | 6 +- docs/functions/Beatmap.getScores.html | 8 +- docs/functions/Beatmap.getSoloScores.html | 8 +- docs/functions/Beatmap.lookup.html | 4 +- ...eatmapset.Discussion.Post.getMultiple.html | 12 +- ...eatmapset.Discussion.Vote.getMultiple.html | 12 +- .../Beatmapset.Discussion.getMultiple.html | 12 +- .../Beatmapset.Event.getMultiple.html | 14 +- docs/functions/Beatmapset.getOne.html | 6 +- docs/functions/Beatmapset.lookup.html | 6 +- docs/functions/Beatmapset.search.html | 38 +- .../Changelog.Build.getMultiple.html | 12 +- docs/functions/Changelog.Build.getOne.html | 4 +- docs/functions/Changelog.Build.lookup.html | 4 +- .../Changelog.UpdateStream.getAll.html | 9 +- .../Chat.Channel.createAnnouncement.html | 10 +- .../functions/Chat.Channel.createPrivate.html | 6 +- docs/functions/Chat.Channel.getAll.html | 6 +- docs/functions/Chat.Channel.getOne.html | 8 +- docs/functions/Chat.Channel.joinOne.html | 8 +- docs/functions/Chat.Channel.leaveOne.html | 8 +- docs/functions/Chat.Channel.markAsRead.html | 8 +- docs/functions/Chat.Message.getMultiple.html | 10 +- docs/functions/Chat.Message.send.html | 6 +- docs/functions/Chat.Message.sendPrivate.html | 10 +- docs/functions/Chat.keepAlive.html | 12 +- docs/functions/Comment.getMultiple.html | 10 +- docs/functions/Comment.getOne.html | 4 +- docs/functions/Event.getMultiple.html | 6 +- docs/functions/Forum.Post.edit.html | 6 +- docs/functions/Forum.Topic.create.html | 24 +- docs/functions/Forum.Topic.editTitle.html | 8 +- docs/functions/Forum.Topic.reply.html | 12 +- docs/functions/Forum.getTopicAndPosts.html | 16 +- docs/functions/Home.Search.getUsers.html | 6 +- docs/functions/Home.Search.getWikiPages.html | 6 +- .../Multiplayer.Match.getMultiple.html | 14 +- docs/functions/Multiplayer.Match.getOne.html | 9 +- .../Multiplayer.Room.Leader.getMultiple.html | 6 +- ...ltiplayer.Room.PlaylistItem.getScores.html | 8 +- .../Multiplayer.Room.getMultiple.html | 10 +- docs/functions/Multiplayer.Room.getOne.html | 4 +- docs/functions/NewsPost.getMultiple.html | 8 +- docs/functions/NewsPost.getOne.html | 4 +- docs/functions/Ranking.getCountry.html | 4 +- docs/functions/Ranking.getKudosu.html | 4 +- docs/functions/Ranking.getSpotlight.html | 4 +- docs/functions/Ranking.getUser.html | 14 +- docs/functions/Score.getReplay.html | 6 +- docs/functions/Spotlight.getAll.html | 8 +- docs/functions/User.getBeatmaps.html | 8 +- docs/functions/User.getFriends.html | 6 +- docs/functions/User.getKudosu.html | 6 +- docs/functions/User.getMostPlayed.html | 6 +- docs/functions/User.getMultiple.html | 5 +- docs/functions/User.getOne.html | 6 +- docs/functions/User.getRecentActivity.html | 6 +- docs/functions/User.getResourceOwner.html | 8 +- docs/functions/User.getScores.html | 10 +- docs/functions/WikiPage.getOne.html | 6 +- docs/functions/generateAuthorizationURL.html | 6 +- docs/hierarchy.html | 2 +- docs/index.html | 246 +++---- docs/interfaces/Beatmap-1.html | 6 +- docs/interfaces/Beatmap.Config.html | 16 +- .../Beatmap.DifficultyAttributes-1.html | 6 +- .../Beatmap.DifficultyAttributes.Fruits.html | 6 +- .../Beatmap.DifficultyAttributes.Mania.html | 8 +- .../Beatmap.DifficultyAttributes.Osu.html | 6 +- .../Beatmap.DifficultyAttributes.Taiko.html | 6 +- docs/interfaces/Beatmap.Extended-1.html | 6 +- .../Beatmap.Extended.WithFailtimes.html | 6 +- ...tmap.Extended.WithFailtimesBeatmapset.html | 8 +- ...eatmap.Extended.WithFailtimesMaxcombo.html | 8 +- .../Beatmap.Extended.WithMaxcombo.html | 6 +- docs/interfaces/Beatmap.Pack-1.html | 12 +- .../Beatmap.Pack.WithBeatmapset.html | 12 +- docs/interfaces/Beatmap.Playcount.html | 8 +- docs/interfaces/Beatmap.UserScore-1.html | 10 +- docs/interfaces/Beatmap.WithBeatmapset.html | 6 +- ...eatmap.WithBeatmapsetChecksumMaxcombo.html | 6 +- docs/interfaces/Beatmap.WithChecksum.html | 6 +- docs/interfaces/Beatmapset-1.html | 15 +- docs/interfaces/Beatmapset.Config.html | 14 +- docs/interfaces/Beatmapset.Discussion-1.html | 6 +- .../Beatmapset.Discussion.Post-1.html | 4 +- .../Beatmapset.Discussion.Vote-1.html | 4 +- ...eatmapset.Discussion.WithStartingpost.html | 6 +- docs/interfaces/Beatmapset.Event-1.html | 7 +- .../Beatmapset.Event.BeatmapOwnerChange.html | 6 +- .../Beatmapset.Event.Comment-1.html | 4 +- ....Event.Comment.WithDiscussionidPostid.html | 6 +- ...eatmapversionNewuseridNewuserusername.html | 6 +- ...nt.WithDiscussionidPostidNewvotevotes.html | 6 +- ...t.WithDiscussionidPostidNominatorsids.html | 6 +- ...ithDiscussionidPostidOldgenreNewgenre.html | 6 +- ...cussionidPostidOldlanguageNewlanguage.html | 6 +- ....WithDiscussionidPostidOldnsfwNewnsfw.html | 6 +- ...hDiscussionidPostidOldoffsetNewoffset.html | 6 +- ....WithDiscussionidPostidOldtagsNewtags.html | 6 +- ....Comment.WithDiscussionidPostidReason.html | 6 +- ...dPostidSourceuseridSourceuserusername.html | 6 +- .../Beatmapset.Event.Comment.WithModes.html | 6 +- .../Beatmapset.Event.DiscussionDelete.html | 6 +- ...atmapset.Event.DiscussionLockORUnlock.html | 6 +- ...Beatmapset.Event.DiscussionPostDelete.html | 9 + .../Beatmapset.Event.DiscussionRestore.html | 9 + ....DiscussionRestoreORKudosuRecalculate.html | 7 - ...set.Event.DisqualifyORNominationReset.html | 6 +- .../Beatmapset.Event.GenreEdit.html | 6 +- ...Beatmapset.Event.IssueResolveOrReopen.html | 6 +- ...ORDenyORDiscussionPostDeleteORRestore.html | 7 - ...osuAllowORDenyORDiscussionPostRestore.html | 9 + .../Beatmapset.Event.KudosuGainORLost.html | 6 +- .../Beatmapset.Event.KudosuRecalculate.html | 9 + .../Beatmapset.Event.LanguageEdit.html | 6 +- docs/interfaces/Beatmapset.Event.Love.html | 6 +- .../interfaces/Beatmapset.Event.Nominate.html | 6 +- ...tmapset.Event.NominationResetReceived.html | 6 +- .../Beatmapset.Event.NsfwToggle.html | 6 +- .../Beatmapset.Event.OffsetEdit.html | 6 +- .../Beatmapset.Event.QualifyORRank.html | 6 +- .../Beatmapset.Event.RemoveFromLoved.html | 6 +- .../interfaces/Beatmapset.Event.TagsEdit.html | 6 +- docs/interfaces/Beatmapset.Extended-1.html | 19 +- docs/interfaces/Beatmapset.Extended.Plus.html | 29 +- .../Beatmapset.Extended.WithBeatmap.html | 21 +- ...atmapset.Extended.WithBeatmapPacktags.html | 19 +- docs/interfaces/Beatmapset.WithHype.html | 15 +- docs/interfaces/Beatmapset.WithUserHype.html | 15 +- docs/interfaces/Changelog.Build-1.html | 12 +- ...og.Build.WithChangelogentriesVersions.html | 26 +- .../Changelog.Build.WithUpdatestreams.html | 14 +- ...ild.WithUpdatestreamsChangelogentries.html | 26 +- docs/interfaces/Changelog.UpdateStream-1.html | 10 +- ...UpdateStream.WithLatestbuildUsercount.html | 14 +- docs/interfaces/Chat.Channel-1.html | 6 +- docs/interfaces/Chat.Channel.WithDetails.html | 16 +- docs/interfaces/Chat.Message-1.html | 8 +- docs/interfaces/Chat.UserSilence.html | 6 +- docs/interfaces/Comment-1.html | 14 +- docs/interfaces/Comment.Bundle-1.html | 14 +- ...Comment.Bundle.WithTotalToplevelcount.html | 14 +- docs/interfaces/Event-1.html | 4 +- docs/interfaces/Event.Achievement.html | 8 +- docs/interfaces/Event.BeatmapPlaycount.html | 4 +- docs/interfaces/Event.BeatmapsetApprove.html | 4 +- docs/interfaces/Event.BeatmapsetDelete.html | 4 +- docs/interfaces/Event.BeatmapsetRevive.html | 4 +- docs/interfaces/Event.BeatmapsetUpdate.html | 4 +- docs/interfaces/Event.BeatmapsetUpload.html | 4 +- docs/interfaces/Event.Rank.html | 8 +- docs/interfaces/Event.RankLost.html | 4 +- .../Event.SharedProperties.Beatmap.html | 8 +- .../Event.SharedProperties.Beatmapset.html | 8 +- .../Event.SharedProperties.User.html | 6 +- docs/interfaces/Event.UserSupportAgain.html | 4 +- docs/interfaces/Event.UserSupportFirst.html | 4 +- docs/interfaces/Event.UserSupportGift.html | 4 +- docs/interfaces/Event.UsernameChange.html | 6 +- docs/interfaces/Forum.Post-1.html | 8 +- docs/interfaces/Forum.Topic-1.html | 8 +- docs/interfaces/Multiplayer.Match-1.html | 8 +- docs/interfaces/Multiplayer.Match.Event.html | 8 + docs/interfaces/Multiplayer.Match.Info.html | 6 +- docs/interfaces/Multiplayer.Room-1.html | 8 +- .../interfaces/Multiplayer.Room.Leader-1.html | 6 +- .../Multiplayer.Room.Leader.WithPosition.html | 6 +- .../Multiplayer.Room.PlaylistItem-1.html | 8 +- .../Multiplayer.Room.PlaylistItem.Scores.html | 12 +- docs/interfaces/NewsPost-1.html | 12 +- .../NewsPost.WithContentNavigation.html | 14 +- docs/interfaces/Ranking.Country.html | 14 +- docs/interfaces/Ranking.Spotlight.html | 6 +- docs/interfaces/Ranking.User.html | 10 +- docs/interfaces/Score-1.html | 14 +- docs/interfaces/Score.Legacy.html | 20 +- docs/interfaces/Score.Multiplayer.html | 12 +- docs/interfaces/Score.Solo.html | 20 +- docs/interfaces/Score.Statistics.html | 8 +- docs/interfaces/Score.WithMatch.html | 20 +- docs/interfaces/Score.WithUser.html | 18 +- docs/interfaces/Score.WithUserBeatmap.html | 20 +- .../Score.WithUserBeatmapBeatmapset.html | 20 +- docs/interfaces/Spotlight-1.html | 8 +- .../Spotlight.WithParticipantcount.html | 8 +- docs/interfaces/User-1.html | 4 +- docs/interfaces/User.Config.html | 12 +- docs/interfaces/User.Extended-1.html | 15 +- .../User.Extended.WithStatisticsrulesets.html | 17 +- docs/interfaces/User.KudosuHistory.html | 6 +- docs/interfaces/User.Statistics-1.html | 8 +- .../User.Statistics.WithCountryrank.html | 8 +- docs/interfaces/User.Statistics.WithUser.html | 8 +- docs/interfaces/User.WithCountry.html | 6 +- docs/interfaces/User.WithCountryCover.html | 6 +- ...thCountryCoverGroupsStatisticsSupport.html | 6 +- ...hCountryCoverGroupsStatisticsrulesets.html | 8 +- docs/interfaces/User.WithGroups.html | 4 +- docs/interfaces/User.WithKudosu.html | 4 +- .../WebSocket.Event.ChatChannelJoin.html | 4 +- .../WebSocket.Event.ChatChannelLeave.html | 4 +- .../WebSocket.Event.ChatMessageNew.html | 4 +- docs/interfaces/WikiPage-1.html | 14 +- docs/modules.html | 4 +- .../modules/Beatmap.DifficultyAttributes.html | 4 +- docs/modules/Beatmap.Extended.html | 4 +- docs/modules/Beatmap.Pack.html | 4 +- docs/modules/Beatmap.UserScore.html | 4 +- docs/modules/Beatmap.html | 4 +- docs/modules/Beatmapset.Discussion.Post.html | 4 +- docs/modules/Beatmapset.Discussion.Vote.html | 4 +- docs/modules/Beatmapset.Discussion.html | 4 +- docs/modules/Beatmapset.Event.Comment.html | 6 +- docs/modules/Beatmapset.Event.html | 10 +- docs/modules/Beatmapset.Extended.html | 4 +- docs/modules/Beatmapset.html | 4 +- docs/modules/Changelog.Build.html | 4 +- docs/modules/Changelog.UpdateStream.html | 4 +- docs/modules/Changelog.html | 4 +- docs/modules/Chat.Channel.html | 4 +- docs/modules/Chat.Message.html | 4 +- docs/modules/Chat.html | 4 +- docs/modules/Comment.Bundle.html | 4 +- docs/modules/Comment.html | 4 +- docs/modules/Event.SharedProperties.html | 6 +- docs/modules/Event.html | 4 +- docs/modules/Forum.Post.html | 4 +- docs/modules/Forum.Topic.html | 4 +- docs/modules/Forum.html | 4 +- docs/modules/Home.Search.html | 4 +- docs/modules/Home.html | 4 +- docs/modules/Multiplayer.Match.html | 5 +- docs/modules/Multiplayer.Room.Leader.html | 4 +- .../Multiplayer.Room.PlaylistItem.html | 4 +- docs/modules/Multiplayer.Room.html | 4 +- docs/modules/Multiplayer.html | 4 +- docs/modules/NewsPost.html | 4 +- docs/modules/Ranking.html | 4 +- docs/modules/Score.html | 4 +- docs/modules/Spotlight.html | 4 +- docs/modules/User.Extended.html | 4 +- docs/modules/User.Statistics.html | 4 +- docs/modules/User.html | 4 +- docs/modules/WebSocket.Command.html | 11 +- docs/modules/WebSocket.Event.html | 6 +- docs/modules/WebSocket.html | 6 +- docs/modules/WikiPage.html | 4 +- .../Beatmap.DifficultyAttributes.Any.html | 2 +- docs/types/Beatmapset.Event.Any.html | 2 +- .../Beatmapset.Event.AnyBeatmapChange.html | 2 +- ...apset.Event.AnyBeatmapsetStatusChange.html | 2 +- .../Beatmapset.Event.AnyDiscussionChange.html | 2 +- docs/types/Event.Any.html | 2 +- docs/types/Event.AnyRecentActivity.html | 4 +- docs/types/Mod.html | 2 +- docs/types/Scope.html | 8 +- docs/types/WebSocket.Event.Any.html | 4 +- docs/variables/WebSocket.Command.chatEnd.html | 2 +- .../WebSocket.Command.chatStart.html | 2 +- package.json | 4 +- yarn.lock | 140 ++-- 285 files changed, 2308 insertions(+), 1590 deletions(-) create mode 100644 docs/interfaces/Beatmapset.Event.DiscussionPostDelete.html create mode 100644 docs/interfaces/Beatmapset.Event.DiscussionRestore.html delete mode 100644 docs/interfaces/Beatmapset.Event.DiscussionRestoreORKudosuRecalculate.html delete mode 100644 docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostDeleteORRestore.html create mode 100644 docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostRestore.html create mode 100644 docs/interfaces/Beatmapset.Event.KudosuRecalculate.html create mode 100644 docs/interfaces/Multiplayer.Match.Event.html diff --git a/docs/assets/icons.js b/docs/assets/icons.js index b79c9e8..e88e8ca 100644 --- a/docs/assets/icons.js +++ b/docs/assets/icons.js @@ -1,15 +1,18 @@ -(function(svg) { - svg.innerHTML = ``; - svg.style.display = 'none'; - if (location.protocol === 'file:') { - if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateUseElements); - else updateUseElements() - function updateUseElements() { - document.querySelectorAll('use').forEach(el => { - if (el.getAttribute('href').includes('#icon-')) { - el.setAttribute('href', el.getAttribute('href').replace(/.*#/, '#')); - } - }); - } +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `""`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); } -})(document.body.appendChild(document.createElementNS('http://www.w3.org/2000/svg', 'svg'))) \ No newline at end of file + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/assets/icons.svg b/docs/assets/icons.svg index 7dead61..e371b8b 100644 --- a/docs/assets/icons.svg +++ b/docs/assets/icons.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/assets/main.js b/docs/assets/main.js index d6f1388..3572881 100644 --- a/docs/assets/main.js +++ b/docs/assets/main.js @@ -1,8 +1,9 @@ "use strict"; -"use strict";(()=>{var Ce=Object.create;var ne=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Fe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!Re.call(t,i)&&i!==n&&ne(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Ce(_e(t)):{},Fe(e||!t||!t.__esModule?ne(n,"default",{value:t,enumerable:!0}):n,t));var ae=Me((se,oe)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),y=s.str.charAt(1),p;y in s.node.edges?p=s.node.edges[y]:(p=new t.TokenSet,s.node.edges[y]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof se=="object"?oe.exports=n():e.lunr=n()}(this,function(){return t})})()});var re=[];function G(t,e){re.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){re.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(console.log("Show page"),document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){console.log("Scorlling");let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!e.checkVisibility()){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(n&&n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var de=De(ae());async function le(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=de.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function he(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{le(e,t)}),le(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");let s=!1;i.addEventListener("mousedown",()=>s=!0),i.addEventListener("mouseup",()=>{s=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{s||(s=!1,t.classList.remove("has-focus"))}),Ae(t,i,r,e)}function Ae(t,e,n,r){n.addEventListener("input",ie(()=>{Ve(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ne(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ve(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ce(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${ce(l.parent,i)}.${d}`);let y=document.createElement("li");y.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,y.append(p),e.appendChild(y)}}function ue(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ne(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(K(t.substring(s))),i.join("")}var He={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>He[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",fe="mousemove",H="mouseup",J={x:0,y:0},pe=!1,ee=!1,Be=!1,D=!1,me=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(me?"is-mobile":"not-mobile");me&&"ontouchstart"in document.documentElement&&(Be=!0,F="touchstart",fe="touchmove",H="touchend");document.addEventListener(F,t=>{ee=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(fe,t=>{if(ee&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(H,()=>{ee=!1});document.addEventListener("click",t=>{pe&&(t.preventDefault(),t.stopImmediatePropagation(),pe=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(H,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(H,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var ye=document.head.appendChild(document.createElement("style"));ye.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ye.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ge(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ve(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ve(t.value)})}function ve(t){document.documentElement.dataset.theme=t}var Le;function be(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",xe),xe())}async function xe(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();Le=t.dataset.base+"/",t.innerHTML="";for(let s of i)we(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function we(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-index-accordion`:"tsd-index-accordion",s.dataset.key=i.join("$");let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.innerHTML='',Ee(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)we(u,l,i)}else Ee(t,r,t.class)}function Ee(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=Le+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("tsd-theme");Se&&ge(Se);var je=new U;Object.defineProperty(window,"app",{value:je});he();be();})(); +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!Ve(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})(); /*! Bundled license information: lunr/lunr.js: diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index b25aa46..49cfabd 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 7f8e44c..feecd16 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ 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/assets/style.css b/docs/assets/style.css index 778b949..9d619a6 100644 --- a/docs/assets/style.css +++ b/docs/assets/style.css @@ -10,6 +10,7 @@ --light-color-text: #222; --light-color-text-aside: #6e6e6e; --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; --light-color-ts-keyword: #056bd6; --light-color-ts-project: #b111c9; @@ -35,6 +36,7 @@ --light-color-ts-set-signature: var(--light-color-ts-accessor); --light-color-ts-type-alias: #d51270; /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; --light-external-icon: url("data:image/svg+xml;utf8,"); --light-color-scheme: light; @@ -50,6 +52,7 @@ --dark-color-text: #f5f5f5; --dark-color-text-aside: #dddddd; --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; --dark-color-ts-keyword: #3399ff; --dark-color-ts-project: #e358ff; @@ -75,6 +78,7 @@ --dark-color-ts-set-signature: var(--dark-color-ts-accessor); --dark-color-ts-type-alias: #ff6492; /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; --dark-external-icon: url("data:image/svg+xml;utf8,"); --dark-color-scheme: dark; @@ -92,6 +96,7 @@ --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); --color-ts-module: var(--light-color-ts-module); @@ -116,6 +121,7 @@ --color-ts-get-signature: var(--light-color-ts-get-signature); --color-ts-set-signature: var(--light-color-ts-set-signature); --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); @@ -134,6 +140,7 @@ --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); --color-ts-module: var(--dark-color-ts-module); @@ -158,6 +165,7 @@ --color-ts-get-signature: var(--dark-color-ts-get-signature); --color-ts-set-signature: var(--dark-color-ts-set-signature); --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); @@ -183,6 +191,7 @@ body { --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); --color-ts-module: var(--light-color-ts-module); @@ -207,6 +216,7 @@ body { --color-ts-get-signature: var(--light-color-ts-get-signature); --color-ts-set-signature: var(--light-color-ts-set-signature); --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); @@ -223,6 +233,7 @@ body { --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); --color-ts-module: var(--dark-color-ts-module); @@ -247,11 +258,17 @@ body { --color-ts-get-signature: var(--dark-color-ts-get-signature); --color-ts-set-signature: var(--dark-color-ts-set-signature); --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); } +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + .always-visible, .always-visible .tsd-signatures { display: inherit !important; @@ -266,16 +283,6 @@ h6 { line-height: 1.2; } -h1 > a:not(.link), -h2 > a:not(.link), -h3 > a:not(.link), -h4 > a:not(.link), -h5 > a:not(.link), -h6 > a:not(.link) { - text-decoration: none; - color: var(--color-text); -} - h1 { font-size: 1.875rem; margin: 0.67rem 0; @@ -306,10 +313,6 @@ h6 { margin: 2.33rem 0; } -.uppercase { - text-transform: uppercase; -} - dl, menu, ol, @@ -333,7 +336,7 @@ footer { padding-bottom: 1rem; max-height: 3.5rem; } -.tsd-generator { +footer > p { margin: 0 1em; } @@ -421,6 +424,9 @@ a.external[target="_blank"] { background-repeat: no-repeat; padding-right: 13px; } +a.tsd-anchor-link { + color: var(--color-text); +} code, pre { @@ -580,13 +586,13 @@ dl.tsd-comment-tag-group p { } .tsd-filter-input { display: flex; - width: fit-content; width: -moz-fit-content; + width: fit-content; align-items: center; - user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; + user-select: none; cursor: pointer; } .tsd-filter-input input[type="checkbox"] { @@ -609,11 +615,8 @@ dl.tsd-comment-tag-group p { Don't remove unless you know what you're doing. */ opacity: 0.99; } -.tsd-filter-input input[type="checkbox"]:focus + svg { - transform: scale(0.95); -} -.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { - transform: scale(1); +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); } .tsd-checkbox-background { fill: var(--color-accent); @@ -630,13 +633,18 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { stroke: var(--color-accent); } -.tsd-theme-toggle { - padding-top: 0.75rem; +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; } -.tsd-theme-toggle > h4 { - display: inline; - vertical-align: middle; - margin-right: 0.75rem; + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; } .tsd-hierarchy { @@ -769,6 +777,9 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { padding: 0; max-width: 100%; } +.tsd-navigation .tsd-nav-link { + display: none; +} .tsd-nested-navigation { margin-left: 3rem; } @@ -782,6 +793,15 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { margin-left: -1.5rem; } +.tsd-page-navigation-section { + margin-left: 10px; +} +.tsd-page-navigation-section > summary { + padding: 0.25rem; +} +.tsd-page-navigation-section > div { + margin-left: 20px; +} .tsd-page-navigation ul { padding-left: 1.75rem; } @@ -812,10 +832,10 @@ a.tsd-index-link { } .tsd-accordion-summary, .tsd-accordion-summary a { - user-select: none; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; + user-select: none; cursor: pointer; } @@ -828,8 +848,9 @@ a.tsd-index-link { padding-top: 0; padding-bottom: 0; } -.tsd-index-accordion .tsd-accordion-summary > svg { +.tsd-accordion .tsd-accordion-summary > svg { margin-left: 0.25rem; + vertical-align: text-top; } .tsd-index-content > :not(:first-child) { margin-top: 0.75rem; @@ -877,7 +898,7 @@ a.tsd-index-link { } .tsd-panel-group { - margin: 4rem 0; + margin: 2rem 0; } .tsd-panel-group.tsd-index-group { margin: 2rem 0; @@ -885,6 +906,9 @@ a.tsd-index-link { .tsd-panel-group.tsd-index-group details { margin: 2rem 0; } +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} #tsd-search { transition: background-color 0.2s; @@ -1034,6 +1058,12 @@ a.tsd-index-link { border-width: 1px 0; transition: background-color 0.1s; } +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} .tsd-description .tsd-signatures .tsd-signature { border-width: 1px; } @@ -1347,6 +1377,12 @@ img { .has-menu .tsd-navigation { max-height: 100%; } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } } /* one sidebar */ diff --git a/docs/classes/API.html b/docs/classes/API.html index 36b5835..a7ca614 100644 --- a/docs/classes/API.html +++ b/docs/classes/API.html @@ -1,20 +1,5 @@ -API | osu-api-v2-js

You can create an API instance without directly providing an access_token by using API.createAsync!

-

Hierarchy (view full)

Constructors

Properties

_access_token -_client -_expires -_refresh_on_401 -_refresh_on_expires -_refresh_timeout? -_refresh_token? -_retry -_routes -_scopes? -_server -_timeout -_token_type -_user? -_verbose? +API | osu-api-v2-js

You can create an API instance without directly providing an access_token by using API.createAsync!

+

Hierarchy (view full)

Constructors

Constructors

  • Please use API.createAsync instead of the default constructor if you don't have at least an API.access_token! An API object without an access_token is pretty much useless!

    -

    Parameters

    • properties: Partial<API>

    Returns API

Properties

_access_token: string = ""
_client: {
    id: number;
    secret: string;
} = ...

Type declaration

  • id: number
  • secret: string
_expires: Date = ...
_refresh_on_401: boolean = true
_refresh_on_expires: boolean = true
_refresh_timeout?: Timeout
_refresh_token?: string
_retry: {
    delay: number;
    disabled: boolean;
    maximum_amount: number;
    on_automatic_refresh: boolean;
    on_status_codes: number[];
    on_timeout: boolean;
} = ...

Type declaration

  • delay: number

    In seconds, how long should it wait until retrying? (defaults to 2)

    -
  • disabled: boolean

    If true, doesn't retry under any circumstances (defaults to false)

    -
  • maximum_amount: number

    How many retries maximum before throwing an APIError (defaults to 5)

    -
  • on_automatic_refresh: boolean

    Should it retry a request upon successfully refreshing the token due to API.refresh_on_401 being true? (defaults to true)

    -
  • on_status_codes: number[]

    Upon failing a request and receiving a response, because of which received status code should the request be retried? (defaults to [429])

    -
  • on_timeout: boolean

    Should it retry a request if that request failed because it has been aborted by the API.timeout? (defaults to false)

    -
_routes: {
    normal: string;
    token_obtention: string;
} = ...

Type declaration

_scopes?: Scope[]
_server: string = "https://osu.ppy.sh"
_timeout: number = 20
_token_type: string = "Bearer"
_user?: number
_verbose?: "all" | "none" | "errors" = "none"

Accessors

  • get access_token(): string
  • The key that allows you to talk with the API

    -

    Returns string

  • set access_token(token): void
  • Parameters

    • token: string

    Returns void

  • get client(): {
        id: number;
        secret: string;
    }
  • The details of your client, which you've got from https://osu.ppy.sh/home/account/edit#oauth

    -

    Returns {
        id: number;
        secret: string;
    }

    • id: number
    • secret: string
  • set client(client): void
  • Parameters

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

    Returns void

  • get expires(): Date
  • The expiration date of your access_token

    -

    Returns Date

  • set expires(date): void
  • Parameters

    • date: Date

    Returns void

  • get refresh_on_401(): boolean
  • If true, upon failing a request due to a 401, it will use the API.refresh_token if it exists (defaults to true)

    -

    Returns boolean

  • set refresh_on_401(refresh): void
  • Parameters

    • refresh: boolean

    Returns void

Accessors

  • get access_token(): string
  • The key that allows you to talk with the API

    +

    Returns string

  • set access_token(token): void
  • Parameters

    • token: string

    Returns void

  • get client(): {
        id: number;
        secret: string;
    }
  • The details of your client, which you've got from https://osu.ppy.sh/home/account/edit#oauth

    +

    Returns {
        id: number;
        secret: string;
    }

    • id: number
    • secret: string
  • set client(client): void
  • Parameters

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

    Returns void

  • get expires(): Date
  • The expiration date of your access_token

    +

    Returns Date

  • set expires(date): void
  • Parameters

    • date: Date

    Returns void

  • get refresh_on_401(): boolean
  • If true, upon failing a request due to a 401, it will use the API.refresh_token if it exists (defaults to true)

    +

    Returns boolean

  • set refresh_on_401(refresh): void
  • Parameters

    • refresh: boolean

    Returns void

  • get refresh_timeout(): undefined | Timeout
  • Returns undefined | Timeout

  • set refresh_timeout(timeout): void
  • Parameters

    • timeout: Timeout

    Returns void

  • get refresh_token(): undefined | string
  • Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant again! +

    Returns boolean

  • set refresh_on_expires(enabled): void
  • Parameters

    • enabled: boolean

    Returns void

  • get refresh_timeout(): undefined | Timeout
  • Returns undefined | Timeout

  • set refresh_timeout(timeout): void
  • Parameters

    • timeout: Timeout

    Returns void

  • get refresh_token(): undefined | string
  • Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant again! Use API.refreshToken to do that

    -

    Returns undefined | string

  • set refresh_token(token): void
  • Parameters

    • token: undefined | string

    Returns void

  • get retry(): {
        delay: number;
        disabled: boolean;
        maximum_amount: number;
        on_automatic_refresh: boolean;
        on_status_codes: number[];
        on_timeout: boolean;
    }
  • Configure how this instance should behave when it comes to automatically retrying a request

    +

    Returns undefined | string

  • set refresh_token(token): void
  • Parameters

    • token: undefined | string

    Returns void

  • get retry(): {
        delay: number;
        disabled: boolean;
        maximum_amount: number;
        on_automatic_refresh: boolean;
        on_status_codes: number[];
        on_timeout: boolean;
    }
  • Configure how this instance should behave when it comes to automatically retrying a request

    Returns {
        delay: number;
        disabled: boolean;
        maximum_amount: number;
        on_automatic_refresh: boolean;
        on_status_codes: number[];
        on_timeout: boolean;
    }

    • delay: number

      In seconds, how long should it wait until retrying? (defaults to 2)

      -
    • disabled: boolean

      If true, doesn't retry under any circumstances (defaults to false)

      +
    • disabled: boolean

      If true, doesn't retry under any circumstances (defaults to false)

    • maximum_amount: number

      How many retries maximum before throwing an APIError (defaults to 5)

    • on_automatic_refresh: boolean

      Should it retry a request upon successfully refreshing the token due to API.refresh_on_401 being true? (defaults to true)

    • on_status_codes: number[]

      Upon failing a request and receiving a response, because of which received status code should the request be retried? (defaults to [429])

    • on_timeout: boolean

      Should it retry a request if that request failed because it has been aborted by the API.timeout? (defaults to false)

      -
  • set retry(retry): void
  • Parameters

    • retry: {
          delay: number;
          disabled: boolean;
          maximum_amount: number;
          on_automatic_refresh: boolean;
          on_status_codes: number[];
          on_timeout: boolean;
      }
      • delay: number

        In seconds, how long should it wait until retrying? (defaults to 2)

        -
      • disabled: boolean

        If true, doesn't retry under any circumstances (defaults to false)

        +
    • set retry(retry): void
    • Parameters

      • retry: {
            delay: number;
            disabled: boolean;
            maximum_amount: number;
            on_automatic_refresh: boolean;
            on_status_codes: number[];
            on_timeout: boolean;
        }
        • delay: number

          In seconds, how long should it wait until retrying? (defaults to 2)

          +
        • disabled: boolean

          If true, doesn't retry under any circumstances (defaults to false)

        • maximum_amount: number

          How many retries maximum before throwing an APIError (defaults to 5)

        • on_automatic_refresh: boolean

          Should it retry a request upon successfully refreshing the token due to API.refresh_on_401 being true? (defaults to true)

        • on_status_codes: number[]

          Upon failing a request and receiving a response, because of which received status code should the request be retried? (defaults to [429])

        • on_timeout: boolean

          Should it retry a request if that request failed because it has been aborted by the API.timeout? (defaults to false)

          -

      Returns void

  • get routes(): {
        normal: string;
        token_obtention: string;
    }
  • What follows the API.server and preceeds the individual endpoints used by each request

    +

Returns void

  • get routes(): {
        normal: string;
        token_obtention: string;
    }
  • What follows the API.server and preceeds the individual endpoints used by each request

    Returns {
        normal: string;
        token_obtention: string;
    }

  • set routes(routes): void
  • Parameters

    • routes: {
          normal: string;
          token_obtention: string;
      }
      • normal: string

        Used by practically every method to interact with the API.server

        +
    • set routes(routes): void
    • Parameters

      • routes: {
            normal: string;
            token_obtention: string;
        }

      Returns void

  • get scopes(): undefined | Scope[]
  • The Scopes your application has, assuming it acts as a user

    -

    Returns undefined | Scope[]

  • set scopes(scopes): void
  • Parameters

    • scopes: undefined | Scope[]

    Returns void

  • get server(): string
  • The base url of the server where the requests should land (defaults to https://osu.ppy.sh)

    -

    Returns string

  • set server(server): void
  • Parameters

    • server: string

    Returns void

  • get timeout(): number
  • The maximum amount of seconds requests should take before returning an answer (defaults to 20)

    -

    Returns number

    Remarks

    0 means no maximum, no timeout

    -
  • set timeout(timeout): void
  • Parameters

    • timeout: number

    Returns void

  • get token_type(): string
  • Should always be "Bearer"

    -

    Returns string

  • set token_type(token): void
  • Parameters

    • token: string

    Returns void

  • get user(): undefined | number
  • The osu! user id of the user who went through the Authorization Code Grant

    -

    Returns undefined | number

  • set user(user): void
  • Parameters

    • user: undefined | number

    Returns void

  • get verbose(): undefined | "all" | "none" | "errors"
  • Which events should be logged (defaults to none)

    -

    Returns undefined | "all" | "none" | "errors"

  • set verbose(verbose): void
  • Parameters

    • verbose: undefined | "all" | "none" | "errors"

    Returns void

Methods

  • Get a websocket to get WebSocket events from!

    +

Returns void

  • get scopes(): undefined | Scope[]
  • The Scopes your application has, assuming it acts as a user

    +

    Returns undefined | Scope[]

  • set scopes(scopes): void
  • Parameters

    • scopes: undefined | Scope[]

    Returns void

  • get server(): string
  • The base url of the server where the requests should land (defaults to https://osu.ppy.sh)

    +

    Returns string

  • set server(server): void
  • Parameters

    • server: string

    Returns void

  • get timeout(): number
  • The maximum amount of seconds requests should take before returning an answer (defaults to 20)

    +

    Returns number

    0 means no maximum, no timeout

    +
  • set timeout(timeout): void
  • Parameters

    • timeout: number

    Returns void

  • get token_type(): string
  • Should always be "Bearer"

    +

    Returns string

  • set token_type(token): void
  • Parameters

    • token: string

    Returns void

  • get user(): undefined | number
  • The osu! user id of the user who went through the Authorization Code Grant

    +

    Returns undefined | number

  • set user(user): void
  • Parameters

    • user: undefined | number

    Returns void

  • get verbose():
        | undefined
        | "all"
        | "none"
        | "errors"
  • Which events should be logged (defaults to none)

    +

    Returns
        | undefined
        | "all"
        | "none"
        | "errors"

  • set verbose(verbose): void
  • Parameters

    • verbose:
          | undefined
          | "all"
          | "none"
          | "errors"

    Returns void

Methods

  • Get a websocket to get WebSocket events from!

    Parameters

    • server: string = ...

      Where the "notification websocket/server" is -(defaults to the API.server's protocol and a maximum of 1 subdomain being replaced by "wss://notify." (so usually wss://notify.ppy.sh))

      -

    Returns WebSocket

  • Set most of an api's properties, like tokens, token_type, scopes, expiration_date

    -

    Parameters

    • body: {
          client_id: number;
          client_secret: string;
          code: string;
          grant_type: "authorization_code";
          redirect_uri: string;
      }

      An Object with the client id & secret, grant_type, and stuff that depends of the grant_type

      -
      • client_id: number
      • client_secret: string
      • code: string
      • grant_type: "authorization_code"
      • redirect_uri: string
    • api: API

      The api which will see its properties change

      -

    Returns Promise<API>

    api, just in case, because in theory it should modify the original object

    -
  • Parameters

    • body: {
          client_id: number;
          client_secret: string;
          grant_type: "client_credentials";
          scope: "public";
      }
      • client_id: number
      • client_secret: string
      • grant_type: "client_credentials"
      • scope: "public"
    • api: API

    Returns Promise<API>

  • Parameters

    • body: {
          client_id: number;
          client_secret: string;
          grant_type: "refresh_token";
          refresh_token: string;
      }
      • client_id: number
      • client_secret: string
      • grant_type: "refresh_token"
      • refresh_token: string
    • api: API

    Returns Promise<API>

  • 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

  • Returns Promise<boolean>

    Whether or not the token has been refreshed

    -
  • The function that directly communicates with the API! Almost every functions of the API object uses this function!

    -

    Parameters

    • method: "get" | "post" | "put" | "delete"

      The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)

      +(defaults to the API.server's protocol and a maximum of 1 subdomain being replaced by "wss://notify." (so usually wss://notify.ppy.sh))

      +

    Returns WebSocket

  • Returns Promise<boolean>

    Whether or not the token has been refreshed

    +
  • The function that directly communicates with the API! Almost every functions of the API object uses this function!

    +

    Parameters

    • method:
          | "get"
          | "post"
          | "put"
          | "delete"

      The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)

    • endpoint: string

      What comes in the URL after api/

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

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

      -
      • [k: string]: any
    • Optional settings: Omit<RequestInit, "body">

      Additional settings to add to the current settings of the fetch() request

      +
      • [k: string]: any
    • Optionalsettings: Omit<RequestInit, "body">

      Additional settings to add to the current settings of the fetch() request

    • info: {
          just_refreshed: boolean;
          number_try: number;
      } = ...

      Context given by a prior request

      -
      • just_refreshed: boolean
      • number_try: number

    Returns Promise<any>

    A Promise with the API's response

    -
  • Revoke your current token! Revokes the refresh token as well

    -

    Returns Promise<true>

  • Add, remove, change the timeout used for refreshing the token automatically whenever certain properties change

    -

    Returns undefined

  • You can use this to specify additional settings for the method you're going to call, such as headers, an AbortSignal, and more advanced things!

    +
    • just_refreshed: boolean
    • number_try: number

Returns Promise<any>

A Promise with the API's response

+
  • Revoke your current token! Revokes the refresh token as well

    +

    Returns Promise<true>

  • You can use this to specify additional settings for the method you're going to call, such as headers, an AbortSignal, and more advanced things!

    Parameters

    Returns ChildAPI

    A special version of the API that changes how requests are done

    -

    Example

    const controller = new AbortController() // this controller can be used to abort any request that uses its signal!
    const user = await api.withSettings({signal: controller.signal}).getUser(7276846) -
    -
  • The normal way to create an API instance! Make sure to await it

    +
    const controller = new AbortController() // this controller can be used to abort any request that uses its signal!
    const user = await api.withSettings({signal: controller.signal}).getUser(7276846) +
    + +
  • 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!

      +
      • id: number
      • secret: string
    • Optionaluser: {
          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

        The code that appeared as a GET argument when they got redirected to the Application Callback URL (redirect_uri)

      • redirect_uri: string

        The Application Callback URL; Where the User has been redirected to after saying "okay" to your application doing stuff

        -
    • Optional verbose: "all" | "none" | "errors"
    • Optional server: string
    • Optional timeout: number

      Remarks

      In seconds

      +
  • Optionalverbose: "all" | "none" | "errors"
  • Optionalserver: string
  • Optionaltimeout: number

    In seconds

Returns Promise<API>

A promise with an API instance

-

Beatmap Functions

getBeatmap: ((this, beatmap) => Promise<WithFailtimesBeatmapset>) = Beatmap.getOne

Get extensive beatmap data about whichever beatmap you want!

-

Type declaration

getBeatmapDifficultyAttributes: ((this, beatmap, mods?, ruleset?) => Promise<Beatmap.DifficultyAttributes.Any>) = Beatmap.DifficultyAttributes.get

Get various data about the difficulty of a beatmap!

-

Type declaration

Remarks

You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

-
getBeatmapDifficultyAttributesFruits: ((this, beatmap, mods?) => Promise<Fruits>) = Beatmap.DifficultyAttributes.getFruits

Get various data about the difficulty of a ctb beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Fruits>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Fruits>

getBeatmapDifficultyAttributesMania: ((this, beatmap, mods?) => Promise<Mania>) = Beatmap.DifficultyAttributes.getMania

Get various data about the difficulty of a mania beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Mania>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Mania>

getBeatmapDifficultyAttributesOsu: ((this, beatmap, mods?) => Promise<Osu>) = Beatmap.DifficultyAttributes.getOsu

Get various data about the difficulty of an osu! beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Osu>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Osu>

getBeatmapDifficultyAttributesTaiko: ((this, beatmap, mods?) => Promise<Taiko>) = Beatmap.DifficultyAttributes.getTaiko

Get various data about the difficulty of a taiko beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Taiko>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Taiko>

getBeatmapPack: ((this, pack, legacy_only?) => Promise<Pack>) = Beatmap.Pack.getOne

Get data about a Beatmap.Pack using its tag!

-

Type declaration

    • (this, pack, legacy_only?): Promise<Pack>
    • Parameters

      • this: API
      • pack: string | Pack
      • legacy_only: boolean = false

      Returns Promise<Pack>

Remarks

Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

-
getBeatmapPacks: ((this, type?, cursor_string?) => Promise<{
    beatmap_packs: Pack[];
    cursor_string: string | null;
}>) = Beatmap.Pack.getMultiple

Get an Array of up to 100 Beatmap.Packs of a specific type!

-

Type declaration

    • (this, type?, cursor_string?): Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>
    • Parameters

      • this: API
      • type: "standard" | "artist" | "loved" | "featured" | "tournament" | "chart" | "theme" = "standard"
      • Optional cursor_string: string

      Returns Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>

getBeatmapScores: ((this, beatmap, config?) => Promise<Score.WithUser[]>) = Beatmap.getScores

Get the top scores of a beatmap!

-

Type declaration

Remarks

Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores

-
getBeatmapSoloScores: ((this, beatmap, config?) => Promise<Solo[]>) = Beatmap.getSoloScores

Get the top scores of a beatmap, in the "solo score" format lazer brought with it! +

Beatmap Functions

getBeatmap: ((this: API, beatmap: number | Beatmap) => Promise<WithFailtimesBeatmapset>) = Beatmap.getOne

Get extensive beatmap data about whichever beatmap you want!

+

Type declaration

getBeatmapDifficultyAttributes: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[], ruleset?: Ruleset) => Promise<Beatmap.DifficultyAttributes.Any>) = Beatmap.DifficultyAttributes.get

Get various data about the difficulty of a beatmap!

+

Type declaration

    • (this, beatmap, mods?, ruleset?): Promise<Beatmap.DifficultyAttributes.Any>
    • Get various data about the difficulty of a beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +
      • Optionalruleset: Ruleset

        Useful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)

        +

      Returns Promise<Beatmap.DifficultyAttributes.Any>

      You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

      +

You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

+
getBeatmapDifficultyAttributesFruits: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Fruits>) = Beatmap.DifficultyAttributes.getFruits

Get various data about the difficulty of a ctb beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Fruits>
    • Get various data about the difficulty of a ctb beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Fruits>

getBeatmapDifficultyAttributesMania: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Mania>) = Beatmap.DifficultyAttributes.getMania

Get various data about the difficulty of a mania beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Mania>
    • Get various data about the difficulty of a mania beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Mania>

getBeatmapDifficultyAttributesOsu: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Osu>) = Beatmap.DifficultyAttributes.getOsu

Get various data about the difficulty of an osu! beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Osu>
    • Get various data about the difficulty of an osu! beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Osu>

getBeatmapDifficultyAttributesTaiko: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Taiko>) = Beatmap.DifficultyAttributes.getTaiko

Get various data about the difficulty of a taiko beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Taiko>
    • Get various data about the difficulty of a taiko beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Taiko>

getBeatmapPack: ((this: API, pack: string | Pack, legacy_only?: boolean) => Promise<Pack>) = Beatmap.Pack.getOne

Get data about a Beatmap.Pack using its tag!

+

Type declaration

    • (this, pack, legacy_only?): Promise<Pack>
    • Get data about a Beatmap.Pack using its tag!

      +

      Parameters

      • this: API
      • pack: string | Pack

        The Pack or the pack tag of the Pack you're trying to get

        +
      • legacy_only: boolean = false

        Should lazer scores be excluded from the pack's user_completion_data? (defaults to false)

        +

      Returns Promise<Pack>

      Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

      +

Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

+
getBeatmapPacks: ((this: API, type?:
    | "standard"
    | "artist"
    | "loved"
    | "featured"
    | "tournament"
    | "chart"
    | "theme", cursor_string?: string) => Promise<{
    beatmap_packs: Pack[];
    cursor_string: string | null;
}>) = Beatmap.Pack.getMultiple

Get an Array of up to 100 Beatmap.Packs of a specific type!

+

Type declaration

    • (this, type?, cursor_string?): Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>
    • Get an Array of up to 100 Beatmap.Packs of a specific type!

      +

      Parameters

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

        The type of the BeatmapPacks (defaults to standard)

        +
      • Optionalcursor_string: string

        Use a response's cursor_string with the same parameters to get the next "page" of results!

        +

      Returns Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>

getBeatmapScores: ((this: API, beatmap: number | Beatmap, config?: Beatmap.Config) => Promise<Score.WithUser[]>) = Beatmap.getScores

Get the top scores of a beatmap!

+

Type declaration

Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores

+
getBeatmapSoloScores: ((this: API, beatmap: number | Beatmap, config?: Beatmap.Config) => Promise<Solo[]>) = Beatmap.getSoloScores

Get the top scores of a beatmap, in the "solo score" format lazer brought with it! +More info on GitHub if needed https://github.com/ppy/osu-infrastructure/blob/master/score-submission.md

+

Type declaration

getBeatmapUserScore: ((this, beatmap, user, config?) => Promise<UserScore>) = Beatmap.UserScore.getOne

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

-

Type declaration

Returns

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

-
getBeatmapUserScores: ((this, beatmap, user, config?) => Promise<Legacy[]>) = Beatmap.UserScore.getMultiple

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

-

Type declaration

getBeatmaps: ((this, beatmaps) => Promise<WithFailtimesMaxcombo[]>) = Beatmap.getMultiple

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

-

Type declaration

lookupBeatmap: ((this, query) => Promise<WithFailtimesBeatmapset>) = Beatmap.lookup

Get extensive beatmap data about whichever beatmap you want!

-

Type declaration

    • (this, query): Promise<WithFailtimesBeatmapset>
    • Parameters

      • this: API
      • query: {
            checksum?: string;
            filename?: string;
            id?: number;
        }
        • Optional checksum?: string
        • Optional filename?: string
        • Optional id?: number

      Returns Promise<WithFailtimesBeatmapset>

Beatmapset Functions

getBeatmapset: ((this, beatmapset) => Promise<Plus>) = Beatmapset.getOne

Get extensive beatmapset data about whichever beatmapset you want!

-

Type declaration

getBeatmapsetDiscussionPosts: ((this, from?, types?, config?) => Promise<{
    beatmapsets: WithHype[];
    cursor_string: string | null;
    posts: Beatmapset.Discussion.Post[];
    users: User[];
}>) = Beatmapset.Discussion.Post.getMultiple

Get complex data about the posts of a beatmapset's discussion or of a user!

-

Type declaration

    • (this, from?, types?, config?): Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            discussion?: number | Discussion;
            user?: number | User;
        }
        • Optional discussion?: number | Discussion
        • Optional user?: number | User
      • Optional types: ("first" | "reply" | "system")[]
      • Optional config: Beatmapset.Config

      Returns Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

-

Returns

Relevant posts and info about them

-
getBeatmapsetDiscussionVotes: ((this, from?, score?, config?) => Promise<{
    cursor_string: string | null;
    discussions: Discussion[];
    users: WithGroups[];
    votes: Vote[];
}>) = Beatmapset.Discussion.Vote.getMultiple

Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

-

Type declaration

    • (this, from?, score?, config?): Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            discussion?: number | Discussion;
            vote_giver?: number | User;
            vote_receiver?: number | User;
        }
        • Optional discussion?: number | Discussion
        • Optional vote_giver?: number | User
        • Optional vote_receiver?: number | User
      • Optional score: 1 | -1
      • Optional config: Beatmapset.Config

      Returns Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

-

Returns

Relevant votes and info about them

-
getBeatmapsetDiscussions: ((this, from?, filter?, config?) => Promise<{
    beatmaps: Beatmap.Extended[];
    beatmapsets: Beatmapset.Extended[];
    cursor_string: string | null;
    discussions: WithStartingpost[];
    included_discussions: WithStartingpost[];
    reviews_config: {
        max_blocks: number;
    };
    users: WithGroups[];
}>) = Beatmapset.Discussion.getMultiple

Get complex data about the discussion page of any beatmapet that you want!

-

Type declaration

    • (this, from?, filter?, config?): Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            beatmapset?: number | Beatmapset;
            status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified";
            user?: number | User;
        }
        • Optional beatmapset?: number | Beatmapset
        • Optional status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified"
        • Optional user?: number | User
      • Optional filter: {
            only_unresolved?: boolean;
            types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[];
        }
        • Optional only_unresolved?: boolean
        • Optional types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[]
      • Optional config: Beatmapset.Config

      Returns Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

-

Returns

Relevant discussions and info about them

-
getBeatmapsetEvents: ((this, from?, types?, config?) => Promise<{
    events: Beatmapset.Event.Any[];
    users: WithGroups[];
}>) = Beatmapset.Event.getMultiple

Get complex data about the events of a beatmapset and the users involved with them!

-

Type declaration

    • (this, from?, types?, config?): Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            beatmapset?: number | Beatmapset;
            max_date?: Date;
            min_date?: Date;
            user?: number | User;
        }
        • Optional beatmapset?: number | Beatmapset
        • Optional max_date?: Date
        • Optional min_date?: Date
        • Optional user?: number | User
      • Optional types: ("nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change")[]
      • Optional config: Beatmapset.Config

      Returns Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, -and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

-

Returns

Relevant events and users

-
lookupBeatmapset: ((this, beatmap) => Promise<Plus>) = Beatmapset.lookup

Get extensive data about a beatmapset by using a beatmap!

-

Type declaration

    • (this, beatmap): Promise<Plus>
    • Parameters

      Returns Promise<Plus>

searchBeatmapsets: ((this, query?) => Promise<{
    beatmapsets: WithBeatmapPacktags[];
    cursor_string: string | null;
    error: any | null;
    recommended_difficulty: number | null;
    total: number;
}>) = Beatmapset.search

Search for beatmapsets as if you were on the website or on lazer!

-

Type declaration

    • (this, query?): Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>
    • Parameters

      • this: API
      • Optional query: {
            categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps";
            cursor_string?: string;
            extra?: ("must_have_video" | "must_have_storyboard")[];
            general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[];
            genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | Jazz;
            hide_explicit_content?: true;
            keywords?: string;
            language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | Other;
            mode?: Ruleset;
            played?: "Played" | "Unplayed";
            rank_achieved?: ("A" | "Silver SS" | "SS" | "Silver S" | "S" | "B" | "C" | "D")[];
            sort?: {
                by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated";
                in: "desc" | "asc";
            };
        }
        • Optional categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps"

          Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)

          -
        • Optional cursor_string?: string

          The thing you've got from a previous request to get another page of results!

          -
        • Optional extra?: ("must_have_video" | "must_have_storyboard")[]

          Should all sets have a video, a storyboard, maybe both at once?

          -
        • Optional general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[]

          Various filters to activate

          -
        • Optional genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | Jazz

          Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)

          -

          Remarks

          "Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947, it's excluded because it's counter-intuitive +

          Parameters

          • this: API
          • beatmap: number | Beatmap

            The Beatmap in question

            +
          • Optionalconfig: Beatmap.Config

            Specify the score's ruleset, mods, type (legacy_only should not be supported)

            +

          Returns Promise<Solo[]>

          Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy

          +

      Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy

      +
getBeatmapUserScore: ((this: API, beatmap: number | Beatmap, user: number | User, config?: Beatmap.Config) => Promise<UserScore>) = Beatmap.UserScore.getOne

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

+

Type declaration

    • (this, beatmap, user, config?): Promise<UserScore>
    • Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap the score was made on

        +
      • user: number | User

        The User who made the score

        +
      • Optionalconfig: Beatmap.Config

        Specify the score's ruleset, the score's mods, prevent a lazer score from being returned (type should not be supported)

        +

      Returns Promise<UserScore>

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

      +

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

+
getBeatmapUserScores: ((this: API, beatmap: number | Beatmap, user: number | User, config?: Beatmap.Config) => Promise<Legacy[]>) = Beatmap.UserScore.getMultiple

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

+

Type declaration

    • (this, beatmap, user, config?): Promise<Legacy[]>
    • Get the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap the scores were made on

        +
      • user: number | User

        The User who made the scores

        +
      • Optionalconfig: Beatmap.Config

        Specify the score's ruleset, prevent a lazer score from being returned (mods and type should not be supported)

        +

      Returns Promise<Legacy[]>

getBeatmaps: ((this: API, beatmaps: (number | Beatmap)[]) => Promise<WithFailtimesMaxcombo[]>) = Beatmap.getMultiple

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

+

Type declaration

    • (this, beatmaps): Promise<WithFailtimesMaxcombo[]>
    • Get extensive beatmap data for up to 50 beatmaps at once!

      +

      Parameters

      • this: API
      • beatmaps: (number | Beatmap)[]

        An array of beatmaps or of objects that have the id of the beatmaps you're trying to get

        +

      Returns Promise<WithFailtimesMaxcombo[]>

lookupBeatmap: ((this: API, query: {
    checksum?: string;
    filename?: string;
    id?: number;
}) => Promise<WithFailtimesBeatmapset>) = Beatmap.lookup

Get extensive beatmap data about whichever beatmap you want!

+

Type declaration

    • (this, query): Promise<WithFailtimesBeatmapset>
    • Get extensive beatmap data about whichever beatmap you want!

      +

      Parameters

      • this: API
      • query: {
            checksum?: string;
            filename?: string;
            id?: number;
        }

        What to specify in order to find the right beatmap

        +
        • Optionalchecksum?: string
        • Optionalfilename?: string
        • Optionalid?: number

      Returns Promise<WithFailtimesBeatmapset>

Beatmapset Functions

getBeatmapset: ((this: API, beatmapset: number | Beatmapset) => Promise<Plus>) = Beatmapset.getOne

Get extensive beatmapset data about whichever beatmapset you want!

+

Type declaration

    • (this, beatmapset): Promise<Plus>
    • Get extensive beatmapset data about whichever beatmapset you want!

      +

      Parameters

      • this: API
      • beatmapset: number | Beatmapset

        The beatmapset or the id of the beatmapset you're trying to get

        +

      Returns Promise<Plus>

getBeatmapsetDiscussionPosts: ((this: API, from?: {
    discussion?: number | Discussion;
    user?: number | User;
}, types?: ("first" | "reply" | "system")[], config?: Beatmapset.Config) => Promise<{
    beatmapsets: WithHype[];
    cursor_string: string | null;
    posts: Beatmapset.Discussion.Post[];
    users: User[];
}>) = Beatmapset.Discussion.Post.getMultiple

Get complex data about the posts of a beatmapset's discussion or of a user!

+

Type declaration

    • (this, from?, types?, config?): Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>
    • Get complex data about the posts of a beatmapset's discussion or of a user!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            discussion?: number | Discussion;
            user?: number | User;
        }

        From where/who are the posts coming from? A specific discussion, a specific user?

        +
      • Optionaltypes: ("first" | "reply" | "system")[]

        What kind of posts?

        +
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>

      Relevant posts and info about them

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

+

Relevant posts and info about them

+
getBeatmapsetDiscussionVotes: ((this: API, from?: {
    discussion?: number | Discussion;
    vote_giver?: number | User;
    vote_receiver?: number | User;
}, score?: 1 | -1, config?: Beatmapset.Config) => Promise<{
    cursor_string: string | null;
    discussions: Discussion[];
    users: WithGroups[];
    votes: Vote[];
}>) = Beatmapset.Discussion.Vote.getMultiple

Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

+

Type declaration

    • (this, from?, score?, config?): Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>
    • Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            discussion?: number | Discussion;
            vote_giver?: number | User;
            vote_receiver?: number | User;
        }

        The discussion with the votes, the user who voted, the user who's gotten the votes...

        +
        • Optionaldiscussion?: number | Discussion
        • Optionalvote_giver?: number | User
        • Optionalvote_receiver?: number | User
      • Optionalscore: 1 | -1

        An upvote (1) or a downvote (-1)

        +
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>

      Relevant votes and info about them

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

+

Relevant votes and info about them

+
getBeatmapsetDiscussions: ((this: API, from?: {
    beatmapset?: number | Beatmapset;
    status?:
        | "all"
        | "ranked"
        | "qualified"
        | "disqualified"
        | "never_qualified";
    user?: number | User;
}, filter?: {
    only_unresolved?: boolean;
    types?: (
        | "suggestion"
        | "problem"
        | "mapper_note"
        | "praise"
        | "hype"
        | "review")[];
}, config?: Beatmapset.Config) => Promise<{
    beatmaps: Beatmap.Extended[];
    beatmapsets: Beatmapset.Extended[];
    cursor_string: string | null;
    discussions: WithStartingpost[];
    included_discussions: WithStartingpost[];
    reviews_config: {
        max_blocks: number;
    };
    users: WithGroups[];
}>) = Beatmapset.Discussion.getMultiple

Get complex data about the discussion page of any beatmapet that you want!

+

Type declaration

    • (this, from?, filter?, config?): Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>
    • Get complex data about the discussion page of any beatmapet that you want!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            beatmapset?: number | Beatmapset;
            status?:
                | "all"
                | "ranked"
                | "qualified"
                | "disqualified"
                | "never_qualified";
            user?: number | User;
        }

        From where/who are the discussions coming from? Maybe only qualified sets?

        +
        • Optionalbeatmapset?: number | Beatmapset
        • Optionalstatus?:
              | "all"
              | "ranked"
              | "qualified"
              | "disqualified"
              | "never_qualified"
        • Optionaluser?: number | User
      • Optionalfilter: {
            only_unresolved?: boolean;
            types?: (
                | "suggestion"
                | "problem"
                | "mapper_note"
                | "praise"
                | "hype"
                | "review")[];
        }

        Should those discussions only be unresolved problems, for example?

        +
        • Optionalonly_unresolved?: boolean
        • Optionaltypes?: (
              | "suggestion"
              | "problem"
              | "mapper_note"
              | "praise"
              | "hype"
              | "review")[]
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>

      Relevant discussions and info about them

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

+

Relevant discussions and info about them

+
getBeatmapsetEvents: ((this: API, from?: {
    beatmapset?: number | Beatmapset;
    max_date?: Date;
    min_date?: Date;
    user?: number | User;
}, types?: (
    | "nominate"
    | "love"
    | "remove_from_loved"
    | "qualify"
    | "disqualify"
    | "approve"
    | "rank"
    | "kudosu_allow"
    | "kudosu_deny"
    | "kudosu_gain"
    | "kudosu_lost"
    | "kudosu_recalculate"
    | "issue_resolve"
    | "issue_reopen"
    | "discussion_lock"
    | "discussion_unlock"
    | "discussion_delete"
    | "discussion_restore"
    | "discussion_post_delete"
    | "discussion_post_restore"
    | "nomination_reset"
    | "nomination_reset_received"
    | "genre_edit"
    | "language_edit"
    | "nsfw_toggle"
    | "offset_edit"
    | "tags_edit"
    | "beatmap_owner_change")[], config?: Beatmapset.Config) => Promise<{
    events: Beatmapset.Event.Any[];
    users: WithGroups[];
}>) = Beatmapset.Event.getMultiple

Get complex data about the events of a beatmapset and the users involved with them!

+

Type declaration

    • (this, from?, types?, config?): Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>
    • Get complex data about the events of a beatmapset and the users involved with them!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            beatmapset?: number | Beatmapset;
            max_date?: Date;
            min_date?: Date;
            user?: number | User;
        }

        Which beatmapset, or caused by which user? When?

        +
        • Optionalbeatmapset?: number | Beatmapset
        • Optionalmax_date?: Date
        • Optionalmin_date?: Date
        • Optionaluser?: number | User
      • Optionaltypes: (
            | "nominate"
            | "love"
            | "remove_from_loved"
            | "qualify"
            | "disqualify"
            | "approve"
            | "rank"
            | "kudosu_allow"
            | "kudosu_deny"
            | "kudosu_gain"
            | "kudosu_lost"
            | "kudosu_recalculate"
            | "issue_resolve"
            | "issue_reopen"
            | "discussion_lock"
            | "discussion_unlock"
            | "discussion_delete"
            | "discussion_restore"
            | "discussion_post_delete"
            | "discussion_post_restore"
            | "nomination_reset"
            | "nomination_reset_received"
            | "genre_edit"
            | "language_edit"
            | "nsfw_toggle"
            | "offset_edit"
            | "tags_edit"
            | "beatmap_owner_change")[]

        What kinds of events?

        +
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>

      Relevant events and users

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, +and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, +and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

+

Relevant events and users

+
lookupBeatmapset: ((this: API, beatmap: number | Beatmap) => Promise<Plus>) = Beatmapset.lookup

Get extensive data about a beatmapset by using a beatmap!

+

Type declaration

    • (this, beatmap): Promise<Plus>
    • Get extensive data about a beatmapset by using a beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        A beatmap from the beatmapset you're looking for

        +

      Returns Promise<Plus>

searchBeatmapsets: ((this: API, query?: {
    categories?:
        | "Any"
        | "Ranked"
        | "Qualified"
        | "Loved"
        | "Favourites"
        | "Pending"
        | "WIP"
        | "Graveyard"
        | "My Maps";
    cursor_string?: string;
    extra?: ("must_have_video" | "must_have_storyboard")[];
    general?: (
        | "Recommended difficulty"
        | "Include converted beatmaps"
        | "Subscribed mappers"
        | "Spotlighted beatmaps"
        | "Featured Artists")[];
    genre?:
        | Unspecified
        | any[any]
        | Anime
        | Rock
        | Pop
        | Other
        | Novelty
        | any[any]
        | Electronic
        | Metal
        | Classical
        | Folk
        | Jazz;
    hide_explicit_content?: true;
    keywords?: string;
    language?:
        | Unspecified
        | English
        | Japanese
        | Chinese
        | Instrumental
        | Korean
        | French
        | German
        | Swedish
        | Spanish
        | Italian
        | Russian
        | Polish
        | Other;
    mode?: Ruleset;
    played?: "Played" | "Unplayed";
    rank_achieved?: (
        | "A"
        | "Silver SS"
        | "SS"
        | "Silver S"
        | "S"
        | "B"
        | "C"
        | "D")[];
    sort?: {
        by:
            | "title"
            | "artist"
            | "ranked"
            | "difficulty"
            | "rating"
            | "plays"
            | "favourites"
            | "updated";
        in: "desc" | "asc";
    };
}) => Promise<{
    beatmapsets: WithBeatmapPacktags[];
    cursor_string: string | null;
    error: any | null;
    recommended_difficulty: number | null;
    total: number;
}>) = Beatmapset.search

Search for beatmapsets as if you were on the website or on lazer!

+

Type declaration

    • (this, query?): Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>
    • Search for beatmapsets as if you were on the website or on lazer!

      +

      Parameters

      • this: API
      • Optionalquery: {
            categories?:
                | "Any"
                | "Ranked"
                | "Qualified"
                | "Loved"
                | "Favourites"
                | "Pending"
                | "WIP"
                | "Graveyard"
                | "My Maps";
            cursor_string?: string;
            extra?: ("must_have_video" | "must_have_storyboard")[];
            general?: (
                | "Recommended difficulty"
                | "Include converted beatmaps"
                | "Subscribed mappers"
                | "Spotlighted beatmaps"
                | "Featured Artists")[];
            genre?:
                | Unspecified
                | any[any]
                | Anime
                | Rock
                | Pop
                | Other
                | Novelty
                | any[any]
                | Electronic
                | Metal
                | Classical
                | Folk
                | Jazz;
            hide_explicit_content?: true;
            keywords?: string;
            language?:
                | Unspecified
                | English
                | Japanese
                | Chinese
                | Instrumental
                | Korean
                | French
                | German
                | Swedish
                | Spanish
                | Italian
                | Russian
                | Polish
                | Other;
            mode?: Ruleset;
            played?: "Played" | "Unplayed";
            rank_achieved?: (
                | "A"
                | "Silver SS"
                | "SS"
                | "Silver S"
                | "S"
                | "B"
                | "C"
                | "D")[];
            sort?: {
                by:
                    | "title"
                    | "artist"
                    | "ranked"
                    | "difficulty"
                    | "rating"
                    | "plays"
                    | "favourites"
                    | "updated";
                in: "desc" | "asc";
            };
        }

        All the filters and sorting options that you'd normally find on the website or on lazer

        +
        • Optionalcategories?:
              | "Any"
              | "Ranked"
              | "Qualified"
              | "Loved"
              | "Favourites"
              | "Pending"
              | "WIP"
              | "Graveyard"
              | "My Maps"

          Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)

          +
        • Optionalcursor_string?: string

          The thing you've got from a previous request to get another page of results!

          +
        • Optionalextra?: ("must_have_video" | "must_have_storyboard")[]

          Should all sets have a video, a storyboard, maybe both at once?

          +
        • Optionalgeneral?: (
              | "Recommended difficulty"
              | "Include converted beatmaps"
              | "Subscribed mappers"
              | "Spotlighted beatmaps"
              | "Featured Artists")[]

          Various filters to activate

          +
        • Optionalgenre?:
              | Unspecified
              | any[any]
              | Anime
              | Rock
              | Pop
              | Other
              | Novelty
              | any[any]
              | Electronic
              | Metal
              | Classical
              | Folk
              | Jazz

          Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)

          +

          "Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947, it's excluded because it's counter-intuitive and near useless (but you can do something like 1-1 if you actually want that!)

          -
        • Optional hide_explicit_content?: true

          Use this to hide all sets that are marked as explicit

          -
        • Optional keywords?: string

          What you'd put in the searchbar, like the name of a beatmapset or a mapper!

          -
        • Optional language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | Other

          Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)

          -

          Remarks

          "Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive +

        • Optionalhide_explicit_content?: true

          Use this to hide all sets that are marked as explicit

          +
        • Optionalkeywords?: string

          What you'd put in the searchbar, like the name of a beatmapset or a mapper!

          +
        • Optionallanguage?:
              | Unspecified
              | English
              | Japanese
              | Chinese
              | Instrumental
              | Korean
              | French
              | German
              | Swedish
              | Spanish
              | Italian
              | Russian
              | Polish
              | Other

          Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)

          +

          "Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive and near useless (but you can do something like 1-1 if you actually want that!)

          -
        • Optional mode?: Ruleset

          Only get sets that have maps that you can play in the ruleset of your choice

          -
        • Optional played?: "Played" | "Unplayed"

          Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?

          -
        • Optional rank_achieved?: ("A" | "Silver SS" | "SS" | "Silver S" | "S" | "B" | "C" | "D")[]

          Does the authorized user with osu!supporter have already achieved certain ranks on those sets?

          -
        • Optional sort?: {
              by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated";
              in: "desc" | "asc";
          }

          Sort by what, in ascending/descending order

          -
          • by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated"
          • in: "desc" | "asc"

      Returns Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>

Remarks

This does not bypass the current osu!supporter requirement for certain filters

-

Returns

Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

-

Changelog Functions

getChangelogBuild: ((this, stream, build) => Promise<WithChangelogentriesVersions>) = Changelog.Build.getOne

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

-

Type declaration

getChangelogBuilds: ((this, stream?, range?, message_formats?) => Promise<WithUpdatestreamsChangelogentries[]>) = Changelog.Build.getMultiple

Get up to 21 versions/updates/builds!

-

Type declaration

    • (this, stream?, range?, message_formats?): Promise<WithUpdatestreamsChangelogentries[]>
    • Parameters

      • this: API
      • Optional stream: string
      • Optional range: {
            from?: string;
            to?: string | number;
        }
        • Optional from?: string

          The name of the build

          -
        • Optional to?: string | number

          The name or the id of the build

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

      Returns Promise<WithUpdatestreamsChangelogentries[]>

getChangelogStreams: ((this) => Promise<WithLatestbuildUsercount[]>) = Changelog.UpdateStream.getAll

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

-

Type declaration

lookupChangelogBuild: ((this, changelog, message_formats?) => Promise<WithChangelogentriesVersions>) = Changelog.Build.lookup

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

-

Type declaration

Chat Functions

createChatAnnouncementChannel: ((this, channel, user_targets, message) => Promise<Channel>) = Chat.Channel.createAnnouncement

Create a new announcement!

-

Type declaration

    • (this, channel, user_targets, message): Promise<Channel>
    • Parameters

      • this: API
      • channel: {
            description: string;
            name: string;
        }
        • description: string
        • name: string
      • user_targets: (number | User)[]
      • message: string

      Returns Promise<Channel>

Remarks

From my understanding, this WILL 403 unless the user is kinda special

-

Returns

The newly created channel!

-
createChatPrivateChannel: ((this, user_target) => Promise<Channel>) = Chat.Channel.createPrivate

Create/Open/Join a private messages chat channel!

-

Type declaration

    • (this, user_target): Promise<Channel>
    • Parameters

      • this: API
      • user_target: number | User

      Returns Promise<Channel>

Returns

The newly created channel!

-
getChatChannel: ((this, channel) => Promise<WithDetails>) = Chat.Channel.getOne

Get a ChatChannel that you have joined, and the users in it if it is a private channel!

-

Type declaration

Remarks

Will 404 if the user has not joined the channel (use joinChatChannel for that)

-
getChatChannels: ((this) => Promise<Channel[]>) = Chat.Channel.getAll

Get a list of all publicly joinable channels!

-

Type declaration

getChatMessages: ((this, channel, limit?, since?, until?) => Promise<Message[]>) = Chat.Message.getMultiple

Get the recent messages of a specific ChatChannel!

-

Type declaration

    • (this, channel, limit?, since?, until?): Promise<Message[]>
    • Parameters

      Returns Promise<Message[]>

joinChatChannel: ((this, channel, user?) => Promise<WithDetails>) = Chat.Channel.joinOne

Join a public or multiplayer ChatChannel, allowing you to interact with it!

-

Type declaration

keepChatAlive: ((this, since?) => Promise<UserSilence[]>) = Chat.keepAlive

Needs to be done periodically to reset chat activity timeout

-

Type declaration

Remarks

Every 30 seconds is a good idea

-

Returns

A list of recent silences

-
leaveChatChannel: ((this, channel, user?) => Promise<void>) = Chat.Channel.leaveOne

Leave/Close a public ChatChannel!

-

Type declaration

    • (this, channel, user?): Promise<void>
    • Parameters

      Returns Promise<void>

markChatChannelAsRead: ((this, channel, message) => Promise<void>) = Chat.Channel.markAsRead

Mark a certain channel as read up to a given message!

-

Type declaration

    • (this, channel, message): Promise<void>
    • Parameters

      Returns Promise<void>

sendChatMessage: ((this, channel, message, is_action?) => Promise<Message>) = Chat.Message.send

Send a message in a ChatChannel!

-

Type declaration

    • (this, channel, message, is_action?): Promise<Message>
    • Parameters

      • this: API
      • channel: number | Channel
      • message: string
      • is_action: boolean = false

      Returns Promise<Message>

Returns

The newly sent ChatMessage!

-
sendChatPrivateMessage: ((this, user_target, message, is_action?, uuid?) => Promise<{
    channel: Channel;
    message: Message;
}>) = Chat.Message.sendPrivate

Send a private message to someone!

-

Type declaration

    • (this, user_target, message, is_action?, uuid?): Promise<{
          channel: Channel;
          message: Message;
      }>
    • Parameters

      • this: API
      • user_target: number | User
      • message: string
      • is_action: boolean = false
      • Optional uuid: string

      Returns Promise<{
          channel: Channel;
          message: Message;
      }>

Remarks

You don't need to use createChatPrivateChannel before sending a message

-

Returns

The message you sent

-

Comment Functions

getComment: ((this, comment) => Promise<Bundle>) = Comment.getOne

Get a specific comment by using its id!

-

Type declaration

getComments: ((this, from?, parent?, sort?) => Promise<WithTotalToplevelcount>) = Comment.getMultiple

Get comments that meet any of your requirements!

-

Type declaration

    • (this, from?, parent?, sort?): Promise<WithTotalToplevelcount>
    • Parameters

      • this: API
      • Optional from: {
            id: number;
            type: "beatmapset" | "build" | "news_post";
        }
        • id: number
        • type: "beatmapset" | "build" | "news_post"
      • Optional parent: number | Comment
      • Optional sort: {
            after?: number | Comment;
            cursor?: null | {
                created_at: Date;
                id: number;
            };
            type?: "new" | "top" | "old";
        }
        • Optional after?: number | Comment
        • Optional cursor?: null | {
              created_at: Date;
              id: number;
          }
        • Optional type?: "new" | "top" | "old"

      Returns Promise<WithTotalToplevelcount>

Event Functions

getEvents: ((this, sort?, cursor_string?) => Promise<{
    cursor_string: string | null;
    events: Event.Any[];
}>) = Event.getMultiple

Get everything note-worthy that happened on osu! recently!

-

Type declaration

    • (this, sort?, cursor_string?): Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>
    • Parameters

      • this: API
      • sort: "id_desc" | "id_asc" = "id_desc"
      • Optional cursor_string: string

      Returns Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>

Forum Functions

createForumTopic: ((this, forum_id, title, text, poll?) => Promise<{
    post: Forum.Post;
    topic: Topic;
}>) = Forum.Topic.create

Create a new ForumTopic in the forum of your choice!

-

Type declaration

    • (this, forum_id, title, text, poll?): Promise<{
          post: Forum.Post;
          topic: Topic;
      }>
    • Parameters

      • this: API
      • forum_id: number
      • title: string
      • text: string
      • Optional poll: {
            hide_results?: boolean;
            length_days: number;
            max_options?: number;
            options: string[];
            title: string;
            vote_change?: boolean;
        }
        • Optional hide_results?: boolean

          Should the results of the poll be hidden while the voting period is still active? (defaults to false)

          +
        • Optionalmode?: Ruleset

          Only get sets that have maps that you can play in the ruleset of your choice

          +
        • Optionalplayed?: "Played" | "Unplayed"

          Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?

          +
        • Optionalrank_achieved?: (
              | "A"
              | "Silver SS"
              | "SS"
              | "Silver S"
              | "S"
              | "B"
              | "C"
              | "D")[]

          Does the authorized user with osu!supporter have already achieved certain ranks on those sets?

          +
        • Optionalsort?: {
              by:
                  | "title"
                  | "artist"
                  | "ranked"
                  | "difficulty"
                  | "rating"
                  | "plays"
                  | "favourites"
                  | "updated";
              in: "desc" | "asc";
          }

          Sort by what, in ascending/descending order

          +
          • by:
                | "title"
                | "artist"
                | "ranked"
                | "difficulty"
                | "rating"
                | "plays"
                | "favourites"
                | "updated"
          • in: "desc" | "asc"

      Returns Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>

      Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

      +

      This does not bypass the current osu!supporter requirement for certain filters

      +

This does not bypass the current osu!supporter requirement for certain filters

+

Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

+

Changelog Functions

getChangelogBuild: ((this: API, stream: string, build: string) => Promise<WithChangelogentriesVersions>) = Changelog.Build.getOne

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

+

Type declaration

    • (this, stream, build): Promise<WithChangelogentriesVersions>
    • Get details about the version/update/build of something related to osu!

      +

      Parameters

      • this: API
      • 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<WithChangelogentriesVersions>

getChangelogBuilds: ((this: API, stream?: string, range?: {
    from?: string;
    to?: string | number;
}, message_formats?: ("html" | "markdown")[]) => Promise<WithUpdatestreamsChangelogentries[]>) = Changelog.Build.getMultiple

Get up to 21 versions/updates/builds!

+

Type declaration

    • (this, stream?, range?, message_formats?): Promise<WithUpdatestreamsChangelogentries[]>
    • Get up to 21 versions/updates/builds!

      +

      Parameters

      • this: API
      • Optionalstream: string

        Only get builds from a specific stream

        +
      • Optionalrange: {
            from?: string;
            to?: string | number;
        }

        Get builds that were released before/after (and including) those builds

        +
        • Optionalfrom?: string

          The name of the build

          +
        • Optionalto?: string | number

          The name or the id of the build

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

        changelog_entries will have a message property if markdown, message_html property if html (defaults to both)

        +

      Returns Promise<WithUpdatestreamsChangelogentries[]>

getChangelogStreams: ((this: API) => Promise<WithLatestbuildUsercount[]>) = Changelog.UpdateStream.getAll

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

+

Type declaration

    • (this): Promise<WithLatestbuildUsercount[]>
    • An effective way to get all available streams, as well as their latest version!

      +

      Parameters

      Returns Promise<WithLatestbuildUsercount[]>

      const names_of_streams = (await api.getChangelogStreams()).map(s => s.name)
      +
      + +
lookupChangelogBuild: ((this: API, changelog: string | number, message_formats?: ("html" | "markdown")[]) => Promise<WithChangelogentriesVersions>) = Changelog.Build.lookup

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

+

Type declaration

    • (this, changelog, message_formats?): Promise<WithChangelogentriesVersions>
    • Get details about the version/update/build of something related to osu!

      +

      Parameters

      • this: API
      • changelog: string | number

        A stream name like lazer, a build version like 2023.1026.0, or the id of a build

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

        changelog_entries will have a message property if markdown, message_html property if html (defaults to both)

        +

      Returns Promise<WithChangelogentriesVersions>

Chat Functions

createChatAnnouncementChannel: ((this: API, channel: {
    description: string;
    name: string;
}, user_targets: (number | User)[], message: string) => Promise<Channel>) = Chat.Channel.createAnnouncement

Create a new announcement!

+

Type declaration

    • (this, channel, user_targets, message): Promise<Channel>
    • Create a new announcement!

      +

      Parameters

      • this: API
      • channel: {
            description: string;
            name: string;
        }

        Details of the channel you're creating

        +
        • description: string
        • name: string
      • user_targets: (number | User)[]

        The people that will receive your message

        +
      • message: string

        The message to send with the announcement

        +

      Returns Promise<Channel>

      The newly created channel!

      +

      "chat.write_manage"

      +

      From my understanding, this WILL 403 unless the user is kinda special

      +

From my understanding, this WILL 403 unless the user is kinda special

+

The newly created channel!

+
createChatPrivateChannel: ((this: API, user_target: number | User) => Promise<Channel>) = Chat.Channel.createPrivate

Create/Open/Join a private messages chat channel!

+

Type declaration

    • (this, user_target): Promise<Channel>
    • Create/Open/Join a private messages chat channel!

      +

      Parameters

      • this: API
      • user_target: number | User

        The other user able to read and send messages in this channel

        +

      Returns Promise<Channel>

      The newly created channel!

      +

The newly created channel!

+
getChatChannel: ((this: API, channel: number | Channel) => Promise<WithDetails>) = Chat.Channel.getOne

Get a ChatChannel that you have joined, and the users in it if it is a private channel!

+

Type declaration

    • (this, channel): Promise<WithDetails>
    • Get a ChatChannel that you have joined, and the users in it if it is a private channel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel in question

        +

      Returns Promise<WithDetails>

      "chat.read"

      +

      Will 404 if the user has not joined the channel (use joinChatChannel for that)

      +

Will 404 if the user has not joined the channel (use joinChatChannel for that)

+
getChatChannels: ((this: API) => Promise<Channel[]>) = Chat.Channel.getAll

Get a list of all publicly joinable channels!

+

Type declaration

getChatMessages: ((this: API, channel: number | Channel, limit?: number, since?: number | Message, until?: number | Message) => Promise<Message[]>) = Chat.Message.getMultiple

Get the recent messages of a specific ChatChannel!

+

Type declaration

    • (this, channel, limit?, since?, until?): Promise<Message[]>
    • Get the recent messages of a specific ChatChannel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The Channel you wanna get the messages from

        +
      • limit: number = 20

        The maximum amount of messages you want to get, up to 50! (defaults to 20)

        +
      • Optionalsince: number | Message

        Get the messages sent after this message

        +
      • Optionaluntil: number | Message

        Get the messages sent up to but not including this message

        +

      Returns Promise<Message[]>

joinChatChannel: ((this: API, channel: number | Channel, user?: number | User) => Promise<WithDetails>) = Chat.Channel.joinOne

Join a public or multiplayer ChatChannel, allowing you to interact with it!

+

Type declaration

    • (this, channel, user?): Promise<WithDetails>
    • Join a public or multiplayer ChatChannel, allowing you to interact with it!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel you wanna join

        +
      • Optionaluser: number | User

        The user joining the channel (defaults to the presumed authorized user (api.user))

        +

      Returns Promise<WithDetails>

keepChatAlive: ((this: API, since?: {
    message?: number | Message;
    user_silence?: number | UserSilence;
}) => Promise<UserSilence[]>) = Chat.keepAlive

Needs to be done periodically to reset chat activity timeout

+

Type declaration

    • (this, since?): Promise<UserSilence[]>
    • Needs to be done periodically to reset chat activity timeout

      +

      Parameters

      • this: API
      • Optionalsince: {
            message?: number | Message;
            user_silence?: number | UserSilence;
        }

        UserSilences that are before that will not be returned!

        +

      Returns Promise<UserSilence[]>

      A list of recent silences

      +

      "chat.read"

      +

      Every 30 seconds is a good idea

      +

Every 30 seconds is a good idea

+

A list of recent silences

+
leaveChatChannel: ((this: API, channel: number | Channel, user?: number | User) => Promise<void>) = Chat.Channel.leaveOne

Leave/Close a public ChatChannel!

+

Type declaration

    • (this, channel, user?): Promise<void>
    • Leave/Close a public ChatChannel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel you wanna leave/close

        +
      • Optionaluser: number | User

        The user leaving/closing the channel (defaults to the presumed authorized user (api.user))

        +

      Returns Promise<void>

markChatChannelAsRead: ((this: API, channel: number | Channel, message: number | Message) => Promise<void>) = Chat.Channel.markAsRead

Mark a certain channel as read up to a given message!

+

Type declaration

    • (this, channel, message): Promise<void>
    • Mark a certain channel as read up to a given message!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel in question

        +
      • message: number | Message

        You're marking this and all the messages before it as read!

        +

      Returns Promise<void>

sendChatMessage: ((this: API, channel: number | Channel, message: string, is_action?: boolean) => Promise<Message>) = Chat.Message.send

Send a message in a ChatChannel!

+

Type declaration

    • (this, channel, message, is_action?): Promise<Message>
    • Send a message in a ChatChannel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel in which you want to send your message

        +
      • message: string

        The message you wanna send

        +
      • is_action: boolean = false

        Is it a command? Like /me dances (defaults to false)

        +

      Returns Promise<Message>

      The newly sent ChatMessage!

      +

The newly sent ChatMessage!

+
sendChatPrivateMessage: ((this: API, user_target: number | User, message: string, is_action?: boolean, uuid?: string) => Promise<{
    channel: Channel;
    message: Message;
}>) = Chat.Message.sendPrivate

Send a private message to someone!

+

Type declaration

    • (this, user_target, message, is_action?, uuid?): Promise<{
          channel: Channel;
          message: Message;
      }>
    • Send a private message to someone!

      +

      Parameters

      • this: API
      • user_target: number | User

        The User you wanna send your message to!

        +
      • message: string

        The message you wanna send

        +
      • is_action: boolean = false

        Is it a command? Like /me dances (defaults to false)

        +
      • Optionaluuid: string

        A client-side message identifier

        +

      Returns Promise<{
          channel: Channel;
          message: Message;
      }>

      The message you sent

      +

      "chat.write"

      +

      You don't need to use createChatPrivateChannel before sending a message

      +

You don't need to use createChatPrivateChannel before sending a message

+

The message you sent

+

Comment Functions

getComment: ((this: API, comment: number | Comment) => Promise<Bundle>) = Comment.getOne

Get a specific comment by using its id!

+

Type declaration

    • (this, comment): Promise<Bundle>
    • Get a specific comment by using its id!

      +

      Parameters

      • this: API
      • comment: number | Comment

        The comment in question

        +

      Returns Promise<Bundle>

getComments: ((this: API, from?: {
    id: number;
    type: "beatmapset" | "build" | "news_post";
}, parent?: number | Comment, sort?: {
    after?: number | Comment;
    cursor?: null | {
        created_at: Date;
        id: number;
    };
    type?: "new" | "top" | "old";
}) => Promise<WithTotalToplevelcount>) = Comment.getMultiple

Get comments that meet any of your requirements!

+

Type declaration

    • (this, from?, parent?, sort?): Promise<WithTotalToplevelcount>
    • Get comments that meet any of your requirements!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            id: number;
            type: "beatmapset" | "build" | "news_post";
        }

        From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?

        +
        • id: number
        • type: "beatmapset" | "build" | "news_post"
      • Optionalparent: number | Comment

        The comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)

        +
      • Optionalsort: {
            after?: number | Comment;
            cursor?: null | {
                created_at: Date;
                id: number;
            };
            type?: "new" | "top" | "old";
        }

        Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?

        +
        • Optionalafter?: number | Comment
        • Optionalcursor?: null | {
              created_at: Date;
              id: number;
          }
        • Optionaltype?: "new" | "top" | "old"

      Returns Promise<WithTotalToplevelcount>

Event Functions

getEvents: ((this: API, sort?: "id_desc" | "id_asc", cursor_string?: string) => Promise<{
    cursor_string: string | null;
    events: Event.Any[];
}>) = Event.getMultiple

Get everything note-worthy that happened on osu! recently!

+

Type declaration

    • (this, sort?, cursor_string?): Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>
    • Get everything note-worthy that happened on osu! recently!

      +

      Parameters

      • this: API
      • sort: "id_desc" | "id_asc" = "id_desc"

        "id_asc" to have the oldest recent event first, "id_desc" to have the newest instead (defaults to id_desc)

        +
      • Optionalcursor_string: string

        Use a response's cursor_string with the same parameters to get the next "page" of results, so events in this instance!

        +

      Returns Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>

Forum Functions

createForumTopic: ((this: API, forum_id: number, title: string, text: string, poll?: {
    hide_results?: boolean;
    length_days: number;
    max_options?: number;
    options: string[];
    title: string;
    vote_change?: boolean;
}) => Promise<{
    post: Forum.Post;
    topic: Topic;
}>) = Forum.Topic.create

Create a new ForumTopic in the forum of your choice!

+

Type declaration

    • (this, forum_id, title, text, poll?): Promise<{
          post: Forum.Post;
          topic: Topic;
      }>
    • Create a new ForumTopic in the forum of your choice!

      +

      Parameters

      • this: API
      • forum_id: number

        The id of the forum you're creating your topic in

        +
      • title: string

        The topic's title

        +
      • text: string

        The first post's content/message

        +
      • Optionalpoll: {
            hide_results?: boolean;
            length_days: number;
            max_options?: number;
            options: string[];
            title: string;
            vote_change?: boolean;
        }

        If you want to make a poll, specify the parameters of that poll!

        +
        • Optionalhide_results?: boolean

          Should the results of the poll be hidden while the voting period is still active? (defaults to false)

        • length_days: number

          Length of voting period in days, 0 means forever

          -
        • Optional max_options?: number

          The maximum amount of votes per user! (defaults to 1)

          +
        • Optionalmax_options?: number

          The maximum amount of votes per user! (defaults to 1)

        • options: string[]

          The things the users can vote for

          -
        • title: string
        • Optional vote_change?: boolean

          Do you allow users to change their vote? (defaults to false)

          -

      Returns Promise<{
          post: Forum.Post;
          topic: Topic;
      }>

Remarks

Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

-

Returns

An object with the topic you've made, and its first initial post (which uses your text)

-
editForumPost: ((this, post, new_text) => Promise<Forum.Post>) = Forum.Post.edit

Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

-

Type declaration

Returns

The edited ForumPost

-
editForumTopicTitle: ((this, topic, new_title) => Promise<Topic>) = Forum.Topic.editTitle

Edit the title of a Forum.Topic!

-

Type declaration

    • (this, topic, new_title): Promise<Topic>
    • Parameters

      • this: API
      • topic: number | Topic
      • new_title: string

      Returns Promise<Topic>

Remarks

Use editForumPost if you wanna edit the post at the top of the topic

-

Returns

The edited ForumTopic

-
getForumTopicAndPosts: ((this, topic, config?) => Promise<{
    cursor_string: string | null;
    posts: Forum.Post[];
    topic: Topic;
}>) = Forum.getTopicAndPosts

Get a forum topic, as well as its main post (content) and the posts that were sent in it!

-

Type declaration

    • (this, topic, config?): Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>
    • Parameters

      • this: API
      • topic: number | Topic
      • Optional config: {
            cursor_string?: string;
            first_post?: number | Forum.Post;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }
        • Optional cursor_string?: string

          Use a response's cursor_string with the same parameters to get the next "page" of results, so posts in this instance!

          -
        • Optional first_post?: number | Forum.Post

          The id (or the post itself) of the first post to be returned in posts (irrelevant if using a cursor_string)

          -
        • Optional limit?: number

          How many posts maximum, up to 50

          -
        • Optional sort?: "id_desc" | "id_asc"

          "id_asc" to have the oldest post at the beginning of the posts array, "id_desc" to have the newest instead

          -

      Returns Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>

Remarks

The oldest post of a topic is the text of a topic

-
replyForumTopic: ((this, topic, text) => Promise<Forum.Post>) = Forum.Topic.reply

Make and send a Forum.Post in a Forum.Topic!

-

Type declaration

Remarks

Replying when the last post was made by the authorized user will likely cause the server to return a 403

-

Returns

The reply you've made, as a Forum.Post!

-

Home Functions

searchUser: ((this, query, page?) => Promise<{
    data: User[];
    total: number;
}>) = Home.Search.getUsers

Look for a user like you would on the website!

-

Type declaration

    • (this, query, page?): Promise<{
          data: User[];
          total: number;
      }>
    • Parameters

      • this: API
      • query: string
      • page: number = 1

      Returns Promise<{
          data: User[];
          total: number;
      }>

searchWiki: ((this, query, page?) => Promise<{
    data: WikiPage[];
    total: number;
}>) = Home.Search.getWikiPages

Look for a wiki page like you would on the website!

-

Type declaration

    • (this, query, page?): Promise<{
          data: WikiPage[];
          total: number;
      }>
    • Parameters

      • this: API
      • query: string
      • page: number = 1

      Returns Promise<{
          data: WikiPage[];
          total: number;
      }>

Multiplayer Functions

getMatch: ((this, match) => Promise<Match>) = Multiplayer.Match.getOne

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

-

Type declaration

    • (this, match): Promise<Match>
    • Parameters

      Returns Promise<Match>

getMatches: ((this, query?) => Promise<Info[]>) = Multiplayer.Match.getMultiple

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

-

Type declaration

    • (this, query?): Promise<Info[]>
    • Parameters

      • this: API
      • Optional query: {
            first_match_in_array?: number | Info;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }
        • Optional first_match_in_array?: number | Info

          Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable

          -

          Remarks

          You can use this argument differently to get all matches before/after (depending of query.sort) a certain match, +

        • title: string
        • Optionalvote_change?: boolean

          Do you allow users to change their vote? (defaults to false)

          +

      Returns Promise<{
          post: Forum.Post;
          topic: Topic;
      }>

      An object with the topic you've made, and its first initial post (which uses your text)

      +

      "forum.write"

      +

      Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

      +

Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

+

An object with the topic you've made, and its first initial post (which uses your text)

+
editForumPost: ((this: API, post: number | Forum.Post, new_text: string) => Promise<Forum.Post>) = Forum.Post.edit

Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

+

Type declaration

    • (this, post, new_text): Promise<Forum.Post>
    • Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

      +

      Parameters

      • this: API
      • post: number | Forum.Post

        The post or the id of the post in question

        +
      • new_text: string

        The new content of the post (replaces the old content)

        +

      Returns Promise<Forum.Post>

      The edited ForumPost

      +

The edited ForumPost

+
editForumTopicTitle: ((this: API, topic: number | Topic, new_title: string) => Promise<Topic>) = Forum.Topic.editTitle

Edit the title of a Forum.Topic!

+

Type declaration

    • (this, topic, new_title): Promise<Topic>
    • Edit the title of a Forum.Topic!

      +

      Parameters

      • this: API
      • topic: number | Topic

        The topic or the id of the topic in question

        +
      • new_title: string

        The new title of the topic

        +

      Returns Promise<Topic>

      The edited ForumTopic

      +

      "forum.write"

      +

      Use editForumPost if you wanna edit the post at the top of the topic

      +

Use editForumPost if you wanna edit the post at the top of the topic

+

The edited ForumTopic

+
getForumTopicAndPosts: ((this: API, topic: number | Topic, config?: {
    cursor_string?: string;
    first_post?: number | Forum.Post;
    limit?: number;
    sort?: "id_desc" | "id_asc";
}) => Promise<{
    cursor_string: string | null;
    posts: Forum.Post[];
    topic: Topic;
}>) = Forum.getTopicAndPosts

Get a forum topic, as well as its main post (content) and the posts that were sent in it!

+

Type declaration

    • (this, topic, config?): Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>
    • Get a forum topic, as well as its main post (content) and the posts that were sent in it!

      +

      Parameters

      • this: API
      • topic: number | Topic

        An object with the id of the topic in question

        +
      • Optionalconfig: {
            cursor_string?: string;
            first_post?: number | Forum.Post;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }

        How many results maximum, how to sort them, etc...

        +
        • Optionalcursor_string?: string

          Use a response's cursor_string with the same parameters to get the next "page" of results, so posts in this instance!

          +
        • Optionalfirst_post?: number | Forum.Post

          The id (or the post itself) of the first post to be returned in posts (irrelevant if using a cursor_string)

          +
        • Optionallimit?: number

          How many posts maximum, up to 50

          +
        • Optionalsort?: "id_desc" | "id_asc"

          "id_asc" to have the oldest post at the beginning of the posts array, "id_desc" to have the newest instead

          +

      Returns Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>

      The oldest post of a topic is the text of a topic

      +

The oldest post of a topic is the text of a topic

+
replyForumTopic: ((this: API, topic: number | Topic, text: string) => Promise<Forum.Post>) = Forum.Topic.reply

Make and send a Forum.Post in a Forum.Topic!

+

Type declaration

    • (this, topic, text): Promise<Forum.Post>
    • Make and send a Forum.Post in a Forum.Topic!

      +

      Parameters

      • this: API
      • topic: number | Topic

        The topic or the id of the topic you're making your reply in

        +
      • text: string

        Your reply! Your message!

        +

      Returns Promise<Forum.Post>

      The reply you've made, as a Forum.Post!

      +

      "forum.write"

      +

      Replying when the last post was made by the authorized user will likely cause the server to return a 403

      +

Replying when the last post was made by the authorized user will likely cause the server to return a 403

+

The reply you've made, as a Forum.Post!

+

Home Functions

searchUser: ((this: API, query: string, page?: number) => Promise<{
    data: User[];
    total: number;
}>) = Home.Search.getUsers

Look for a user like you would on the website!

+

Type declaration

    • (this, query, page?): Promise<{
          data: User[];
          total: number;
      }>
    • Look for a user like you would on the website!

      +

      Parameters

      • this: API
      • query: string

        What you would put in the searchbar

        +
      • page: number = 1

        You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)

        +

      Returns Promise<{
          data: User[];
          total: number;
      }>

searchWiki: ((this: API, query: string, page?: number) => Promise<{
    data: WikiPage[];
    total: number;
}>) = Home.Search.getWikiPages

Look for a wiki page like you would on the website!

+

Type declaration

    • (this, query, page?): Promise<{
          data: WikiPage[];
          total: number;
      }>
    • Look for a wiki page like you would on the website!

      +

      Parameters

      • this: API
      • query: string

        What you would put in the searchbar

        +
      • page: number = 1

        You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)

        +

      Returns Promise<{
          data: WikiPage[];
          total: number;
      }>

Multiplayer Functions

getMatch: ((this: API, match: number | Info, query?: {
    after?: number | Multiplayer.Match.Event;
    before?: number | Multiplayer.Match.Event;
    limit?: number;
}) => Promise<Match>) = Multiplayer.Match.getOne

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

+

Type declaration

    • (this, match, query?): Promise<Match>
    • Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches or mp

      +

      Parameters

      • this: API
      • match: number | Info

        The id of a match can be found at the end of its URL

        +
      • Optionalquery: {
            after?: number | Multiplayer.Match.Event;
            before?: number | Multiplayer.Match.Event;
            limit?: number;
        }

        Filter and limit the amount of events shown

        +
        • Optionalafter?: number | Multiplayer.Match.Event

          Filter FOR events AFTER this one

          +
        • Optionalbefore?: number | Multiplayer.Match.Event

          Filter FOR events BEFORE this one

          +
        • Optionallimit?: number

          From 1 to 101 events (defaults to 100)

          +

          0 is treated as 1, anything above 101 is treated as 101

          +

      Returns Promise<Match>

getMatches: ((this: API, query?: {
    first_match_in_array?: number | Info;
    limit?: number;
    sort?: "id_desc" | "id_asc";
}) => Promise<Info[]>) = Multiplayer.Match.getMultiple

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

+

Type declaration

    • (this, query?): Promise<Info[]>
    • Get the info about several matches!

      +

      Parameters

      • this: API
      • Optionalquery: {
            first_match_in_array?: number | Info;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }

        The id of the first match of the array, and the sorting and size of said array

        +
        • Optionalfirst_match_in_array?: number | Info

          Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable

          +

          You can use this argument differently to get all matches before/after (depending of query.sort) a certain match, by adding +1/-1 to its id! So if you want all matches after match_id 10 with sorting is_desc, just have this argument be 10 + 1, or 11!

          -
        • Optional limit?: number

          The maximum amount of elements returned in the array (defaults to 50)

          -
        • Optional sort?: "id_desc" | "id_asc"

          "id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)

          -

      Returns Promise<Info[]>

getPlaylistItemScores: ((this, item, limit?, sort?, cursor_string?) => Promise<Scores>) = Multiplayer.Room.PlaylistItem.getScores

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

-

Type declaration

    • (this, item, limit?, sort?, cursor_string?): Promise<Scores>
    • Parameters

      • this: API
      • item: PlaylistItem | {
            id: number;
            room_id: number;
        }
      • limit: number = 50
      • sort: "score_asc" | "score_desc" = "score_desc"
      • Optional cursor_string: string

      Returns Promise<Scores>

getRoom: ((this, room) => Promise<Room>) = Multiplayer.Room.getOne

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

-

Type declaration

    • (this, room): Promise<Room>
    • Parameters

      Returns Promise<Room>

getRoomLeaderboard: ((this, room) => Promise<{
    leaderboard: Leader[];
    user_score: WithPosition | null;
}>) = Multiplayer.Room.Leader.getMultiple

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

-

Type declaration

    • (this, room): Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>
    • Parameters

      Returns Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>

getRooms: ((this, type, mode, limit?, sort?) => Promise<Room[]>) = Multiplayer.Room.getMultiple

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

-

Type declaration

    • (this, type, mode, limit?, sort?): Promise<Room[]>
    • Parameters

      • this: API
      • type: "realtime" | "playlists"
      • mode: "all" | "active" | "ended" | "participated" | "owned"
      • limit: number = 10
      • sort: "ended" | "created" = "created"

      Returns Promise<Room[]>

NewsPost Functions

getNewsPost: ((this, post) => Promise<WithContentNavigation>) = NewsPost.getOne

Get a NewsPost, its content, and the NewsPosts right before and right after it!

-

Type declaration

getNewsPosts: ((this, year?) => Promise<NewsPost[]>) = NewsPost.getMultiple

Get all the NewsPosts of a specific year!

-

Type declaration

    • (this, year?): Promise<NewsPost[]>
    • Parameters

      • this: API
      • Optional year: number

      Returns Promise<NewsPost[]>

Remarks

If the specified year is invalid/has no news, it fallbacks to the default year

-

Other Functions

getReplay: ((this, score) => Promise<string>) = Score.getReplay

Get the replay for a score!

-

Type declaration

    • (this, score): Promise<string>
    • Parameters

      Returns Promise<string>

Returns

The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)

-
getSpotlights: ((this) => Promise<Spotlight[]>) = Spotlight.getAll

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

-

Type declaration

Remarks

The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom() -but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(

-
  • Get the backgrounds made and selected for this season or for last season!

    +
  • Optionallimit?: number

    The maximum amount of elements returned in the array (defaults to 50)

    +
  • Optionalsort?: "id_desc" | "id_asc"

    "id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)

    +

Returns Promise<Info[]>

getPlaylistItemScores: ((this: API, item: PlaylistItem | {
    id: number;
    room_id: number;
}, limit?: number, sort?: "score_asc" | "score_desc", cursor_string?: string) => Promise<Scores>) = Multiplayer.Room.PlaylistItem.getScores

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

+

Type declaration

    • (this, item, limit?, sort?, cursor_string?): Promise<Scores>
    • Get the scores on a specific item of a room!

      +

      Parameters

      • this: API
      • 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

        +
      • Optionalcursor_string: string

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

        +

      Returns Promise<Scores>

      (2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk +https://github.com/ppy/osu-web/issues/10725

      +
getRoom: ((this: API, room: number | Room) => Promise<Room>) = Multiplayer.Room.getOne

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

+

Type declaration

    • (this, room): Promise<Room>
    • Get data about a lazer multiplayer room (realtime or playlists)!

      +

      Parameters

      • this: API
      • room: number | Room

        The room or the id of the room, can be found at the end of its URL (after /multiplayer/rooms/)

        +

      Returns Promise<Room>

getRoomLeaderboard: ((this: API, room: number | Room) => Promise<{
    leaderboard: Leader[];
    user_score: WithPosition | null;
}>) = Multiplayer.Room.Leader.getMultiple

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

+

Type declaration

    • (this, room): Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>
    • Get the room stats of all the users of that room!

      +

      Parameters

      • this: API
      • room: number | Room

        The room or the id of the room in question

        +

      Returns Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>

      An object with the leaderboard, and the score and position of the authorized user under user_score

      +

      "public"

      +
getRooms: ((this: API, type: "realtime" | "playlists", mode:
    | "all"
    | "active"
    | "ended"
    | "participated"
    | "owned", limit?: number, sort?: "ended" | "created", season_id?: number) => Promise<Room[]>) = Multiplayer.Room.getMultiple

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

+

Type declaration

    • (this, type, mode, limit?, sort?, season_id?): Promise<Room[]>
    • Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!

      +

      Parameters

      • this: API
      • type: "realtime" | "playlists"

        Whether the multiplayer rooms are in playlist format (like current spotlights) or realtime

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

        The state of the room, or the relation of the authorized user with the room

        +
      • limit: number = 10

        The maximum amount of rooms to return, defaults to 10

        +
      • sort: "ended" | "created" = "created"

        Sort (where most recent is first) by creation date or end date, defaults to the creation date

        +
      • Optionalseason_id: number

        Only get rooms (playlists) that belong to a specific (modern) Beatmap Spotlights season id +(so 5'd be summer 2020's mania rooms, not winter 2022!!)

        +

      Returns Promise<Room[]>

      "public"

      +

NewsPost Functions

getNewsPost: ((this: API, post: string | number | NewsPost) => Promise<WithContentNavigation>) = NewsPost.getOne

Get a NewsPost, its content, and the NewsPosts right before and right after it!

+

Type declaration

getNewsPosts: ((this: API, year?: number) => Promise<NewsPost[]>) = NewsPost.getMultiple

Get all the NewsPosts of a specific year!

+

Type declaration

    • (this, year?): Promise<NewsPost[]>
    • Get all the NewsPosts of a specific year!

      +

      Parameters

      • this: API
      • Optionalyear: number

        The year the posts were made (defaults to current year)

        +

      Returns Promise<NewsPost[]>

      If the specified year is invalid/has no news, it fallbacks to the default year

      +

If the specified year is invalid/has no news, it fallbacks to the default year

+

Other Functions

getReplay: ((this: API, score: number | Score) => Promise<string>) = Score.getReplay

Get the replay for a score!

+

Type declaration

    • (this, score): Promise<string>
    • Get the replay for a score!

      +

      Parameters

      • this: API
      • score: number | Score

        The score that has created the replay

        +

      Returns Promise<string>

      The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)

      +

      "public"

      +

The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)

+
getSpotlights: ((this: API) => Promise<Spotlight[]>) = Spotlight.getAll

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

+

Type declaration

    • (this): Promise<Spotlight[]>
    • Get ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)

      +

      Parameters

      Returns Promise<Spotlight[]>

      The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom() +but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(

      +

The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom() +but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(

+
  • Get the backgrounds made and selected for this season or for last season!

    Returns Promise<{
        backgrounds: {
            url: string;
            user: User;
        }[];
        ends_at: Date;
    }>

    When the season ended, and for each background, its URL and its artist

    -

Ranking Functions

getCountryRanking: ((this, ruleset, page?) => Promise<Country>) = Ranking.getCountry

Get the top countries of a specific ruleset!

-

Type declaration

getKudosuRanking: ((this) => Promise<WithKudosu[]>) = Ranking.getKudosu

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

-

Type declaration

getSpotlightRanking: ((this, ruleset, spotlight, filter?) => Promise<Ranking.Spotlight>) = Ranking.getSpotlight

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

-

Type declaration

getUserRanking: ((this, ruleset, type, config?) => Promise<Ranking.User>) = Ranking.getUser

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

-

Type declaration

    • (this, ruleset, type, config?): Promise<Ranking.User>
    • Parameters

      • this: API
      • ruleset: Ruleset
      • type: "performance" | "score"
      • Optional config: {
            country?: string;
            filter?: "all" | "friends";
            page?: number;
            variant?: "4k" | "7k";
        }
        • 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 filter?: "all" | "friends"

          What kind of players do you want to see? Keep in mind friends has no effect if no authorized user

          -
        • Optional page?: number

          Imagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one

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

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

          -

      Returns Promise<Ranking.User>

User Functions

getFriends: ((this) => Promise<WithCountryCoverGroupsStatisticsSupport[]>) = User.getFriends

Get user data of each friend of the authorized user

-

Type declaration

getResourceOwner: ((this, ruleset?) => Promise<WithStatisticsrulesets>) = User.getResourceOwner

Get extensive user data about the authorized user

-

Type declaration

getUser: ((this, user, ruleset?) => Promise<User.Extended>) = User.getOne

Get extensive user data about whoever you want!

-

Type declaration

getUserBeatmaps: ((this, user, type, config?) => Promise<WithBeatmap[]>) = User.getBeatmaps

Get beatmaps favourited or made by a user!

-

Type declaration

    • (this, user, type, config?): Promise<WithBeatmap[]>
    • Parameters

      • this: API
      • user: number | User
      • type: "pending" | "favourite" | "graveyard" | "guest" | "loved" | "nominated" | "ranked"
      • Optional config: User.Config

      Returns Promise<WithBeatmap[]>

getUserKudosu: ((this, user, config?) => Promise<KudosuHistory[]>) = User.getKudosu

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

-

Type declaration

getUserMostPlayed: ((this, user, config?) => Promise<Playcount[]>) = User.getMostPlayed

Get the beatmaps most played by a user!

-

Type declaration

getUserRecentActivity: ((this, user, config?) => Promise<AnyRecentActivity[]>) = User.getRecentActivity

Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

-

Type declaration

getUserScores: ((this, user, type, ruleset?, include?, config?) => Promise<WithUserBeatmapBeatmapset[]>) = User.getScores

Get "notable" scores from a user

-

Type declaration

    • (this, user, type, ruleset?, include?, config?): Promise<WithUserBeatmapBeatmapset[]>
    • Parameters

      • this: API
      • user: number | User
      • type: "best" | "firsts" | "recent"
      • Optional ruleset: Ruleset
      • include: {
            fails?: boolean;
            lazer?: boolean;
        } = ...
        • Optional fails?: boolean
        • Optional lazer?: boolean
      • Optional config: User.Config

      Returns Promise<WithUserBeatmapBeatmapset[]>

getUsers: ((this, users) => Promise<WithCountryCoverGroupsStatisticsrulesets[]>) = User.getMultiple

Get user data for up to 50 users at once!

-

Type declaration

WikiPage Functions

getWikiPage: ((this, path, locale?) => Promise<WikiPage>) = WikiPage.getOne

Get a wiki page!

-

Type declaration

    • (this, path, locale?): Promise<WikiPage>
    • Parameters

      • this: API
      • path: string
      • locale: string = "en"

      Returns Promise<WikiPage>

\ No newline at end of file +

Ranking Functions

getCountryRanking: ((this: API, ruleset: Ruleset, page?: number) => Promise<Country>) = Ranking.getCountry

Get the top countries of a specific ruleset!

+

Type declaration

    • (this, ruleset, page?): Promise<Country>
    • Get the top countries of a specific ruleset!

      +

      Parameters

      • this: API
      • ruleset: Ruleset

        On which Ruleset should the countries be compared?

        +
      • page: number = 1

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

        +

      Returns Promise<Country>

getKudosuRanking: ((this: API) => Promise<WithKudosu[]>) = Ranking.getKudosu

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

+

Type declaration

    • (this): Promise<WithKudosu[]>
    • Get the top 50 players who have the most total kudosu!

      +

      Parameters

      Returns Promise<WithKudosu[]>

getSpotlightRanking: ((this: API, ruleset: Ruleset, spotlight: number | Spotlight, filter?: "all" | "friends") => Promise<Ranking.Spotlight>) = Ranking.getSpotlight

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

+

Type declaration

    • (this, ruleset, spotlight, filter?): Promise<Ranking.Spotlight>
    • Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!

      +

      Parameters

      • this: API
      • ruleset: Ruleset

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

        +
      • spotlight: number | Spotlight

        The spotlight in question

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

        What kind of players do you want to see? Keep in mind friends has no effect if no authorized user (defaults to all)

        +

      Returns Promise<Ranking.Spotlight>

getUserRanking: ((this: API, ruleset: Ruleset, type: "performance" | "score", config?: {
    country?: string;
    filter?: "all" | "friends";
    page?: number;
    variant?: "4k" | "7k";
}) => Promise<Ranking.User>) = Ranking.getUser

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

+

Type declaration

    • (this, ruleset, type, config?): Promise<Ranking.User>
    • Get the top players of the game, with some filters!

      +

      Parameters

      • this: API
      • ruleset: Ruleset

        Self-explanatory, is also known as "Gamemode"

        +
      • type: "performance" | "score"

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

        +
      • Optionalconfig: {
            country?: string;
            filter?: "all" | "friends";
            page?: number;
            variant?: "4k" | "7k";
        }

        Specify which page, country, filter out non-friends...

        +
        • Optionalcountry?: string

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

          +
        • Optionalfilter?: "all" | "friends"

          What kind of players do you want to see? Keep in mind friends has no effect if no authorized user

          +
        • Optionalpage?: number

          Imagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one

          +
        • Optionalvariant?: "4k" | "7k"

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

          +

      Returns Promise<Ranking.User>

User Functions

getFriends: ((this: API) => Promise<WithCountryCoverGroupsStatisticsSupport[]>) = User.getFriends

Get user data of each friend of the authorized user

+

Type declaration

getResourceOwner: ((this: API, ruleset?: Ruleset) => Promise<WithStatisticsrulesets>) = User.getResourceOwner

Get extensive user data about the authorized user

+

Type declaration

getUser: ((this: API, user: string | number | User, ruleset?: Ruleset) => Promise<User.Extended>) = User.getOne

Get extensive user data about whoever you want!

+

Type declaration

    • (this, user, ruleset?): Promise<User.Extended>
    • Get extensive user data about whoever you want!

      +

      Parameters

      • this: API
      • user: string | number | User

        A user id, a username or a User object!

        +
      • Optionalruleset: Ruleset

        The data should be relevant to which ruleset? (defaults to user's default Ruleset)

        +

      Returns Promise<User.Extended>

getUserBeatmaps: ((this: API, user: number | User, type:
    | "pending"
    | "favourite"
    | "graveyard"
    | "guest"
    | "loved"
    | "nominated"
    | "ranked", config?: User.Config) => Promise<WithBeatmap[]>) = User.getBeatmaps

Get beatmaps favourited or made by a user!

+

Type declaration

    • (this, user, type, config?): Promise<WithBeatmap[]>
    • Get beatmaps favourited or made by a user!

      +

      Parameters

      • this: API
      • user: number | User

        The user in question

        +
      • type:
            | "pending"
            | "favourite"
            | "graveyard"
            | "guest"
            | "loved"
            | "nominated"
            | "ranked"

        The relation between the user and the beatmaps

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<WithBeatmap[]>

getUserKudosu: ((this: API, user: number | User, config?: User.Config) => Promise<KudosuHistory[]>) = User.getKudosu

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

+

Type declaration

    • (this, user, config?): Promise<KudosuHistory[]>
    • Get data about the activity of a user kudosu-wise!

      +

      Parameters

      • this: API
      • user: number | User

        The user in question

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<KudosuHistory[]>

getUserMostPlayed: ((this: API, user: number | User, config?: User.Config) => Promise<Playcount[]>) = User.getMostPlayed

Get the beatmaps most played by a user!

+

Type declaration

    • (this, user, config?): Promise<Playcount[]>
    • Get the beatmaps most played by a user!

      +

      Parameters

      • this: API
      • user: number | User

        The user who played the beatmaps

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<Playcount[]>

getUserRecentActivity: ((this: API, user: number | User, config?: User.Config) => Promise<AnyRecentActivity[]>) = User.getRecentActivity

Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

+

Type declaration

    • (this, user, config?): Promise<AnyRecentActivity[]>
    • Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

      +

      Parameters

      • this: API
      • user: number | User

        The user in question

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<AnyRecentActivity[]>

getUserScores: ((this: API, user: number | User, type: "best" | "firsts" | "recent", ruleset?: Ruleset, include?: {
    fails?: boolean;
    lazer?: boolean;
}, config?: User.Config) => Promise<WithUserBeatmapBeatmapset[]>) = User.getScores

Get "notable" scores from a user

+

Type declaration

    • (this, user, type, ruleset?, include?, config?): Promise<WithUserBeatmapBeatmapset[]>
    • Get "notable" scores from a user

      +

      Parameters

      • this: API
      • user: number | User

        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?

        +
      • Optionalruleset: Ruleset

        The Ruleset the scores were made in (defaults to user's default Ruleset)

        +
      • include: {
            fails?: boolean;
            lazer?: boolean;
        } = ...

        Do you also want lazer scores and failed scores? (defaults to true for lazer & false for fails)

        +
        • Optionalfails?: boolean
        • Optionallazer?: boolean
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<WithUserBeatmapBeatmapset[]>

getUsers: ((this: API, users: (number | User)[], include_variant_statistics?: boolean) => Promise<WithCountryCoverGroupsStatisticsrulesets[]>) = User.getMultiple

Get user data for up to 50 users at once!

+

Type declaration

    • (this, users, include_variant_statistics?): Promise<WithCountryCoverGroupsStatisticsrulesets[]>
    • Get user data for up to 50 users at once!

      +

      Parameters

      • this: API
      • users: (number | User)[]

        An array containing user ids or/and User objects!

        +
      • include_variant_statistics: boolean = false

        Should the response include variants, useful to get stats specific to mania 4k/7k for example? (defaults to false)

        +

      Returns Promise<WithCountryCoverGroupsStatisticsrulesets[]>

WikiPage Functions

getWikiPage: ((this: API, path: string, locale?: string) => Promise<WikiPage>) = WikiPage.getOne

Get a wiki page!

+

Type declaration

    • (this, path, locale?): Promise<WikiPage>
    • Get a wiki page!

      +

      Parameters

      • this: API
      • path: string

        What's in the page's URL after https://osu.ppy.sh/wiki/ (so the title, after the subtitle if there is a subtitle) +(An example for https://osu.ppy.sh/wiki/en/Game_mode/osu! would be Game_mode/osu!)

        +
      • locale: string = "en"

        The BCP 47 language (sub)tag lowercase (for example, for a french WikiPage, use "fr") (defaults to en)

        +

      Returns Promise<WikiPage>

diff --git a/docs/classes/APIError.html b/docs/classes/APIError.html index ea309a0..10b7866 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!

-

Constructors

constructor +APIError | osu-api-v2-js

Class APIError

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

+

Constructors

Properties

Constructors

  • Parameters

    • message: string
    • server: string
    • method: string
    • endpoint: string
    • parameters: object
    • Optional status_code: number
    • Optional original_error: Error

    Returns APIError

Properties

endpoint: string

The type of resource that was requested from the server

-
message: string

The reason why things didn't go as expected

-
method: string

The method used for this request (like "get", "post", etc...)

-
original_error?: Error

The error that caused the api to throw an APIError in the first place, if there is one

-
parameters: object

The filters that were used to specify what resource was wanted

-
server: string

The server to which the request was sent

-
status_code?: number

The status code that was returned by the server, if there is one

-
\ No newline at end of file +

Constructors

  • Parameters

    • message: string
    • server: string
    • method: string
    • endpoint: string
    • parameters: object
    • Optionalstatus_code: number
    • Optionaloriginal_error: Error

    Returns APIError

Properties

endpoint: string

The type of resource that was requested from the server

+
message: string

The reason why things didn't go as expected

+
method: string

The method used for this request (like "get", "post", etc...)

+
original_error?: Error

The error that caused the api to throw an APIError in the first place, if there is one

+
parameters: object

The filters that were used to specify what resource was wanted

+
server: string

The server to which the request was sent

+
status_code?: number

The status code that was returned by the server, if there is one

+
diff --git a/docs/classes/ChildAPI.html b/docs/classes/ChildAPI.html index c6ca021..8ec0438 100644 --- a/docs/classes/ChildAPI.html +++ b/docs/classes/ChildAPI.html @@ -1,6 +1,6 @@ -ChildAPI | osu-api-v2-js

Class ChildAPI

Created with API.withSettings, this special version of the API specifies additional settings to every request!

-

Remarks

This is not to be used for any purpose other than calling methods; The original ChildAPI.original handles tokens & configuration

-

Hierarchy (view full)

Constructors

constructor +ChildAPI | osu-api-v2-js

Class ChildAPI

Created with API.withSettings, this special version of the API specifies additional settings to every request!

+

This is not to be used for any purpose other than calling methods; The original ChildAPI.original handles tokens & configuration

+

Hierarchy (view full)

Constructors

Properties

Methods

request @@ -76,162 +76,443 @@ getUserScores getUsers

WikiPage Functions

Constructors

Properties

additional_fetch_settings: Omit<RequestInit, "body">

The additional settings that are used for every request made by this object

-
original: API

The API where API.withSettings was used; this ChildAPI gets everything from it!

-

Methods

  • The function that directly communicates with the API! Almost every functions of the API object uses this function!

    -

    Parameters

    • Rest ...args: [method: "get" | "post" | "put" | "delete", endpoint: string, parameters: {
          [k: string]: any;
      }, settings?: Omit<RequestInit, "body">, info: {
          just_refreshed: boolean;
          number_try: number;
      }]

      The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)

      -

    Returns Promise<any>

    A Promise with the API's response

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

    +

Constructors

Properties

additional_fetch_settings: Omit<RequestInit, "body">

The additional settings that are used for every request made by this object

+
original: API

The API where API.withSettings was used; this ChildAPI gets everything from it!

+

Methods

  • The function that directly communicates with the API! Almost every functions of the API object uses this function!

    +

    Parameters

    • Rest...args: [method:
          | "get"
          | "post"
          | "put"
          | "delete", endpoint: string, parameters: {
          [k: string]: any;
      }, settings?: Omit<RequestInit, "body">, info: {
          just_refreshed: boolean;
          number_try: number;
      }]

      The type of request, each endpoint uses a specific one (if it uses multiple, the intent and parameters become different)

      +

    Returns Promise<any>

    A Promise with the API's response

    +
  • 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!

      +
      • id: number
      • secret: string
    • Optionaluser: {
          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

        The code that appeared as a GET argument when they got redirected to the Application Callback URL (redirect_uri)

      • redirect_uri: string

        The Application Callback URL; Where the User has been redirected to after saying "okay" to your application doing stuff

        -
    • Optional verbose: "all" | "none" | "errors"
    • Optional server: string
    • Optional timeout: number

      Remarks

      In seconds

      +
  • Optionalverbose: "all" | "none" | "errors"
  • Optionalserver: string
  • Optionaltimeout: number

    In seconds

Returns Promise<API>

A promise with an API instance

-

Beatmap Functions

getBeatmap: ((this, beatmap) => Promise<WithFailtimesBeatmapset>) = Beatmap.getOne

Get extensive beatmap data about whichever beatmap you want!

-

Type declaration

getBeatmapDifficultyAttributes: ((this, beatmap, mods?, ruleset?) => Promise<Beatmap.DifficultyAttributes.Any>) = Beatmap.DifficultyAttributes.get

Get various data about the difficulty of a beatmap!

-

Type declaration

Remarks

You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

-
getBeatmapDifficultyAttributesFruits: ((this, beatmap, mods?) => Promise<Fruits>) = Beatmap.DifficultyAttributes.getFruits

Get various data about the difficulty of a ctb beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Fruits>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Fruits>

getBeatmapDifficultyAttributesMania: ((this, beatmap, mods?) => Promise<Mania>) = Beatmap.DifficultyAttributes.getMania

Get various data about the difficulty of a mania beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Mania>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Mania>

getBeatmapDifficultyAttributesOsu: ((this, beatmap, mods?) => Promise<Osu>) = Beatmap.DifficultyAttributes.getOsu

Get various data about the difficulty of an osu! beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Osu>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Osu>

getBeatmapDifficultyAttributesTaiko: ((this, beatmap, mods?) => Promise<Taiko>) = Beatmap.DifficultyAttributes.getTaiko

Get various data about the difficulty of a taiko beatmap!

-

Type declaration

    • (this, beatmap, mods?): Promise<Taiko>
    • Parameters

      • this: API
      • beatmap: number | Beatmap
      • Optional mods: number | string[] | Mod[]

      Returns Promise<Taiko>

getBeatmapPack: ((this, pack, legacy_only?) => Promise<Pack>) = Beatmap.Pack.getOne

Get data about a Beatmap.Pack using its tag!

-

Type declaration

    • (this, pack, legacy_only?): Promise<Pack>
    • Parameters

      • this: API
      • pack: string | Pack
      • legacy_only: boolean = false

      Returns Promise<Pack>

Remarks

Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

-
getBeatmapPacks: ((this, type?, cursor_string?) => Promise<{
    beatmap_packs: Pack[];
    cursor_string: string | null;
}>) = Beatmap.Pack.getMultiple

Get an Array of up to 100 Beatmap.Packs of a specific type!

-

Type declaration

    • (this, type?, cursor_string?): Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>
    • Parameters

      • this: API
      • type: "standard" | "artist" | "loved" | "featured" | "tournament" | "chart" | "theme" = "standard"
      • Optional cursor_string: string

      Returns Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>

getBeatmapScores: ((this, beatmap, config?) => Promise<Score.WithUser[]>) = Beatmap.getScores

Get the top scores of a beatmap!

-

Type declaration

Remarks

Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores

-
getBeatmapSoloScores: ((this, beatmap, config?) => Promise<Solo[]>) = Beatmap.getSoloScores

Get the top scores of a beatmap, in the "solo score" format lazer brought with it! +

Beatmap Functions

getBeatmap: ((this: API, beatmap: number | Beatmap) => Promise<WithFailtimesBeatmapset>) = Beatmap.getOne

Get extensive beatmap data about whichever beatmap you want!

+

Type declaration

getBeatmapDifficultyAttributes: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[], ruleset?: Ruleset) => Promise<Beatmap.DifficultyAttributes.Any>) = Beatmap.DifficultyAttributes.get

Get various data about the difficulty of a beatmap!

+

Type declaration

    • (this, beatmap, mods?, ruleset?): Promise<Beatmap.DifficultyAttributes.Any>
    • Get various data about the difficulty of a beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +
      • Optionalruleset: Ruleset

        Useful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)

        +

      Returns Promise<Beatmap.DifficultyAttributes.Any>

      You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

      +

You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

+
getBeatmapDifficultyAttributesFruits: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Fruits>) = Beatmap.DifficultyAttributes.getFruits

Get various data about the difficulty of a ctb beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Fruits>
    • Get various data about the difficulty of a ctb beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Fruits>

getBeatmapDifficultyAttributesMania: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Mania>) = Beatmap.DifficultyAttributes.getMania

Get various data about the difficulty of a mania beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Mania>
    • Get various data about the difficulty of a mania beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Mania>

getBeatmapDifficultyAttributesOsu: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Osu>) = Beatmap.DifficultyAttributes.getOsu

Get various data about the difficulty of an osu! beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Osu>
    • Get various data about the difficulty of an osu! beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Osu>

getBeatmapDifficultyAttributesTaiko: ((this: API, beatmap: number | Beatmap, mods?: number | string[] | Mod[]) => Promise<Taiko>) = Beatmap.DifficultyAttributes.getTaiko

Get various data about the difficulty of a taiko beatmap!

+

Type declaration

    • (this, beatmap, mods?): Promise<Taiko>
    • Get various data about the difficulty of a taiko beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

        +
      • Optionalmods: number | string[] | Mod[]

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        +

      Returns Promise<Taiko>

getBeatmapPack: ((this: API, pack: string | Pack, legacy_only?: boolean) => Promise<Pack>) = Beatmap.Pack.getOne

Get data about a Beatmap.Pack using its tag!

+

Type declaration

    • (this, pack, legacy_only?): Promise<Pack>
    • Get data about a Beatmap.Pack using its tag!

      +

      Parameters

      • this: API
      • pack: string | Pack

        The Pack or the pack tag of the Pack you're trying to get

        +
      • legacy_only: boolean = false

        Should lazer scores be excluded from the pack's user_completion_data? (defaults to false)

        +

      Returns Promise<Pack>

      Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

      +

Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

+
getBeatmapPacks: ((this: API, type?:
    | "standard"
    | "artist"
    | "loved"
    | "featured"
    | "tournament"
    | "chart"
    | "theme", cursor_string?: string) => Promise<{
    beatmap_packs: Pack[];
    cursor_string: string | null;
}>) = Beatmap.Pack.getMultiple

Get an Array of up to 100 Beatmap.Packs of a specific type!

+

Type declaration

    • (this, type?, cursor_string?): Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>
    • Get an Array of up to 100 Beatmap.Packs of a specific type!

      +

      Parameters

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

        The type of the BeatmapPacks (defaults to standard)

        +
      • Optionalcursor_string: string

        Use a response's cursor_string with the same parameters to get the next "page" of results!

        +

      Returns Promise<{
          beatmap_packs: Pack[];
          cursor_string: string | null;
      }>

getBeatmapScores: ((this: API, beatmap: number | Beatmap, config?: Beatmap.Config) => Promise<Score.WithUser[]>) = Beatmap.getScores

Get the top scores of a beatmap!

+

Type declaration

Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores

+
getBeatmapSoloScores: ((this: API, beatmap: number | Beatmap, config?: Beatmap.Config) => Promise<Solo[]>) = Beatmap.getSoloScores

Get the top scores of a beatmap, in the "solo score" format lazer brought with it! More info on GitHub if needed https://github.com/ppy/osu-infrastructure/blob/master/score-submission.md

-

Type declaration

Remarks

Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy

-
getBeatmapUserScore: ((this, beatmap, user, config?) => Promise<UserScore>) = Beatmap.UserScore.getOne

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

-

Type declaration

Returns

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

-
getBeatmapUserScores: ((this, beatmap, user, config?) => Promise<Legacy[]>) = Beatmap.UserScore.getMultiple

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

-

Type declaration

getBeatmaps: ((this, beatmaps) => Promise<WithFailtimesMaxcombo[]>) = Beatmap.getMultiple

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

-

Type declaration

lookupBeatmap: ((this, query) => Promise<WithFailtimesBeatmapset>) = Beatmap.lookup

Get extensive beatmap data about whichever beatmap you want!

-

Type declaration

    • (this, query): Promise<WithFailtimesBeatmapset>
    • Parameters

      • this: API
      • query: {
            checksum?: string;
            filename?: string;
            id?: number;
        }
        • Optional checksum?: string
        • Optional filename?: string
        • Optional id?: number

      Returns Promise<WithFailtimesBeatmapset>

Beatmapset Functions

getBeatmapset: ((this, beatmapset) => Promise<Plus>) = Beatmapset.getOne

Get extensive beatmapset data about whichever beatmapset you want!

-

Type declaration

getBeatmapsetDiscussionPosts: ((this, from?, types?, config?) => Promise<{
    beatmapsets: WithHype[];
    cursor_string: string | null;
    posts: Beatmapset.Discussion.Post[];
    users: User[];
}>) = Beatmapset.Discussion.Post.getMultiple

Get complex data about the posts of a beatmapset's discussion or of a user!

-

Type declaration

    • (this, from?, types?, config?): Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            discussion?: number | Discussion;
            user?: number | User;
        }
        • Optional discussion?: number | Discussion
        • Optional user?: number | User
      • Optional types: ("first" | "reply" | "system")[]
      • Optional config: Beatmapset.Config

      Returns Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

-

Returns

Relevant posts and info about them

-
getBeatmapsetDiscussionVotes: ((this, from?, score?, config?) => Promise<{
    cursor_string: string | null;
    discussions: Discussion[];
    users: WithGroups[];
    votes: Vote[];
}>) = Beatmapset.Discussion.Vote.getMultiple

Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

-

Type declaration

    • (this, from?, score?, config?): Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            discussion?: number | Discussion;
            vote_giver?: number | User;
            vote_receiver?: number | User;
        }
        • Optional discussion?: number | Discussion
        • Optional vote_giver?: number | User
        • Optional vote_receiver?: number | User
      • Optional score: 1 | -1
      • Optional config: Beatmapset.Config

      Returns Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

-

Returns

Relevant votes and info about them

-
getBeatmapsetDiscussions: ((this, from?, filter?, config?) => Promise<{
    beatmaps: Beatmap.Extended[];
    beatmapsets: Beatmapset.Extended[];
    cursor_string: string | null;
    discussions: WithStartingpost[];
    included_discussions: WithStartingpost[];
    reviews_config: {
        max_blocks: number;
    };
    users: WithGroups[];
}>) = Beatmapset.Discussion.getMultiple

Get complex data about the discussion page of any beatmapet that you want!

-

Type declaration

    • (this, from?, filter?, config?): Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            beatmapset?: number | Beatmapset;
            status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified";
            user?: number | User;
        }
        • Optional beatmapset?: number | Beatmapset
        • Optional status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified"
        • Optional user?: number | User
      • Optional filter: {
            only_unresolved?: boolean;
            types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[];
        }
        • Optional only_unresolved?: boolean
        • Optional types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[]
      • Optional config: Beatmapset.Config

      Returns Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

-

Returns

Relevant discussions and info about them

-
getBeatmapsetEvents: ((this, from?, types?, config?) => Promise<{
    events: Beatmapset.Event.Any[];
    users: WithGroups[];
}>) = Beatmapset.Event.getMultiple

Get complex data about the events of a beatmapset and the users involved with them!

-

Type declaration

    • (this, from?, types?, config?): Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>
    • Parameters

      • this: API
      • Optional from: {
            beatmapset?: number | Beatmapset;
            max_date?: Date;
            min_date?: Date;
            user?: number | User;
        }
        • Optional beatmapset?: number | Beatmapset
        • Optional max_date?: Date
        • Optional min_date?: Date
        • Optional user?: number | User
      • Optional types: ("nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change")[]
      • Optional config: Beatmapset.Config

      Returns Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>

Remarks

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, -and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

-

Returns

Relevant events and users

-
lookupBeatmapset: ((this, beatmap) => Promise<Plus>) = Beatmapset.lookup

Get extensive data about a beatmapset by using a beatmap!

-

Type declaration

    • (this, beatmap): Promise<Plus>
    • Parameters

      Returns Promise<Plus>

searchBeatmapsets: ((this, query?) => Promise<{
    beatmapsets: WithBeatmapPacktags[];
    cursor_string: string | null;
    error: any | null;
    recommended_difficulty: number | null;
    total: number;
}>) = Beatmapset.search

Search for beatmapsets as if you were on the website or on lazer!

-

Type declaration

    • (this, query?): Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>
    • Parameters

      • this: API
      • Optional query: {
            categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps";
            cursor_string?: string;
            extra?: ("must_have_video" | "must_have_storyboard")[];
            general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[];
            genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | Jazz;
            hide_explicit_content?: true;
            keywords?: string;
            language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | Other;
            mode?: Ruleset;
            played?: "Played" | "Unplayed";
            rank_achieved?: ("A" | "Silver SS" | "SS" | "Silver S" | "S" | "B" | "C" | "D")[];
            sort?: {
                by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated";
                in: "desc" | "asc";
            };
        }
        • Optional categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps"

          Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)

          -
        • Optional cursor_string?: string

          The thing you've got from a previous request to get another page of results!

          -
        • Optional extra?: ("must_have_video" | "must_have_storyboard")[]

          Should all sets have a video, a storyboard, maybe both at once?

          -
        • Optional general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[]

          Various filters to activate

          -
        • Optional genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | Jazz

          Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)

          -

          Remarks

          "Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947, it's excluded because it's counter-intuitive +

          Type declaration

          Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy

          +
getBeatmapUserScore: ((this: API, beatmap: number | Beatmap, user: number | User, config?: Beatmap.Config) => Promise<UserScore>) = Beatmap.UserScore.getOne

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

+

Type declaration

    • (this, beatmap, user, config?): Promise<UserScore>
    • Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap the score was made on

        +
      • user: number | User

        The User who made the score

        +
      • Optionalconfig: Beatmap.Config

        Specify the score's ruleset, the score's mods, prevent a lazer score from being returned (type should not be supported)

        +

      Returns Promise<UserScore>

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

      +

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

+
getBeatmapUserScores: ((this: API, beatmap: number | Beatmap, user: number | User, config?: Beatmap.Config) => Promise<Legacy[]>) = Beatmap.UserScore.getMultiple

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

+

Type declaration

    • (this, beatmap, user, config?): Promise<Legacy[]>
    • Get the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap the scores were made on

        +
      • user: number | User

        The User who made the scores

        +
      • Optionalconfig: Beatmap.Config

        Specify the score's ruleset, prevent a lazer score from being returned (mods and type should not be supported)

        +

      Returns Promise<Legacy[]>

getBeatmaps: ((this: API, beatmaps: (number | Beatmap)[]) => Promise<WithFailtimesMaxcombo[]>) = Beatmap.getMultiple

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

+

Type declaration

    • (this, beatmaps): Promise<WithFailtimesMaxcombo[]>
    • Get extensive beatmap data for up to 50 beatmaps at once!

      +

      Parameters

      • this: API
      • beatmaps: (number | Beatmap)[]

        An array of beatmaps or of objects that have the id of the beatmaps you're trying to get

        +

      Returns Promise<WithFailtimesMaxcombo[]>

lookupBeatmap: ((this: API, query: {
    checksum?: string;
    filename?: string;
    id?: number;
}) => Promise<WithFailtimesBeatmapset>) = Beatmap.lookup

Get extensive beatmap data about whichever beatmap you want!

+

Type declaration

    • (this, query): Promise<WithFailtimesBeatmapset>
    • Get extensive beatmap data about whichever beatmap you want!

      +

      Parameters

      • this: API
      • query: {
            checksum?: string;
            filename?: string;
            id?: number;
        }

        What to specify in order to find the right beatmap

        +
        • Optionalchecksum?: string
        • Optionalfilename?: string
        • Optionalid?: number

      Returns Promise<WithFailtimesBeatmapset>

Beatmapset Functions

getBeatmapset: ((this: API, beatmapset: number | Beatmapset) => Promise<Plus>) = Beatmapset.getOne

Get extensive beatmapset data about whichever beatmapset you want!

+

Type declaration

    • (this, beatmapset): Promise<Plus>
    • Get extensive beatmapset data about whichever beatmapset you want!

      +

      Parameters

      • this: API
      • beatmapset: number | Beatmapset

        The beatmapset or the id of the beatmapset you're trying to get

        +

      Returns Promise<Plus>

getBeatmapsetDiscussionPosts: ((this: API, from?: {
    discussion?: number | Discussion;
    user?: number | User;
}, types?: ("first" | "reply" | "system")[], config?: Beatmapset.Config) => Promise<{
    beatmapsets: WithHype[];
    cursor_string: string | null;
    posts: Beatmapset.Discussion.Post[];
    users: User[];
}>) = Beatmapset.Discussion.Post.getMultiple

Get complex data about the posts of a beatmapset's discussion or of a user!

+

Type declaration

    • (this, from?, types?, config?): Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>
    • Get complex data about the posts of a beatmapset's discussion or of a user!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            discussion?: number | Discussion;
            user?: number | User;
        }

        From where/who are the posts coming from? A specific discussion, a specific user?

        +
      • Optionaltypes: ("first" | "reply" | "system")[]

        What kind of posts?

        +
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          beatmapsets: WithHype[];
          cursor_string: string | null;
          posts: Beatmapset.Discussion.Post[];
          users: User[];
      }>

      Relevant posts and info about them

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

+

Relevant posts and info about them

+
getBeatmapsetDiscussionVotes: ((this: API, from?: {
    discussion?: number | Discussion;
    vote_giver?: number | User;
    vote_receiver?: number | User;
}, score?: 1 | -1, config?: Beatmapset.Config) => Promise<{
    cursor_string: string | null;
    discussions: Discussion[];
    users: WithGroups[];
    votes: Vote[];
}>) = Beatmapset.Discussion.Vote.getMultiple

Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

+

Type declaration

    • (this, from?, score?, config?): Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>
    • Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            discussion?: number | Discussion;
            vote_giver?: number | User;
            vote_receiver?: number | User;
        }

        The discussion with the votes, the user who voted, the user who's gotten the votes...

        +
        • Optionaldiscussion?: number | Discussion
        • Optionalvote_giver?: number | User
        • Optionalvote_receiver?: number | User
      • Optionalscore: 1 | -1

        An upvote (1) or a downvote (-1)

        +
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          cursor_string: string | null;
          discussions: Discussion[];
          users: WithGroups[];
          votes: Vote[];
      }>

      Relevant votes and info about them

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

+

Relevant votes and info about them

+
getBeatmapsetDiscussions: ((this: API, from?: {
    beatmapset?: number | Beatmapset;
    status?:
        | "all"
        | "ranked"
        | "qualified"
        | "disqualified"
        | "never_qualified";
    user?: number | User;
}, filter?: {
    only_unresolved?: boolean;
    types?: (
        | "suggestion"
        | "problem"
        | "mapper_note"
        | "praise"
        | "hype"
        | "review")[];
}, config?: Beatmapset.Config) => Promise<{
    beatmaps: Beatmap.Extended[];
    beatmapsets: Beatmapset.Extended[];
    cursor_string: string | null;
    discussions: WithStartingpost[];
    included_discussions: WithStartingpost[];
    reviews_config: {
        max_blocks: number;
    };
    users: WithGroups[];
}>) = Beatmapset.Discussion.getMultiple

Get complex data about the discussion page of any beatmapet that you want!

+

Type declaration

    • (this, from?, filter?, config?): Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>
    • Get complex data about the discussion page of any beatmapet that you want!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            beatmapset?: number | Beatmapset;
            status?:
                | "all"
                | "ranked"
                | "qualified"
                | "disqualified"
                | "never_qualified";
            user?: number | User;
        }

        From where/who are the discussions coming from? Maybe only qualified sets?

        +
        • Optionalbeatmapset?: number | Beatmapset
        • Optionalstatus?:
              | "all"
              | "ranked"
              | "qualified"
              | "disqualified"
              | "never_qualified"
        • Optionaluser?: number | User
      • Optionalfilter: {
            only_unresolved?: boolean;
            types?: (
                | "suggestion"
                | "problem"
                | "mapper_note"
                | "praise"
                | "hype"
                | "review")[];
        }

        Should those discussions only be unresolved problems, for example?

        +
        • Optionalonly_unresolved?: boolean
        • Optionaltypes?: (
              | "suggestion"
              | "problem"
              | "mapper_note"
              | "praise"
              | "hype"
              | "review")[]
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          beatmaps: Beatmap.Extended[];
          beatmapsets: Beatmapset.Extended[];
          cursor_string: string | null;
          discussions: WithStartingpost[];
          included_discussions: WithStartingpost[];
          reviews_config: {
              max_blocks: number;
          };
          users: WithGroups[];
      }>

      Relevant discussions and info about them

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

+

Relevant discussions and info about them

+
getBeatmapsetEvents: ((this: API, from?: {
    beatmapset?: number | Beatmapset;
    max_date?: Date;
    min_date?: Date;
    user?: number | User;
}, types?: (
    | "nominate"
    | "love"
    | "remove_from_loved"
    | "qualify"
    | "disqualify"
    | "approve"
    | "rank"
    | "kudosu_allow"
    | "kudosu_deny"
    | "kudosu_gain"
    | "kudosu_lost"
    | "kudosu_recalculate"
    | "issue_resolve"
    | "issue_reopen"
    | "discussion_lock"
    | "discussion_unlock"
    | "discussion_delete"
    | "discussion_restore"
    | "discussion_post_delete"
    | "discussion_post_restore"
    | "nomination_reset"
    | "nomination_reset_received"
    | "genre_edit"
    | "language_edit"
    | "nsfw_toggle"
    | "offset_edit"
    | "tags_edit"
    | "beatmap_owner_change")[], config?: Beatmapset.Config) => Promise<{
    events: Beatmapset.Event.Any[];
    users: WithGroups[];
}>) = Beatmapset.Event.getMultiple

Get complex data about the events of a beatmapset and the users involved with them!

+

Type declaration

    • (this, from?, types?, config?): Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>
    • Get complex data about the events of a beatmapset and the users involved with them!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            beatmapset?: number | Beatmapset;
            max_date?: Date;
            min_date?: Date;
            user?: number | User;
        }

        Which beatmapset, or caused by which user? When?

        +
        • Optionalbeatmapset?: number | Beatmapset
        • Optionalmax_date?: Date
        • Optionalmin_date?: Date
        • Optionaluser?: number | User
      • Optionaltypes: (
            | "nominate"
            | "love"
            | "remove_from_loved"
            | "qualify"
            | "disqualify"
            | "approve"
            | "rank"
            | "kudosu_allow"
            | "kudosu_deny"
            | "kudosu_gain"
            | "kudosu_lost"
            | "kudosu_recalculate"
            | "issue_resolve"
            | "issue_reopen"
            | "discussion_lock"
            | "discussion_unlock"
            | "discussion_delete"
            | "discussion_restore"
            | "discussion_post_delete"
            | "discussion_post_restore"
            | "nomination_reset"
            | "nomination_reset_received"
            | "genre_edit"
            | "language_edit"
            | "nsfw_toggle"
            | "offset_edit"
            | "tags_edit"
            | "beatmap_owner_change")[]

        What kinds of events?

        +
      • Optionalconfig: Beatmapset.Config

        How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        +

      Returns Promise<{
          events: Beatmapset.Event.Any[];
          users: WithGroups[];
      }>

      Relevant events and users

      +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, +and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

      +

(2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, +and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

+

Relevant events and users

+
lookupBeatmapset: ((this: API, beatmap: number | Beatmap) => Promise<Plus>) = Beatmapset.lookup

Get extensive data about a beatmapset by using a beatmap!

+

Type declaration

    • (this, beatmap): Promise<Plus>
    • Get extensive data about a beatmapset by using a beatmap!

      +

      Parameters

      • this: API
      • beatmap: number | Beatmap

        A beatmap from the beatmapset you're looking for

        +

      Returns Promise<Plus>

searchBeatmapsets: ((this: API, query?: {
    categories?:
        | "Any"
        | "Ranked"
        | "Qualified"
        | "Loved"
        | "Favourites"
        | "Pending"
        | "WIP"
        | "Graveyard"
        | "My Maps";
    cursor_string?: string;
    extra?: ("must_have_video" | "must_have_storyboard")[];
    general?: (
        | "Recommended difficulty"
        | "Include converted beatmaps"
        | "Subscribed mappers"
        | "Spotlighted beatmaps"
        | "Featured Artists")[];
    genre?:
        | Unspecified
        | any[any]
        | Anime
        | Rock
        | Pop
        | Other
        | Novelty
        | any[any]
        | Electronic
        | Metal
        | Classical
        | Folk
        | Jazz;
    hide_explicit_content?: true;
    keywords?: string;
    language?:
        | Unspecified
        | English
        | Japanese
        | Chinese
        | Instrumental
        | Korean
        | French
        | German
        | Swedish
        | Spanish
        | Italian
        | Russian
        | Polish
        | Other;
    mode?: Ruleset;
    played?: "Played" | "Unplayed";
    rank_achieved?: (
        | "A"
        | "Silver SS"
        | "SS"
        | "Silver S"
        | "S"
        | "B"
        | "C"
        | "D")[];
    sort?: {
        by:
            | "title"
            | "artist"
            | "ranked"
            | "difficulty"
            | "rating"
            | "plays"
            | "favourites"
            | "updated";
        in: "desc" | "asc";
    };
}) => Promise<{
    beatmapsets: WithBeatmapPacktags[];
    cursor_string: string | null;
    error: any | null;
    recommended_difficulty: number | null;
    total: number;
}>) = Beatmapset.search

Search for beatmapsets as if you were on the website or on lazer!

+

Type declaration

    • (this, query?): Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>
    • Search for beatmapsets as if you were on the website or on lazer!

      +

      Parameters

      • this: API
      • Optionalquery: {
            categories?:
                | "Any"
                | "Ranked"
                | "Qualified"
                | "Loved"
                | "Favourites"
                | "Pending"
                | "WIP"
                | "Graveyard"
                | "My Maps";
            cursor_string?: string;
            extra?: ("must_have_video" | "must_have_storyboard")[];
            general?: (
                | "Recommended difficulty"
                | "Include converted beatmaps"
                | "Subscribed mappers"
                | "Spotlighted beatmaps"
                | "Featured Artists")[];
            genre?:
                | Unspecified
                | any[any]
                | Anime
                | Rock
                | Pop
                | Other
                | Novelty
                | any[any]
                | Electronic
                | Metal
                | Classical
                | Folk
                | Jazz;
            hide_explicit_content?: true;
            keywords?: string;
            language?:
                | Unspecified
                | English
                | Japanese
                | Chinese
                | Instrumental
                | Korean
                | French
                | German
                | Swedish
                | Spanish
                | Italian
                | Russian
                | Polish
                | Other;
            mode?: Ruleset;
            played?: "Played" | "Unplayed";
            rank_achieved?: (
                | "A"
                | "Silver SS"
                | "SS"
                | "Silver S"
                | "S"
                | "B"
                | "C"
                | "D")[];
            sort?: {
                by:
                    | "title"
                    | "artist"
                    | "ranked"
                    | "difficulty"
                    | "rating"
                    | "plays"
                    | "favourites"
                    | "updated";
                in: "desc" | "asc";
            };
        }

        All the filters and sorting options that you'd normally find on the website or on lazer

        +
        • Optionalcategories?:
              | "Any"
              | "Ranked"
              | "Qualified"
              | "Loved"
              | "Favourites"
              | "Pending"
              | "WIP"
              | "Graveyard"
              | "My Maps"

          Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)

          +
        • Optionalcursor_string?: string

          The thing you've got from a previous request to get another page of results!

          +
        • Optionalextra?: ("must_have_video" | "must_have_storyboard")[]

          Should all sets have a video, a storyboard, maybe both at once?

          +
        • Optionalgeneral?: (
              | "Recommended difficulty"
              | "Include converted beatmaps"
              | "Subscribed mappers"
              | "Spotlighted beatmaps"
              | "Featured Artists")[]

          Various filters to activate

          +
        • Optionalgenre?:
              | Unspecified
              | any[any]
              | Anime
              | Rock
              | Pop
              | Other
              | Novelty
              | any[any]
              | Electronic
              | Metal
              | Classical
              | Folk
              | Jazz

          Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)

          +

          "Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947, it's excluded because it's counter-intuitive and near useless (but you can do something like 1-1 if you actually want that!)

          -
        • Optional hide_explicit_content?: true

          Use this to hide all sets that are marked as explicit

          -
        • Optional keywords?: string

          What you'd put in the searchbar, like the name of a beatmapset or a mapper!

          -
        • Optional language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | Other

          Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)

          -

          Remarks

          "Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive +

        • Optionalhide_explicit_content?: true

          Use this to hide all sets that are marked as explicit

          +
        • Optionalkeywords?: string

          What you'd put in the searchbar, like the name of a beatmapset or a mapper!

          +
        • Optionallanguage?:
              | Unspecified
              | English
              | Japanese
              | Chinese
              | Instrumental
              | Korean
              | French
              | German
              | Swedish
              | Spanish
              | Italian
              | Russian
              | Polish
              | Other

          Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)

          +

          "Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive and near useless (but you can do something like 1-1 if you actually want that!)

          -
        • Optional mode?: Ruleset

          Only get sets that have maps that you can play in the ruleset of your choice

          -
        • Optional played?: "Played" | "Unplayed"

          Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?

          -
        • Optional rank_achieved?: ("A" | "Silver SS" | "SS" | "Silver S" | "S" | "B" | "C" | "D")[]

          Does the authorized user with osu!supporter have already achieved certain ranks on those sets?

          -
        • Optional sort?: {
              by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated";
              in: "desc" | "asc";
          }

          Sort by what, in ascending/descending order

          -
          • by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated"
          • in: "desc" | "asc"

      Returns Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>

Remarks

This does not bypass the current osu!supporter requirement for certain filters

-

Returns

Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

-

Changelog Functions

getChangelogBuild: ((this, stream, build) => Promise<WithChangelogentriesVersions>) = Changelog.Build.getOne

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

-

Type declaration

getChangelogBuilds: ((this, stream?, range?, message_formats?) => Promise<WithUpdatestreamsChangelogentries[]>) = Changelog.Build.getMultiple

Get up to 21 versions/updates/builds!

-

Type declaration

    • (this, stream?, range?, message_formats?): Promise<WithUpdatestreamsChangelogentries[]>
    • Parameters

      • this: API
      • Optional stream: string
      • Optional range: {
            from?: string;
            to?: string | number;
        }
        • Optional from?: string

          The name of the build

          -
        • Optional to?: string | number

          The name or the id of the build

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

      Returns Promise<WithUpdatestreamsChangelogentries[]>

getChangelogStreams: ((this) => Promise<WithLatestbuildUsercount[]>) = Changelog.UpdateStream.getAll

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

-

Type declaration

lookupChangelogBuild: ((this, changelog, message_formats?) => Promise<WithChangelogentriesVersions>) = Changelog.Build.lookup

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

-

Type declaration

Chat Functions

createChatAnnouncementChannel: ((this, channel, user_targets, message) => Promise<Channel>) = Chat.Channel.createAnnouncement

Create a new announcement!

-

Type declaration

    • (this, channel, user_targets, message): Promise<Channel>
    • Parameters

      • this: API
      • channel: {
            description: string;
            name: string;
        }
        • description: string
        • name: string
      • user_targets: (number | User)[]
      • message: string

      Returns Promise<Channel>

Remarks

From my understanding, this WILL 403 unless the user is kinda special

-

Returns

The newly created channel!

-
createChatPrivateChannel: ((this, user_target) => Promise<Channel>) = Chat.Channel.createPrivate

Create/Open/Join a private messages chat channel!

-

Type declaration

    • (this, user_target): Promise<Channel>
    • Parameters

      • this: API
      • user_target: number | User

      Returns Promise<Channel>

Returns

The newly created channel!

-
getChatChannel: ((this, channel) => Promise<WithDetails>) = Chat.Channel.getOne

Get a ChatChannel that you have joined, and the users in it if it is a private channel!

-

Type declaration

Remarks

Will 404 if the user has not joined the channel (use joinChatChannel for that)

-
getChatChannels: ((this) => Promise<Channel[]>) = Chat.Channel.getAll

Get a list of all publicly joinable channels!

-

Type declaration

getChatMessages: ((this, channel, limit?, since?, until?) => Promise<Message[]>) = Chat.Message.getMultiple

Get the recent messages of a specific ChatChannel!

-

Type declaration

    • (this, channel, limit?, since?, until?): Promise<Message[]>
    • Parameters

      Returns Promise<Message[]>

joinChatChannel: ((this, channel, user?) => Promise<WithDetails>) = Chat.Channel.joinOne

Join a public or multiplayer ChatChannel, allowing you to interact with it!

-

Type declaration

keepChatAlive: ((this, since?) => Promise<UserSilence[]>) = Chat.keepAlive

Needs to be done periodically to reset chat activity timeout

-

Type declaration

Remarks

Every 30 seconds is a good idea

-

Returns

A list of recent silences

-
leaveChatChannel: ((this, channel, user?) => Promise<void>) = Chat.Channel.leaveOne

Leave/Close a public ChatChannel!

-

Type declaration

    • (this, channel, user?): Promise<void>
    • Parameters

      Returns Promise<void>

markChatChannelAsRead: ((this, channel, message) => Promise<void>) = Chat.Channel.markAsRead

Mark a certain channel as read up to a given message!

-

Type declaration

    • (this, channel, message): Promise<void>
    • Parameters

      Returns Promise<void>

sendChatMessage: ((this, channel, message, is_action?) => Promise<Message>) = Chat.Message.send

Send a message in a ChatChannel!

-

Type declaration

    • (this, channel, message, is_action?): Promise<Message>
    • Parameters

      • this: API
      • channel: number | Channel
      • message: string
      • is_action: boolean = false

      Returns Promise<Message>

Returns

The newly sent ChatMessage!

-
sendChatPrivateMessage: ((this, user_target, message, is_action?, uuid?) => Promise<{
    channel: Channel;
    message: Message;
}>) = Chat.Message.sendPrivate

Send a private message to someone!

-

Type declaration

    • (this, user_target, message, is_action?, uuid?): Promise<{
          channel: Channel;
          message: Message;
      }>
    • Parameters

      • this: API
      • user_target: number | User
      • message: string
      • is_action: boolean = false
      • Optional uuid: string

      Returns Promise<{
          channel: Channel;
          message: Message;
      }>

Remarks

You don't need to use createChatPrivateChannel before sending a message

-

Returns

The message you sent

-

Comment Functions

getComment: ((this, comment) => Promise<Bundle>) = Comment.getOne

Get a specific comment by using its id!

-

Type declaration

getComments: ((this, from?, parent?, sort?) => Promise<WithTotalToplevelcount>) = Comment.getMultiple

Get comments that meet any of your requirements!

-

Type declaration

    • (this, from?, parent?, sort?): Promise<WithTotalToplevelcount>
    • Parameters

      • this: API
      • Optional from: {
            id: number;
            type: "beatmapset" | "build" | "news_post";
        }
        • id: number
        • type: "beatmapset" | "build" | "news_post"
      • Optional parent: number | Comment
      • Optional sort: {
            after?: number | Comment;
            cursor?: null | {
                created_at: Date;
                id: number;
            };
            type?: "new" | "top" | "old";
        }
        • Optional after?: number | Comment
        • Optional cursor?: null | {
              created_at: Date;
              id: number;
          }
        • Optional type?: "new" | "top" | "old"

      Returns Promise<WithTotalToplevelcount>

Event Functions

getEvents: ((this, sort?, cursor_string?) => Promise<{
    cursor_string: string | null;
    events: Event.Any[];
}>) = Event.getMultiple

Get everything note-worthy that happened on osu! recently!

-

Type declaration

    • (this, sort?, cursor_string?): Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>
    • Parameters

      • this: API
      • sort: "id_desc" | "id_asc" = "id_desc"
      • Optional cursor_string: string

      Returns Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>

Forum Functions

createForumTopic: ((this, forum_id, title, text, poll?) => Promise<{
    post: Forum.Post;
    topic: Topic;
}>) = Forum.Topic.create

Create a new ForumTopic in the forum of your choice!

-

Type declaration

    • (this, forum_id, title, text, poll?): Promise<{
          post: Forum.Post;
          topic: Topic;
      }>
    • Parameters

      • this: API
      • forum_id: number
      • title: string
      • text: string
      • Optional poll: {
            hide_results?: boolean;
            length_days: number;
            max_options?: number;
            options: string[];
            title: string;
            vote_change?: boolean;
        }
        • Optional hide_results?: boolean

          Should the results of the poll be hidden while the voting period is still active? (defaults to false)

          +
        • Optionalmode?: Ruleset

          Only get sets that have maps that you can play in the ruleset of your choice

          +
        • Optionalplayed?: "Played" | "Unplayed"

          Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?

          +
        • Optionalrank_achieved?: (
              | "A"
              | "Silver SS"
              | "SS"
              | "Silver S"
              | "S"
              | "B"
              | "C"
              | "D")[]

          Does the authorized user with osu!supporter have already achieved certain ranks on those sets?

          +
        • Optionalsort?: {
              by:
                  | "title"
                  | "artist"
                  | "ranked"
                  | "difficulty"
                  | "rating"
                  | "plays"
                  | "favourites"
                  | "updated";
              in: "desc" | "asc";
          }

          Sort by what, in ascending/descending order

          +
          • by:
                | "title"
                | "artist"
                | "ranked"
                | "difficulty"
                | "rating"
                | "plays"
                | "favourites"
                | "updated"
          • in: "desc" | "asc"

      Returns Promise<{
          beatmapsets: WithBeatmapPacktags[];
          cursor_string: string | null;
          error: any | null;
          recommended_difficulty: number | null;
          total: number;
      }>

      Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

      +

      This does not bypass the current osu!supporter requirement for certain filters

      +

This does not bypass the current osu!supporter requirement for certain filters

+

Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

+

Changelog Functions

getChangelogBuild: ((this: API, stream: string, build: string) => Promise<WithChangelogentriesVersions>) = Changelog.Build.getOne

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

+

Type declaration

    • (this, stream, build): Promise<WithChangelogentriesVersions>
    • Get details about the version/update/build of something related to osu!

      +

      Parameters

      • this: API
      • 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<WithChangelogentriesVersions>

getChangelogBuilds: ((this: API, stream?: string, range?: {
    from?: string;
    to?: string | number;
}, message_formats?: ("html" | "markdown")[]) => Promise<WithUpdatestreamsChangelogentries[]>) = Changelog.Build.getMultiple

Get up to 21 versions/updates/builds!

+

Type declaration

    • (this, stream?, range?, message_formats?): Promise<WithUpdatestreamsChangelogentries[]>
    • Get up to 21 versions/updates/builds!

      +

      Parameters

      • this: API
      • Optionalstream: string

        Only get builds from a specific stream

        +
      • Optionalrange: {
            from?: string;
            to?: string | number;
        }

        Get builds that were released before/after (and including) those builds

        +
        • Optionalfrom?: string

          The name of the build

          +
        • Optionalto?: string | number

          The name or the id of the build

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

        changelog_entries will have a message property if markdown, message_html property if html (defaults to both)

        +

      Returns Promise<WithUpdatestreamsChangelogentries[]>

getChangelogStreams: ((this: API) => Promise<WithLatestbuildUsercount[]>) = Changelog.UpdateStream.getAll

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

+

Type declaration

    • (this): Promise<WithLatestbuildUsercount[]>
    • An effective way to get all available streams, as well as their latest version!

      +

      Parameters

      Returns Promise<WithLatestbuildUsercount[]>

      const names_of_streams = (await api.getChangelogStreams()).map(s => s.name)
      +
      + +
lookupChangelogBuild: ((this: API, changelog: string | number, message_formats?: ("html" | "markdown")[]) => Promise<WithChangelogentriesVersions>) = Changelog.Build.lookup

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

+

Type declaration

    • (this, changelog, message_formats?): Promise<WithChangelogentriesVersions>
    • Get details about the version/update/build of something related to osu!

      +

      Parameters

      • this: API
      • changelog: string | number

        A stream name like lazer, a build version like 2023.1026.0, or the id of a build

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

        changelog_entries will have a message property if markdown, message_html property if html (defaults to both)

        +

      Returns Promise<WithChangelogentriesVersions>

Chat Functions

createChatAnnouncementChannel: ((this: API, channel: {
    description: string;
    name: string;
}, user_targets: (number | User)[], message: string) => Promise<Channel>) = Chat.Channel.createAnnouncement

Create a new announcement!

+

Type declaration

    • (this, channel, user_targets, message): Promise<Channel>
    • Create a new announcement!

      +

      Parameters

      • this: API
      • channel: {
            description: string;
            name: string;
        }

        Details of the channel you're creating

        +
        • description: string
        • name: string
      • user_targets: (number | User)[]

        The people that will receive your message

        +
      • message: string

        The message to send with the announcement

        +

      Returns Promise<Channel>

      The newly created channel!

      +

      "chat.write_manage"

      +

      From my understanding, this WILL 403 unless the user is kinda special

      +

From my understanding, this WILL 403 unless the user is kinda special

+

The newly created channel!

+
createChatPrivateChannel: ((this: API, user_target: number | User) => Promise<Channel>) = Chat.Channel.createPrivate

Create/Open/Join a private messages chat channel!

+

Type declaration

    • (this, user_target): Promise<Channel>
    • Create/Open/Join a private messages chat channel!

      +

      Parameters

      • this: API
      • user_target: number | User

        The other user able to read and send messages in this channel

        +

      Returns Promise<Channel>

      The newly created channel!

      +

The newly created channel!

+
getChatChannel: ((this: API, channel: number | Channel) => Promise<WithDetails>) = Chat.Channel.getOne

Get a ChatChannel that you have joined, and the users in it if it is a private channel!

+

Type declaration

    • (this, channel): Promise<WithDetails>
    • Get a ChatChannel that you have joined, and the users in it if it is a private channel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel in question

        +

      Returns Promise<WithDetails>

      "chat.read"

      +

      Will 404 if the user has not joined the channel (use joinChatChannel for that)

      +

Will 404 if the user has not joined the channel (use joinChatChannel for that)

+
getChatChannels: ((this: API) => Promise<Channel[]>) = Chat.Channel.getAll

Get a list of all publicly joinable channels!

+

Type declaration

getChatMessages: ((this: API, channel: number | Channel, limit?: number, since?: number | Message, until?: number | Message) => Promise<Message[]>) = Chat.Message.getMultiple

Get the recent messages of a specific ChatChannel!

+

Type declaration

    • (this, channel, limit?, since?, until?): Promise<Message[]>
    • Get the recent messages of a specific ChatChannel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The Channel you wanna get the messages from

        +
      • limit: number = 20

        The maximum amount of messages you want to get, up to 50! (defaults to 20)

        +
      • Optionalsince: number | Message

        Get the messages sent after this message

        +
      • Optionaluntil: number | Message

        Get the messages sent up to but not including this message

        +

      Returns Promise<Message[]>

joinChatChannel: ((this: API, channel: number | Channel, user?: number | User) => Promise<WithDetails>) = Chat.Channel.joinOne

Join a public or multiplayer ChatChannel, allowing you to interact with it!

+

Type declaration

    • (this, channel, user?): Promise<WithDetails>
    • Join a public or multiplayer ChatChannel, allowing you to interact with it!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel you wanna join

        +
      • Optionaluser: number | User

        The user joining the channel (defaults to the presumed authorized user (api.user))

        +

      Returns Promise<WithDetails>

keepChatAlive: ((this: API, since?: {
    message?: number | Message;
    user_silence?: number | UserSilence;
}) => Promise<UserSilence[]>) = Chat.keepAlive

Needs to be done periodically to reset chat activity timeout

+

Type declaration

    • (this, since?): Promise<UserSilence[]>
    • Needs to be done periodically to reset chat activity timeout

      +

      Parameters

      • this: API
      • Optionalsince: {
            message?: number | Message;
            user_silence?: number | UserSilence;
        }

        UserSilences that are before that will not be returned!

        +

      Returns Promise<UserSilence[]>

      A list of recent silences

      +

      "chat.read"

      +

      Every 30 seconds is a good idea

      +

Every 30 seconds is a good idea

+

A list of recent silences

+
leaveChatChannel: ((this: API, channel: number | Channel, user?: number | User) => Promise<void>) = Chat.Channel.leaveOne

Leave/Close a public ChatChannel!

+

Type declaration

    • (this, channel, user?): Promise<void>
    • Leave/Close a public ChatChannel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel you wanna leave/close

        +
      • Optionaluser: number | User

        The user leaving/closing the channel (defaults to the presumed authorized user (api.user))

        +

      Returns Promise<void>

markChatChannelAsRead: ((this: API, channel: number | Channel, message: number | Message) => Promise<void>) = Chat.Channel.markAsRead

Mark a certain channel as read up to a given message!

+

Type declaration

    • (this, channel, message): Promise<void>
    • Mark a certain channel as read up to a given message!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel in question

        +
      • message: number | Message

        You're marking this and all the messages before it as read!

        +

      Returns Promise<void>

sendChatMessage: ((this: API, channel: number | Channel, message: string, is_action?: boolean) => Promise<Message>) = Chat.Message.send

Send a message in a ChatChannel!

+

Type declaration

    • (this, channel, message, is_action?): Promise<Message>
    • Send a message in a ChatChannel!

      +

      Parameters

      • this: API
      • channel: number | Channel

        The channel in which you want to send your message

        +
      • message: string

        The message you wanna send

        +
      • is_action: boolean = false

        Is it a command? Like /me dances (defaults to false)

        +

      Returns Promise<Message>

      The newly sent ChatMessage!

      +

The newly sent ChatMessage!

+
sendChatPrivateMessage: ((this: API, user_target: number | User, message: string, is_action?: boolean, uuid?: string) => Promise<{
    channel: Channel;
    message: Message;
}>) = Chat.Message.sendPrivate

Send a private message to someone!

+

Type declaration

    • (this, user_target, message, is_action?, uuid?): Promise<{
          channel: Channel;
          message: Message;
      }>
    • Send a private message to someone!

      +

      Parameters

      • this: API
      • user_target: number | User

        The User you wanna send your message to!

        +
      • message: string

        The message you wanna send

        +
      • is_action: boolean = false

        Is it a command? Like /me dances (defaults to false)

        +
      • Optionaluuid: string

        A client-side message identifier

        +

      Returns Promise<{
          channel: Channel;
          message: Message;
      }>

      The message you sent

      +

      "chat.write"

      +

      You don't need to use createChatPrivateChannel before sending a message

      +

You don't need to use createChatPrivateChannel before sending a message

+

The message you sent

+

Comment Functions

getComment: ((this: API, comment: number | Comment) => Promise<Bundle>) = Comment.getOne

Get a specific comment by using its id!

+

Type declaration

    • (this, comment): Promise<Bundle>
    • Get a specific comment by using its id!

      +

      Parameters

      • this: API
      • comment: number | Comment

        The comment in question

        +

      Returns Promise<Bundle>

getComments: ((this: API, from?: {
    id: number;
    type: "beatmapset" | "build" | "news_post";
}, parent?: number | Comment, sort?: {
    after?: number | Comment;
    cursor?: null | {
        created_at: Date;
        id: number;
    };
    type?: "new" | "top" | "old";
}) => Promise<WithTotalToplevelcount>) = Comment.getMultiple

Get comments that meet any of your requirements!

+

Type declaration

    • (this, from?, parent?, sort?): Promise<WithTotalToplevelcount>
    • Get comments that meet any of your requirements!

      +

      Parameters

      • this: API
      • Optionalfrom: {
            id: number;
            type: "beatmapset" | "build" | "news_post";
        }

        From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?

        +
        • id: number
        • type: "beatmapset" | "build" | "news_post"
      • Optionalparent: number | Comment

        The comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)

        +
      • Optionalsort: {
            after?: number | Comment;
            cursor?: null | {
                created_at: Date;
                id: number;
            };
            type?: "new" | "top" | "old";
        }

        Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?

        +
        • Optionalafter?: number | Comment
        • Optionalcursor?: null | {
              created_at: Date;
              id: number;
          }
        • Optionaltype?: "new" | "top" | "old"

      Returns Promise<WithTotalToplevelcount>

Event Functions

getEvents: ((this: API, sort?: "id_desc" | "id_asc", cursor_string?: string) => Promise<{
    cursor_string: string | null;
    events: Event.Any[];
}>) = Event.getMultiple

Get everything note-worthy that happened on osu! recently!

+

Type declaration

    • (this, sort?, cursor_string?): Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>
    • Get everything note-worthy that happened on osu! recently!

      +

      Parameters

      • this: API
      • sort: "id_desc" | "id_asc" = "id_desc"

        "id_asc" to have the oldest recent event first, "id_desc" to have the newest instead (defaults to id_desc)

        +
      • Optionalcursor_string: string

        Use a response's cursor_string with the same parameters to get the next "page" of results, so events in this instance!

        +

      Returns Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>

Forum Functions

createForumTopic: ((this: API, forum_id: number, title: string, text: string, poll?: {
    hide_results?: boolean;
    length_days: number;
    max_options?: number;
    options: string[];
    title: string;
    vote_change?: boolean;
}) => Promise<{
    post: Forum.Post;
    topic: Topic;
}>) = Forum.Topic.create

Create a new ForumTopic in the forum of your choice!

+

Type declaration

    • (this, forum_id, title, text, poll?): Promise<{
          post: Forum.Post;
          topic: Topic;
      }>
    • Create a new ForumTopic in the forum of your choice!

      +

      Parameters

      • this: API
      • forum_id: number

        The id of the forum you're creating your topic in

        +
      • title: string

        The topic's title

        +
      • text: string

        The first post's content/message

        +
      • Optionalpoll: {
            hide_results?: boolean;
            length_days: number;
            max_options?: number;
            options: string[];
            title: string;
            vote_change?: boolean;
        }

        If you want to make a poll, specify the parameters of that poll!

        +
        • Optionalhide_results?: boolean

          Should the results of the poll be hidden while the voting period is still active? (defaults to false)

        • length_days: number

          Length of voting period in days, 0 means forever

          -
        • Optional max_options?: number

          The maximum amount of votes per user! (defaults to 1)

          +
        • Optionalmax_options?: number

          The maximum amount of votes per user! (defaults to 1)

        • options: string[]

          The things the users can vote for

          -
        • title: string
        • Optional vote_change?: boolean

          Do you allow users to change their vote? (defaults to false)

          -

      Returns Promise<{
          post: Forum.Post;
          topic: Topic;
      }>

Remarks

Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

-

Returns

An object with the topic you've made, and its first initial post (which uses your text)

-
editForumPost: ((this, post, new_text) => Promise<Forum.Post>) = Forum.Post.edit

Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

-

Type declaration

Returns

The edited ForumPost

-
editForumTopicTitle: ((this, topic, new_title) => Promise<Topic>) = Forum.Topic.editTitle

Edit the title of a Forum.Topic!

-

Type declaration

    • (this, topic, new_title): Promise<Topic>
    • Parameters

      • this: API
      • topic: number | Topic
      • new_title: string

      Returns Promise<Topic>

Remarks

Use editForumPost if you wanna edit the post at the top of the topic

-

Returns

The edited ForumTopic

-
getForumTopicAndPosts: ((this, topic, config?) => Promise<{
    cursor_string: string | null;
    posts: Forum.Post[];
    topic: Topic;
}>) = Forum.getTopicAndPosts

Get a forum topic, as well as its main post (content) and the posts that were sent in it!

-

Type declaration

    • (this, topic, config?): Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>
    • Parameters

      • this: API
      • topic: number | Topic
      • Optional config: {
            cursor_string?: string;
            first_post?: number | Forum.Post;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }
        • Optional cursor_string?: string

          Use a response's cursor_string with the same parameters to get the next "page" of results, so posts in this instance!

          -
        • Optional first_post?: number | Forum.Post

          The id (or the post itself) of the first post to be returned in posts (irrelevant if using a cursor_string)

          -
        • Optional limit?: number

          How many posts maximum, up to 50

          -
        • Optional sort?: "id_desc" | "id_asc"

          "id_asc" to have the oldest post at the beginning of the posts array, "id_desc" to have the newest instead

          -

      Returns Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>

Remarks

The oldest post of a topic is the text of a topic

-
replyForumTopic: ((this, topic, text) => Promise<Forum.Post>) = Forum.Topic.reply

Make and send a Forum.Post in a Forum.Topic!

-

Type declaration

Remarks

Replying when the last post was made by the authorized user will likely cause the server to return a 403

-

Returns

The reply you've made, as a Forum.Post!

-

Home Functions

searchUser: ((this, query, page?) => Promise<{
    data: User[];
    total: number;
}>) = Home.Search.getUsers

Look for a user like you would on the website!

-

Type declaration

    • (this, query, page?): Promise<{
          data: User[];
          total: number;
      }>
    • Parameters

      • this: API
      • query: string
      • page: number = 1

      Returns Promise<{
          data: User[];
          total: number;
      }>

searchWiki: ((this, query, page?) => Promise<{
    data: WikiPage[];
    total: number;
}>) = Home.Search.getWikiPages

Look for a wiki page like you would on the website!

-

Type declaration

    • (this, query, page?): Promise<{
          data: WikiPage[];
          total: number;
      }>
    • Parameters

      • this: API
      • query: string
      • page: number = 1

      Returns Promise<{
          data: WikiPage[];
          total: number;
      }>

Multiplayer Functions

getMatch: ((this, match) => Promise<Match>) = Multiplayer.Match.getOne

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

-

Type declaration

    • (this, match): Promise<Match>
    • Parameters

      Returns Promise<Match>

getMatches: ((this, query?) => Promise<Info[]>) = Multiplayer.Match.getMultiple

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

-

Type declaration

    • (this, query?): Promise<Info[]>
    • Parameters

      • this: API
      • Optional query: {
            first_match_in_array?: number | Info;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }
        • Optional first_match_in_array?: number | Info

          Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable

          -

          Remarks

          You can use this argument differently to get all matches before/after (depending of query.sort) a certain match, +

        • title: string
        • Optionalvote_change?: boolean

          Do you allow users to change their vote? (defaults to false)

          +

      Returns Promise<{
          post: Forum.Post;
          topic: Topic;
      }>

      An object with the topic you've made, and its first initial post (which uses your text)

      +

      "forum.write"

      +

      Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

      +

Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

+

An object with the topic you've made, and its first initial post (which uses your text)

+
editForumPost: ((this: API, post: number | Forum.Post, new_text: string) => Promise<Forum.Post>) = Forum.Post.edit

Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

+

Type declaration

    • (this, post, new_text): Promise<Forum.Post>
    • Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

      +

      Parameters

      • this: API
      • post: number | Forum.Post

        The post or the id of the post in question

        +
      • new_text: string

        The new content of the post (replaces the old content)

        +

      Returns Promise<Forum.Post>

      The edited ForumPost

      +

The edited ForumPost

+
editForumTopicTitle: ((this: API, topic: number | Topic, new_title: string) => Promise<Topic>) = Forum.Topic.editTitle

Edit the title of a Forum.Topic!

+

Type declaration

    • (this, topic, new_title): Promise<Topic>
    • Edit the title of a Forum.Topic!

      +

      Parameters

      • this: API
      • topic: number | Topic

        The topic or the id of the topic in question

        +
      • new_title: string

        The new title of the topic

        +

      Returns Promise<Topic>

      The edited ForumTopic

      +

      "forum.write"

      +

      Use editForumPost if you wanna edit the post at the top of the topic

      +

Use editForumPost if you wanna edit the post at the top of the topic

+

The edited ForumTopic

+
getForumTopicAndPosts: ((this: API, topic: number | Topic, config?: {
    cursor_string?: string;
    first_post?: number | Forum.Post;
    limit?: number;
    sort?: "id_desc" | "id_asc";
}) => Promise<{
    cursor_string: string | null;
    posts: Forum.Post[];
    topic: Topic;
}>) = Forum.getTopicAndPosts

Get a forum topic, as well as its main post (content) and the posts that were sent in it!

+

Type declaration

    • (this, topic, config?): Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>
    • Get a forum topic, as well as its main post (content) and the posts that were sent in it!

      +

      Parameters

      • this: API
      • topic: number | Topic

        An object with the id of the topic in question

        +
      • Optionalconfig: {
            cursor_string?: string;
            first_post?: number | Forum.Post;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }

        How many results maximum, how to sort them, etc...

        +
        • Optionalcursor_string?: string

          Use a response's cursor_string with the same parameters to get the next "page" of results, so posts in this instance!

          +
        • Optionalfirst_post?: number | Forum.Post

          The id (or the post itself) of the first post to be returned in posts (irrelevant if using a cursor_string)

          +
        • Optionallimit?: number

          How many posts maximum, up to 50

          +
        • Optionalsort?: "id_desc" | "id_asc"

          "id_asc" to have the oldest post at the beginning of the posts array, "id_desc" to have the newest instead

          +

      Returns Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>

      The oldest post of a topic is the text of a topic

      +

The oldest post of a topic is the text of a topic

+
replyForumTopic: ((this: API, topic: number | Topic, text: string) => Promise<Forum.Post>) = Forum.Topic.reply

Make and send a Forum.Post in a Forum.Topic!

+

Type declaration

    • (this, topic, text): Promise<Forum.Post>
    • Make and send a Forum.Post in a Forum.Topic!

      +

      Parameters

      • this: API
      • topic: number | Topic

        The topic or the id of the topic you're making your reply in

        +
      • text: string

        Your reply! Your message!

        +

      Returns Promise<Forum.Post>

      The reply you've made, as a Forum.Post!

      +

      "forum.write"

      +

      Replying when the last post was made by the authorized user will likely cause the server to return a 403

      +

Replying when the last post was made by the authorized user will likely cause the server to return a 403

+

The reply you've made, as a Forum.Post!

+

Home Functions

searchUser: ((this: API, query: string, page?: number) => Promise<{
    data: User[];
    total: number;
}>) = Home.Search.getUsers

Look for a user like you would on the website!

+

Type declaration

    • (this, query, page?): Promise<{
          data: User[];
          total: number;
      }>
    • Look for a user like you would on the website!

      +

      Parameters

      • this: API
      • query: string

        What you would put in the searchbar

        +
      • page: number = 1

        You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)

        +

      Returns Promise<{
          data: User[];
          total: number;
      }>

searchWiki: ((this: API, query: string, page?: number) => Promise<{
    data: WikiPage[];
    total: number;
}>) = Home.Search.getWikiPages

Look for a wiki page like you would on the website!

+

Type declaration

    • (this, query, page?): Promise<{
          data: WikiPage[];
          total: number;
      }>
    • Look for a wiki page like you would on the website!

      +

      Parameters

      • this: API
      • query: string

        What you would put in the searchbar

        +
      • page: number = 1

        You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)

        +

      Returns Promise<{
          data: WikiPage[];
          total: number;
      }>

Multiplayer Functions

getMatch: ((this: API, match: number | Info, query?: {
    after?: number | Multiplayer.Match.Event;
    before?: number | Multiplayer.Match.Event;
    limit?: number;
}) => Promise<Match>) = Multiplayer.Match.getOne

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

+

Type declaration

    • (this, match, query?): Promise<Match>
    • Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches or mp

      +

      Parameters

      • this: API
      • match: number | Info

        The id of a match can be found at the end of its URL

        +
      • Optionalquery: {
            after?: number | Multiplayer.Match.Event;
            before?: number | Multiplayer.Match.Event;
            limit?: number;
        }

        Filter and limit the amount of events shown

        +
        • Optionalafter?: number | Multiplayer.Match.Event

          Filter FOR events AFTER this one

          +
        • Optionalbefore?: number | Multiplayer.Match.Event

          Filter FOR events BEFORE this one

          +
        • Optionallimit?: number

          From 1 to 101 events (defaults to 100)

          +

          0 is treated as 1, anything above 101 is treated as 101

          +

      Returns Promise<Match>

getMatches: ((this: API, query?: {
    first_match_in_array?: number | Info;
    limit?: number;
    sort?: "id_desc" | "id_asc";
}) => Promise<Info[]>) = Multiplayer.Match.getMultiple

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

+

Type declaration

    • (this, query?): Promise<Info[]>
    • Get the info about several matches!

      +

      Parameters

      • this: API
      • Optionalquery: {
            first_match_in_array?: number | Info;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }

        The id of the first match of the array, and the sorting and size of said array

        +
        • Optionalfirst_match_in_array?: number | Info

          Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable

          +

          You can use this argument differently to get all matches before/after (depending of query.sort) a certain match, by adding +1/-1 to its id! So if you want all matches after match_id 10 with sorting is_desc, just have this argument be 10 + 1, or 11!

          -
        • Optional limit?: number

          The maximum amount of elements returned in the array (defaults to 50)

          -
        • Optional sort?: "id_desc" | "id_asc"

          "id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)

          -

      Returns Promise<Info[]>

getPlaylistItemScores: ((this, item, limit?, sort?, cursor_string?) => Promise<Scores>) = Multiplayer.Room.PlaylistItem.getScores

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

-

Type declaration

    • (this, item, limit?, sort?, cursor_string?): Promise<Scores>
    • Parameters

      • this: API
      • item: PlaylistItem | {
            id: number;
            room_id: number;
        }
      • limit: number = 50
      • sort: "score_asc" | "score_desc" = "score_desc"
      • Optional cursor_string: string

      Returns Promise<Scores>

getRoom: ((this, room) => Promise<Room>) = Multiplayer.Room.getOne

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

-

Type declaration

    • (this, room): Promise<Room>
    • Parameters

      Returns Promise<Room>

getRoomLeaderboard: ((this, room) => Promise<{
    leaderboard: Leader[];
    user_score: WithPosition | null;
}>) = Multiplayer.Room.Leader.getMultiple

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

-

Type declaration

    • (this, room): Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>
    • Parameters

      Returns Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>

getRooms: ((this, type, mode, limit?, sort?) => Promise<Room[]>) = Multiplayer.Room.getMultiple

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

-

Type declaration

    • (this, type, mode, limit?, sort?): Promise<Room[]>
    • Parameters

      • this: API
      • type: "realtime" | "playlists"
      • mode: "all" | "active" | "ended" | "participated" | "owned"
      • limit: number = 10
      • sort: "ended" | "created" = "created"

      Returns Promise<Room[]>

NewsPost Functions

getNewsPost: ((this, post) => Promise<WithContentNavigation>) = NewsPost.getOne

Get a NewsPost, its content, and the NewsPosts right before and right after it!

-

Type declaration

getNewsPosts: ((this, year?) => Promise<NewsPost[]>) = NewsPost.getMultiple

Get all the NewsPosts of a specific year!

-

Type declaration

    • (this, year?): Promise<NewsPost[]>
    • Parameters

      • this: API
      • Optional year: number

      Returns Promise<NewsPost[]>

Remarks

If the specified year is invalid/has no news, it fallbacks to the default year

-

Other Functions

getReplay: ((this, score) => Promise<string>) = Score.getReplay

Get the replay for a score!

-

Type declaration

    • (this, score): Promise<string>
    • Parameters

      Returns Promise<string>

Returns

The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)

-
getSpotlights: ((this) => Promise<Spotlight[]>) = Spotlight.getAll

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

-

Type declaration

Remarks

The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom() -but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(

-
  • Get the backgrounds made and selected for this season or for last season!

    +
  • Optionallimit?: number

    The maximum amount of elements returned in the array (defaults to 50)

    +
  • Optionalsort?: "id_desc" | "id_asc"

    "id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)

    +

Returns Promise<Info[]>

getPlaylistItemScores: ((this: API, item: PlaylistItem | {
    id: number;
    room_id: number;
}, limit?: number, sort?: "score_asc" | "score_desc", cursor_string?: string) => Promise<Scores>) = Multiplayer.Room.PlaylistItem.getScores

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

+

Type declaration

    • (this, item, limit?, sort?, cursor_string?): Promise<Scores>
    • Get the scores on a specific item of a room!

      +

      Parameters

      • this: API
      • 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

        +
      • Optionalcursor_string: string

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

        +

      Returns Promise<Scores>

      (2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk +https://github.com/ppy/osu-web/issues/10725

      +
getRoom: ((this: API, room: number | Room) => Promise<Room>) = Multiplayer.Room.getOne

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

+

Type declaration

    • (this, room): Promise<Room>
    • Get data about a lazer multiplayer room (realtime or playlists)!

      +

      Parameters

      • this: API
      • room: number | Room

        The room or the id of the room, can be found at the end of its URL (after /multiplayer/rooms/)

        +

      Returns Promise<Room>

getRoomLeaderboard: ((this: API, room: number | Room) => Promise<{
    leaderboard: Leader[];
    user_score: WithPosition | null;
}>) = Multiplayer.Room.Leader.getMultiple

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

+

Type declaration

    • (this, room): Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>
    • Get the room stats of all the users of that room!

      +

      Parameters

      • this: API
      • room: number | Room

        The room or the id of the room in question

        +

      Returns Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>

      An object with the leaderboard, and the score and position of the authorized user under user_score

      +

      "public"

      +
getRooms: ((this: API, type: "realtime" | "playlists", mode:
    | "all"
    | "active"
    | "ended"
    | "participated"
    | "owned", limit?: number, sort?: "ended" | "created", season_id?: number) => Promise<Room[]>) = Multiplayer.Room.getMultiple

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

+

Type declaration

    • (this, type, mode, limit?, sort?, season_id?): Promise<Room[]>
    • Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!

      +

      Parameters

      • this: API
      • type: "realtime" | "playlists"

        Whether the multiplayer rooms are in playlist format (like current spotlights) or realtime

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

        The state of the room, or the relation of the authorized user with the room

        +
      • limit: number = 10

        The maximum amount of rooms to return, defaults to 10

        +
      • sort: "ended" | "created" = "created"

        Sort (where most recent is first) by creation date or end date, defaults to the creation date

        +
      • Optionalseason_id: number

        Only get rooms (playlists) that belong to a specific (modern) Beatmap Spotlights season id +(so 5'd be summer 2020's mania rooms, not winter 2022!!)

        +

      Returns Promise<Room[]>

      "public"

      +

NewsPost Functions

getNewsPost: ((this: API, post: string | number | NewsPost) => Promise<WithContentNavigation>) = NewsPost.getOne

Get a NewsPost, its content, and the NewsPosts right before and right after it!

+

Type declaration

getNewsPosts: ((this: API, year?: number) => Promise<NewsPost[]>) = NewsPost.getMultiple

Get all the NewsPosts of a specific year!

+

Type declaration

    • (this, year?): Promise<NewsPost[]>
    • Get all the NewsPosts of a specific year!

      +

      Parameters

      • this: API
      • Optionalyear: number

        The year the posts were made (defaults to current year)

        +

      Returns Promise<NewsPost[]>

      If the specified year is invalid/has no news, it fallbacks to the default year

      +

If the specified year is invalid/has no news, it fallbacks to the default year

+

Other Functions

getReplay: ((this: API, score: number | Score) => Promise<string>) = Score.getReplay

Get the replay for a score!

+

Type declaration

    • (this, score): Promise<string>
    • Get the replay for a score!

      +

      Parameters

      • this: API
      • score: number | Score

        The score that has created the replay

        +

      Returns Promise<string>

      The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)

      +

      "public"

      +

The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)

+
getSpotlights: ((this: API) => Promise<Spotlight[]>) = Spotlight.getAll

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

+

Type declaration

    • (this): Promise<Spotlight[]>
    • Get ALL legacy spotlights! (2009-2020, somewhat known as charts/ranking charts, available @ https://osu.ppy.sh/rankings/osu/charts)

      +

      Parameters

      Returns Promise<Spotlight[]>

      The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom() +but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(

      +

The data for newer spotlights (2020-, somewhat known as seasons) can be obtained through getRoom() +but you can't really get the id of those newer spotlights without going through the website's URLs (https://osu.ppy.sh/seasons/latest) as far as I know :(

+
  • Get the backgrounds made and selected for this season or for last season!

    Returns Promise<{
        backgrounds: {
            url: string;
            user: User;
        }[];
        ends_at: Date;
    }>

    When the season ended, and for each background, its URL and its artist

    -

Ranking Functions

getCountryRanking: ((this, ruleset, page?) => Promise<Country>) = Ranking.getCountry

Get the top countries of a specific ruleset!

-

Type declaration

getKudosuRanking: ((this) => Promise<WithKudosu[]>) = Ranking.getKudosu

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

-

Type declaration

getSpotlightRanking: ((this, ruleset, spotlight, filter?) => Promise<Ranking.Spotlight>) = Ranking.getSpotlight

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

-

Type declaration

getUserRanking: ((this, ruleset, type, config?) => Promise<Ranking.User>) = Ranking.getUser

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

-

Type declaration

    • (this, ruleset, type, config?): Promise<Ranking.User>
    • Parameters

      • this: API
      • ruleset: Ruleset
      • type: "performance" | "score"
      • Optional config: {
            country?: string;
            filter?: "all" | "friends";
            page?: number;
            variant?: "4k" | "7k";
        }
        • 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 filter?: "all" | "friends"

          What kind of players do you want to see? Keep in mind friends has no effect if no authorized user

          -
        • Optional page?: number

          Imagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one

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

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

          -

      Returns Promise<Ranking.User>

User Functions

getFriends: ((this) => Promise<WithCountryCoverGroupsStatisticsSupport[]>) = User.getFriends

Get user data of each friend of the authorized user

-

Type declaration

getResourceOwner: ((this, ruleset?) => Promise<WithStatisticsrulesets>) = User.getResourceOwner

Get extensive user data about the authorized user

-

Type declaration

getUser: ((this, user, ruleset?) => Promise<User.Extended>) = User.getOne

Get extensive user data about whoever you want!

-

Type declaration

getUserBeatmaps: ((this, user, type, config?) => Promise<WithBeatmap[]>) = User.getBeatmaps

Get beatmaps favourited or made by a user!

-

Type declaration

    • (this, user, type, config?): Promise<WithBeatmap[]>
    • Parameters

      • this: API
      • user: number | User
      • type: "pending" | "favourite" | "graveyard" | "guest" | "loved" | "nominated" | "ranked"
      • Optional config: User.Config

      Returns Promise<WithBeatmap[]>

getUserKudosu: ((this, user, config?) => Promise<KudosuHistory[]>) = User.getKudosu

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

-

Type declaration

getUserMostPlayed: ((this, user, config?) => Promise<Playcount[]>) = User.getMostPlayed

Get the beatmaps most played by a user!

-

Type declaration

getUserRecentActivity: ((this, user, config?) => Promise<AnyRecentActivity[]>) = User.getRecentActivity

Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

-

Type declaration

getUserScores: ((this, user, type, ruleset?, include?, config?) => Promise<WithUserBeatmapBeatmapset[]>) = User.getScores

Get "notable" scores from a user

-

Type declaration

    • (this, user, type, ruleset?, include?, config?): Promise<WithUserBeatmapBeatmapset[]>
    • Parameters

      • this: API
      • user: number | User
      • type: "best" | "firsts" | "recent"
      • Optional ruleset: Ruleset
      • include: {
            fails?: boolean;
            lazer?: boolean;
        } = ...
        • Optional fails?: boolean
        • Optional lazer?: boolean
      • Optional config: User.Config

      Returns Promise<WithUserBeatmapBeatmapset[]>

getUsers: ((this, users) => Promise<WithCountryCoverGroupsStatisticsrulesets[]>) = User.getMultiple

Get user data for up to 50 users at once!

-

Type declaration

WikiPage Functions

getWikiPage: ((this, path, locale?) => Promise<WikiPage>) = WikiPage.getOne

Get a wiki page!

-

Type declaration

    • (this, path, locale?): Promise<WikiPage>
    • Parameters

      • this: API
      • path: string
      • locale: string = "en"

      Returns Promise<WikiPage>

\ No newline at end of file +

Ranking Functions

getCountryRanking: ((this: API, ruleset: Ruleset, page?: number) => Promise<Country>) = Ranking.getCountry

Get the top countries of a specific ruleset!

+

Type declaration

    • (this, ruleset, page?): Promise<Country>
    • Get the top countries of a specific ruleset!

      +

      Parameters

      • this: API
      • ruleset: Ruleset

        On which Ruleset should the countries be compared?

        +
      • page: number = 1

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

        +

      Returns Promise<Country>

getKudosuRanking: ((this: API) => Promise<WithKudosu[]>) = Ranking.getKudosu

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

+

Type declaration

    • (this): Promise<WithKudosu[]>
    • Get the top 50 players who have the most total kudosu!

      +

      Parameters

      Returns Promise<WithKudosu[]>

getSpotlightRanking: ((this: API, ruleset: Ruleset, spotlight: number | Spotlight, filter?: "all" | "friends") => Promise<Ranking.Spotlight>) = Ranking.getSpotlight

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

+

Type declaration

    • (this, ruleset, spotlight, filter?): Promise<Ranking.Spotlight>
    • Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!

      +

      Parameters

      • this: API
      • ruleset: Ruleset

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

        +
      • spotlight: number | Spotlight

        The spotlight in question

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

        What kind of players do you want to see? Keep in mind friends has no effect if no authorized user (defaults to all)

        +

      Returns Promise<Ranking.Spotlight>

getUserRanking: ((this: API, ruleset: Ruleset, type: "performance" | "score", config?: {
    country?: string;
    filter?: "all" | "friends";
    page?: number;
    variant?: "4k" | "7k";
}) => Promise<Ranking.User>) = Ranking.getUser

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

+

Type declaration

    • (this, ruleset, type, config?): Promise<Ranking.User>
    • Get the top players of the game, with some filters!

      +

      Parameters

      • this: API
      • ruleset: Ruleset

        Self-explanatory, is also known as "Gamemode"

        +
      • type: "performance" | "score"

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

        +
      • Optionalconfig: {
            country?: string;
            filter?: "all" | "friends";
            page?: number;
            variant?: "4k" | "7k";
        }

        Specify which page, country, filter out non-friends...

        +
        • Optionalcountry?: string

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

          +
        • Optionalfilter?: "all" | "friends"

          What kind of players do you want to see? Keep in mind friends has no effect if no authorized user

          +
        • Optionalpage?: number

          Imagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one

          +
        • Optionalvariant?: "4k" | "7k"

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

          +

      Returns Promise<Ranking.User>

User Functions

getFriends: ((this: API) => Promise<WithCountryCoverGroupsStatisticsSupport[]>) = User.getFriends

Get user data of each friend of the authorized user

+

Type declaration

getResourceOwner: ((this: API, ruleset?: Ruleset) => Promise<WithStatisticsrulesets>) = User.getResourceOwner

Get extensive user data about the authorized user

+

Type declaration

getUser: ((this: API, user: string | number | User, ruleset?: Ruleset) => Promise<User.Extended>) = User.getOne

Get extensive user data about whoever you want!

+

Type declaration

    • (this, user, ruleset?): Promise<User.Extended>
    • Get extensive user data about whoever you want!

      +

      Parameters

      • this: API
      • user: string | number | User

        A user id, a username or a User object!

        +
      • Optionalruleset: Ruleset

        The data should be relevant to which ruleset? (defaults to user's default Ruleset)

        +

      Returns Promise<User.Extended>

getUserBeatmaps: ((this: API, user: number | User, type:
    | "pending"
    | "favourite"
    | "graveyard"
    | "guest"
    | "loved"
    | "nominated"
    | "ranked", config?: User.Config) => Promise<WithBeatmap[]>) = User.getBeatmaps

Get beatmaps favourited or made by a user!

+

Type declaration

    • (this, user, type, config?): Promise<WithBeatmap[]>
    • Get beatmaps favourited or made by a user!

      +

      Parameters

      • this: API
      • user: number | User

        The user in question

        +
      • type:
            | "pending"
            | "favourite"
            | "graveyard"
            | "guest"
            | "loved"
            | "nominated"
            | "ranked"

        The relation between the user and the beatmaps

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<WithBeatmap[]>

getUserKudosu: ((this: API, user: number | User, config?: User.Config) => Promise<KudosuHistory[]>) = User.getKudosu

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

+

Type declaration

    • (this, user, config?): Promise<KudosuHistory[]>
    • Get data about the activity of a user kudosu-wise!

      +

      Parameters

      • this: API
      • user: number | User

        The user in question

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<KudosuHistory[]>

getUserMostPlayed: ((this: API, user: number | User, config?: User.Config) => Promise<Playcount[]>) = User.getMostPlayed

Get the beatmaps most played by a user!

+

Type declaration

    • (this, user, config?): Promise<Playcount[]>
    • Get the beatmaps most played by a user!

      +

      Parameters

      • this: API
      • user: number | User

        The user who played the beatmaps

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<Playcount[]>

getUserRecentActivity: ((this: API, user: number | User, config?: User.Config) => Promise<AnyRecentActivity[]>) = User.getRecentActivity

Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

+

Type declaration

    • (this, user, config?): Promise<AnyRecentActivity[]>
    • Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

      +

      Parameters

      • this: API
      • user: number | User

        The user in question

        +
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<AnyRecentActivity[]>

getUserScores: ((this: API, user: number | User, type: "best" | "firsts" | "recent", ruleset?: Ruleset, include?: {
    fails?: boolean;
    lazer?: boolean;
}, config?: User.Config) => Promise<WithUserBeatmapBeatmapset[]>) = User.getScores

Get "notable" scores from a user

+

Type declaration

    • (this, user, type, ruleset?, include?, config?): Promise<WithUserBeatmapBeatmapset[]>
    • Get "notable" scores from a user

      +

      Parameters

      • this: API
      • user: number | User

        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?

        +
      • Optionalruleset: Ruleset

        The Ruleset the scores were made in (defaults to user's default Ruleset)

        +
      • include: {
            fails?: boolean;
            lazer?: boolean;
        } = ...

        Do you also want lazer scores and failed scores? (defaults to true for lazer & false for fails)

        +
        • Optionalfails?: boolean
        • Optionallazer?: boolean
      • Optionalconfig: User.Config

        Array limit & offset

        +

      Returns Promise<WithUserBeatmapBeatmapset[]>

getUsers: ((this: API, users: (number | User)[], include_variant_statistics?: boolean) => Promise<WithCountryCoverGroupsStatisticsrulesets[]>) = User.getMultiple

Get user data for up to 50 users at once!

+

Type declaration

    • (this, users, include_variant_statistics?): Promise<WithCountryCoverGroupsStatisticsrulesets[]>
    • Get user data for up to 50 users at once!

      +

      Parameters

      • this: API
      • users: (number | User)[]

        An array containing user ids or/and User objects!

        +
      • include_variant_statistics: boolean = false

        Should the response include variants, useful to get stats specific to mania 4k/7k for example? (defaults to false)

        +

      Returns Promise<WithCountryCoverGroupsStatisticsrulesets[]>

WikiPage Functions

getWikiPage: ((this: API, path: string, locale?: string) => Promise<WikiPage>) = WikiPage.getOne

Get a wiki page!

+

Type declaration

    • (this, path, locale?): Promise<WikiPage>
    • Get a wiki page!

      +

      Parameters

      • this: API
      • path: string

        What's in the page's URL after https://osu.ppy.sh/wiki/ (so the title, after the subtitle if there is a subtitle) +(An example for https://osu.ppy.sh/wiki/en/Game_mode/osu! would be Game_mode/osu!)

        +
      • locale: string = "en"

        The BCP 47 language (sub)tag lowercase (for example, for a french WikiPage, use "fr") (defaults to en)

        +

      Returns Promise<WikiPage>

diff --git a/docs/enums/Beatmapset.Genre.html b/docs/enums/Beatmapset.Genre.html index cf9ca09..6bd3ec1 100644 --- a/docs/enums/Beatmapset.Genre.html +++ b/docs/enums/Beatmapset.Genre.html @@ -1,4 +1,4 @@ -Genre | osu-api-v2-js

Enumeration Members

Anime +Genre | osu-api-v2-js

Enumeration Members

Enumeration Members

Anime: 3
Any: 0
Classical: 12
Electronic: 10
Folk: 13
Hip Hop: 9
Jazz: 14
Metal: 11
Novelty: 7
Other: 6
Pop: 5
Rock: 4
Unspecified: 1
Video Game: 2
\ No newline at end of file +

Enumeration Members

Anime: 3
Any: 0
Classical: 12
Electronic: 10
Folk: 13
Hip Hop: 9
Jazz: 14
Metal: 11
Novelty: 7
Other: 6
Pop: 5
Rock: 4
Unspecified: 1
Video Game: 2
diff --git a/docs/enums/Beatmapset.Language.html b/docs/enums/Beatmapset.Language.html index e9b1633..ca6cb54 100644 --- a/docs/enums/Beatmapset.Language.html +++ b/docs/enums/Beatmapset.Language.html @@ -1,4 +1,4 @@ -Language | osu-api-v2-js

Enumeration Members

Any +Language | osu-api-v2-js

Enumeration Members

Enumeration Members

Any: 0
Chinese: 4
English: 2
French: 7
German: 8
Instrumental: 5
Italian: 11
Japanese: 3
Korean: 6
Other: 14
Polish: 13
Russian: 12
Spanish: 10
Swedish: 9
Unspecified: 1
\ No newline at end of file +

Enumeration Members

Any: 0
Chinese: 4
English: 2
French: 7
German: 8
Instrumental: 5
Italian: 11
Japanese: 3
Korean: 6
Other: 14
Polish: 13
Russian: 12
Spanish: 10
Swedish: 9
Unspecified: 1
diff --git a/docs/enums/Beatmapset.RankStatus.html b/docs/enums/Beatmapset.RankStatus.html index 7559667..3623223 100644 --- a/docs/enums/Beatmapset.RankStatus.html +++ b/docs/enums/Beatmapset.RankStatus.html @@ -1,8 +1,8 @@ -RankStatus | osu-api-v2-js

Enumeration RankStatus

Enumeration Members

Approved +RankStatus | osu-api-v2-js

Enumeration RankStatus

Enumeration Members

Approved: 2
Graveyard: -2
Loved: 4
Pending: 0
Qualified: 3
Ranked: 1
Wip: -1
\ No newline at end of file +

Enumeration Members

Approved: 2
Graveyard: -2
Loved: 4
Pending: 0
Qualified: 3
Ranked: 1
Wip: -1
diff --git a/docs/enums/Ruleset.html b/docs/enums/Ruleset.html index 06cbb4d..673a474 100644 --- a/docs/enums/Ruleset.html +++ b/docs/enums/Ruleset.html @@ -1,5 +1,5 @@ -Ruleset | osu-api-v2-js

Enumeration Ruleset

Enumeration Members

fruits +Ruleset | osu-api-v2-js

Enumeration Ruleset

Enumeration Members

Enumeration Members

fruits: 2
mania: 3
osu: 0
taiko: 1
\ No newline at end of file +

Enumeration Members

fruits: 2
mania: 3
osu: 0
taiko: 1
diff --git a/docs/functions/Beatmap.DifficultyAttributes.get.html b/docs/functions/Beatmap.DifficultyAttributes.get.html index cda7b7b..c4d57bc 100644 --- a/docs/functions/Beatmap.DifficultyAttributes.get.html +++ b/docs/functions/Beatmap.DifficultyAttributes.get.html @@ -1,6 +1,6 @@ -get | osu-api-v2-js
  • Get various data about the difficulty of a beatmap!

    +get | osu-api-v2-js
    • Get various data about the difficulty of a beatmap!

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

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

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        -
      • Optional ruleset: Ruleset

        Useful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)

        -

      Returns Promise<Beatmap.DifficultyAttributes.Any>

      Remarks

      You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

      -
    \ No newline at end of file +
  • Optionalmods: number | string[] | Mod[]

    Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

    +
  • Optionalruleset: Ruleset

    Useful to specify if the beatmap is a convert (defaults to the ruleset the beatmap was intended for)

    +

Returns Promise<Beatmap.DifficultyAttributes.Any>

You may want to use api.getBeatmapDifficultyAttributesOsu (or Taiko or whatever) instead for better type safety

+
diff --git a/docs/functions/Beatmap.DifficultyAttributes.getFruits.html b/docs/functions/Beatmap.DifficultyAttributes.getFruits.html index fff4031..0c038dc 100644 --- a/docs/functions/Beatmap.DifficultyAttributes.getFruits.html +++ b/docs/functions/Beatmap.DifficultyAttributes.getFruits.html @@ -1,4 +1,4 @@ -getFruits | osu-api-v2-js
  • Get various data about the difficulty of a ctb beatmap!

    +getFruits | osu-api-v2-js
    • Get various data about the difficulty of a ctb beatmap!

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

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

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        -

      Returns Promise<Fruits>

    \ No newline at end of file +
  • Optionalmods: number | string[] | Mod[]

    Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

    +

Returns Promise<Fruits>

diff --git a/docs/functions/Beatmap.DifficultyAttributes.getMania.html b/docs/functions/Beatmap.DifficultyAttributes.getMania.html index 18a2e33..f3e0cd5 100644 --- a/docs/functions/Beatmap.DifficultyAttributes.getMania.html +++ b/docs/functions/Beatmap.DifficultyAttributes.getMania.html @@ -1,4 +1,4 @@ -getMania | osu-api-v2-js
  • Get various data about the difficulty of a mania beatmap!

    +getMania | osu-api-v2-js
    • Get various data about the difficulty of a mania beatmap!

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

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

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        -

      Returns Promise<Mania>

    \ No newline at end of file +
  • Optionalmods: number | string[] | Mod[]

    Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

    +

Returns Promise<Mania>

diff --git a/docs/functions/Beatmap.DifficultyAttributes.getOsu.html b/docs/functions/Beatmap.DifficultyAttributes.getOsu.html index a37c6db..46e7272 100644 --- a/docs/functions/Beatmap.DifficultyAttributes.getOsu.html +++ b/docs/functions/Beatmap.DifficultyAttributes.getOsu.html @@ -1,4 +1,4 @@ -getOsu | osu-api-v2-js
  • Get various data about the difficulty of an osu! beatmap!

    +getOsu | osu-api-v2-js
    • Get various data about the difficulty of an osu! beatmap!

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

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

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        -

      Returns Promise<Osu>

    \ No newline at end of file +
  • Optionalmods: number | string[] | Mod[]

    Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

    +

Returns Promise<Osu>

diff --git a/docs/functions/Beatmap.DifficultyAttributes.getTaiko.html b/docs/functions/Beatmap.DifficultyAttributes.getTaiko.html index 1687f4d..1e074c0 100644 --- a/docs/functions/Beatmap.DifficultyAttributes.getTaiko.html +++ b/docs/functions/Beatmap.DifficultyAttributes.getTaiko.html @@ -1,4 +1,4 @@ -getTaiko | osu-api-v2-js
  • Get various data about the difficulty of a taiko beatmap!

    +getTaiko | osu-api-v2-js
    • Get various data about the difficulty of a taiko beatmap!

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap in question

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

        Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

        -

      Returns Promise<Taiko>

    \ No newline at end of file +
  • Optionalmods: number | string[] | Mod[]

    Can be a bitset of mods, an array of mod acronyms, or an array of Mods (ignores mod settings) (defaults to No Mod)

    +

Returns Promise<Taiko>

diff --git a/docs/functions/Beatmap.Pack.getMultiple.html b/docs/functions/Beatmap.Pack.getMultiple.html index b9e2af8..17a2ae6 100644 --- a/docs/functions/Beatmap.Pack.getMultiple.html +++ b/docs/functions/Beatmap.Pack.getMultiple.html @@ -1,4 +1,4 @@ -getMultiple | osu-api-v2-js
  • Get an Array of up to 100 Beatmap.Packs of a specific type!

    -

    Parameters

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

      The type of the BeatmapPacks (defaults to standard)

      -
    • Optional cursor_string: string

      Use a response's cursor_string with the same parameters to get the next "page" of results!

      -

    Returns Promise<{
        beatmap_packs: Pack[];
        cursor_string: string | null;
    }>

\ No newline at end of file +getMultiple | osu-api-v2-js
  • Get an Array of up to 100 Beatmap.Packs of a specific type!

    +

    Parameters

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

      The type of the BeatmapPacks (defaults to standard)

      +
    • Optionalcursor_string: string

      Use a response's cursor_string with the same parameters to get the next "page" of results!

      +

    Returns Promise<{
        beatmap_packs: Pack[];
        cursor_string: string | null;
    }>

diff --git a/docs/functions/Beatmap.Pack.getOne.html b/docs/functions/Beatmap.Pack.getOne.html index 5164ffd..c27226b 100644 --- a/docs/functions/Beatmap.Pack.getOne.html +++ b/docs/functions/Beatmap.Pack.getOne.html @@ -1,5 +1,5 @@ -getOne | osu-api-v2-js
  • Get data about a Beatmap.Pack using its tag!

    -

    Parameters

    • this: API
    • pack: string | Pack

      The Pack or the pack tag of the Pack you're trying to get

      -
    • legacy_only: boolean = false

      Should lazer scores be excluded from the pack's user_completion_data? (defaults to false)

      -

    Returns Promise<Pack>

    Remarks

    Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

    -
\ No newline at end of file +getOne | osu-api-v2-js
  • Get data about a Beatmap.Pack using its tag!

    +

    Parameters

    • this: API
    • pack: string | Pack

      The Pack or the pack tag of the Pack you're trying to get

      +
    • legacy_only: boolean = false

      Should lazer scores be excluded from the pack's user_completion_data? (defaults to false)

      +

    Returns Promise<Pack>

    Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its URL with its tag should be preview by your browser

    +
diff --git a/docs/functions/Beatmap.UserScore.getMultiple.html b/docs/functions/Beatmap.UserScore.getMultiple.html index f5585ec..c7d157d 100644 --- a/docs/functions/Beatmap.UserScore.getMultiple.html +++ b/docs/functions/Beatmap.UserScore.getMultiple.html @@ -1,5 +1,5 @@ -getMultiple | osu-api-v2-js
  • Get the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)

    +getMultiple | osu-api-v2-js
    • Get the scores on a beatmap made by a specific user (with the possibility to specify if the scores are on a convert)

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap the scores were made on

      • user: number | User

        The User who made the scores

        -
      • Optional config: Beatmap.Config

        Specify the score's ruleset, prevent a lazer score from being returned (mods and type should not be supported)

        -

      Returns Promise<Legacy[]>

    \ No newline at end of file +
  • Optionalconfig: Beatmap.Config

    Specify the score's ruleset, prevent a lazer score from being returned (mods and type should not be supported)

    +

Returns Promise<Legacy[]>

diff --git a/docs/functions/Beatmap.UserScore.getOne.html b/docs/functions/Beatmap.UserScore.getOne.html index 652be65..678cc13 100644 --- a/docs/functions/Beatmap.UserScore.getOne.html +++ b/docs/functions/Beatmap.UserScore.getOne.html @@ -1,6 +1,6 @@ -getOne | osu-api-v2-js
  • Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)

    +getOne | osu-api-v2-js
    • Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)

      Parameters

      • this: API
      • beatmap: number | Beatmap

        The Beatmap the score was made on

      • user: number | User

        The User who made the score

        -
      • Optional config: Beatmap.Config

        Specify the score's ruleset, the score's mods, prevent a lazer score from being returned (type should not be supported)

        +
      • Optionalconfig: Beatmap.Config

        Specify the score's ruleset, the score's mods, prevent a lazer score from being returned (type should not be supported)

      Returns Promise<UserScore>

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

      -
    \ No newline at end of file +
diff --git a/docs/functions/Beatmap.getMultiple.html b/docs/functions/Beatmap.getMultiple.html index 07d21a3..0cccdd9 100644 --- a/docs/functions/Beatmap.getMultiple.html +++ b/docs/functions/Beatmap.getMultiple.html @@ -1,3 +1,3 @@ -getMultiple | osu-api-v2-js
\ No newline at end of file +getMultiple | osu-api-v2-js
diff --git a/docs/functions/Beatmap.getOne.html b/docs/functions/Beatmap.getOne.html index 6a50804..b51aa96 100644 --- a/docs/functions/Beatmap.getOne.html +++ b/docs/functions/Beatmap.getOne.html @@ -1,3 +1,3 @@ -getOne | osu-api-v2-js
\ No newline at end of file +getOne | osu-api-v2-js
diff --git a/docs/functions/Beatmap.getScores.html b/docs/functions/Beatmap.getScores.html index 92b81e1..925ea56 100644 --- a/docs/functions/Beatmap.getScores.html +++ b/docs/functions/Beatmap.getScores.html @@ -1,5 +1,5 @@ -getScores | osu-api-v2-js
  • Get the top scores of a beatmap!

    +getScores | osu-api-v2-js
    \ No newline at end of file +
  • Optionalconfig: Beatmap.Config

    Specify the score's ruleset, mods, type, prevent a lazer score from being returned

    +

Returns Promise<Score.WithUser[]>

Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores

+
diff --git a/docs/functions/Beatmap.getSoloScores.html b/docs/functions/Beatmap.getSoloScores.html index 1e917ad..ca819f0 100644 --- a/docs/functions/Beatmap.getSoloScores.html +++ b/docs/functions/Beatmap.getSoloScores.html @@ -1,6 +1,6 @@ -getSoloScores | osu-api-v2-js

Function getSoloScores

  • Get the top scores of a beatmap, in the "solo score" format lazer brought with it! +getSoloScores | osu-api-v2-js

    Function getSoloScores

    \ No newline at end of file +
  • Optionalconfig: Beatmap.Config

    Specify the score's ruleset, mods, type (legacy_only should not be supported)

    +

Returns Promise<Solo[]>

Please check if mods and type seem to be supported or not by the API: https://osu.ppy.sh/docs/index.html#get-beatmap-scores-non-legacy

+
diff --git a/docs/functions/Beatmap.lookup.html b/docs/functions/Beatmap.lookup.html index cf86342..4c9176c 100644 --- a/docs/functions/Beatmap.lookup.html +++ b/docs/functions/Beatmap.lookup.html @@ -1,3 +1,3 @@ -lookup | osu-api-v2-js
  • Get extensive beatmap data about whichever beatmap you want!

    +lookup | osu-api-v2-js
    • Get extensive beatmap data about whichever beatmap you want!

      Parameters

      • this: API
      • query: {
            checksum?: string;
            filename?: string;
            id?: number;
        }

        What to specify in order to find the right beatmap

        -
        • Optional checksum?: string
        • Optional filename?: string
        • Optional id?: number

      Returns Promise<WithFailtimesBeatmapset>

    \ No newline at end of file +
    • Optionalchecksum?: string
    • Optionalfilename?: string
    • Optionalid?: number

Returns Promise<WithFailtimesBeatmapset>

diff --git a/docs/functions/Beatmapset.Discussion.Post.getMultiple.html b/docs/functions/Beatmapset.Discussion.Post.getMultiple.html index 9ce3937..3e771d5 100644 --- a/docs/functions/Beatmapset.Discussion.Post.getMultiple.html +++ b/docs/functions/Beatmapset.Discussion.Post.getMultiple.html @@ -1,7 +1,7 @@ -getMultiple | osu-api-v2-js
  • Get complex data about the posts of a beatmapset's discussion or of a user!

    -

    Parameters

    • this: API
    • Optional from: {
          discussion?: number | Discussion;
          user?: number | User;
      }

      From where/who are the posts coming from? A specific discussion, a specific user?

      -
      • Optional discussion?: number | Discussion
      • Optional user?: number | User
    • Optional types: ("first" | "reply" | "system")[]

      What kind of posts?

      -
    • Optional config: Beatmapset.Config

      How many results maximum, how to sort them, which page of those, maybe a cursor_string...

      +getMultiple | osu-api-v2-js
      • Get complex data about the posts of a beatmapset's discussion or of a user!

        +

        Parameters

        • this: API
        • Optionalfrom: {
              discussion?: number | Discussion;
              user?: number | User;
          }

          From where/who are the posts coming from? A specific discussion, a specific user?

          +
        • Optionaltypes: ("first" | "reply" | "system")[]

          What kind of posts?

          +
        • Optionalconfig: Beatmapset.Config

          How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        Returns Promise<{
            beatmapsets: WithHype[];
            cursor_string: string | null;
            posts: Beatmapset.Discussion.Post[];
            users: User[];
        }>

        Relevant posts and info about them

        -

        Remarks

        (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

        -
      \ No newline at end of file +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +
diff --git a/docs/functions/Beatmapset.Discussion.Vote.getMultiple.html b/docs/functions/Beatmapset.Discussion.Vote.getMultiple.html index 56de68c..252ea4b 100644 --- a/docs/functions/Beatmapset.Discussion.Vote.getMultiple.html +++ b/docs/functions/Beatmapset.Discussion.Vote.getMultiple.html @@ -1,7 +1,7 @@ -getMultiple | osu-api-v2-js
  • Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

    -

    Parameters

    • this: API
    • Optional from: {
          discussion?: number | Discussion;
          vote_giver?: number | User;
          vote_receiver?: number | User;
      }

      The discussion with the votes, the user who voted, the user who's gotten the votes...

      -
      • Optional discussion?: number | Discussion
      • Optional vote_giver?: number | User
      • Optional vote_receiver?: number | User
    • Optional score: 1 | -1

      An upvote (1) or a downvote (-1)

      -
    • Optional config: Beatmapset.Config

      How many results maximum, how to sort them, which page of those, maybe a cursor_string...

      +getMultiple | osu-api-v2-js
      • Get complex data about the votes of a beatmapset's discussions or/and received/given by a specific user!

        +

        Parameters

        • this: API
        • Optionalfrom: {
              discussion?: number | Discussion;
              vote_giver?: number | User;
              vote_receiver?: number | User;
          }

          The discussion with the votes, the user who voted, the user who's gotten the votes...

          +
          • Optionaldiscussion?: number | Discussion
          • Optionalvote_giver?: number | User
          • Optionalvote_receiver?: number | User
        • Optionalscore: 1 | -1

          An upvote (1) or a downvote (-1)

          +
        • Optionalconfig: Beatmapset.Config

          How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        Returns Promise<{
            cursor_string: string | null;
            discussions: Discussion[];
            users: WithGroups[];
            votes: Vote[];
        }>

        Relevant votes and info about them

        -

        Remarks

        (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

        -
      \ No newline at end of file +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +
diff --git a/docs/functions/Beatmapset.Discussion.getMultiple.html b/docs/functions/Beatmapset.Discussion.getMultiple.html index 21aa48d..01e6f93 100644 --- a/docs/functions/Beatmapset.Discussion.getMultiple.html +++ b/docs/functions/Beatmapset.Discussion.getMultiple.html @@ -1,7 +1,7 @@ -getMultiple | osu-api-v2-js
  • Get complex data about the discussion page of any beatmapet that you want!

    -

    Parameters

    • this: API
    • Optional from: {
          beatmapset?: number | Beatmapset;
          status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified";
          user?: number | User;
      }

      From where/who are the discussions coming from? Maybe only qualified sets?

      -
      • Optional beatmapset?: number | Beatmapset
      • Optional status?: "all" | "ranked" | "qualified" | "disqualified" | "never_qualified"
      • Optional user?: number | User
    • Optional filter: {
          only_unresolved?: boolean;
          types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[];
      }

      Should those discussions only be unresolved problems, for example?

      -
      • Optional only_unresolved?: boolean
      • Optional types?: ("suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review")[]
    • Optional config: Beatmapset.Config

      How many results maximum, how to sort them, which page of those, maybe a cursor_string...

      +getMultiple | osu-api-v2-js
      • Get complex data about the discussion page of any beatmapet that you want!

        +

        Parameters

        • this: API
        • Optionalfrom: {
              beatmapset?: number | Beatmapset;
              status?:
                  | "all"
                  | "ranked"
                  | "qualified"
                  | "disqualified"
                  | "never_qualified";
              user?: number | User;
          }

          From where/who are the discussions coming from? Maybe only qualified sets?

          +
          • Optionalbeatmapset?: number | Beatmapset
          • Optionalstatus?:
                | "all"
                | "ranked"
                | "qualified"
                | "disqualified"
                | "never_qualified"
          • Optionaluser?: number | User
        • Optionalfilter: {
              only_unresolved?: boolean;
              types?: (
                  | "suggestion"
                  | "problem"
                  | "mapper_note"
                  | "praise"
                  | "hype"
                  | "review")[];
          }

          Should those discussions only be unresolved problems, for example?

          +
          • Optionalonly_unresolved?: boolean
          • Optionaltypes?: (
                | "suggestion"
                | "problem"
                | "mapper_note"
                | "praise"
                | "hype"
                | "review")[]
        • Optionalconfig: Beatmapset.Config

          How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        Returns Promise<{
            beatmaps: Beatmap.Extended[];
            beatmapsets: Beatmapset.Extended[];
            cursor_string: string | null;
            discussions: WithStartingpost[];
            included_discussions: WithStartingpost[];
            reviews_config: {
                max_blocks: number;
            };
            users: WithGroups[];
        }>

        Relevant discussions and info about them

        -

        Remarks

        (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

        -
      \ No newline at end of file +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware

      +
diff --git a/docs/functions/Beatmapset.Event.getMultiple.html b/docs/functions/Beatmapset.Event.getMultiple.html index 3504293..e5260cb 100644 --- a/docs/functions/Beatmapset.Event.getMultiple.html +++ b/docs/functions/Beatmapset.Event.getMultiple.html @@ -1,8 +1,8 @@ -getMultiple | osu-api-v2-js
  • Get complex data about the events of a beatmapset and the users involved with them!

    -

    Parameters

    • this: API
    • Optional from: {
          beatmapset?: number | Beatmapset;
          max_date?: Date;
          min_date?: Date;
          user?: number | User;
      }

      Which beatmapset, or caused by which user? When?

      -
      • Optional beatmapset?: number | Beatmapset
      • Optional max_date?: Date
      • Optional min_date?: Date
      • Optional user?: number | User
    • Optional types: ("nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change")[]

      What kinds of events?

      -
    • Optional config: Beatmapset.Config

      How many results maximum, how to sort them, which page of those, maybe a cursor_string...

      +getMultiple | osu-api-v2-js
      • Get complex data about the events of a beatmapset and the users involved with them!

        +

        Parameters

        • this: API
        • Optionalfrom: {
              beatmapset?: number | Beatmapset;
              max_date?: Date;
              min_date?: Date;
              user?: number | User;
          }

          Which beatmapset, or caused by which user? When?

          +
          • Optionalbeatmapset?: number | Beatmapset
          • Optionalmax_date?: Date
          • Optionalmin_date?: Date
          • Optionaluser?: number | User
        • Optionaltypes: (
              | "nominate"
              | "love"
              | "remove_from_loved"
              | "qualify"
              | "disqualify"
              | "approve"
              | "rank"
              | "kudosu_allow"
              | "kudosu_deny"
              | "kudosu_gain"
              | "kudosu_lost"
              | "kudosu_recalculate"
              | "issue_resolve"
              | "issue_reopen"
              | "discussion_lock"
              | "discussion_unlock"
              | "discussion_delete"
              | "discussion_restore"
              | "discussion_post_delete"
              | "discussion_post_restore"
              | "nomination_reset"
              | "nomination_reset_received"
              | "genre_edit"
              | "language_edit"
              | "nsfw_toggle"
              | "offset_edit"
              | "tags_edit"
              | "beatmap_owner_change")[]

          What kinds of events?

          +
        • Optionalconfig: Beatmapset.Config

          How many results maximum, how to sort them, which page of those, maybe a cursor_string...

        Returns Promise<{
            events: Beatmapset.Event.Any[];
            users: WithGroups[];
        }>

        Relevant events and users

        -

        Remarks

        (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, -and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

        -
      \ No newline at end of file +

      (2024-03-11) For months now, the API's documentation says the response is likely to change, so beware, +and also there's no documentation for this route in the API, so this is only the result of my interpretation of the website's code lol

      +
diff --git a/docs/functions/Beatmapset.getOne.html b/docs/functions/Beatmapset.getOne.html index 984d0f2..f96a026 100644 --- a/docs/functions/Beatmapset.getOne.html +++ b/docs/functions/Beatmapset.getOne.html @@ -1,3 +1,3 @@ -getOne | osu-api-v2-js
  • Get extensive beatmapset data about whichever beatmapset you want!

    -

    Parameters

    • this: API
    • beatmapset: number | Beatmapset

      The beatmapset or the id of the beatmapset you're trying to get

      -

    Returns Promise<Plus>

\ No newline at end of file +getOne | osu-api-v2-js
  • Get extensive beatmapset data about whichever beatmapset you want!

    +

    Parameters

    • this: API
    • beatmapset: number | Beatmapset

      The beatmapset or the id of the beatmapset you're trying to get

      +

    Returns Promise<Plus>

diff --git a/docs/functions/Beatmapset.lookup.html b/docs/functions/Beatmapset.lookup.html index 4679c2c..f77b655 100644 --- a/docs/functions/Beatmapset.lookup.html +++ b/docs/functions/Beatmapset.lookup.html @@ -1,3 +1,3 @@ -lookup | osu-api-v2-js
  • Get extensive data about a beatmapset by using a beatmap!

    -

    Parameters

    • this: API
    • beatmap: number | Beatmap

      A beatmap from the beatmapset you're looking for

      -

    Returns Promise<Plus>

\ No newline at end of file +lookup | osu-api-v2-js
  • Get extensive data about a beatmapset by using a beatmap!

    +

    Parameters

    • this: API
    • beatmap: number | Beatmap

      A beatmap from the beatmapset you're looking for

      +

    Returns Promise<Plus>

diff --git a/docs/functions/Beatmapset.search.html b/docs/functions/Beatmapset.search.html index 7a4cb55..21f7b4a 100644 --- a/docs/functions/Beatmapset.search.html +++ b/docs/functions/Beatmapset.search.html @@ -1,21 +1,21 @@ -search | osu-api-v2-js
  • Search for beatmapsets as if you were on the website or on lazer!

    -

    Parameters

    • this: API
    • Optional query: {
          categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps";
          cursor_string?: string;
          extra?: ("must_have_video" | "must_have_storyboard")[];
          general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[];
          genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | Jazz;
          hide_explicit_content?: true;
          keywords?: string;
          language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | Other;
          mode?: Ruleset;
          played?: "Played" | "Unplayed";
          rank_achieved?: ("A" | "Silver SS" | "SS" | "Silver S" | "S" | "B" | "C" | "D")[];
          sort?: {
              by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated";
              in: "desc" | "asc";
          };
      }

      All the filters and sorting options that you'd normally find on the website or on lazer

      -
      • Optional categories?: "Any" | "Ranked" | "Qualified" | "Loved" | "Favourites" | "Pending" | "WIP" | "Graveyard" | "My Maps"

        Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)

        -
      • Optional cursor_string?: string

        The thing you've got from a previous request to get another page of results!

        -
      • Optional extra?: ("must_have_video" | "must_have_storyboard")[]

        Should all sets have a video, a storyboard, maybe both at once?

        -
      • Optional general?: ("Recommended difficulty" | "Include converted beatmaps" | "Subscribed mappers" | "Spotlighted beatmaps" | "Featured Artists")[]

        Various filters to activate

        -
      • Optional genre?: Unspecified | any[any] | Anime | Rock | Pop | Other | Novelty | any[any] | Electronic | Metal | Classical | Folk | Jazz

        Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)

        -

        Remarks

        "Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947, it's excluded because it's counter-intuitive +search | osu-api-v2-js

        • Search for beatmapsets as if you were on the website or on lazer!

          +

          Parameters

          • this: API
          • Optionalquery: {
                categories?:
                    | "Any"
                    | "Ranked"
                    | "Qualified"
                    | "Loved"
                    | "Favourites"
                    | "Pending"
                    | "WIP"
                    | "Graveyard"
                    | "My Maps";
                cursor_string?: string;
                extra?: ("must_have_video" | "must_have_storyboard")[];
                general?: (
                    | "Recommended difficulty"
                    | "Include converted beatmaps"
                    | "Subscribed mappers"
                    | "Spotlighted beatmaps"
                    | "Featured Artists")[];
                genre?:
                    | Unspecified
                    | any[any]
                    | Anime
                    | Rock
                    | Pop
                    | Other
                    | Novelty
                    | any[any]
                    | Electronic
                    | Metal
                    | Classical
                    | Folk
                    | Jazz;
                hide_explicit_content?: true;
                keywords?: string;
                language?:
                    | Unspecified
                    | English
                    | Japanese
                    | Chinese
                    | Instrumental
                    | Korean
                    | French
                    | German
                    | Swedish
                    | Spanish
                    | Italian
                    | Russian
                    | Polish
                    | Other;
                mode?: Ruleset;
                played?: "Played" | "Unplayed";
                rank_achieved?: (
                    | "A"
                    | "Silver SS"
                    | "SS"
                    | "Silver S"
                    | "S"
                    | "B"
                    | "C"
                    | "D")[];
                sort?: {
                    by:
                        | "title"
                        | "artist"
                        | "ranked"
                        | "difficulty"
                        | "rating"
                        | "plays"
                        | "favourites"
                        | "updated";
                    in: "desc" | "asc";
                };
            }

            All the filters and sorting options that you'd normally find on the website or on lazer

            +
            • Optionalcategories?:
                  | "Any"
                  | "Ranked"
                  | "Qualified"
                  | "Loved"
                  | "Favourites"
                  | "Pending"
                  | "WIP"
                  | "Graveyard"
                  | "My Maps"

              Filter in sets depending on their status or on their relation with the authorized user (defaults to all that have a leaderboard)

              +
            • Optionalcursor_string?: string

              The thing you've got from a previous request to get another page of results!

              +
            • Optionalextra?: ("must_have_video" | "must_have_storyboard")[]

              Should all sets have a video, a storyboard, maybe both at once?

              +
            • Optionalgeneral?: (
                  | "Recommended difficulty"
                  | "Include converted beatmaps"
                  | "Subscribed mappers"
                  | "Spotlighted beatmaps"
                  | "Featured Artists")[]

              Various filters to activate

              +
            • Optionalgenre?:
                  | Unspecified
                  | any[any]
                  | Anime
                  | Rock
                  | Pop
                  | Other
                  | Novelty
                  | any[any]
                  | Electronic
                  | Metal
                  | Classical
                  | Folk
                  | Jazz

              Specify the musical genre of the music of the beatmapsets you're searching for (don't specify to get any genre)

              +

              "Any"/0 actually looks up sets that specifically have the Genre "Any" such as 5947, it's excluded because it's counter-intuitive and near useless (but you can do something like 1-1 if you actually want that!)

              -
            • Optional hide_explicit_content?: true

              Use this to hide all sets that are marked as explicit

              -
            • Optional keywords?: string

              What you'd put in the searchbar, like the name of a beatmapset or a mapper!

              -
            • Optional language?: Unspecified | English | Japanese | Chinese | Instrumental | Korean | French | German | Swedish | Spanish | Italian | Russian | Polish | Other

              Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)

              -

              Remarks

              "Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive +

            • Optionalhide_explicit_content?: true

              Use this to hide all sets that are marked as explicit

              +
            • Optionalkeywords?: string

              What you'd put in the searchbar, like the name of a beatmapset or a mapper!

              +
            • Optionallanguage?:
                  | Unspecified
                  | English
                  | Japanese
                  | Chinese
                  | Instrumental
                  | Korean
                  | French
                  | German
                  | Swedish
                  | Spanish
                  | Italian
                  | Russian
                  | Polish
                  | Other

              Specify the spoken language of the music of the beatmapsets you're searching for (don't specify to get any language)

              +

              "Any"/0 actually looks up sets that specifically have the Language "Any" (and no set has that), it's excluded because it's counter-intuitive and near useless (but you can do something like 1-1 if you actually want that!)

              -
            • Optional mode?: Ruleset

              Only get sets that have maps that you can play in the ruleset of your choice

              -
            • Optional played?: "Played" | "Unplayed"

              Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?

              -
            • Optional rank_achieved?: ("A" | "Silver SS" | "SS" | "Silver S" | "S" | "B" | "C" | "D")[]

              Does the authorized user with osu!supporter have already achieved certain ranks on those sets?

              -
            • Optional sort?: {
                  by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated";
                  in: "desc" | "asc";
              }

              Sort by what, in ascending/descending order

              -
              • by: "title" | "artist" | "ranked" | "difficulty" | "rating" | "plays" | "favourites" | "updated"
              • in: "desc" | "asc"

          Returns Promise<{
              beatmapsets: WithBeatmapPacktags[];
              cursor_string: string | null;
              error: any | null;
              recommended_difficulty: number | null;
              total: number;
          }>

          Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

          -

          Remarks

          This does not bypass the current osu!supporter requirement for certain filters

          -
        \ No newline at end of file +
      • Optionalmode?: Ruleset

        Only get sets that have maps that you can play in the ruleset of your choice

        +
      • Optionalplayed?: "Played" | "Unplayed"

        Does the authorized user with osu!supporter have already played those sets, or have they not played them yet?

        +
      • Optionalrank_achieved?: (
            | "A"
            | "Silver SS"
            | "SS"
            | "Silver S"
            | "S"
            | "B"
            | "C"
            | "D")[]

        Does the authorized user with osu!supporter have already achieved certain ranks on those sets?

        +
      • Optionalsort?: {
            by:
                | "title"
                | "artist"
                | "ranked"
                | "difficulty"
                | "rating"
                | "plays"
                | "favourites"
                | "updated";
            in: "desc" | "asc";
        }

        Sort by what, in ascending/descending order

        +
        • by:
              | "title"
              | "artist"
              | "ranked"
              | "difficulty"
              | "rating"
              | "plays"
              | "favourites"
              | "updated"
        • in: "desc" | "asc"

    Returns Promise<{
        beatmapsets: WithBeatmapPacktags[];
        cursor_string: string | null;
        error: any | null;
        recommended_difficulty: number | null;
        total: number;
    }>

    Relevant Beatmapsets that contain Beatmaps, and a cursor_string to allow you to look for more of the same!

    +

    This does not bypass the current osu!supporter requirement for certain filters

    +
diff --git a/docs/functions/Changelog.Build.getMultiple.html b/docs/functions/Changelog.Build.getMultiple.html index f92439a..c8a3101 100644 --- a/docs/functions/Changelog.Build.getMultiple.html +++ b/docs/functions/Changelog.Build.getMultiple.html @@ -1,7 +1,7 @@ -getMultiple | osu-api-v2-js
  • Get up to 21 versions/updates/builds!

    -

    Parameters

    • this: API
    • Optional stream: string

      Only get builds from a specific stream

      -
    • Optional range: {
          from?: string;
          to?: string | number;
      }

      Get builds that were released before/after (and including) those builds

      -
      • Optional from?: string

        The name of the build

        -
      • Optional to?: string | number

        The name or the id of the build

        +getMultiple | osu-api-v2-js
        • Get up to 21 versions/updates/builds!

          +

          Parameters

          • this: API
          • Optionalstream: string

            Only get builds from a specific stream

            +
          • Optionalrange: {
                from?: string;
                to?: string | number;
            }

            Get builds that were released before/after (and including) those builds

            +
            • Optionalfrom?: string

              The name of the build

              +
            • Optionalto?: string | number

              The name or the id of the build

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

            changelog_entries will have a message property if markdown, message_html property if html (defaults to both)

            -

          Returns Promise<WithUpdatestreamsChangelogentries[]>

        \ No newline at end of file +

    Returns Promise<WithUpdatestreamsChangelogentries[]>

diff --git a/docs/functions/Changelog.Build.getOne.html b/docs/functions/Changelog.Build.getOne.html index 200070d..78c6814 100644 --- a/docs/functions/Changelog.Build.getOne.html +++ b/docs/functions/Changelog.Build.getOne.html @@ -1,4 +1,4 @@ -getOne | osu-api-v2-js
  • Get details about the version/update/build of something related to osu!

    +getOne | osu-api-v2-js
    • Get details about the version/update/build of something related to osu!

      Parameters

      • this: API
      • 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<WithChangelogentriesVersions>

    \ No newline at end of file +

Returns Promise<WithChangelogentriesVersions>

diff --git a/docs/functions/Changelog.Build.lookup.html b/docs/functions/Changelog.Build.lookup.html index 2626132..86130b1 100644 --- a/docs/functions/Changelog.Build.lookup.html +++ b/docs/functions/Changelog.Build.lookup.html @@ -1,4 +1,4 @@ -lookup | osu-api-v2-js
  • Get details about the version/update/build of something related to osu!

    +lookup | osu-api-v2-js
    • Get details about the version/update/build of something related to osu!

      Parameters

      • this: API
      • changelog: string | number

        A stream name like lazer, a build version like 2023.1026.0, or the id of a build

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

        changelog_entries will have a message property if markdown, message_html property if html (defaults to both)

        -

      Returns Promise<WithChangelogentriesVersions>

    \ No newline at end of file +

Returns Promise<WithChangelogentriesVersions>

diff --git a/docs/functions/Changelog.UpdateStream.getAll.html b/docs/functions/Changelog.UpdateStream.getAll.html index 8d50cfc..7cd98a1 100644 --- a/docs/functions/Changelog.UpdateStream.getAll.html +++ b/docs/functions/Changelog.UpdateStream.getAll.html @@ -1,4 +1,5 @@ -getAll | osu-api-v2-js
\ No newline at end of file +getAll | osu-api-v2-js
diff --git a/docs/functions/Chat.Channel.createAnnouncement.html b/docs/functions/Chat.Channel.createAnnouncement.html index e8ce2b2..f4abc62 100644 --- a/docs/functions/Chat.Channel.createAnnouncement.html +++ b/docs/functions/Chat.Channel.createAnnouncement.html @@ -1,8 +1,8 @@ -createAnnouncement | osu-api-v2-js
  • Create a new announcement!

    -

    Parameters

    • this: API
    • channel: {
          description: string;
          name: string;
      }

      Details of the channel you're creating

      +createAnnouncement | osu-api-v2-js
      • Create a new announcement!

        +

        Parameters

        • this: API
        • channel: {
              description: string;
              name: string;
          }

          Details of the channel you're creating

          • description: string
          • name: string
        • user_targets: (number | User)[]

          The people that will receive your message

        • message: string

          The message to send with the announcement

        Returns Promise<Channel>

        The newly created channel!

        -

        Scope

        "chat.write_manage"

        -

        Remarks

        From my understanding, this WILL 403 unless the user is kinda special

        -
      \ No newline at end of file +

      "chat.write_manage"

      +

      From my understanding, this WILL 403 unless the user is kinda special

      +
diff --git a/docs/functions/Chat.Channel.createPrivate.html b/docs/functions/Chat.Channel.createPrivate.html index b0261d0..1c8e62c 100644 --- a/docs/functions/Chat.Channel.createPrivate.html +++ b/docs/functions/Chat.Channel.createPrivate.html @@ -1,5 +1,5 @@ -createPrivate | osu-api-v2-js
  • Create/Open/Join a private messages chat channel!

    +createPrivate | osu-api-v2-js
    • Create/Open/Join a private messages chat channel!

      Parameters

      • this: API
      • user_target: number | User

        The other user able to read and send messages in this channel

      Returns Promise<Channel>

      The newly created channel!

      -
    \ No newline at end of file +
diff --git a/docs/functions/Chat.Channel.getAll.html b/docs/functions/Chat.Channel.getAll.html index 4ac527d..159c151 100644 --- a/docs/functions/Chat.Channel.getAll.html +++ b/docs/functions/Chat.Channel.getAll.html @@ -1,3 +1,3 @@ -getAll | osu-api-v2-js
\ No newline at end of file +getAll | osu-api-v2-js
diff --git a/docs/functions/Chat.Channel.getOne.html b/docs/functions/Chat.Channel.getOne.html index 3a6c6a1..593ecbf 100644 --- a/docs/functions/Chat.Channel.getOne.html +++ b/docs/functions/Chat.Channel.getOne.html @@ -1,5 +1,5 @@ -getOne | osu-api-v2-js
  • Get a ChatChannel that you have joined, and the users in it if it is a private channel!

    +getOne | osu-api-v2-js
    • Get a ChatChannel that you have joined, and the users in it if it is a private channel!

      Parameters

      • this: API
      • channel: number | Channel

        The channel in question

        -

      Returns Promise<WithDetails>

      Scope

      "chat.read"

      -

      Remarks

      Will 404 if the user has not joined the channel (use joinChatChannel for that)

      -
    \ No newline at end of file +

Returns Promise<WithDetails>

"chat.read"

+

Will 404 if the user has not joined the channel (use joinChatChannel for that)

+
diff --git a/docs/functions/Chat.Channel.joinOne.html b/docs/functions/Chat.Channel.joinOne.html index a747eab..94233d5 100644 --- a/docs/functions/Chat.Channel.joinOne.html +++ b/docs/functions/Chat.Channel.joinOne.html @@ -1,5 +1,5 @@ -joinOne | osu-api-v2-js
  • Join a public or multiplayer ChatChannel, allowing you to interact with it!

    +joinOne | osu-api-v2-js
    • Join a public or multiplayer ChatChannel, allowing you to interact with it!

      Parameters

      • this: API
      • channel: number | Channel

        The channel you wanna join

        -
      • Optional user: number | User

        The user joining the channel (defaults to the presumed authorized user (api.user))

        -

      Returns Promise<WithDetails>

    \ No newline at end of file +
  • Optionaluser: number | User

    The user joining the channel (defaults to the presumed authorized user (api.user))

    +

Returns Promise<WithDetails>

diff --git a/docs/functions/Chat.Channel.leaveOne.html b/docs/functions/Chat.Channel.leaveOne.html index c87a8d9..21e69e8 100644 --- a/docs/functions/Chat.Channel.leaveOne.html +++ b/docs/functions/Chat.Channel.leaveOne.html @@ -1,5 +1,5 @@ -leaveOne | osu-api-v2-js
  • Leave/Close a public ChatChannel!

    +leaveOne | osu-api-v2-js
    • Leave/Close a public ChatChannel!

      Parameters

      • this: API
      • channel: number | Channel

        The channel you wanna leave/close

        -
      • Optional user: number | User

        The user leaving/closing the channel (defaults to the presumed authorized user (api.user))

        -

      Returns Promise<void>

    \ No newline at end of file +
  • Optionaluser: number | User

    The user leaving/closing the channel (defaults to the presumed authorized user (api.user))

    +

Returns Promise<void>

diff --git a/docs/functions/Chat.Channel.markAsRead.html b/docs/functions/Chat.Channel.markAsRead.html index 6363866..97e7cbb 100644 --- a/docs/functions/Chat.Channel.markAsRead.html +++ b/docs/functions/Chat.Channel.markAsRead.html @@ -1,5 +1,5 @@ -markAsRead | osu-api-v2-js
  • Mark a certain channel as read up to a given message!

    +markAsRead | osu-api-v2-js
    • Mark a certain channel as read up to a given message!

      Parameters

      • this: API
      • channel: number | Channel

        The channel in question

        -
      • message: number | Message

        You're marking this and all the messages before it as read!

        -

      Returns Promise<void>

    \ No newline at end of file +
  • message: number | Message

    You're marking this and all the messages before it as read!

    +

Returns Promise<void>

diff --git a/docs/functions/Chat.Message.getMultiple.html b/docs/functions/Chat.Message.getMultiple.html index e3bee53..9d7a816 100644 --- a/docs/functions/Chat.Message.getMultiple.html +++ b/docs/functions/Chat.Message.getMultiple.html @@ -1,7 +1,7 @@ -getMultiple | osu-api-v2-js
  • Get the recent messages of a specific ChatChannel!

    +getMultiple | osu-api-v2-js
    • Get the recent messages of a specific ChatChannel!

      Parameters

      • this: API
      • channel: number | Channel

        The Channel you wanna get the messages from

      • limit: number = 20

        The maximum amount of messages you want to get, up to 50! (defaults to 20)

        -
      • Optional since: number | Message

        Get the messages sent after this message

        -
      • Optional until: number | Message

        Get the messages sent up to but not including this message

        -

      Returns Promise<Message[]>

    \ No newline at end of file +
  • Optionalsince: number | Message

    Get the messages sent after this message

    +
  • Optionaluntil: number | Message

    Get the messages sent up to but not including this message

    +

Returns Promise<Message[]>

diff --git a/docs/functions/Chat.Message.send.html b/docs/functions/Chat.Message.send.html index 2ff73e0..3049ac9 100644 --- a/docs/functions/Chat.Message.send.html +++ b/docs/functions/Chat.Message.send.html @@ -1,7 +1,7 @@ -send | osu-api-v2-js
  • Send a message in a ChatChannel!

    +send | osu-api-v2-js
    • Send a message in a ChatChannel!

      Parameters

      • this: API
      • channel: number | Channel

        The channel in which you want to send your message

      • message: string

        The message you wanna send

      • is_action: boolean = false

        Is it a command? Like /me dances (defaults to false)

      Returns Promise<Message>

      The newly sent ChatMessage!

      -
    \ No newline at end of file +
diff --git a/docs/functions/Chat.Message.sendPrivate.html b/docs/functions/Chat.Message.sendPrivate.html index 9d72c8f..508ac37 100644 --- a/docs/functions/Chat.Message.sendPrivate.html +++ b/docs/functions/Chat.Message.sendPrivate.html @@ -1,9 +1,9 @@ -sendPrivate | osu-api-v2-js
  • Send a private message to someone!

    +sendPrivate | osu-api-v2-js
    • Send a private message to someone!

      Parameters

      • this: API
      • user_target: number | User

        The User you wanna send your message to!

      • message: string

        The message you wanna send

      • is_action: boolean = false

        Is it a command? Like /me dances (defaults to false)

        -
      • Optional uuid: string

        A client-side message identifier

        +
      • Optionaluuid: string

        A client-side message identifier

      Returns Promise<{
          channel: Channel;
          message: Message;
      }>

      The message you sent

      -

      Scope

      "chat.write"

      -

      Remarks

      You don't need to use createChatPrivateChannel before sending a message

      -
    \ No newline at end of file +

    "chat.write"

    +

    You don't need to use createChatPrivateChannel before sending a message

    +
diff --git a/docs/functions/Chat.keepAlive.html b/docs/functions/Chat.keepAlive.html index 3ee4b55..db133b8 100644 --- a/docs/functions/Chat.keepAlive.html +++ b/docs/functions/Chat.keepAlive.html @@ -1,6 +1,6 @@ -keepAlive | osu-api-v2-js

Function keepAlive

  • Needs to be done periodically to reset chat activity timeout

    -

    Parameters

    • this: API
    • Optional since: {
          message?: number | Message;
          user_silence?: number | UserSilence;
      }

      UserSilences that are before that will not be returned!

      -

    Returns Promise<UserSilence[]>

    A list of recent silences

    -

    Scope

    "chat.read"

    -

    Remarks

    Every 30 seconds is a good idea

    -
\ No newline at end of file +keepAlive | osu-api-v2-js

Function keepAlive

  • Needs to be done periodically to reset chat activity timeout

    +

    Parameters

    • this: API
    • Optionalsince: {
          message?: number | Message;
          user_silence?: number | UserSilence;
      }

      UserSilences that are before that will not be returned!

      +

    Returns Promise<UserSilence[]>

    A list of recent silences

    +

    "chat.read"

    +

    Every 30 seconds is a good idea

    +
diff --git a/docs/functions/Comment.getMultiple.html b/docs/functions/Comment.getMultiple.html index 875a694..615663d 100644 --- a/docs/functions/Comment.getMultiple.html +++ b/docs/functions/Comment.getMultiple.html @@ -1,5 +1,5 @@ -getMultiple | osu-api-v2-js
  • Get comments that meet any of your requirements!

    -

    Parameters

    • this: API
    • Optional from: {
          id: number;
          type: "beatmapset" | "build" | "news_post";
      }

      From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?

      -
      • id: number
      • type: "beatmapset" | "build" | "news_post"
    • Optional parent: number | Comment

      The comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)

      -
    • Optional sort: {
          after?: number | Comment;
          cursor?: null | {
              created_at: Date;
              id: number;
          };
          type?: "new" | "top" | "old";
      }

      Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?

      -
      • Optional after?: number | Comment
      • Optional cursor?: null | {
            created_at: Date;
            id: number;
        }
      • Optional type?: "new" | "top" | "old"

    Returns Promise<WithTotalToplevelcount>

\ No newline at end of file +getMultiple | osu-api-v2-js
  • Get comments that meet any of your requirements!

    +

    Parameters

    • this: API
    • Optionalfrom: {
          id: number;
          type: "beatmapset" | "build" | "news_post";
      }

      From where are the comments coming from? Maybe a beatmapset, but then, which beatmapset?

      +
      • id: number
      • type: "beatmapset" | "build" | "news_post"
    • Optionalparent: number | Comment

      The comments are replying to which comment? Make the id 0 to filter out replies (and only get top level comments)

      +
    • Optionalsort: {
          after?: number | Comment;
          cursor?: null | {
              created_at: Date;
              id: number;
          };
          type?: "new" | "top" | "old";
      }

      Should the comments be sorted by votes? Should they be from after a certain date? Maybe you can give a cursor?

      +
      • Optionalafter?: number | Comment
      • Optionalcursor?: null | {
            created_at: Date;
            id: number;
        }
      • Optionaltype?: "new" | "top" | "old"

    Returns Promise<WithTotalToplevelcount>

diff --git a/docs/functions/Comment.getOne.html b/docs/functions/Comment.getOne.html index 8567846..fbf47b8 100644 --- a/docs/functions/Comment.getOne.html +++ b/docs/functions/Comment.getOne.html @@ -1,3 +1,3 @@ -getOne | osu-api-v2-js
  • Get a specific comment by using its id!

    +getOne | osu-api-v2-js
    • Get a specific comment by using its id!

      Parameters

      • this: API
      • comment: number | Comment

        The comment in question

        -

      Returns Promise<Bundle>

    \ No newline at end of file +

Returns Promise<Bundle>

diff --git a/docs/functions/Event.getMultiple.html b/docs/functions/Event.getMultiple.html index 85a1e75..7319b83 100644 --- a/docs/functions/Event.getMultiple.html +++ b/docs/functions/Event.getMultiple.html @@ -1,4 +1,4 @@ -getMultiple | osu-api-v2-js

Function getMultiple

  • Get everything note-worthy that happened on osu! recently!

    +getMultiple | osu-api-v2-js

    Function getMultiple

    • Get everything note-worthy that happened on osu! recently!

      Parameters

      • this: API
      • sort: "id_desc" | "id_asc" = "id_desc"

        "id_asc" to have the oldest recent event first, "id_desc" to have the newest instead (defaults to id_desc)

        -
      • Optional cursor_string: string

        Use a response's cursor_string with the same parameters to get the next "page" of results, so events in this instance!

        -

      Returns Promise<{
          cursor_string: string | null;
          events: Event.Any[];
      }>

    \ No newline at end of file +
  • Optionalcursor_string: string

    Use a response's cursor_string with the same parameters to get the next "page" of results, so events in this instance!

    +

Returns Promise<{
    cursor_string: string | null;
    events: Event.Any[];
}>

diff --git a/docs/functions/Forum.Post.edit.html b/docs/functions/Forum.Post.edit.html index 608a843..c7bcb17 100644 --- a/docs/functions/Forum.Post.edit.html +++ b/docs/functions/Forum.Post.edit.html @@ -1,6 +1,6 @@ -edit | osu-api-v2-js
  • Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

    +edit | osu-api-v2-js
    • Edit a ForumPost! Note that it can be the initial one of a ForumTopic!

      Parameters

      • this: API
      • post: number | Forum.Post

        The post or the id of the post in question

      • new_text: string

        The new content of the post (replaces the old content)

      Returns Promise<Forum.Post>

      The edited ForumPost

      -
    \ No newline at end of file +
diff --git a/docs/functions/Forum.Topic.create.html b/docs/functions/Forum.Topic.create.html index 42b9dfd..b252b41 100644 --- a/docs/functions/Forum.Topic.create.html +++ b/docs/functions/Forum.Topic.create.html @@ -1,14 +1,14 @@ -create | osu-api-v2-js
  • Create a new ForumTopic in the forum of your choice!

    -

    Parameters

    • this: API
    • forum_id: number

      The id of the forum you're creating your topic in

      -
    • title: string

      The topic's title

      -
    • text: string

      The first post's content/message

      -
    • Optional poll: {
          hide_results?: boolean;
          length_days: number;
          max_options?: number;
          options: string[];
          title: string;
          vote_change?: boolean;
      }

      If you want to make a poll, specify the parameters of that poll!

      -
      • Optional hide_results?: boolean

        Should the results of the poll be hidden while the voting period is still active? (defaults to false)

        +create | osu-api-v2-js
        • Create a new ForumTopic in the forum of your choice!

          +

          Parameters

          • this: API
          • forum_id: number

            The id of the forum you're creating your topic in

            +
          • title: string

            The topic's title

            +
          • text: string

            The first post's content/message

            +
          • Optionalpoll: {
                hide_results?: boolean;
                length_days: number;
                max_options?: number;
                options: string[];
                title: string;
                vote_change?: boolean;
            }

            If you want to make a poll, specify the parameters of that poll!

            +
            • Optionalhide_results?: boolean

              Should the results of the poll be hidden while the voting period is still active? (defaults to false)

            • length_days: number

              Length of voting period in days, 0 means forever

              -
            • Optional max_options?: number

              The maximum amount of votes per user! (defaults to 1)

              +
            • Optionalmax_options?: number

              The maximum amount of votes per user! (defaults to 1)

            • options: string[]

              The things the users can vote for

              -
            • title: string
            • Optional vote_change?: boolean

              Do you allow users to change their vote? (defaults to false)

              -

          Returns Promise<{
              post: Forum.Post;
              topic: Topic;
          }>

          An object with the topic you've made, and its first initial post (which uses your text)

          -

          Scope

          "forum.write"

          -

          Remarks

          Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

          -
        \ No newline at end of file +
      • title: string
      • Optionalvote_change?: boolean

        Do you allow users to change their vote? (defaults to false)

        +

    Returns Promise<{
        post: Forum.Post;
        topic: Topic;
    }>

    An object with the topic you've made, and its first initial post (which uses your text)

    +

    "forum.write"

    +

    Some users may not be allowed to do that, such as newly registered users, so this can 403 even with the right scopes

    +
diff --git a/docs/functions/Forum.Topic.editTitle.html b/docs/functions/Forum.Topic.editTitle.html index c4e03c4..0bdf26d 100644 --- a/docs/functions/Forum.Topic.editTitle.html +++ b/docs/functions/Forum.Topic.editTitle.html @@ -1,7 +1,7 @@ -editTitle | osu-api-v2-js
  • Edit the title of a Forum.Topic!

    +editTitle | osu-api-v2-js
    • Edit the title of a Forum.Topic!

      Parameters

      • this: API
      • topic: number | Topic

        The topic or the id of the topic in question

      • new_title: string

        The new title of the topic

      Returns Promise<Topic>

      The edited ForumTopic

      -

      Scope

      "forum.write"

      -

      Remarks

      Use editForumPost if you wanna edit the post at the top of the topic

      -
    \ No newline at end of file +

    "forum.write"

    +

    Use editForumPost if you wanna edit the post at the top of the topic

    +
diff --git a/docs/functions/Forum.Topic.reply.html b/docs/functions/Forum.Topic.reply.html index 0c14de1..eae7b6a 100644 --- a/docs/functions/Forum.Topic.reply.html +++ b/docs/functions/Forum.Topic.reply.html @@ -1,7 +1,7 @@ -reply | osu-api-v2-js
  • Make and send a Forum.Post in a Forum.Topic!

    -

    Parameters

    • this: API
    • topic: number | Topic

      The topic or the id of the topic you're making your reply in

      +reply | osu-api-v2-js
      • Make and send a Forum.Post in a Forum.Topic!

        +

        Parameters

        • this: API
        • topic: number | Topic

          The topic or the id of the topic you're making your reply in

        • text: string

          Your reply! Your message!

          -

        Returns Promise<Forum.Post>

        The reply you've made, as a Forum.Post!

        -

        Scope

        "forum.write"

        -

        Remarks

        Replying when the last post was made by the authorized user will likely cause the server to return a 403

        -
      \ No newline at end of file +

    Returns Promise<Forum.Post>

    The reply you've made, as a Forum.Post!

    +

    "forum.write"

    +

    Replying when the last post was made by the authorized user will likely cause the server to return a 403

    +
diff --git a/docs/functions/Forum.getTopicAndPosts.html b/docs/functions/Forum.getTopicAndPosts.html index 1c75cd0..bb7c25d 100644 --- a/docs/functions/Forum.getTopicAndPosts.html +++ b/docs/functions/Forum.getTopicAndPosts.html @@ -1,9 +1,9 @@ -getTopicAndPosts | osu-api-v2-js

Function getTopicAndPosts

  • Get a forum topic, as well as its main post (content) and the posts that were sent in it!

    +getTopicAndPosts | osu-api-v2-js

    Function getTopicAndPosts

    • Get a forum topic, as well as its main post (content) and the posts that were sent in it!

      Parameters

      • this: API
      • topic: number | Topic

        An object with the id of the topic in question

        -
      • Optional config: {
            cursor_string?: string;
            first_post?: number | Forum.Post;
            limit?: number;
            sort?: "id_desc" | "id_asc";
        }

        How many results maximum, how to sort them, etc...

        -
        • Optional cursor_string?: string

          Use a response's cursor_string with the same parameters to get the next "page" of results, so posts in this instance!

          -
        • Optional first_post?: number | Forum.Post

          The id (or the post itself) of the first post to be returned in posts (irrelevant if using a cursor_string)

          -
        • Optional limit?: number

          How many posts maximum, up to 50

          -
        • Optional sort?: "id_desc" | "id_asc"

          "id_asc" to have the oldest post at the beginning of the posts array, "id_desc" to have the newest instead

          -

      Returns Promise<{
          cursor_string: string | null;
          posts: Forum.Post[];
          topic: Topic;
      }>

      Remarks

      The oldest post of a topic is the text of a topic

      -
    \ No newline at end of file +
  • Optionalconfig: {
        cursor_string?: string;
        first_post?: number | Forum.Post;
        limit?: number;
        sort?: "id_desc" | "id_asc";
    }

    How many results maximum, how to sort them, etc...

    +
    • Optionalcursor_string?: string

      Use a response's cursor_string with the same parameters to get the next "page" of results, so posts in this instance!

      +
    • Optionalfirst_post?: number | Forum.Post

      The id (or the post itself) of the first post to be returned in posts (irrelevant if using a cursor_string)

      +
    • Optionallimit?: number

      How many posts maximum, up to 50

      +
    • Optionalsort?: "id_desc" | "id_asc"

      "id_asc" to have the oldest post at the beginning of the posts array, "id_desc" to have the newest instead

      +

Returns Promise<{
    cursor_string: string | null;
    posts: Forum.Post[];
    topic: Topic;
}>

The oldest post of a topic is the text of a topic

+
diff --git a/docs/functions/Home.Search.getUsers.html b/docs/functions/Home.Search.getUsers.html index 06db165..f33323b 100644 --- a/docs/functions/Home.Search.getUsers.html +++ b/docs/functions/Home.Search.getUsers.html @@ -1,4 +1,4 @@ -getUsers | osu-api-v2-js
  • Look for a user like you would on the website!

    +getUsers | osu-api-v2-js
    • Look for a user like you would on the website!

      Parameters

      • this: API
      • query: string

        What you would put in the searchbar

        -
      • page: number = 1

        You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)

        -

      Returns Promise<{
          data: User[];
          total: number;
      }>

    \ No newline at end of file +
  • page: number = 1

    You normally get the first 20 results, but if page is 2, you'd get results 21 to 40 instead for example! (defaults to 1)

    +

Returns Promise<{
    data: User[];
    total: number;
}>

diff --git a/docs/functions/Home.Search.getWikiPages.html b/docs/functions/Home.Search.getWikiPages.html index 14de0fd..b9571a4 100644 --- a/docs/functions/Home.Search.getWikiPages.html +++ b/docs/functions/Home.Search.getWikiPages.html @@ -1,4 +1,4 @@ -getWikiPages | osu-api-v2-js
  • Look for a wiki page like you would on the website!

    +getWikiPages | osu-api-v2-js
    • Look for a wiki page like you would on the website!

      Parameters

      • this: API
      • query: string

        What you would put in the searchbar

        -
      • page: number = 1

        You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)

        -

      Returns Promise<{
          data: WikiPage[];
          total: number;
      }>

    \ No newline at end of file +
  • page: number = 1

    You normally get the first 50 results, but if page is 2, you'd get results 51 to 100 instead for example! (defaults to 1)

    +

Returns Promise<{
    data: WikiPage[];
    total: number;
}>

diff --git a/docs/functions/Multiplayer.Match.getMultiple.html b/docs/functions/Multiplayer.Match.getMultiple.html index b4d0f8a..3727945 100644 --- a/docs/functions/Multiplayer.Match.getMultiple.html +++ b/docs/functions/Multiplayer.Match.getMultiple.html @@ -1,8 +1,8 @@ -getMultiple | osu-api-v2-js
  • Get the info about several matches!

    -

    Parameters

    • this: API
    • Optional query: {
          first_match_in_array?: number | Info;
          limit?: number;
          sort?: "id_desc" | "id_asc";
      }

      The id of the first match of the array, and the sorting and size of said array

      -
      • Optional first_match_in_array?: number | Info

        Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable

        -

        Remarks

        You can use this argument differently to get all matches before/after (depending of query.sort) a certain match, +getMultiple | osu-api-v2-js

        • Get the info about several matches!

          +

          Parameters

          • this: API
          • Optionalquery: {
                first_match_in_array?: number | Info;
                limit?: number;
                sort?: "id_desc" | "id_asc";
            }

            The id of the first match of the array, and the sorting and size of said array

            +
            • Optionalfirst_match_in_array?: number | Info

              Which match should be featured at index 0 of the returned array? Will get one with a similar id if it is unavailable

              +

              You can use this argument differently to get all matches before/after (depending of query.sort) a certain match, by adding +1/-1 to its id! So if you want all matches after match_id 10 with sorting is_desc, just have this argument be 10 + 1, or 11!

              -
            • Optional limit?: number

              The maximum amount of elements returned in the array (defaults to 50)

              -
            • Optional sort?: "id_desc" | "id_asc"

              "id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)

              -

          Returns Promise<Info[]>

        \ No newline at end of file +
      • Optionallimit?: number

        The maximum amount of elements returned in the array (defaults to 50)

        +
      • Optionalsort?: "id_desc" | "id_asc"

        "id_desc" has the biggest id (most recent start_time) at the beginning of the array, "id_asc" is the opposite (defaults to id_desc)

        +

    Returns Promise<Info[]>

diff --git a/docs/functions/Multiplayer.Match.getOne.html b/docs/functions/Multiplayer.Match.getOne.html index 57e74c5..d52dfbf 100644 --- a/docs/functions/Multiplayer.Match.getOne.html +++ b/docs/functions/Multiplayer.Match.getOne.html @@ -1,3 +1,8 @@ -getOne | osu-api-v2-js
  • Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches or mp

    +getOne | osu-api-v2-js
    • Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with community/matches or mp

      Parameters

      • this: API
      • match: number | Info

        The id of a match can be found at the end of its URL

        -

      Returns Promise<Match>

    \ No newline at end of file +
  • Optionalquery: {
        after?: number | Multiplayer.Match.Event;
        before?: number | Multiplayer.Match.Event;
        limit?: number;
    }

    Filter and limit the amount of events shown

    +
    • Optionalafter?: number | Multiplayer.Match.Event

      Filter FOR events AFTER this one

      +
    • Optionalbefore?: number | Multiplayer.Match.Event

      Filter FOR events BEFORE this one

      +
    • Optionallimit?: number

      From 1 to 101 events (defaults to 100)

      +

      0 is treated as 1, anything above 101 is treated as 101

      +

Returns Promise<Match>

diff --git a/docs/functions/Multiplayer.Room.Leader.getMultiple.html b/docs/functions/Multiplayer.Room.Leader.getMultiple.html index 2313574..fe9567d 100644 --- a/docs/functions/Multiplayer.Room.Leader.getMultiple.html +++ b/docs/functions/Multiplayer.Room.Leader.getMultiple.html @@ -1,5 +1,5 @@ -getMultiple | osu-api-v2-js
  • Get the room stats of all the users of that room!

    +getMultiple | osu-api-v2-js
    • Get the room stats of all the users of that room!

      Parameters

      • this: API
      • room: number | Room

        The room or the id of the room in question

      Returns Promise<{
          leaderboard: Leader[];
          user_score: WithPosition | null;
      }>

      An object with the leaderboard, and the score and position of the authorized user under user_score

      -

      Scope

      "public"

      -
    \ No newline at end of file +

    "public"

    +
diff --git a/docs/functions/Multiplayer.Room.PlaylistItem.getScores.html b/docs/functions/Multiplayer.Room.PlaylistItem.getScores.html index bf5cff6..5c58dc9 100644 --- a/docs/functions/Multiplayer.Room.PlaylistItem.getScores.html +++ b/docs/functions/Multiplayer.Room.PlaylistItem.getScores.html @@ -1,8 +1,8 @@ -getScores | osu-api-v2-js
  • Get the scores on a specific item of a room!

    +getScores | osu-api-v2-js
    • Get the scores on a specific item of a room!

      Parameters

      • this: API
      • 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 Multiplayer.Scores' params and cursor_string to get the next page (scores 51 to 100 for example)

        -

      Returns Promise<Scores>

      Remarks

      (2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk +

    • Optionalcursor_string: string

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

      +

    Returns Promise<Scores>

    (2024-03-04) This may not work for rooms from before March 5th 2024, use at your own risk https://github.com/ppy/osu-web/issues/10725

    -
\ No newline at end of file +
diff --git a/docs/functions/Multiplayer.Room.getMultiple.html b/docs/functions/Multiplayer.Room.getMultiple.html index 68da722..c3dbc86 100644 --- a/docs/functions/Multiplayer.Room.getMultiple.html +++ b/docs/functions/Multiplayer.Room.getMultiple.html @@ -1,7 +1,9 @@ -getMultiple | osu-api-v2-js
  • Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!

    +getMultiple | osu-api-v2-js
    • Get playlists/realtime rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room!

      Parameters

      • this: API
      • type: "realtime" | "playlists"

        Whether the multiplayer rooms are in playlist format (like current spotlights) or realtime

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

        The state of the room, or the relation of the authorized user with the room

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

        The state of the room, or the relation of the authorized user with the room

      • limit: number = 10

        The maximum amount of rooms to return, defaults to 10

      • sort: "ended" | "created" = "created"

        Sort (where most recent is first) by creation date or end date, defaults to the creation date

        -

      Returns Promise<Room[]>

      Scope

      "public"

      -
    \ No newline at end of file +
  • Optionalseason_id: number

    Only get rooms (playlists) that belong to a specific (modern) Beatmap Spotlights season id +(so 5'd be summer 2020's mania rooms, not winter 2022!!)

    +

Returns Promise<Room[]>

"public"

+
diff --git a/docs/functions/Multiplayer.Room.getOne.html b/docs/functions/Multiplayer.Room.getOne.html index 250d532..b889c8d 100644 --- a/docs/functions/Multiplayer.Room.getOne.html +++ b/docs/functions/Multiplayer.Room.getOne.html @@ -1,3 +1,3 @@ -getOne | osu-api-v2-js
  • Get data about a lazer multiplayer room (realtime or playlists)!

    +getOne | osu-api-v2-js
    • Get data about a lazer multiplayer room (realtime or playlists)!

      Parameters

      • this: API
      • room: number | Room

        The room or the id of the room, can be found at the end of its URL (after /multiplayer/rooms/)

        -

      Returns Promise<Room>

    \ No newline at end of file +

Returns Promise<Room>

diff --git a/docs/functions/NewsPost.getMultiple.html b/docs/functions/NewsPost.getMultiple.html index c479538..b27cce3 100644 --- a/docs/functions/NewsPost.getMultiple.html +++ b/docs/functions/NewsPost.getMultiple.html @@ -1,4 +1,4 @@ -getMultiple | osu-api-v2-js
  • Get all the NewsPosts of a specific year!

    -

    Parameters

    • this: API
    • Optional year: number

      The year the posts were made (defaults to current year)

      -

    Returns Promise<NewsPost[]>

    Remarks

    If the specified year is invalid/has no news, it fallbacks to the default year

    -
\ No newline at end of file +getMultiple | osu-api-v2-js
  • Get all the NewsPosts of a specific year!

    +

    Parameters

    • this: API
    • Optionalyear: number

      The year the posts were made (defaults to current year)

      +

    Returns Promise<NewsPost[]>

    If the specified year is invalid/has no news, it fallbacks to the default year

    +
diff --git a/docs/functions/NewsPost.getOne.html b/docs/functions/NewsPost.getOne.html index 90724d0..9865659 100644 --- a/docs/functions/NewsPost.getOne.html +++ b/docs/functions/NewsPost.getOne.html @@ -1,3 +1,3 @@ -getOne | osu-api-v2-js
  • Get a NewsPost, its content, and the NewsPosts right before and right after it!

    +getOne | osu-api-v2-js
    \ No newline at end of file +

Returns Promise<WithContentNavigation>

diff --git a/docs/functions/Ranking.getCountry.html b/docs/functions/Ranking.getCountry.html index be50474..998b2d1 100644 --- a/docs/functions/Ranking.getCountry.html +++ b/docs/functions/Ranking.getCountry.html @@ -1,4 +1,4 @@ -getCountry | osu-api-v2-js
  • Get the top countries of a specific ruleset!

    +getCountry | osu-api-v2-js
    • Get the top countries of a specific ruleset!

      Parameters

      • this: API
      • ruleset: Ruleset

        On which Ruleset should the countries be compared?

      • page: number = 1

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

        -

      Returns Promise<Country>

    \ No newline at end of file +

Returns Promise<Country>

diff --git a/docs/functions/Ranking.getKudosu.html b/docs/functions/Ranking.getKudosu.html index 4c2f348..9bafcb4 100644 --- a/docs/functions/Ranking.getKudosu.html +++ b/docs/functions/Ranking.getKudosu.html @@ -1,2 +1,2 @@ -getKudosu | osu-api-v2-js
\ No newline at end of file +getKudosu | osu-api-v2-js
diff --git a/docs/functions/Ranking.getSpotlight.html b/docs/functions/Ranking.getSpotlight.html index 256013c..058a0ad 100644 --- a/docs/functions/Ranking.getSpotlight.html +++ b/docs/functions/Ranking.getSpotlight.html @@ -1,5 +1,5 @@ -getSpotlight | osu-api-v2-js
  • Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!

    +getSpotlight | osu-api-v2-js
    • Get the rankings of a spotlight from 2009 to 2020 on a specific ruleset!

      Parameters

      • this: API
      • ruleset: Ruleset

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

      • spotlight: number | Spotlight

        The spotlight in question

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

        What kind of players do you want to see? Keep in mind friends has no effect if no authorized user (defaults to all)

        -

      Returns Promise<Ranking.Spotlight>

    \ No newline at end of file +

Returns Promise<Ranking.Spotlight>

diff --git a/docs/functions/Ranking.getUser.html b/docs/functions/Ranking.getUser.html index 2f51411..af3bc44 100644 --- a/docs/functions/Ranking.getUser.html +++ b/docs/functions/Ranking.getUser.html @@ -1,9 +1,9 @@ -getUser | osu-api-v2-js
  • Get the top players of the game, with some filters!

    +getUser | osu-api-v2-js
    • Get the top players of the game, with some filters!

      Parameters

      • this: API
      • ruleset: Ruleset

        Self-explanatory, is also known as "Gamemode"

      • type: "performance" | "score"

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

        -
      • Optional config: {
            country?: string;
            filter?: "all" | "friends";
            page?: number;
            variant?: "4k" | "7k";
        }

        Specify which page, country, filter out non-friends...

        -
        • 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 filter?: "all" | "friends"

          What kind of players do you want to see? Keep in mind friends has no effect if no authorized user

          -
        • Optional page?: number

          Imagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one

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

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

          -

      Returns Promise<Ranking.User>

    \ No newline at end of file +
  • Optionalconfig: {
        country?: string;
        filter?: "all" | "friends";
        page?: number;
        variant?: "4k" | "7k";
    }

    Specify which page, country, filter out non-friends...

    +
    • Optionalcountry?: string

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

      +
    • Optionalfilter?: "all" | "friends"

      What kind of players do you want to see? Keep in mind friends has no effect if no authorized user

      +
    • Optionalpage?: number

      Imagine the array you get as a page, it can only have a maximum of 50 players, while 50 others may be on the next one

      +
    • Optionalvariant?: "4k" | "7k"

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

      +

Returns Promise<Ranking.User>

diff --git a/docs/functions/Score.getReplay.html b/docs/functions/Score.getReplay.html index e587417..f48e508 100644 --- a/docs/functions/Score.getReplay.html +++ b/docs/functions/Score.getReplay.html @@ -1,5 +1,5 @@ -getReplay | osu-api-v2-js

Function getReplay

  • Get the replay for a score!

    +getReplay | osu-api-v2-js

    Function getReplay

    • Get the replay for a score!

      Parameters

      • this: API
      • score: number | Score

        The score that has created the replay

      Returns Promise<string>

      The correctly encoded content of what would be a replay file (you can just fs.writeFileSync with it!)

      -

      Scope

      "public"

      -
    \ No newline at end of file +

    "public"

    +
diff --git a/docs/functions/Spotlight.getAll.html b/docs/functions/Spotlight.getAll.html index 39164a2..0ce1dea 100644 --- a/docs/functions/Spotlight.getAll.html +++ b/docs/functions/Spotlight.getAll.html @@ -1,4 +1,4 @@ -getAll | osu-api-v2-js
\ No newline at end of file +getAll | osu-api-v2-js
diff --git a/docs/functions/User.getBeatmaps.html b/docs/functions/User.getBeatmaps.html index 3f6eaa0..20e13b6 100644 --- a/docs/functions/User.getBeatmaps.html +++ b/docs/functions/User.getBeatmaps.html @@ -1,5 +1,5 @@ -getBeatmaps | osu-api-v2-js

Function getBeatmaps

  • Get beatmaps favourited or made by a user!

    +getBeatmaps | osu-api-v2-js

    Function getBeatmaps

    • Get beatmaps favourited or made by a user!

      Parameters

      • this: API
      • user: number | User

        The user in question

        -
      • type: "pending" | "favourite" | "graveyard" | "guest" | "loved" | "nominated" | "ranked"

        The relation between the user and the beatmaps

        -
      • Optional config: User.Config

        Array limit & offset

        -

      Returns Promise<WithBeatmap[]>

    \ No newline at end of file +
  • type:
        | "pending"
        | "favourite"
        | "graveyard"
        | "guest"
        | "loved"
        | "nominated"
        | "ranked"

    The relation between the user and the beatmaps

    +
  • Optionalconfig: User.Config

    Array limit & offset

    +

Returns Promise<WithBeatmap[]>

diff --git a/docs/functions/User.getFriends.html b/docs/functions/User.getFriends.html index 857099d..f5c4dd0 100644 --- a/docs/functions/User.getFriends.html +++ b/docs/functions/User.getFriends.html @@ -1,3 +1,3 @@ -getFriends | osu-api-v2-js

Function getFriends

\ No newline at end of file +getFriends | osu-api-v2-js

Function getFriends

diff --git a/docs/functions/User.getKudosu.html b/docs/functions/User.getKudosu.html index 340185e..649d696 100644 --- a/docs/functions/User.getKudosu.html +++ b/docs/functions/User.getKudosu.html @@ -1,4 +1,4 @@ -getKudosu | osu-api-v2-js

Function getKudosu

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

    +getKudosu | osu-api-v2-js

    Function getKudosu

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

      Parameters

      • this: API
      • user: number | User

        The user in question

        -
      • Optional config: User.Config

        Array limit & offset

        -

      Returns Promise<KudosuHistory[]>

    \ No newline at end of file +
  • Optionalconfig: User.Config

    Array limit & offset

    +

Returns Promise<KudosuHistory[]>

diff --git a/docs/functions/User.getMostPlayed.html b/docs/functions/User.getMostPlayed.html index 2decf48..2c99b0b 100644 --- a/docs/functions/User.getMostPlayed.html +++ b/docs/functions/User.getMostPlayed.html @@ -1,4 +1,4 @@ -getMostPlayed | osu-api-v2-js

Function getMostPlayed

  • Get the beatmaps most played by a user!

    +getMostPlayed | osu-api-v2-js

    Function getMostPlayed

    • Get the beatmaps most played by a user!

      Parameters

      • this: API
      • user: number | User

        The user who played the beatmaps

        -
      • Optional config: User.Config

        Array limit & offset

        -

      Returns Promise<Playcount[]>

    \ No newline at end of file +
  • Optionalconfig: User.Config

    Array limit & offset

    +

Returns Promise<Playcount[]>

diff --git a/docs/functions/User.getMultiple.html b/docs/functions/User.getMultiple.html index eee36b4..0677cb0 100644 --- a/docs/functions/User.getMultiple.html +++ b/docs/functions/User.getMultiple.html @@ -1,3 +1,4 @@ -getMultiple | osu-api-v2-js

Function getMultiple

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

    +getMultiple | osu-api-v2-js

    Function getMultiple

    \ No newline at end of file +
  • include_variant_statistics: boolean = false

    Should the response include variants, useful to get stats specific to mania 4k/7k for example? (defaults to false)

    +

Returns Promise<WithCountryCoverGroupsStatisticsrulesets[]>

diff --git a/docs/functions/User.getOne.html b/docs/functions/User.getOne.html index 392544c..3c4bb0d 100644 --- a/docs/functions/User.getOne.html +++ b/docs/functions/User.getOne.html @@ -1,4 +1,4 @@ -getOne | osu-api-v2-js
  • Get extensive user data about whoever you want!

    +getOne | osu-api-v2-js
    • Get extensive user data about whoever you want!

      Parameters

      • this: API
      • user: string | number | User

        A user id, a username or a User object!

        -
      • Optional ruleset: Ruleset

        The data should be relevant to which ruleset? (defaults to user's default Ruleset)

        -

      Returns Promise<User.Extended>

    \ No newline at end of file +
  • Optionalruleset: Ruleset

    The data should be relevant to which ruleset? (defaults to user's default Ruleset)

    +

Returns Promise<User.Extended>

diff --git a/docs/functions/User.getRecentActivity.html b/docs/functions/User.getRecentActivity.html index e9b158f..e8bbdf9 100644 --- a/docs/functions/User.getRecentActivity.html +++ b/docs/functions/User.getRecentActivity.html @@ -1,4 +1,4 @@ -getRecentActivity | osu-api-v2-js

Function getRecentActivity

  • Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

    +getRecentActivity | osu-api-v2-js

    Function getRecentActivity

    • Get an array of Events of different types that relate to a user's activity during the last 31 days! (or 100 activities, whatever comes first)

      Parameters

      • this: API
      • user: number | User

        The user in question

        -
      • Optional config: User.Config

        Array limit & offset

        -

      Returns Promise<AnyRecentActivity[]>

    \ No newline at end of file +
  • Optionalconfig: User.Config

    Array limit & offset

    +

Returns Promise<AnyRecentActivity[]>

diff --git a/docs/functions/User.getResourceOwner.html b/docs/functions/User.getResourceOwner.html index 8f3aed8..730e0cc 100644 --- a/docs/functions/User.getResourceOwner.html +++ b/docs/functions/User.getResourceOwner.html @@ -1,4 +1,4 @@ -getResourceOwner | osu-api-v2-js

Function getResourceOwner

\ No newline at end of file +getResourceOwner | osu-api-v2-js

Function getResourceOwner

diff --git a/docs/functions/User.getScores.html b/docs/functions/User.getScores.html index 1763f0f..d362330 100644 --- a/docs/functions/User.getScores.html +++ b/docs/functions/User.getScores.html @@ -1,7 +1,7 @@ -getScores | osu-api-v2-js

Function getScores

  • Get "notable" scores from a user

    +getScores | osu-api-v2-js

    Function getScores

    • Get "notable" scores from a user

      Parameters

      • this: API
      • user: number | User

        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 ruleset: Ruleset

        The Ruleset the scores were made in (defaults to user's default Ruleset)

        +
      • 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?

        +
      • Optionalruleset: Ruleset

        The Ruleset the scores were made in (defaults to user's default Ruleset)

      • include: {
            fails?: boolean;
            lazer?: boolean;
        } = ...

        Do you also want lazer scores and failed scores? (defaults to true for lazer & false for fails)

        -
        • Optional fails?: boolean
        • Optional lazer?: boolean
      • Optional config: User.Config

        Array limit & offset

        -

      Returns Promise<WithUserBeatmapBeatmapset[]>

    \ No newline at end of file +
    • Optionalfails?: boolean
    • Optionallazer?: boolean
  • Optionalconfig: User.Config

    Array limit & offset

    +

Returns Promise<WithUserBeatmapBeatmapset[]>

diff --git a/docs/functions/WikiPage.getOne.html b/docs/functions/WikiPage.getOne.html index e745bd4..533483d 100644 --- a/docs/functions/WikiPage.getOne.html +++ b/docs/functions/WikiPage.getOne.html @@ -1,5 +1,5 @@ -getOne | osu-api-v2-js
  • Get a wiki page!

    -

    Parameters

    • this: API
    • path: string

      What's in the page's URL after https://osu.ppy.sh/wiki/ (so the title, after the subtitle if there is a subtitle) +getOne | osu-api-v2-js

      • Get a wiki page!

        +

        Parameters

        • this: API
        • path: string

          What's in the page's URL after https://osu.ppy.sh/wiki/ (so the title, after the subtitle if there is a subtitle) (An example for https://osu.ppy.sh/wiki/en/Game_mode/osu! would be Game_mode/osu!)

        • locale: string = "en"

          The BCP 47 language (sub)tag lowercase (for example, for a french WikiPage, use "fr") (defaults to en)

          -

        Returns Promise<WikiPage>

      \ No newline at end of file +

    Returns Promise<WikiPage>

diff --git a/docs/functions/generateAuthorizationURL.html b/docs/functions/generateAuthorizationURL.html index 1f14a6d..2adcd06 100644 --- a/docs/functions/generateAuthorizationURL.html +++ b/docs/functions/generateAuthorizationURL.html @@ -1,7 +1,7 @@ -generateAuthorizationURL | osu-api-v2-js

Function generateAuthorizationURL

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

    +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

        -
      • server: string = "https://osu.ppy.sh"

        The API server (defaults to https://osu.ppy.sh, leave as is if you don't know exactly what you're doing)

        +
      • server: string = "https://osu.ppy.sh"

        The API server (defaults to https://osu.ppy.sh, leave as is if you don't know exactly what you're doing)

      Returns string

      The link people should click on

      -
    \ No newline at end of file +
diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 2b754cd..bb2d602 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -osu-api-v2-js
\ No newline at end of file +osu-api-v2-js
diff --git a/docs/index.html b/docs/index.html index 2179876..7ab984a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,130 +1,138 @@ -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).

-

You can find this package's documentation on osu-v2.taevas.xyz if needed!

-

How to install and get started

Before installing, if using Node.js, check if you're running version 16 or above:

-
node -v # displays your version of node.js
-
+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).

+

You can find this package's documentation on osu-v2.taevas.xyz if needed!

+

Before installing, if using Node.js, check if you're running version 16 or above:

+
node -v # displays your version of node.js
+
+

Then 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 -
+
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 +
+

You will want to create your own OAuth application: https://osu.ppy.sh/home/account/edit#oauth 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) {
// It's more convenient to use `osu.API.createAsync()` instead of `new osu.API()` as it doesn't require you to directly provide an access_token!
// In a proper application, you'd use this function as soon as the app starts so you can use that object everywhere
// (or if it acts as a user, you'd use this function at the end of the authorization flow)
const api = await osu.API.createAsync({id: "<client_id>", secret: "<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", osu.Ruleset.osu, {lazer: false}, {limit: 1}))[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

const x = `${score.beatmapset.artist} - ${score.beatmapset.title} [${score.beatmap.version}]`
const 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: Yamajet feat. Hiura Masako - Sunglow [Harmony] +DT (8.72*)
}

logUserTopPlayBeatmap("Doomsday fanboy") -
-

Authorization flow

A simple guide on how to do extra fancy stuff

-

The part where the user says they're okay with using your application

If your application is meant to act on behalf of a user after they've clicked on a button to say they consent to your application identifying them and reading public data on their behalf and some other stuff maybe, then things will work differently

-

Let's take it step by step! First, this package comes with generateAuthorizationURL(), which will generate for you a link so users can click on it and allow your application to do stuff on their behalf +

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

async function logUserTopPlayBeatmap(username: string) {
// It's more convenient to use `osu.API.createAsync()` instead of `new osu.API()` as it doesn't require you to directly provide an access_token!
// In a proper application, you'd use this function as soon as the app starts so you can use that object everywhere
// (or if it acts as a user, you'd use this function at the end of the authorization flow)
const api = await osu.API.createAsync({id: "<client_id>", secret: "<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", osu.Ruleset.osu, {lazer: false}, {limit: 1}))[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

const x = `${score.beatmapset.artist} - ${score.beatmapset.title} [${score.beatmap.version}]`
const 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: Yamajet feat. Hiura Masako - Sunglow [Harmony] +DT (8.72*)
}

logUserTopPlayBeatmap("Doomsday fanboy") +
+ +

A simple guide on how to do extra fancy stuff

+

If your application is meant to act on behalf of a user after they've clicked on a button to say they consent to your application identifying them and reading public data on their behalf and some other stuff maybe, then things will work differently

+

Let's take it step by step! First, this package comes with generateAuthorizationURL(), which will generate for you a link so users can click on it and allow your application to do stuff on their behalf This function requires you to specify scopes... well, just know that identify is always implicitly specified, that public is almost always implicitly required, and that functions that require other scopes are explicit about it!

-

Please note: It is the user who ultimately decides which scopes they allow, so you can't assume they allowed all the scopes you specified... +

Please note: It is the user who ultimately decides which scopes they allow, so you can't assume they allowed all the scopes you specified... Thankfully though, you can check at any time the allowed scopes with the scopes property of your api object!

-

The part where your application hears the user when the user says okay

The user clicked your link and authorized your application! ...Now what?

+

The user clicked your link and authorized your application! ...Now what?

When a user authorizes your application, they get redirected to your Application Callback URL with a huge code as a GET parameter (the name of the parameter is code), and it is this very code that will allow you to proceed with the authorization flow! So make sure that somehow, you retrieve this code!

-

With this code, you're able to create your api object:

-
const api = await osu.API.createAsync({id: "<client_id>", secret: "<client_secret>"}, {code: "<code>", redirect_uri: "<application_callback_url>"})
-
-

The part where you make it so your application works without the user saying okay every 2 minutes

Congrats on making your api object! Now you should do something in order to not lose it, or not need a new one in order to request more data!

+

With this code, you're able to create your api object:

+
const api = await osu.API.createAsync({id: "<client_id>", secret: "<client_secret>"}, {code: "<code>", redirect_uri: "<application_callback_url>"})
+
+ +

Congrats on making your api object! Now you should do something in order to not lose it, or not need a new one in order to request more data!

Do note that your api object has lots of practical properties: user allows you to know which user it acts on behalf of, expires allows you to know when your requests with your current access_token will fail, and refresh_token is your key to getting a new access_token without asking the user again! Although, you should not need to access them often, because your api object has a function to use that refresh token which you can call at any given time, and by default, the object will call that function on its own right before the expiration date or when a request seems to fail because of the access_token being invalid! (those are features you can deactivate if needed)

Your refresh_token can actually also expire at a (purposefully) unknown time, so depending of how your application works, you could use it at some point around the date of expiration, or you could throw away your api object while waiting for a user to start the authorization flow again

-

Reading all incoming messages

// TypeScript
import * as osu from "osu-api-v2-js"
import promptSync from "prompt-sync"

const prompt = promptSync({sigint: true})

const id = "<client_id>"
const secret = "<client_secret>"
const redirect_uri = "<application_callback_url>"

async function readChat() {
// Somehow get the code so the application can read the messages as your osu! user
const url = osu.generateAuthorizationURL(id, redirect_uri, ["public", "chat.read"]) // "chat.read" is 100% needed in our case
const code = prompt(`Paste the "code" in the URL you're redicted to by accessing: ${url}\n\n`)
const api = await osu.API.createAsync({id, secret}, {code, redirect_uri}, "errors")

// Get a WebSocket object to interact with and get messages from
const socket = api.generateWebSocket()

// Tell the server you want to know whenever there's are chat messages
socket.on("open", () => {
socket.send(osu.WebSocket.Command.chatStart) // osu.WebSocket.Command.chatStart is simply JSON.stringify({event: "chat.start"}) but easier to remember
api.keepChatAlive()
setInterval(() => api.keepChatAlive(), 30 * 1000) // Tell the server every 30 seconds that you're still listening to the incoming messages
})

// Listen for chat messages (and other stuff)
socket.on("message", (m: MessageEvent) => { // Mind you, "message" doesn't mean "chat message" here, it's more like a raw event
const event: osu.WebSocket.Event.Any = JSON.parse(m.toString())
if (event.event === "chat.message.new") { // Filter out things that aren't new chat messages and get type safety
const message = event.data.messages.map((message) => message.content).join(" | ")
const user = event.data.users.map((user) => user.username).join(" | ")
console.log(`${user}: ${message}`)
}
})
}

readChat() -
-

Above is the code I've written to listen to incoming chat messages by using the API's WebSocket!

-

Using the WebSocket namespace this package provides, it's relatively easy to send commands (anything under osu.WebSocket.Command) and you can have 100% type safety with events (anything under osu.Websocket.Event) simply by checking what the event property is! With that, anything in the data property is yours to play with!

-

Calling the functions, but literally

This package's functions can be accessed both through the api object and through namespaces! It essentially means that for convenience's sake, there are two ways to do anything:

-
// Obtaining a match, assuming an `api` object already exists and everything from the package is imported as `osu`
const match_1 = await api.getMatch(103845156) // through the api object
const match_2 = await osu.Multiplayer.Match.getOne.call(api, 103845156) // through the namespaces
// `match_1` and `match_2` are the same, because they're essentially using the same function!

// The same, but for obtaining multiple lazer updates
const builds_1 = await api.getChangelogBuilds("lazer")
const builds_2 = await osu.Changelog.Build.getMultiple.call(api, "lazer")
// `build_1` and `build_2` are also the same! -
+
// TypeScript
import * as osu from "osu-api-v2-js"
import promptSync from "prompt-sync"

const prompt = promptSync({sigint: true})

const id = "<client_id>"
const secret = "<client_secret>"
const redirect_uri = "<application_callback_url>"

async function readChat() {
// Somehow get the code so the application can read the messages as your osu! user
const url = osu.generateAuthorizationURL(id, redirect_uri, ["public", "chat.read"]) // "chat.read" is 100% needed in our case
const code = prompt(`Paste the "code" in the URL you're redicted to by accessing: ${url}\n\n`)
const api = await osu.API.createAsync({id, secret}, {code, redirect_uri}, "errors")

// Get a WebSocket object to interact with and get messages from
const socket = api.generateWebSocket()

// Tell the server you want to know whenever there's are chat messages
socket.on("open", () => {
socket.send(osu.WebSocket.Command.chatStart) // osu.WebSocket.Command.chatStart is simply JSON.stringify({event: "chat.start"}) but easier to remember
api.keepChatAlive()
setInterval(() => api.keepChatAlive(), 30 * 1000) // Tell the server every 30 seconds that you're still listening to the incoming messages
})

// Listen for chat messages (and other stuff)
socket.on("message", (m: MessageEvent) => { // Mind you, "message" doesn't mean "chat message" here, it's more like a raw event
const event: osu.WebSocket.Event.Any = JSON.parse(m.toString())
if (event.event === "chat.message.new") { // Filter out things that aren't new chat messages and get type safety
const message = event.data.messages.map((message) => message.content).join(" | ")
const user = event.data.users.map((user) => user.username).join(" | ")
console.log(`${user}: ${message}`)
}
})
}

readChat() +
+ +

Above is the code I've written to listen to incoming chat messages by using the API's WebSocket!

+

Using the WebSocket namespace this package provides, it's relatively easy to send commands (anything under osu.WebSocket.Command) and you can have 100% type safety with events (anything under osu.Websocket.Event) simply by checking what the event property is! With that, anything in the data property is yours to play with!

+

This package's functions can be accessed both through the api object and through namespaces! It essentially means that for convenience's sake, there are two ways to do anything:

+
// Obtaining a match, assuming an `api` object already exists and everything from the package is imported as `osu`
const match_1 = await api.getMatch(103845156) // through the api object
const match_2 = await osu.Multiplayer.Match.getOne.call(api, 103845156) // through the namespaces
// `match_1` and `match_2` are the same, because they're essentially using the same function!

// The same, but for obtaining multiple lazer updates
const builds_1 = await api.getChangelogBuilds("lazer")
const builds_2 = await osu.Changelog.Build.getMultiple.call(api, "lazer")
// `build_1` and `build_2` are also the same! +
+

As you may have noticed, when calling the functions through the namespaces, instead of doing something like getOne(), we instead do getOne.call() and use the call() method in order to provide a this value; the api object!

Of course, using the apply() method would also work, so just do things the way you prefer or the way that is more intuitive to you!

-

Implemented endpoints

Beatmap Packs

    -
  • GET /beatmaps/packs -> getBeatmapPacks()
  • -
  • GET /beatmaps/packs/{pack} -> getBeatmapPack()
  • -
-

Beatmaps

    -
  • GET /beatmaps/lookup -> lookupBeatmap()
  • -
  • GET /beatmaps/{beatmap}/scores/users/{user} -> getBeatmapUserScore()
  • -
  • GET /beatmaps/{beatmap}/scores/users/{user}/all -> getBeatmapUserScores()
  • -
  • GET /beatmaps/{beatmap}/scores -> getBeatmapScores()
  • -
  • GET /beatmaps/{beatmap}/solo-scores -> getBeatmapSoloScores()
  • -
  • GET /beatmaps -> getBeatmaps()
  • -
  • GET /beatmaps/{beatmap} -> getBeatmap()
  • -
  • POST /beatmaps/{beatmap}/attributes -> getBeatmapDifficultyAttributes()
  • -
-

Beatmapset Discussions

    -
  • GET /beatmapsets/discussions/posts -> getBeatmapsetDiscussionPosts()
  • -
  • GET /beatmapsets/discussions/votes -> getBeatmapsetDiscussionVotes()
  • -
  • GET /beatmapsets/discussions -> getBeatmapsetDiscussions()
  • -
-

Beatmapsets

    -
  • GET /beatmapsets/search -> searchBeatmapset()
  • -
  • GET /beatmapsets/lookup -> lookupBeatmapset()
  • -
  • GET /beatmapsets/{beatmapset} -> getBeatmapset()
  • -
  • GET /beatmapsets/events -> getBeatmapsetEvents()
  • -
-

Changelog

    -
  • GET /changelog/{stream}/{build} -> getChangelogBuild()
  • -
  • GET /changelog -> getChangelogBuilds() / getChangelogStreams() (removing search, putting builds behind getChangelogBuilds(), and streams behind getChangelogStreams())
  • -
  • GET /changelog/{changelog} -> lookupChangelogBuild()
  • -
-

Chat

    -
  • POST /chat/ack -> keepChatAlive()
  • -
  • POST /chat/new -> sendChatPrivateMessage()
  • -
  • GET /chat/channels/{channel}/messages -> getChatMessages()
  • -
  • POST /chat/channels/{channel}/messages -> sendChatMessage()
  • -
  • PUT /chat/channels/{channel}/users/{user} -> joinChatChannel()
  • -
  • DELETE /chat/channels/{channel}/users/{user} -> leaveChatChannel()
  • -
  • PUT /chat/channels/{channel}/mark-as-read/{message} -> markChatChannelAsRead()
  • -
  • GET /chat/channels -> getChatChannels()
  • -
  • POST /chat/channels -> createChatPrivateChannel() / createChatAnnouncementChannel()
  • -
  • GET /chat/channels/{channel} -> getChatChannel() (without users because channel would already have this property)
  • -
-

Comments

    -
  • GET /comments -> getComments()
  • -
  • GET /comments/{comment} -> getComment()
  • -
-

Events

    -
  • GET /events -> getEvents()
  • -
-

Forum

    -
  • POST /forums/topics/{topic}/reply -> replyForumTopic()
  • -
  • POST /forums/topics -> createForumTopic()
  • -
  • GET /forums/topics/{topic} -> getForumTopicAndPosts() (removing search for simplicity)
  • -
  • PUT /forums/topics/{topic} -> editForumTopicTitle()
  • -
  • PUT /forums/posts/{post} -> editForumPost()
  • -
-

Home

    -
  • GET /search -> searchUser() / searchWiki()
  • -
-

Multiplayer

    -
  • GET /rooms/{room}/playlist/{playlist}/scores -> getPlaylistItemScores()
  • -
  • GET /rooms -> getRooms()
  • -
  • GET /matches -> getMatches()
  • -
  • GET /matches/{match} -> getMatch()
  • -
  • GET /rooms/{room} -> getRoom()
  • -
  • GET /rooms/{room}/leaderboard -> getRoomLeaderboard()
  • -
-

News

    -
  • GET /news -> getNewsPosts() (removing everything except news_sidebar.news_posts)
  • -
  • GET /news/{news} -> getNewsPost()
  • -
-

Ranking

    -
  • GET /rankings/kudosu -> getKudosuRanking()
  • -
  • GET /rankings/{mode}/{type} -> getUserRanking() / getCountryRanking() / getSpotlightRanking()
  • -
  • GET /spotlights -> getSpotlights()
  • -
-

Users

    -
  • GET /me/{mode?} -> getResourceOwner()
  • -
  • GET /users/{user}/kudosu -> getUserKudosu()
  • -
  • GET /users/{user}/scores/{type} -> getUserScores()
  • -
  • GET /users/{user}/beatmapsets/{type} -> getUserBeatmaps() / getUserMostPlayed()
  • -
  • GET /users/{user}/recent_activity -> getUserRecentActivity()
  • -
  • GET /users/{user}/{mode?} -> getUser()
  • -
  • GET /users -> getUsers()
  • -
  • GET /friends -> getFriends()
  • -
-

Wiki

    -
  • GET /wiki/{locale}/{path} -> getWikiPage()
  • -
-

Misc Undocumented Stuff

    -
  • GET /seasonal-backgrounds -> getSeasonalBackgrounds()
  • -
  • GET /scores/{score}/download -> getReplay()
  • -
-
\ No newline at end of file +
    +
  • [x] GET /beatmaps/packs -> getBeatmapPacks()
  • +
  • [x] GET /beatmaps/packs/{pack} -> getBeatmapPack()
  • +
+
    +
  • [x] GET /beatmaps/lookup -> lookupBeatmap()
  • +
  • [x] GET /beatmaps/{beatmap}/scores/users/{user} -> getBeatmapUserScore()
  • +
  • [x] GET /beatmaps/{beatmap}/scores/users/{user}/all -> getBeatmapUserScores()
  • +
  • [x] GET /beatmaps/{beatmap}/scores -> getBeatmapScores()
  • +
  • [x] GET /beatmaps/{beatmap}/solo-scores -> getBeatmapSoloScores()
  • +
  • [x] GET /beatmaps -> getBeatmaps()
  • +
  • [x] GET /beatmaps/{beatmap} -> getBeatmap()
  • +
  • [x] POST /beatmaps/{beatmap}/attributes -> getBeatmapDifficultyAttributes()
  • +
+
    +
  • [x] GET /beatmapsets/discussions/posts -> getBeatmapsetDiscussionPosts()
  • +
  • [x] GET /beatmapsets/discussions/votes -> getBeatmapsetDiscussionVotes()
  • +
  • [x] GET /beatmapsets/discussions -> getBeatmapsetDiscussions()
  • +
+
    +
  • [x] GET /beatmapsets/search -> searchBeatmapset()
  • +
  • [x] GET /beatmapsets/lookup -> lookupBeatmapset()
  • +
  • [x] GET /beatmapsets/{beatmapset} -> getBeatmapset()
  • +
  • [x] GET /beatmapsets/events -> getBeatmapsetEvents()
  • +
+
    +
  • [x] GET /changelog/{stream}/{build} -> getChangelogBuild()
  • +
  • [x] GET /changelog -> getChangelogBuilds() / getChangelogStreams() (removing search, putting builds behind getChangelogBuilds(), and streams behind getChangelogStreams())
  • +
  • [x] GET /changelog/{changelog} -> lookupChangelogBuild()
  • +
+
    +
  • [x] POST /chat/ack -> keepChatAlive()
  • +
  • [x] POST /chat/new -> sendChatPrivateMessage()
  • +
  • [x] GET /chat/channels/{channel}/messages -> getChatMessages()
  • +
  • [x] POST /chat/channels/{channel}/messages -> sendChatMessage()
  • +
  • [x] PUT /chat/channels/{channel}/users/{user} -> joinChatChannel()
  • +
  • [x] DELETE /chat/channels/{channel}/users/{user} -> leaveChatChannel()
  • +
  • [x] PUT /chat/channels/{channel}/mark-as-read/{message} -> markChatChannelAsRead()
  • +
  • [x] GET /chat/channels -> getChatChannels()
  • +
  • [x] POST /chat/channels -> createChatPrivateChannel() / createChatAnnouncementChannel()
  • +
  • [x] GET /chat/channels/{channel} -> getChatChannel() (without users because channel would already have this property)
  • +
+
    +
  • [x] GET /comments -> getComments()
  • +
  • [x] GET /comments/{comment} -> getComment()
  • +
+
    +
  • [x] GET /events -> getEvents()
  • +
+
    +
  • [x] POST /forums/topics/{topic}/reply -> replyForumTopic()
  • +
  • [x] POST /forums/topics -> createForumTopic()
  • +
  • [x] GET /forums/topics/{topic} -> getForumTopicAndPosts() (removing search for simplicity)
  • +
  • [x] PUT /forums/topics/{topic} -> editForumTopicTitle()
  • +
  • [x] PUT /forums/posts/{post} -> editForumPost()
  • +
+
    +
  • [x] GET /search -> searchUser() / searchWiki()
  • +
+
    +
  • [x] GET /matches -> getMatches()
  • +
  • [x] GET /matches/{match} -> getMatch()
  • +
+
    +
  • [x] GET /rooms/{room}/playlist/{playlist}/scores -> getPlaylistItemScores()
  • +
  • [x] GET /rooms -> getRooms()
  • +
  • [x] GET /rooms/{room} -> getRoom()
  • +
  • [x] GET /rooms/{room}/leaderboard -> getRoomLeaderboard()
  • +
+
    +
  • [x] GET /news -> getNewsPosts() (removing everything except news_sidebar.news_posts)
  • +
  • [x] GET /news/{news} -> getNewsPost()
  • +
+
    +
  • [x] GET /rankings/kudosu -> getKudosuRanking()
  • +
  • [x] GET /rankings/{mode}/{type} -> getUserRanking() / getCountryRanking() / getSpotlightRanking()
  • +
  • [x] GET /spotlights -> getSpotlights()
  • +
+
    +
  • [x] GET /me/{mode?} -> getResourceOwner()
  • +
  • [x] GET /users/{user}/kudosu -> getUserKudosu()
  • +
  • [x] GET /users/{user}/scores/{type} -> getUserScores()
  • +
  • [x] GET /users/{user}/beatmapsets/{type} -> getUserBeatmaps() / getUserMostPlayed()
  • +
  • [x] GET /users/{user}/recent_activity -> getUserRecentActivity()
  • +
  • [x] GET /users/{user}/{mode?} -> getUser()
  • +
  • [x] GET /users -> getUsers()
  • +
  • [x] GET /friends -> getFriends()
  • +
+
    +
  • [x] GET /wiki/{locale}/{path} -> getWikiPage()
  • +
+
    +
  • [x] GET /seasonal-backgrounds -> getSeasonalBackgrounds()
  • +
  • [x] GET /scores/{score}/download -> getReplay()
  • +
+
diff --git a/docs/interfaces/Beatmap-1.html b/docs/interfaces/Beatmap-1.html index 8ff3e87..d916074 100644 --- a/docs/interfaces/Beatmap-1.html +++ b/docs/interfaces/Beatmap-1.html @@ -1,4 +1,4 @@ -Beatmap | osu-api-v2-js

Interface Beatmap

interface Beatmap {
    beatmapset_id: number;
    difficulty_rating: number;
    id: number;
    mode: "osu" | "taiko" | "fruits" | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset_id +Beatmap | osu-api-v2-js

Interface Beatmap

interface Beatmap {
    beatmapset_id: number;
    difficulty_rating: number;
    id: number;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset_id: number
difficulty_rating: number
id: number
mode: "osu" | "taiko" | "fruits" | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ No newline at end of file +

Properties

beatmapset_id: number
difficulty_rating: number
id: number
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.Config.html b/docs/interfaces/Beatmap.Config.html index 6a1b8ea..c3b3630 100644 --- a/docs/interfaces/Beatmap.Config.html +++ b/docs/interfaces/Beatmap.Config.html @@ -1,11 +1,11 @@ -Config | osu-api-v2-js

An interface to tell the API what kind of scores should be in an array returned by a function

-

Remarks

Please note that some properties will be ignored by certain functions, check this in case of doubt: https://osu.ppy.sh/docs/index.html#beatmaps

-
interface Config {
    legacy_only?: boolean;
    mods?: string[];
    ruleset?: Ruleset;
    type?: string;
}

Properties

legacy_only? +Config | osu-api-v2-js

An interface to tell the API what kind of scores should be in an array returned by a function

+

Please note that some properties will be ignored by certain functions, check this in case of doubt: https://osu.ppy.sh/docs/index.html#beatmaps

+
interface Config {
    legacy_only?: boolean;
    mods?: string[];
    ruleset?: Ruleset;
    type?: string;
}

Properties

legacy_only?: boolean

Exclude lazer scores? (defaults to false)

-
mods?: string[]

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

-
ruleset?: Ruleset

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

-
type?: string

"Beatmap score ranking type", whatever that means...

-
\ No newline at end of file +

Properties

legacy_only?: boolean

Exclude lazer scores? (defaults to false)

+
mods?: string[]

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

+
ruleset?: Ruleset

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

+
type?: string

"Beatmap score ranking type", whatever that means...

+
diff --git a/docs/interfaces/Beatmap.DifficultyAttributes-1.html b/docs/interfaces/Beatmap.DifficultyAttributes-1.html index 61d978b..0f0a0b8 100644 --- a/docs/interfaces/Beatmap.DifficultyAttributes-1.html +++ b/docs/interfaces/Beatmap.DifficultyAttributes-1.html @@ -1,4 +1,4 @@ -DifficultyAttributes | osu-api-v2-js

Interface DifficultyAttributes

interface DifficultyAttributes {
    max_combo: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

max_combo +DifficultyAttributes | osu-api-v2-js

Interface DifficultyAttributes

interface DifficultyAttributes {
    max_combo: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

max_combo: number
star_rating: number
\ No newline at end of file +

Properties

max_combo: number
star_rating: number
diff --git a/docs/interfaces/Beatmap.DifficultyAttributes.Fruits.html b/docs/interfaces/Beatmap.DifficultyAttributes.Fruits.html index c4c3d0d..a2c6572 100644 --- a/docs/interfaces/Beatmap.DifficultyAttributes.Fruits.html +++ b/docs/interfaces/Beatmap.DifficultyAttributes.Fruits.html @@ -1,5 +1,5 @@ -Fruits | osu-api-v2-js
interface Fruits {
    approach_rate: number;
    max_combo: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

approach_rate +Fruits | osu-api-v2-js
interface Fruits {
    approach_rate: number;
    max_combo: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

approach_rate: number
max_combo: number
star_rating: number
\ No newline at end of file +

Properties

approach_rate: number
max_combo: number
star_rating: number
diff --git a/docs/interfaces/Beatmap.DifficultyAttributes.Mania.html b/docs/interfaces/Beatmap.DifficultyAttributes.Mania.html index e579b56..9550a31 100644 --- a/docs/interfaces/Beatmap.DifficultyAttributes.Mania.html +++ b/docs/interfaces/Beatmap.DifficultyAttributes.Mania.html @@ -1,7 +1,7 @@ -Mania | osu-api-v2-js
interface Mania {
    great_hit_window: number;
    max_combo: number;
    score_multiplier?: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

great_hit_window +Mania | osu-api-v2-js
interface Mania {
    great_hit_window: number;
    max_combo: number;
    score_multiplier?: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

great_hit_window: number
max_combo: number
score_multiplier?: number

Remarks

API documentation says it exists, my thorough testing says it doesn't, so...

-
star_rating: number
\ No newline at end of file +

Properties

great_hit_window: number
max_combo: number
score_multiplier?: number

API documentation says it exists, my thorough testing says it doesn't, so...

+
star_rating: number
diff --git a/docs/interfaces/Beatmap.DifficultyAttributes.Osu.html b/docs/interfaces/Beatmap.DifficultyAttributes.Osu.html index 3d7c173..16d65b9 100644 --- a/docs/interfaces/Beatmap.DifficultyAttributes.Osu.html +++ b/docs/interfaces/Beatmap.DifficultyAttributes.Osu.html @@ -1,5 +1,5 @@ -Osu | osu-api-v2-js
interface Osu {
    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;
}

Hierarchy (view full)

Properties

aim_difficulty +Osu | osu-api-v2-js
interface Osu {
    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;
}

Hierarchy (view full)

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
\ No newline at end of file +

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
diff --git a/docs/interfaces/Beatmap.DifficultyAttributes.Taiko.html b/docs/interfaces/Beatmap.DifficultyAttributes.Taiko.html index 4f34b93..d3ea9e4 100644 --- a/docs/interfaces/Beatmap.DifficultyAttributes.Taiko.html +++ b/docs/interfaces/Beatmap.DifficultyAttributes.Taiko.html @@ -1,9 +1,9 @@ -Taiko | osu-api-v2-js
interface Taiko {
    colour_difficulty: number;
    great_hit_window: number;
    max_combo: number;
    peak_difficulty: number;
    rhythm_difficulty: number;
    stamina_difficulty: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

colour_difficulty +Taiko | osu-api-v2-js
interface Taiko {
    colour_difficulty: number;
    great_hit_window: number;
    max_combo: number;
    peak_difficulty: number;
    rhythm_difficulty: number;
    stamina_difficulty: number;
    star_rating: number;
}

Hierarchy (view full)

Properties

colour_difficulty: number
great_hit_window: number
max_combo: number
peak_difficulty: number
rhythm_difficulty: number
stamina_difficulty: number
star_rating: number
\ No newline at end of file +

Properties

colour_difficulty: number
great_hit_window: number
max_combo: number
peak_difficulty: number
rhythm_difficulty: number
stamina_difficulty: number
star_rating: number
diff --git a/docs/interfaces/Beatmap.Extended-1.html b/docs/interfaces/Beatmap.Extended-1.html index f8eccab..1cf9121 100644 --- a/docs/interfaces/Beatmap.Extended-1.html +++ b/docs/interfaces/Beatmap.Extended-1.html @@ -1,4 +1,4 @@ -Extended | osu-api-v2-js
interface Extended {
    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: "osu" | "taiko" | "fruits" | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

accuracy +Extended | osu-api-v2-js
interface Extended {
    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:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

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: "osu" | "taiko" | "fruits" | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ 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:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.Extended.WithFailtimes.html b/docs/interfaces/Beatmap.Extended.WithFailtimes.html index 650e061..4317f85 100644 --- a/docs/interfaces/Beatmap.Extended.WithFailtimes.html +++ b/docs/interfaces/Beatmap.Extended.WithFailtimes.html @@ -1,4 +1,4 @@ -WithFailtimes | osu-api-v2-js
interface WithFailtimes {
    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[];
    };
    hit_length: number;
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    mode: "osu" | "taiko" | "fruits" | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

accuracy +WithFailtimes | osu-api-v2-js
interface WithFailtimes {
    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[];
    };
    hit_length: number;
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

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: "osu" | "taiko" | "fruits" | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ 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
failtimes: {
    exit: number[];
    fail: number[];
}
hit_length: number
id: number
is_scoreable: boolean
last_updated: Date
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.Extended.WithFailtimesBeatmapset.html b/docs/interfaces/Beatmap.Extended.WithFailtimesBeatmapset.html index 60c0ebe..b758937 100644 --- a/docs/interfaces/Beatmap.Extended.WithFailtimesBeatmapset.html +++ b/docs/interfaces/Beatmap.Extended.WithFailtimesBeatmapset.html @@ -1,5 +1,5 @@ -WithFailtimesBeatmapset | osu-api-v2-js

Obtainable From

API.getBeatmap

-
interface WithFailtimesBeatmapset {
    accuracy: number;
    ar: number;
    beatmapset: Beatmapset.Extended;
    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[];
    };
    hit_length: number;
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    max_combo: number;
    mode: "osu" | "taiko" | "fruits" | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

accuracy +WithFailtimesBeatmapset | osu-api-v2-js

API.getBeatmap

+
interface WithFailtimesBeatmapset {
    accuracy: number;
    ar: number;
    beatmapset: Beatmapset.Extended;
    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[];
    };
    hit_length: number;
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    max_combo: number;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

Properties

accuracy: number
ar: number
beatmapset: Beatmapset.Extended
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
max_combo: number
mode: "osu" | "taiko" | "fruits" | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ No newline at end of file +

Properties

accuracy: number
ar: number
beatmapset: Beatmapset.Extended
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[];
}
hit_length: number
id: number
is_scoreable: boolean
last_updated: Date
max_combo: number
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.Extended.WithFailtimesMaxcombo.html b/docs/interfaces/Beatmap.Extended.WithFailtimesMaxcombo.html index bab6413..d7f13aa 100644 --- a/docs/interfaces/Beatmap.Extended.WithFailtimesMaxcombo.html +++ b/docs/interfaces/Beatmap.Extended.WithFailtimesMaxcombo.html @@ -1,5 +1,5 @@ -WithFailtimesMaxcombo | osu-api-v2-js

Obtainable From

API.getBeatmaps

-
interface WithFailtimesMaxcombo {
    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[];
    };
    hit_length: number;
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    max_combo: number;
    mode: "osu" | "taiko" | "fruits" | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

accuracy +WithFailtimesMaxcombo | osu-api-v2-js

API.getBeatmaps

+
interface WithFailtimesMaxcombo {
    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[];
    };
    hit_length: number;
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    max_combo: number;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

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
max_combo: number
mode: "osu" | "taiko" | "fruits" | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ 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
failtimes: {
    exit: number[];
    fail: number[];
}
hit_length: number
id: number
is_scoreable: boolean
last_updated: Date
max_combo: number
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.Extended.WithMaxcombo.html b/docs/interfaces/Beatmap.Extended.WithMaxcombo.html index 90decbf..c2ce50e 100644 --- a/docs/interfaces/Beatmap.Extended.WithMaxcombo.html +++ b/docs/interfaces/Beatmap.Extended.WithMaxcombo.html @@ -1,4 +1,4 @@ -WithMaxcombo | osu-api-v2-js
interface WithMaxcombo {
    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;
    max_combo: number;
    mode: "osu" | "taiko" | "fruits" | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

accuracy +WithMaxcombo | osu-api-v2-js
interface WithMaxcombo {
    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;
    max_combo: number;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    mode_int: Ruleset;
    passcount: number;
    playcount: number;
    ranked: RankStatus;
    status: string;
    total_length: number;
    url: string;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

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
max_combo: number
mode: "osu" | "taiko" | "fruits" | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ 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
max_combo: number
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
mode_int: Ruleset
passcount: number
playcount: number
ranked: RankStatus
status: string
total_length: number
url: string
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.Pack-1.html b/docs/interfaces/Beatmap.Pack-1.html index 462f122..3a5d3c1 100644 --- a/docs/interfaces/Beatmap.Pack-1.html +++ b/docs/interfaces/Beatmap.Pack-1.html @@ -1,5 +1,5 @@ -Pack | osu-api-v2-js

Obtainable From

API.getBeatmapPacks

-
interface Pack {
    author: string;
    date: Date;
    name: string;
    no_diff_reduction: boolean;
    ruleset_id: null | Ruleset;
    tag: string;
    url: string;
    user_completion_data?: {
        beatmapset_ids: number[];
        completed: boolean;
    };
}

Hierarchy (view full)

Properties

author +Pack | osu-api-v2-js

API.getBeatmapPacks

+
interface Pack {
    author: string;
    date: Date;
    name: string;
    no_diff_reduction: boolean;
    ruleset_id: null | Ruleset;
    tag: string;
    url: string;
    user_completion_data?: {
        beatmapset_ids: number[];
        completed: boolean;
    };
}

Hierarchy (view full)

Properties

author: string
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 | Ruleset
tag: string
url: string

Download page; going there with a web browser should start the download of a zip file automatically

-
user_completion_data?: {
    beatmapset_ids: number[];
    completed: boolean;
}

Not there if the application doesn't act as a specific user

+

Properties

author: string
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 | Ruleset
tag: string
url: string

Download page; going there with a web browser should start the download of a zip file automatically

+
user_completion_data?: {
    beatmapset_ids: number[];
    completed: boolean;
}

Not there if the application doesn't act as a specific user

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

    -
\ No newline at end of file +
diff --git a/docs/interfaces/Beatmap.Pack.WithBeatmapset.html b/docs/interfaces/Beatmap.Pack.WithBeatmapset.html index 3494b8e..95f82de 100644 --- a/docs/interfaces/Beatmap.Pack.WithBeatmapset.html +++ b/docs/interfaces/Beatmap.Pack.WithBeatmapset.html @@ -1,5 +1,5 @@ -WithBeatmapset | osu-api-v2-js

Obtainable From

API.getBeatmapPack

-
interface WithBeatmapset {
    author: string;
    beatmapsets: Beatmapset.Extended[];
    date: Date;
    name: string;
    no_diff_reduction: boolean;
    ruleset_id: null | Ruleset;
    tag: string;
    url: string;
    user_completion_data?: {
        beatmapset_ids: number[];
        completed: boolean;
    };
}

Hierarchy (view full)

Properties

author +WithBeatmapset | osu-api-v2-js

API.getBeatmapPack

+
interface WithBeatmapset {
    author: string;
    beatmapsets: Beatmapset.Extended[];
    date: Date;
    name: string;
    no_diff_reduction: boolean;
    ruleset_id: null | Ruleset;
    tag: string;
    url: string;
    user_completion_data?: {
        beatmapset_ids: number[];
        completed: boolean;
    };
}

Hierarchy (view full)

Properties

author: string
beatmapsets: Beatmapset.Extended[]
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 | Ruleset
tag: string
url: string

Download page; going there with a web browser should start the download of a zip file automatically

-
user_completion_data?: {
    beatmapset_ids: number[];
    completed: boolean;
}

Not there if the application doesn't act as a specific user

+

Properties

author: string
beatmapsets: Beatmapset.Extended[]
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 | Ruleset
tag: string
url: string

Download page; going there with a web browser should start the download of a zip file automatically

+
user_completion_data?: {
    beatmapset_ids: number[];
    completed: boolean;
}

Not there if the application doesn't act as a specific user

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

    -
\ No newline at end of file +
diff --git a/docs/interfaces/Beatmap.Playcount.html b/docs/interfaces/Beatmap.Playcount.html index 748dafd..068347f 100644 --- a/docs/interfaces/Beatmap.Playcount.html +++ b/docs/interfaces/Beatmap.Playcount.html @@ -1,7 +1,7 @@ -Playcount | osu-api-v2-js

Obtainable From

API.getUserMostPlayed

-
interface Playcount {
    beatmap: Beatmap;
    beatmap_id: number;
    beatmapset: Beatmapset;
    count: number;
}

Properties

beatmap +Playcount | osu-api-v2-js

API.getUserMostPlayed

+
interface Playcount {
    beatmap: Beatmap;
    beatmap_id: number;
    beatmapset: Beatmapset;
    count: number;
}

Properties

beatmap: Beatmap
beatmap_id: number
beatmapset: Beatmapset
count: number

Playcount

-
\ No newline at end of file +

Properties

beatmap: Beatmap
beatmap_id: number
beatmapset: Beatmapset
count: number

Playcount

+
diff --git a/docs/interfaces/Beatmap.UserScore-1.html b/docs/interfaces/Beatmap.UserScore-1.html index 6dfd8a0..864f5dd 100644 --- a/docs/interfaces/Beatmap.UserScore-1.html +++ b/docs/interfaces/Beatmap.UserScore-1.html @@ -1,6 +1,6 @@ -UserScore | osu-api-v2-js

Obtainable From

API.getBeatmapUserScore

-
interface UserScore {
    position: number;
    score: WithUserBeatmap;
}

Properties

position +UserScore | osu-api-v2-js

API.getBeatmapUserScore

+
interface UserScore {
    position: number;
    score: WithUserBeatmap;
}

Properties

Properties

position: number

Value depends on the requested mode and mods!

-

The score itself

-
\ No newline at end of file +

Properties

position: number

Value depends on the requested mode and mods!

+

The score itself

+
diff --git a/docs/interfaces/Beatmap.WithBeatmapset.html b/docs/interfaces/Beatmap.WithBeatmapset.html index 462f23e..47a2114 100644 --- a/docs/interfaces/Beatmap.WithBeatmapset.html +++ b/docs/interfaces/Beatmap.WithBeatmapset.html @@ -1,4 +1,4 @@ -WithBeatmapset | osu-api-v2-js

Interface WithBeatmapset

interface WithBeatmapset {
    beatmapset: Beatmapset;
    beatmapset_id: number;
    difficulty_rating: number;
    id: number;
    mode: "osu" | "taiko" | "fruits" | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset +WithBeatmapset | osu-api-v2-js

Interface WithBeatmapset

interface WithBeatmapset {
    beatmapset: Beatmapset;
    beatmapset_id: number;
    difficulty_rating: number;
    id: number;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset: Beatmapset
beatmapset_id: number
difficulty_rating: number
id: number
mode: "osu" | "taiko" | "fruits" | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ No newline at end of file +

Properties

beatmapset: Beatmapset
beatmapset_id: number
difficulty_rating: number
id: number
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.WithBeatmapsetChecksumMaxcombo.html b/docs/interfaces/Beatmap.WithBeatmapsetChecksumMaxcombo.html index d7c434e..431a4ec 100644 --- a/docs/interfaces/Beatmap.WithBeatmapsetChecksumMaxcombo.html +++ b/docs/interfaces/Beatmap.WithBeatmapsetChecksumMaxcombo.html @@ -1,4 +1,4 @@ -WithBeatmapsetChecksumMaxcombo | osu-api-v2-js

Interface WithBeatmapsetChecksumMaxcombo

interface WithBeatmapsetChecksumMaxcombo {
    beatmapset: Beatmapset;
    beatmapset_id: number;
    checksum: string;
    difficulty_rating: number;
    id: number;
    max_combo: number;
    mode: "osu" | "taiko" | "fruits" | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset +WithBeatmapsetChecksumMaxcombo | osu-api-v2-js

Interface WithBeatmapsetChecksumMaxcombo

interface WithBeatmapsetChecksumMaxcombo {
    beatmapset: Beatmapset;
    beatmapset_id: number;
    checksum: string;
    difficulty_rating: number;
    id: number;
    max_combo: number;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset: Beatmapset
beatmapset_id: number
checksum: string
difficulty_rating: number
id: number
max_combo: number
mode: "osu" | "taiko" | "fruits" | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ No newline at end of file +

Properties

beatmapset: Beatmapset
beatmapset_id: number
checksum: string
difficulty_rating: number
id: number
max_combo: number
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmap.WithChecksum.html b/docs/interfaces/Beatmap.WithChecksum.html index 545279f..6c98d0c 100644 --- a/docs/interfaces/Beatmap.WithChecksum.html +++ b/docs/interfaces/Beatmap.WithChecksum.html @@ -1,4 +1,4 @@ -WithChecksum | osu-api-v2-js

Interface WithChecksum

interface WithChecksum {
    beatmapset_id: number;
    checksum: string;
    difficulty_rating: number;
    id: number;
    mode: "osu" | "taiko" | "fruits" | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset_id +WithChecksum | osu-api-v2-js

Interface WithChecksum

interface WithChecksum {
    beatmapset_id: number;
    checksum: string;
    difficulty_rating: number;
    id: number;
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania";
    status: string;
    total_length: number;
    user_id: number;
    version: string;
}

Hierarchy (view full)

Properties

beatmapset_id: number
checksum: string
difficulty_rating: number
id: number
mode: "osu" | "taiko" | "fruits" | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

-
\ No newline at end of file +

Properties

beatmapset_id: number
checksum: string
difficulty_rating: number
id: number
mode:
    | "osu"
    | "taiko"
    | "fruits"
    | "mania"
status: string
total_length: number
user_id: number
version: string

The name of the difficulty, maybe something like "Someone's Insane"

+
diff --git a/docs/interfaces/Beatmapset-1.html b/docs/interfaces/Beatmapset-1.html index 25c5bd0..d314d7b 100644 --- a/docs/interfaces/Beatmapset-1.html +++ b/docs/interfaces/Beatmapset-1.html @@ -1,4 +1,4 @@ -Beatmapset | osu-api-v2-js

Interface Beatmapset

interface Beatmapset {
    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;
    };
    creator: string;
    favourite_count: number;
    id: number;
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    source: string;
    spotlight: boolean;
    status: string;
    title: string;
    title_unicode: string;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

Properties

artist +Beatmapset | osu-api-v2-js

Interface Beatmapset

interface Beatmapset {
    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;
    };
    creator: string;
    favourite_count: number;
    id: number;
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    source: string;
    spotlight: boolean;
    status: string;
    title: string;
    title_unicode: string;
    track_id: null | number;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

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
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 in romaji if the song's title is in Japanese

-
title_unicode: string

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

-
user_id: number
video: boolean
\ 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;
}
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
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 in romaji if the song's title is in Japanese

+
title_unicode: string

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

+
track_id: null | number

If the song exists on a featured artist's page, then it has a track_id

+

https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist

+
user_id: number
video: boolean
diff --git a/docs/interfaces/Beatmapset.Config.html b/docs/interfaces/Beatmapset.Config.html index 9b1dc22..0e2ed90 100644 --- a/docs/interfaces/Beatmapset.Config.html +++ b/docs/interfaces/Beatmapset.Config.html @@ -1,10 +1,10 @@ -Config | osu-api-v2-js

An interface to tell the API how the returned Array should be like

-
interface Config {
    cursor_string?: string;
    limit?: number;
    page?: number;
    sort?: "id_desc" | "id_asc";
}

Properties

cursor_string? +Config | osu-api-v2-js

An interface to tell the API how the returned Array should be like

+
interface Config {
    cursor_string?: string;
    limit?: number;
    page?: number;
    sort?: "id_desc" | "id_asc";
}

Properties

cursor_string?: string

A cursor_string provided by a previous request

-
limit?: number

The maximum amount of elements to get

-
page?: number

Which page of the results to get

-
sort?: "id_desc" | "id_asc"

"id_asc" to have the oldest element first, "id_desc" to have the newest instead

-
\ No newline at end of file +

Properties

cursor_string?: string

A cursor_string provided by a previous request

+
limit?: number

The maximum amount of elements to get

+
page?: number

Which page of the results to get

+
sort?: "id_desc" | "id_asc"

"id_asc" to have the oldest element first, "id_desc" to have the newest instead

+
diff --git a/docs/interfaces/Beatmapset.Discussion-1.html b/docs/interfaces/Beatmapset.Discussion-1.html index 86dae41..2929279 100644 --- a/docs/interfaces/Beatmapset.Discussion-1.html +++ b/docs/interfaces/Beatmapset.Discussion-1.html @@ -1,4 +1,4 @@ -Discussion | osu-api-v2-js
interface Discussion {
    beatmap_id: null | number;
    beatmapset_id: number;
    can_be_resolved: boolean;
    can_grant_kudosu: boolean;
    created_at: Date;
    deleted_at: null | Date;
    deleted_by_id: null | number;
    id: number;
    kudosu_denied: boolean;
    last_post_at: Date;
    message_type: "suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review";
    parent_id: null | number;
    resolved: boolean;
    timestamp: null | number;
    updated_at: Date;
    user_id: number;
}

Hierarchy (view full)

Properties

beatmap_id +Discussion | osu-api-v2-js
interface Discussion {
    beatmap_id: null | number;
    beatmapset_id: number;
    can_be_resolved: boolean;
    can_grant_kudosu: boolean;
    created_at: Date;
    deleted_at: null | Date;
    deleted_by_id: null | number;
    id: number;
    kudosu_denied: boolean;
    last_post_at: Date;
    message_type:
        | "suggestion"
        | "problem"
        | "mapper_note"
        | "praise"
        | "hype"
        | "review";
    parent_id: null | number;
    resolved: boolean;
    timestamp: null | number;
    updated_at: Date;
    user_id: number;
}

Hierarchy (view full)

Properties

beatmap_id: null | number
beatmapset_id: number
can_be_resolved: boolean
can_grant_kudosu: boolean
created_at: Date
deleted_at: null | Date
deleted_by_id: null | number
id: number
kudosu_denied: boolean
last_post_at: Date
message_type: "suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review"
parent_id: null | number

For example, the id of the review this discussion is included in

-
resolved: boolean
timestamp: null | number
updated_at: Date
user_id: number
\ No newline at end of file +

Properties

beatmap_id: null | number
beatmapset_id: number
can_be_resolved: boolean
can_grant_kudosu: boolean
created_at: Date
deleted_at: null | Date
deleted_by_id: null | number
id: number
kudosu_denied: boolean
last_post_at: Date
message_type:
    | "suggestion"
    | "problem"
    | "mapper_note"
    | "praise"
    | "hype"
    | "review"
parent_id: null | number

For example, the id of the review this discussion is included in

+
resolved: boolean
timestamp: null | number
updated_at: Date
user_id: number
diff --git a/docs/interfaces/Beatmapset.Discussion.Post-1.html b/docs/interfaces/Beatmapset.Discussion.Post-1.html index faf8f97..62d9026 100644 --- a/docs/interfaces/Beatmapset.Discussion.Post-1.html +++ b/docs/interfaces/Beatmapset.Discussion.Post-1.html @@ -1,4 +1,4 @@ -Post | osu-api-v2-js
interface Post {
    beatmapset_discussion_id: number;
    created_at: Date;
    deleted_at: null | Date;
    deleted_by_id: null | number;
    id: number;
    last_editor_id: null | number;
    message: string;
    system: boolean;
    updated_at: Date;
    user_id: number;
}

Properties

beatmapset_discussion_id +Post | osu-api-v2-js
interface Post {
    beatmapset_discussion_id: number;
    created_at: Date;
    deleted_at: null | Date;
    deleted_by_id: null | number;
    id: number;
    last_editor_id: null | number;
    message: string;
    system: boolean;
    updated_at: Date;
    user_id: number;
}

Properties

beatmapset_discussion_id: number
created_at: Date
deleted_at: null | Date
deleted_by_id: null | number
id: number
last_editor_id: null | number
message: string
system: boolean
updated_at: Date
user_id: number
\ No newline at end of file +

Properties

beatmapset_discussion_id: number
created_at: Date
deleted_at: null | Date
deleted_by_id: null | number
id: number
last_editor_id: null | number
message: string
system: boolean
updated_at: Date
user_id: number
diff --git a/docs/interfaces/Beatmapset.Discussion.Vote-1.html b/docs/interfaces/Beatmapset.Discussion.Vote-1.html index 32d14ba..1082bee 100644 --- a/docs/interfaces/Beatmapset.Discussion.Vote-1.html +++ b/docs/interfaces/Beatmapset.Discussion.Vote-1.html @@ -1,7 +1,7 @@ -Vote | osu-api-v2-js
interface Vote {
    beatmapset_discussion_id: number;
    created_at: Date;
    id: number;
    score: number;
    updated_at: Date;
    user_id: number;
}

Properties

beatmapset_discussion_id +Vote | osu-api-v2-js
interface Vote {
    beatmapset_discussion_id: number;
    created_at: Date;
    id: number;
    score: number;
    updated_at: Date;
    user_id: number;
}

Properties

beatmapset_discussion_id: number
created_at: Date
id: number
score: number
updated_at: Date
user_id: number
\ No newline at end of file +

Properties

beatmapset_discussion_id: number
created_at: Date
id: number
score: number
updated_at: Date
user_id: number
diff --git a/docs/interfaces/Beatmapset.Discussion.WithStartingpost.html b/docs/interfaces/Beatmapset.Discussion.WithStartingpost.html index cef68da..cfb0206 100644 --- a/docs/interfaces/Beatmapset.Discussion.WithStartingpost.html +++ b/docs/interfaces/Beatmapset.Discussion.WithStartingpost.html @@ -1,4 +1,4 @@ -WithStartingpost | osu-api-v2-js
interface WithStartingpost {
    beatmap_id: null | number;
    beatmapset_id: number;
    can_be_resolved: boolean;
    can_grant_kudosu: boolean;
    created_at: Date;
    deleted_at: null | Date;
    deleted_by_id: null | number;
    id: number;
    kudosu_denied: boolean;
    last_post_at: Date;
    message_type: "suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review";
    parent_id: null | number;
    resolved: boolean;
    starting_post: Beatmapset.Discussion.Post;
    timestamp: null | number;
    updated_at: Date;
    user_id: number;
}

Hierarchy (view full)

Properties

beatmap_id +WithStartingpost | osu-api-v2-js
interface WithStartingpost {
    beatmap_id: null | number;
    beatmapset_id: number;
    can_be_resolved: boolean;
    can_grant_kudosu: boolean;
    created_at: Date;
    deleted_at: null | Date;
    deleted_by_id: null | number;
    id: number;
    kudosu_denied: boolean;
    last_post_at: Date;
    message_type:
        | "suggestion"
        | "problem"
        | "mapper_note"
        | "praise"
        | "hype"
        | "review";
    parent_id: null | number;
    resolved: boolean;
    starting_post: Beatmapset.Discussion.Post;
    timestamp: null | number;
    updated_at: Date;
    user_id: number;
}

Hierarchy (view full)

Properties

beatmap_id: null | number
beatmapset_id: number
can_be_resolved: boolean
can_grant_kudosu: boolean
created_at: Date
deleted_at: null | Date
deleted_by_id: null | number
id: number
kudosu_denied: boolean
last_post_at: Date
message_type: "suggestion" | "problem" | "mapper_note" | "praise" | "hype" | "review"
parent_id: null | number

For example, the id of the review this discussion is included in

-
resolved: boolean
starting_post: Beatmapset.Discussion.Post
timestamp: null | number
updated_at: Date
user_id: number
\ No newline at end of file +

Properties

beatmap_id: null | number
beatmapset_id: number
can_be_resolved: boolean
can_grant_kudosu: boolean
created_at: Date
deleted_at: null | Date
deleted_by_id: null | number
id: number
kudosu_denied: boolean
last_post_at: Date
message_type:
    | "suggestion"
    | "problem"
    | "mapper_note"
    | "praise"
    | "hype"
    | "review"
parent_id: null | number

For example, the id of the review this discussion is included in

+
resolved: boolean
starting_post: Beatmapset.Discussion.Post
timestamp: null | number
updated_at: Date
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event-1.html b/docs/interfaces/Beatmapset.Event-1.html index e518309..8257af6 100644 --- a/docs/interfaces/Beatmapset.Event-1.html +++ b/docs/interfaces/Beatmapset.Event-1.html @@ -1,8 +1,7 @@ -Event | osu-api-v2-js
interface Event {
    beatmapset: WithUserHype;
    comment: null | object;
    created_at: Date;
    id: number;
    type: "nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change";
}

Hierarchy (view full)

Properties

beatmapset -comment +Event | osu-api-v2-js
interface Event {
    comment: null | object;
    created_at: Date;
    id: number;
    type:
        | "nominate"
        | "love"
        | "remove_from_loved"
        | "qualify"
        | "disqualify"
        | "approve"
        | "rank"
        | "kudosu_allow"
        | "kudosu_deny"
        | "kudosu_gain"
        | "kudosu_lost"
        | "kudosu_recalculate"
        | "issue_resolve"
        | "issue_reopen"
        | "discussion_lock"
        | "discussion_unlock"
        | "discussion_delete"
        | "discussion_restore"
        | "discussion_post_delete"
        | "discussion_post_restore"
        | "nomination_reset"
        | "nomination_reset_received"
        | "genre_edit"
        | "language_edit"
        | "nsfw_toggle"
        | "offset_edit"
        | "tags_edit"
        | "beatmap_owner_change";
}

Properties

beatmapset: WithUserHype
comment: null | object
created_at: Date
id: number
type: "nominate" | "love" | "remove_from_loved" | "qualify" | "disqualify" | "approve" | "rank" | "kudosu_allow" | "kudosu_deny" | "kudosu_gain" | "kudosu_lost" | "kudosu_recalculate" | "issue_resolve" | "issue_reopen" | "discussion_lock" | "discussion_unlock" | "discussion_delete" | "discussion_restore" | "discussion_post_delete" | "discussion_post_restore" | "nomination_reset" | "nomination_reset_received" | "genre_edit" | "language_edit" | "nsfw_toggle" | "offset_edit" | "tags_edit" | "beatmap_owner_change"

Remarks

"approve" is currently not used, it's here just in case that ever changes +

Properties

comment: null | object
created_at: Date
id: number
type:
    | "nominate"
    | "love"
    | "remove_from_loved"
    | "qualify"
    | "disqualify"
    | "approve"
    | "rank"
    | "kudosu_allow"
    | "kudosu_deny"
    | "kudosu_gain"
    | "kudosu_lost"
    | "kudosu_recalculate"
    | "issue_resolve"
    | "issue_reopen"
    | "discussion_lock"
    | "discussion_unlock"
    | "discussion_delete"
    | "discussion_restore"
    | "discussion_post_delete"
    | "discussion_post_restore"
    | "nomination_reset"
    | "nomination_reset_received"
    | "genre_edit"
    | "language_edit"
    | "nsfw_toggle"
    | "offset_edit"
    | "tags_edit"
    | "beatmap_owner_change"

"approve" is currently not used, it's here just in case that ever changes https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

-
\ No newline at end of file +
diff --git a/docs/interfaces/Beatmapset.Event.BeatmapOwnerChange.html b/docs/interfaces/Beatmapset.Event.BeatmapOwnerChange.html index 448d5f9..bb1b820 100644 --- a/docs/interfaces/Beatmapset.Event.BeatmapOwnerChange.html +++ b/docs/interfaces/Beatmapset.Event.BeatmapOwnerChange.html @@ -1,7 +1,9 @@ -BeatmapOwnerChange | osu-api-v2-js
interface BeatmapOwnerChange {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername;
    created_at: Date;
    id: number;
    type: "beatmap_owner_change";
    user_id: number;
}

Hierarchy

  • WithUserid
    • BeatmapOwnerChange

Properties

beatmapset +BeatmapOwnerChange | osu-api-v2-js
interface BeatmapOwnerChange {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername;
    created_at: Date;
    id: number;
    type: "beatmap_owner_change";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
    • BeatmapOwnerChange

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "beatmap_owner_change"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "beatmap_owner_change"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.Comment-1.html b/docs/interfaces/Beatmapset.Event.Comment-1.html index d929a26..cfb0619 100644 --- a/docs/interfaces/Beatmapset.Event.Comment-1.html +++ b/docs/interfaces/Beatmapset.Event.Comment-1.html @@ -1,2 +1,2 @@ -Comment | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface Comment {}

Hierarchy (view full)

\ No newline at end of file +Comment | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+

Hierarchy (view full)

diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostid.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostid.html index ea7d3c2..8572ab4 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostid.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostid.html @@ -1,4 +1,4 @@ -WithDiscussionidPostid | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostid {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostid | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostid {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername.html index 5ca8824..7305c22 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername.html @@ -1,8 +1,8 @@ -WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername | osu-api-v2-js

Interface WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    beatmap_id: number;
    beatmap_version: string;
    new_user_id: number;
    new_user_username: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername | osu-api-v2-js

Interface WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidBeatmapidBeatmapversionNewuseridNewuserusername {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    beatmap_id: number;
    beatmap_version: string;
    new_user_id: number;
    new_user_username: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
beatmap_id: number
beatmap_version: string
new_user_id: number
new_user_username: string
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
beatmap_id: number
beatmap_version: string
new_user_id: number
new_user_username: string
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNewvotevotes.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNewvotevotes.html index d89f78c..f3dfd3d 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNewvotevotes.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNewvotevotes.html @@ -1,6 +1,6 @@ -WithDiscussionidPostidNewvotevotes | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidNewvotevotes {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new_vote: {
        score: number;
        user_id: number;
    };
    votes: {
        score: number;
        user_id: number;
    }[];
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidNewvotevotes | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidNewvotevotes {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new_vote: {
        score: number;
        user_id: number;
    };
    votes: {
        score: number;
        user_id: number;
    }[];
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new_vote: {
    score: number;
    user_id: number;
}

Type declaration

  • score: number
  • user_id: number
votes: {
    score: number;
    user_id: number;
}[]

Type declaration

  • score: number
  • user_id: number
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new_vote: {
    score: number;
    user_id: number;
}
votes: {
    score: number;
    user_id: number;
}[]
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNominatorsids.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNominatorsids.html index 07a02f3..cfe6edb 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNominatorsids.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidNominatorsids.html @@ -1,5 +1,5 @@ -WithDiscussionidPostidNominatorsids | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidNominatorsids {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    nominator_ids: number[];
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidNominatorsids | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidNominatorsids {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    nominator_ids: number[];
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
nominator_ids: number[]
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
nominator_ids: number[]
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldgenreNewgenre.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldgenreNewgenre.html index 928b7ad..3ccbfa1 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldgenreNewgenre.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldgenreNewgenre.html @@ -1,6 +1,6 @@ -WithDiscussionidPostidOldgenreNewgenre | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidOldgenreNewgenre {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: "Any" | "Unspecified" | "Video Game" | "Anime" | "Rock" | "Pop" | "Other" | "Novelty" | "Hip Hop" | "Electronic" | "Metal" | "Classical" | "Folk" | "Jazz";
    old: "Any" | "Unspecified" | "Video Game" | "Anime" | "Rock" | "Pop" | "Other" | "Novelty" | "Hip Hop" | "Electronic" | "Metal" | "Classical" | "Folk" | "Jazz";
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidOldgenreNewgenre | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidOldgenreNewgenre {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new:
        | "Any"
        | "Unspecified"
        | "Video Game"
        | "Anime"
        | "Rock"
        | "Pop"
        | "Other"
        | "Novelty"
        | "Hip Hop"
        | "Electronic"
        | "Metal"
        | "Classical"
        | "Folk"
        | "Jazz";
    old:
        | "Any"
        | "Unspecified"
        | "Video Game"
        | "Anime"
        | "Rock"
        | "Pop"
        | "Other"
        | "Novelty"
        | "Hip Hop"
        | "Electronic"
        | "Metal"
        | "Classical"
        | "Folk"
        | "Jazz";
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: "Any" | "Unspecified" | "Video Game" | "Anime" | "Rock" | "Pop" | "Other" | "Novelty" | "Hip Hop" | "Electronic" | "Metal" | "Classical" | "Folk" | "Jazz"
old: "Any" | "Unspecified" | "Video Game" | "Anime" | "Rock" | "Pop" | "Other" | "Novelty" | "Hip Hop" | "Electronic" | "Metal" | "Classical" | "Folk" | "Jazz"
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new:
    | "Any"
    | "Unspecified"
    | "Video Game"
    | "Anime"
    | "Rock"
    | "Pop"
    | "Other"
    | "Novelty"
    | "Hip Hop"
    | "Electronic"
    | "Metal"
    | "Classical"
    | "Folk"
    | "Jazz"
old:
    | "Any"
    | "Unspecified"
    | "Video Game"
    | "Anime"
    | "Rock"
    | "Pop"
    | "Other"
    | "Novelty"
    | "Hip Hop"
    | "Electronic"
    | "Metal"
    | "Classical"
    | "Folk"
    | "Jazz"
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldlanguageNewlanguage.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldlanguageNewlanguage.html index c54b044..0822a80 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldlanguageNewlanguage.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldlanguageNewlanguage.html @@ -1,6 +1,6 @@ -WithDiscussionidPostidOldlanguageNewlanguage | osu-api-v2-js

Interface WithDiscussionidPostidOldlanguageNewlanguage

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidOldlanguageNewlanguage {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: "Any" | "Unspecified" | "Other" | "English" | "Japanese" | "Chinese" | "Instrumental" | "Korean" | "French" | "German" | "Swedish" | "Spanish" | "Italian" | "Russian" | "Polish";
    old: "Any" | "Unspecified" | "Other" | "English" | "Japanese" | "Chinese" | "Instrumental" | "Korean" | "French" | "German" | "Swedish" | "Spanish" | "Italian" | "Russian" | "Polish";
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidOldlanguageNewlanguage | osu-api-v2-js

Interface WithDiscussionidPostidOldlanguageNewlanguage

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidOldlanguageNewlanguage {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new:
        | "Any"
        | "Unspecified"
        | "Other"
        | "English"
        | "Japanese"
        | "Chinese"
        | "Instrumental"
        | "Korean"
        | "French"
        | "German"
        | "Swedish"
        | "Spanish"
        | "Italian"
        | "Russian"
        | "Polish";
    old:
        | "Any"
        | "Unspecified"
        | "Other"
        | "English"
        | "Japanese"
        | "Chinese"
        | "Instrumental"
        | "Korean"
        | "French"
        | "German"
        | "Swedish"
        | "Spanish"
        | "Italian"
        | "Russian"
        | "Polish";
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: "Any" | "Unspecified" | "Other" | "English" | "Japanese" | "Chinese" | "Instrumental" | "Korean" | "French" | "German" | "Swedish" | "Spanish" | "Italian" | "Russian" | "Polish"
old: "Any" | "Unspecified" | "Other" | "English" | "Japanese" | "Chinese" | "Instrumental" | "Korean" | "French" | "German" | "Swedish" | "Spanish" | "Italian" | "Russian" | "Polish"
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new:
    | "Any"
    | "Unspecified"
    | "Other"
    | "English"
    | "Japanese"
    | "Chinese"
    | "Instrumental"
    | "Korean"
    | "French"
    | "German"
    | "Swedish"
    | "Spanish"
    | "Italian"
    | "Russian"
    | "Polish"
old:
    | "Any"
    | "Unspecified"
    | "Other"
    | "English"
    | "Japanese"
    | "Chinese"
    | "Instrumental"
    | "Korean"
    | "French"
    | "German"
    | "Swedish"
    | "Spanish"
    | "Italian"
    | "Russian"
    | "Polish"
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldnsfwNewnsfw.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldnsfwNewnsfw.html index 1c8b304..3597376 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldnsfwNewnsfw.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldnsfwNewnsfw.html @@ -1,6 +1,6 @@ -WithDiscussionidPostidOldnsfwNewnsfw | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidOldnsfwNewnsfw {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: boolean;
    old: boolean;
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidOldnsfwNewnsfw | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidOldnsfwNewnsfw {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: boolean;
    old: boolean;
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: boolean
old: boolean
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: boolean
old: boolean
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldoffsetNewoffset.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldoffsetNewoffset.html index b6e3696..8347ab1 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldoffsetNewoffset.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldoffsetNewoffset.html @@ -1,6 +1,6 @@ -WithDiscussionidPostidOldoffsetNewoffset | osu-api-v2-js

Interface WithDiscussionidPostidOldoffsetNewoffset

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidOldoffsetNewoffset {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: number;
    old: number;
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidOldoffsetNewoffset | osu-api-v2-js

Interface WithDiscussionidPostidOldoffsetNewoffset

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidOldoffsetNewoffset {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: number;
    old: number;
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: number
old: number
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: number
old: number
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldtagsNewtags.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldtagsNewtags.html index 53e7e06..7663123 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldtagsNewtags.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidOldtagsNewtags.html @@ -1,6 +1,6 @@ -WithDiscussionidPostidOldtagsNewtags | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidOldtagsNewtags {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: string;
    old: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidOldtagsNewtags | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidOldtagsNewtags {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    new: string;
    old: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: string
old: string
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
new: string
old: string
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidReason.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidReason.html index 12d2a45..d309ead 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidReason.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidReason.html @@ -1,5 +1,5 @@ -WithDiscussionidPostidReason | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidReason {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    reason: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidReason | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidReason {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    reason: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
reason: string
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
reason: string
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidSourceuseridSourceuserusername.html b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidSourceuseridSourceuserusername.html index e88162e..c7944ab 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidSourceuseridSourceuserusername.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithDiscussionidPostidSourceuseridSourceuserusername.html @@ -1,6 +1,6 @@ -WithDiscussionidPostidSourceuseridSourceuserusername | osu-api-v2-js

Interface WithDiscussionidPostidSourceuseridSourceuserusername

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithDiscussionidPostidSourceuseridSourceuserusername {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    source_user_id: number;
    source_user_username: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id +WithDiscussionidPostidSourceuseridSourceuserusername | osu-api-v2-js

Interface WithDiscussionidPostidSourceuseridSourceuserusername

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithDiscussionidPostidSourceuseridSourceuserusername {
    beatmap_discussion_id: null | number;
    beatmap_discussion_post_id: null | number;
    source_user_id: number;
    source_user_username: string;
}

Hierarchy (view full)

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
source_user_id: number
source_user_username: string
\ No newline at end of file +

Properties

beatmap_discussion_id: null | number
beatmap_discussion_post_id: null | number
source_user_id: number
source_user_username: string
diff --git a/docs/interfaces/Beatmapset.Event.Comment.WithModes.html b/docs/interfaces/Beatmapset.Event.Comment.WithModes.html index 6970f31..3597b77 100644 --- a/docs/interfaces/Beatmapset.Event.Comment.WithModes.html +++ b/docs/interfaces/Beatmapset.Event.Comment.WithModes.html @@ -1,3 +1,3 @@ -WithModes | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

-
interface WithModes {
    modes: ("osu" | "taiko" | "fruits" | "mania")[];
}

Hierarchy (view full)

Properties

Properties

modes: ("osu" | "taiko" | "fruits" | "mania")[]
\ No newline at end of file +WithModes | osu-api-v2-js

An event's comment (unrelated to comments in bundles) can be a lot of things depending of the event type

+
interface WithModes {
    modes: (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[];
}

Hierarchy (view full)

Properties

Properties

modes: (
    | "osu"
    | "taiko"
    | "fruits"
    | "mania")[]
diff --git a/docs/interfaces/Beatmapset.Event.DiscussionDelete.html b/docs/interfaces/Beatmapset.Event.DiscussionDelete.html index 1d1aae4..d8a9750 100644 --- a/docs/interfaces/Beatmapset.Event.DiscussionDelete.html +++ b/docs/interfaces/Beatmapset.Event.DiscussionDelete.html @@ -1,8 +1,8 @@ -DiscussionDelete | osu-api-v2-js
interface DiscussionDelete {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    id: number;
    type: "discussion_delete";
}

Hierarchy (view full)

Properties

beatmapset +DiscussionDelete | osu-api-v2-js
interface DiscussionDelete {
    beatmapset?: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    id: number;
    type: "discussion_delete";
}

Hierarchy

  • WithOptionalBeatmapset
    • DiscussionDelete

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "discussion_delete"

Remarks

"approve" is currently not used, it's here just in case that ever changes +

Properties

beatmapset?: WithUserHype
created_at: Date
id: number
type: "discussion_delete"

"approve" is currently not used, it's here just in case that ever changes https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

-
\ No newline at end of file +
diff --git a/docs/interfaces/Beatmapset.Event.DiscussionLockORUnlock.html b/docs/interfaces/Beatmapset.Event.DiscussionLockORUnlock.html index 66f05c7..894e492 100644 --- a/docs/interfaces/Beatmapset.Event.DiscussionLockORUnlock.html +++ b/docs/interfaces/Beatmapset.Event.DiscussionLockORUnlock.html @@ -1,8 +1,10 @@ -DiscussionLockORUnlock | osu-api-v2-js
interface DiscussionLockORUnlock {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "discussion_lock" | "discussion_unlock";
    user_id: number;
}

Hierarchy

  • WithOptionalDiscussion
  • WithUserid
    • DiscussionLockORUnlock

Properties

beatmapset +DiscussionLockORUnlock | osu-api-v2-js
interface DiscussionLockORUnlock {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "discussion_lock" | "discussion_unlock";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
  • WithOptionalDiscussion
    • DiscussionLockORUnlock

Properties

beatmapset: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "discussion_lock" | "discussion_unlock"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "discussion_lock" | "discussion_unlock"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.DiscussionPostDelete.html b/docs/interfaces/Beatmapset.Event.DiscussionPostDelete.html new file mode 100644 index 0000000..047eb62 --- /dev/null +++ b/docs/interfaces/Beatmapset.Event.DiscussionPostDelete.html @@ -0,0 +1,9 @@ +DiscussionPostDelete | osu-api-v2-js
interface DiscussionPostDelete {
    beatmapset?: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "discussion_post_delete";
}

Hierarchy

  • WithOptionalBeatmapset
  • WithOptionalDiscussion
    • DiscussionPostDelete

Properties

beatmapset?: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "discussion_post_delete"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
diff --git a/docs/interfaces/Beatmapset.Event.DiscussionRestore.html b/docs/interfaces/Beatmapset.Event.DiscussionRestore.html new file mode 100644 index 0000000..35fcb38 --- /dev/null +++ b/docs/interfaces/Beatmapset.Event.DiscussionRestore.html @@ -0,0 +1,9 @@ +DiscussionRestore | osu-api-v2-js
interface DiscussionRestore {
    beatmapset?: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "discussion_restore";
}

Hierarchy

  • WithOptionalBeatmapset
  • WithOptionalDiscussion
    • DiscussionRestore

Properties

beatmapset?: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "discussion_restore"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
diff --git a/docs/interfaces/Beatmapset.Event.DiscussionRestoreORKudosuRecalculate.html b/docs/interfaces/Beatmapset.Event.DiscussionRestoreORKudosuRecalculate.html deleted file mode 100644 index f2c064f..0000000 --- a/docs/interfaces/Beatmapset.Event.DiscussionRestoreORKudosuRecalculate.html +++ /dev/null @@ -1,7 +0,0 @@ -DiscussionRestoreORKudosuRecalculate | osu-api-v2-js

Interface DiscussionRestoreORKudosuRecalculate

interface DiscussionRestoreORKudosuRecalculate {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "kudosu_recalculate" | "discussion_restore";
}

Hierarchy

  • WithOptionalDiscussion
    • DiscussionRestoreORKudosuRecalculate

Properties

beatmapset: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "kudosu_recalculate" | "discussion_restore"
\ No newline at end of file diff --git a/docs/interfaces/Beatmapset.Event.DisqualifyORNominationReset.html b/docs/interfaces/Beatmapset.Event.DisqualifyORNominationReset.html index b6df38f..ec00813 100644 --- a/docs/interfaces/Beatmapset.Event.DisqualifyORNominationReset.html +++ b/docs/interfaces/Beatmapset.Event.DisqualifyORNominationReset.html @@ -1,8 +1,10 @@ -DisqualifyORNominationReset | osu-api-v2-js

Interface DisqualifyORNominationReset

interface DisqualifyORNominationReset {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidNominatorsids;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "disqualify" | "nomination_reset";
    user_id: number;
}

Hierarchy

  • WithDiscussion
  • WithUserid
    • DisqualifyORNominationReset

Properties

beatmapset +DisqualifyORNominationReset | osu-api-v2-js

Interface DisqualifyORNominationReset

interface DisqualifyORNominationReset {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidNominatorsids;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "disqualify" | "nomination_reset";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
  • WithDiscussion
    • DisqualifyORNominationReset

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "disqualify" | "nomination_reset"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "disqualify" | "nomination_reset"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.GenreEdit.html b/docs/interfaces/Beatmapset.Event.GenreEdit.html index a955502..047e6aa 100644 --- a/docs/interfaces/Beatmapset.Event.GenreEdit.html +++ b/docs/interfaces/Beatmapset.Event.GenreEdit.html @@ -1,7 +1,9 @@ -GenreEdit | osu-api-v2-js
interface GenreEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldgenreNewgenre;
    created_at: Date;
    id: number;
    type: "genre_edit";
    user_id: number;
}

Hierarchy

  • WithUserid
    • GenreEdit

Properties

beatmapset +GenreEdit | osu-api-v2-js
interface GenreEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldgenreNewgenre;
    created_at: Date;
    id: number;
    type: "genre_edit";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
    • GenreEdit

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "genre_edit"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "genre_edit"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.IssueResolveOrReopen.html b/docs/interfaces/Beatmapset.Event.IssueResolveOrReopen.html index 61501ed..de2f738 100644 --- a/docs/interfaces/Beatmapset.Event.IssueResolveOrReopen.html +++ b/docs/interfaces/Beatmapset.Event.IssueResolveOrReopen.html @@ -1,8 +1,10 @@ -IssueResolveOrReopen | osu-api-v2-js
interface IssueResolveOrReopen {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "issue_resolve" | "issue_reopen";
    user_id: number;
}

Hierarchy

  • WithDiscussion
  • WithUserid
    • IssueResolveOrReopen

Properties

beatmapset +IssueResolveOrReopen | osu-api-v2-js
interface IssueResolveOrReopen {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "issue_resolve" | "issue_reopen";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
  • WithDiscussion
    • IssueResolveOrReopen

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "issue_resolve" | "issue_reopen"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "issue_resolve" | "issue_reopen"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostDeleteORRestore.html b/docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostDeleteORRestore.html deleted file mode 100644 index dffc7f7..0000000 --- a/docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostDeleteORRestore.html +++ /dev/null @@ -1,7 +0,0 @@ -KudosuAllowORDenyORDiscussionPostDeleteORRestore | osu-api-v2-js

Interface KudosuAllowORDenyORDiscussionPostDeleteORRestore

interface KudosuAllowORDenyORDiscussionPostDeleteORRestore {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "kudosu_allow" | "kudosu_deny" | "discussion_post_delete" | "discussion_post_restore";
}

Hierarchy

  • WithDiscussion
    • KudosuAllowORDenyORDiscussionPostDeleteORRestore

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "kudosu_allow" | "kudosu_deny" | "discussion_post_delete" | "discussion_post_restore"
\ No newline at end of file diff --git a/docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostRestore.html b/docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostRestore.html new file mode 100644 index 0000000..dfc2fdc --- /dev/null +++ b/docs/interfaces/Beatmapset.Event.KudosuAllowORDenyORDiscussionPostRestore.html @@ -0,0 +1,9 @@ +KudosuAllowORDenyORDiscussionPostRestore | osu-api-v2-js

Interface KudosuAllowORDenyORDiscussionPostRestore

interface KudosuAllowORDenyORDiscussionPostRestore {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "kudosu_allow" | "kudosu_deny" | "discussion_post_restore";
}

Hierarchy

  • WithBeatmapset
  • WithDiscussion
    • KudosuAllowORDenyORDiscussionPostRestore

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "kudosu_allow" | "kudosu_deny" | "discussion_post_restore"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
diff --git a/docs/interfaces/Beatmapset.Event.KudosuGainORLost.html b/docs/interfaces/Beatmapset.Event.KudosuGainORLost.html index 3f3cd20..7a0ca9e 100644 --- a/docs/interfaces/Beatmapset.Event.KudosuGainORLost.html +++ b/docs/interfaces/Beatmapset.Event.KudosuGainORLost.html @@ -1,8 +1,10 @@ -KudosuGainORLost | osu-api-v2-js
interface KudosuGainORLost {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidNewvotevotes;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "kudosu_gain" | "kudosu_lost";
    user_id: number;
}

Hierarchy

  • WithDiscussion
  • WithUserid
    • KudosuGainORLost

Properties

beatmapset +KudosuGainORLost | osu-api-v2-js
interface KudosuGainORLost {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidNewvotevotes;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "kudosu_gain" | "kudosu_lost";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
  • WithDiscussion
    • KudosuGainORLost

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "kudosu_gain" | "kudosu_lost"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "kudosu_gain" | "kudosu_lost"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.KudosuRecalculate.html b/docs/interfaces/Beatmapset.Event.KudosuRecalculate.html new file mode 100644 index 0000000..07f8eec --- /dev/null +++ b/docs/interfaces/Beatmapset.Event.KudosuRecalculate.html @@ -0,0 +1,9 @@ +KudosuRecalculate | osu-api-v2-js
interface KudosuRecalculate {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostid;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "kudosu_recalculate";
}

Hierarchy

  • WithBeatmapset
  • WithOptionalDiscussion
    • KudosuRecalculate

Properties

beatmapset: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "kudosu_recalculate"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
diff --git a/docs/interfaces/Beatmapset.Event.LanguageEdit.html b/docs/interfaces/Beatmapset.Event.LanguageEdit.html index 45116b4..503a1d7 100644 --- a/docs/interfaces/Beatmapset.Event.LanguageEdit.html +++ b/docs/interfaces/Beatmapset.Event.LanguageEdit.html @@ -1,7 +1,9 @@ -LanguageEdit | osu-api-v2-js
interface LanguageEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldlanguageNewlanguage;
    created_at: Date;
    id: number;
    type: "language_edit";
    user_id: number;
}

Hierarchy

  • WithUserid
    • LanguageEdit

Properties

beatmapset +LanguageEdit | osu-api-v2-js
interface LanguageEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldlanguageNewlanguage;
    created_at: Date;
    id: number;
    type: "language_edit";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
    • LanguageEdit

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "language_edit"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "language_edit"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.Love.html b/docs/interfaces/Beatmapset.Event.Love.html index 1e9e1f5..9e30700 100644 --- a/docs/interfaces/Beatmapset.Event.Love.html +++ b/docs/interfaces/Beatmapset.Event.Love.html @@ -1,7 +1,9 @@ -Love | osu-api-v2-js
interface Love {
    beatmapset: WithUserHype;
    comment: null;
    created_at: Date;
    id: number;
    type: "love";
    user_id: number;
}

Hierarchy

  • WithUserid
    • Love

Properties

beatmapset +Love | osu-api-v2-js
interface Love {
    beatmapset: WithUserHype;
    comment: null;
    created_at: Date;
    id: number;
    type: "love";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
    • Love

Properties

beatmapset: WithUserHype
comment: null
created_at: Date
id: number
type: "love"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
comment: null
created_at: Date
id: number
type: "love"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.Nominate.html b/docs/interfaces/Beatmapset.Event.Nominate.html index 83b3107..5f59ac1 100644 --- a/docs/interfaces/Beatmapset.Event.Nominate.html +++ b/docs/interfaces/Beatmapset.Event.Nominate.html @@ -1,7 +1,9 @@ -Nominate | osu-api-v2-js
interface Nominate {
    beatmapset: WithUserHype;
    comment: WithModes;
    created_at: Date;
    id: number;
    type: "nominate";
    user_id: number;
}

Hierarchy

  • WithUserid
    • Nominate

Properties

beatmapset +Nominate | osu-api-v2-js
interface Nominate {
    beatmapset: WithUserHype;
    comment: WithModes;
    created_at: Date;
    id: number;
    type: "nominate";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
    • Nominate

Properties

beatmapset: WithUserHype
comment: WithModes
created_at: Date
id: number
type: "nominate"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
comment: WithModes
created_at: Date
id: number
type: "nominate"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.NominationResetReceived.html b/docs/interfaces/Beatmapset.Event.NominationResetReceived.html index 7d87e6c..4570308 100644 --- a/docs/interfaces/Beatmapset.Event.NominationResetReceived.html +++ b/docs/interfaces/Beatmapset.Event.NominationResetReceived.html @@ -1,8 +1,10 @@ -NominationResetReceived | osu-api-v2-js
interface NominationResetReceived {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidSourceuseridSourceuserusername;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "nomination_reset_received";
    user_id: number;
}

Hierarchy

  • WithDiscussion
  • WithUserid
    • NominationResetReceived

Properties

beatmapset +NominationResetReceived | osu-api-v2-js
interface NominationResetReceived {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidSourceuseridSourceuserusername;
    created_at: Date;
    discussion: WithStartingpost;
    id: number;
    type: "nomination_reset_received";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
  • WithDiscussion
    • NominationResetReceived

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "nomination_reset_received"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
discussion: WithStartingpost
id: number
type: "nomination_reset_received"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.NsfwToggle.html b/docs/interfaces/Beatmapset.Event.NsfwToggle.html index 9ed1f91..906bce9 100644 --- a/docs/interfaces/Beatmapset.Event.NsfwToggle.html +++ b/docs/interfaces/Beatmapset.Event.NsfwToggle.html @@ -1,7 +1,9 @@ -NsfwToggle | osu-api-v2-js
interface NsfwToggle {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldnsfwNewnsfw;
    created_at: Date;
    id: number;
    type: "nsfw_toggle";
    user_id: number;
}

Hierarchy

  • WithUserid
    • NsfwToggle

Properties

beatmapset +NsfwToggle | osu-api-v2-js
interface NsfwToggle {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldnsfwNewnsfw;
    created_at: Date;
    id: number;
    type: "nsfw_toggle";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
    • NsfwToggle

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "nsfw_toggle"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "nsfw_toggle"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.OffsetEdit.html b/docs/interfaces/Beatmapset.Event.OffsetEdit.html index 3cf7298..490bb98 100644 --- a/docs/interfaces/Beatmapset.Event.OffsetEdit.html +++ b/docs/interfaces/Beatmapset.Event.OffsetEdit.html @@ -1,7 +1,9 @@ -OffsetEdit | osu-api-v2-js
interface OffsetEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldoffsetNewoffset;
    created_at: Date;
    id: number;
    type: "offset_edit";
    user_id: number;
}

Hierarchy

  • WithUserid
    • OffsetEdit

Properties

beatmapset +OffsetEdit | osu-api-v2-js
interface OffsetEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldoffsetNewoffset;
    created_at: Date;
    id: number;
    type: "offset_edit";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
    • OffsetEdit

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "offset_edit"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "offset_edit"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.QualifyORRank.html b/docs/interfaces/Beatmapset.Event.QualifyORRank.html index 9141512..28a9a4d 100644 --- a/docs/interfaces/Beatmapset.Event.QualifyORRank.html +++ b/docs/interfaces/Beatmapset.Event.QualifyORRank.html @@ -1,8 +1,8 @@ -QualifyORRank | osu-api-v2-js
interface QualifyORRank {
    beatmapset: WithUserHype;
    comment: null;
    created_at: Date;
    id: number;
    type: "qualify" | "rank";
}

Hierarchy (view full)

Properties

beatmapset +QualifyORRank | osu-api-v2-js
interface QualifyORRank {
    beatmapset: WithUserHype;
    comment: null;
    created_at: Date;
    id: number;
    type: "qualify" | "rank";
}

Hierarchy

  • WithBeatmapset
    • QualifyORRank

Properties

beatmapset: WithUserHype
comment: null
created_at: Date
id: number
type: "qualify" | "rank"

Remarks

"approve" is currently not used, it's here just in case that ever changes +

Properties

beatmapset: WithUserHype
comment: null
created_at: Date
id: number
type: "qualify" | "rank"

"approve" is currently not used, it's here just in case that ever changes https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

-
\ No newline at end of file +
diff --git a/docs/interfaces/Beatmapset.Event.RemoveFromLoved.html b/docs/interfaces/Beatmapset.Event.RemoveFromLoved.html index 5ad072d..b72f370 100644 --- a/docs/interfaces/Beatmapset.Event.RemoveFromLoved.html +++ b/docs/interfaces/Beatmapset.Event.RemoveFromLoved.html @@ -1,7 +1,9 @@ -RemoveFromLoved | osu-api-v2-js
interface RemoveFromLoved {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidReason;
    created_at: Date;
    id: number;
    type: "remove_from_loved";
    user_id: number;
}

Hierarchy

  • WithUserid
    • RemoveFromLoved

Properties

beatmapset +RemoveFromLoved | osu-api-v2-js
interface RemoveFromLoved {
    beatmapset?: WithUserHype;
    comment: WithDiscussionidPostidReason;
    created_at: Date;
    id: number;
    type: "remove_from_loved";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithOptionalBeatmapset
    • RemoveFromLoved

Properties

beatmapset: WithUserHype
created_at: Date
id: number
type: "remove_from_loved"
user_id: number
\ No newline at end of file +

Properties

beatmapset?: WithUserHype
created_at: Date
id: number
type: "remove_from_loved"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Event.TagsEdit.html b/docs/interfaces/Beatmapset.Event.TagsEdit.html index e983d49..bb6182c 100644 --- a/docs/interfaces/Beatmapset.Event.TagsEdit.html +++ b/docs/interfaces/Beatmapset.Event.TagsEdit.html @@ -1,8 +1,10 @@ -TagsEdit | osu-api-v2-js
interface TagsEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldtagsNewtags;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "tags_edit";
    user_id: number;
}

Hierarchy

  • WithOptionalDiscussion
  • WithUserid
    • TagsEdit

Properties

beatmapset +TagsEdit | osu-api-v2-js
interface TagsEdit {
    beatmapset: WithUserHype;
    comment: WithDiscussionidPostidOldtagsNewtags;
    created_at: Date;
    discussion?: null | WithStartingpost;
    id: number;
    type: "tags_edit";
    user_id: number;
}

Hierarchy

  • WithUserid
  • WithBeatmapset
  • WithOptionalDiscussion
    • TagsEdit

Properties

beatmapset: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "tags_edit"
user_id: number
\ No newline at end of file +

Properties

beatmapset: WithUserHype
created_at: Date
discussion?: null | WithStartingpost
id: number
type: "tags_edit"

"approve" is currently not used, it's here just in case that ever changes +https://github.com/ppy/osu-web/blob/master/app/Models/BeatmapsetEvent.php

+
user_id: number
diff --git a/docs/interfaces/Beatmapset.Extended-1.html b/docs/interfaces/Beatmapset.Extended-1.html index 07b9825..4ae1b83 100644 --- a/docs/interfaces/Beatmapset.Extended-1.html +++ b/docs/interfaces/Beatmapset.Extended-1.html @@ -1,4 +1,4 @@ -Extended | osu-api-v2-js
interface Extended {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        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;
    };
    creator: string;
    deleted_at: null | Date;
    discussion_locked: boolean;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    ranked: RankStatus;
    ranked_date: null | Date;
    source: string;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

Properties

artist +Extended | osu-api-v2-js
interface Extended {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        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;
    };
    creator: string;
    deleted_at: null | Date;
    discussion_locked: boolean;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    ranked: RankStatus;
    ranked_date: null | Date;
    source: string;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    track_id: null | number;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

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 | Date
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;
    eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    -
    • main_ruleset: number
    • non_main_ruleset: 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
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

-
storyboard: boolean
submitted_date: null | Date
tags: string
title: string

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

-
title_unicode: string

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

-
user_id: number
video: boolean
\ 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;
}
creator: string
deleted_at: null | Date
discussion_locked: boolean
favourite_count: number
hype: null | {
    current: number;
    required: number;
}
id: number
is_scoreable: boolean
last_updated: Date
legacy_thread_url: string
nominations_summary: {
    current: number;
    eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    +
    • main_ruleset: number
    • non_main_ruleset: 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
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

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

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

+
title_unicode: string

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

+
track_id: null | number

If the song exists on a featured artist's page, then it has a track_id

+

https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist

+
user_id: number
video: boolean
diff --git a/docs/interfaces/Beatmapset.Extended.Plus.html b/docs/interfaces/Beatmapset.Extended.Plus.html index a0bb842..8be1047 100644 --- a/docs/interfaces/Beatmapset.Extended.Plus.html +++ b/docs/interfaces/Beatmapset.Extended.Plus.html @@ -1,5 +1,5 @@ -Plus | osu-api-v2-js

Obtainable From

API.getBeatmapset

-
interface Plus {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    };
    beatmaps: WithFailtimes[];
    bpm: number;
    can_be_hyped: boolean;
    converts: WithFailtimes[];
    covers: {
        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: Ruleset[];
        user_id: number;
    }[];
    deleted_at: null | Date;
    description: {
        description: string;
    };
    discussion_locked: boolean;
    favourite_count: number;
    genre: {
        id: Genre;
        name: "Any" | "Unspecified" | "Video Game" | "Anime" | "Rock" | "Pop" | "Other" | "Novelty" | "Hip Hop" | "Electronic" | "Metal" | "Classical" | "Folk" | "Jazz";
    };
    has_favourited?: boolean;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    language: {
        id: Language;
        name: "Any" | "Unspecified" | "Other" | "English" | "Japanese" | "Chinese" | "Instrumental" | "Korean" | "French" | "German" | "Swedish" | "Spanish" | "Italian" | "Russian" | "Polish";
    };
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    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;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    user: User;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

Properties

artist +Plus | osu-api-v2-js

API.getBeatmapset

+
interface Plus {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    };
    beatmaps: WithFailtimes[];
    bpm: number;
    can_be_hyped: boolean;
    converts: WithFailtimes[];
    covers: {
        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 | Ruleset[];
        user_id: number;
    }[];
    deleted_at: null | Date;
    description: {
        description: string;
    };
    discussion_locked: boolean;
    favourite_count: number;
    genre: {
        id: Genre;
        name:
            | "Any"
            | "Unspecified"
            | "Video Game"
            | "Anime"
            | "Rock"
            | "Pop"
            | "Other"
            | "Novelty"
            | "Hip Hop"
            | "Electronic"
            | "Metal"
            | "Classical"
            | "Folk"
            | "Jazz";
    };
    has_favourited?: boolean;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    language: {
        id: Language;
        name:
            | "Any"
            | "Unspecified"
            | "Other"
            | "English"
            | "Japanese"
            | "Chinese"
            | "Instrumental"
            | "Korean"
            | "French"
            | "German"
            | "Swedish"
            | "Spanish"
            | "Italian"
            | "Russian"
            | "Polish";
    };
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    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;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    track_id: null | number;
    user: User;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

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
beatmaps: WithFailtimes[]

The different beatmaps/difficulties this beatmapset has

-
bpm: number
can_be_hyped: boolean
converts: WithFailtimes[]

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: Ruleset[];
    user_id: number;
}[]

Type declaration

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

Type declaration

  • description: string

    In HTML

    -
discussion_locked: boolean
favourite_count: number
genre: {
    id: Genre;
    name: "Any" | "Unspecified" | "Video Game" | "Anime" | "Rock" | "Pop" | "Other" | "Novelty" | "Hip Hop" | "Electronic" | "Metal" | "Classical" | "Folk" | "Jazz";
}

Type declaration

  • id: Genre
  • name: "Any" | "Unspecified" | "Video Game" | "Anime" | "Rock" | "Pop" | "Other" | "Novelty" | "Hip Hop" | "Electronic" | "Metal" | "Classical" | "Folk" | "Jazz"
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: Language;
    name: "Any" | "Unspecified" | "Other" | "English" | "Japanese" | "Chinese" | "Instrumental" | "Korean" | "French" | "German" | "Swedish" | "Spanish" | "Italian" | "Russian" | "Polish";
}

Type declaration

  • id: Language
  • name: "Any" | "Unspecified" | "Other" | "English" | "Japanese" | "Chinese" | "Instrumental" | "Korean" | "French" | "German" | "Swedish" | "Spanish" | "Italian" | "Russian" | "Polish"
last_updated: Date
legacy_thread_url: string
nominations_summary: {
    current: number;
    eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    -
    • main_ruleset: number
    • non_main_ruleset: 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
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

-
storyboard: boolean
submitted_date: null | Date
tags: string
title: string

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

-
title_unicode: string

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

-
user: User
user_id: number
video: boolean
\ 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
beatmaps: WithFailtimes[]

The different beatmaps/difficulties this beatmapset has

+
bpm: number
can_be_hyped: boolean
converts: WithFailtimes[]

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;
}
creator: string
current_nominations: {
    beatmapset_id: number;
    reset: boolean;
    rulesets: null | Ruleset[];
    user_id: number;
}[]
deleted_at: null | Date
description: {
    description: string;
}

Type declaration

  • description: string

    In HTML

    +
discussion_locked: boolean
favourite_count: number
genre: {
    id: Genre;
    name:
        | "Any"
        | "Unspecified"
        | "Video Game"
        | "Anime"
        | "Rock"
        | "Pop"
        | "Other"
        | "Novelty"
        | "Hip Hop"
        | "Electronic"
        | "Metal"
        | "Classical"
        | "Folk"
        | "Jazz";
}
has_favourited?: boolean

Only exists if authorized user

+
hype: null | {
    current: number;
    required: number;
}
id: number
is_scoreable: boolean
language: {
    id: Language;
    name:
        | "Any"
        | "Unspecified"
        | "Other"
        | "English"
        | "Japanese"
        | "Chinese"
        | "Instrumental"
        | "Korean"
        | "French"
        | "German"
        | "Swedish"
        | "Spanish"
        | "Italian"
        | "Russian"
        | "Polish";
}
last_updated: Date
legacy_thread_url: string
nominations_summary: {
    current: number;
    eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    +
    • main_ruleset: number
    • non_main_ruleset: 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
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

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

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

+
title_unicode: string

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

+
track_id: null | number

If the song exists on a featured artist's page, then it has a track_id

+

https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist

+
user: User
user_id: number
video: boolean
diff --git a/docs/interfaces/Beatmapset.Extended.WithBeatmap.html b/docs/interfaces/Beatmapset.Extended.WithBeatmap.html index 154636c..31e5b48 100644 --- a/docs/interfaces/Beatmapset.Extended.WithBeatmap.html +++ b/docs/interfaces/Beatmapset.Extended.WithBeatmap.html @@ -1,5 +1,5 @@ -WithBeatmap | osu-api-v2-js

Obtainable From

API.getUserBeatmaps

-
interface WithBeatmap {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    };
    beatmaps: Beatmap.Extended[];
    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;
    };
    creator: string;
    deleted_at: null | Date;
    discussion_locked: boolean;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    ranked: RankStatus;
    ranked_date: null | Date;
    source: string;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

Properties

artist +WithBeatmap | osu-api-v2-js

API.getUserBeatmaps

+
interface WithBeatmap {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    };
    beatmaps: Beatmap.Extended[];
    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;
    };
    creator: string;
    deleted_at: null | Date;
    discussion_locked: boolean;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    ranked: RankStatus;
    ranked_date: null | Date;
    source: string;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    track_id: null | number;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

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
beatmaps: Beatmap.Extended[]
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 | Date
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;
    eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    -
    • main_ruleset: number
    • non_main_ruleset: 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
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

-
storyboard: boolean
submitted_date: null | Date
tags: string
title: string

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

-
title_unicode: string

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

-
user_id: number
video: boolean
\ 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
beatmaps: Beatmap.Extended[]
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;
}
creator: string
deleted_at: null | Date
discussion_locked: boolean
favourite_count: number
hype: null | {
    current: number;
    required: number;
}
id: number
is_scoreable: boolean
last_updated: Date
legacy_thread_url: string
nominations_summary: {
    current: number;
    eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    +
    • main_ruleset: number
    • non_main_ruleset: 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
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

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

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

+
title_unicode: string

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

+
track_id: null | number

If the song exists on a featured artist's page, then it has a track_id

+

https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist

+
user_id: number
video: boolean
diff --git a/docs/interfaces/Beatmapset.Extended.WithBeatmapPacktags.html b/docs/interfaces/Beatmapset.Extended.WithBeatmapPacktags.html index b72fa09..867057f 100644 --- a/docs/interfaces/Beatmapset.Extended.WithBeatmapPacktags.html +++ b/docs/interfaces/Beatmapset.Extended.WithBeatmapPacktags.html @@ -1,4 +1,4 @@ -WithBeatmapPacktags | osu-api-v2-js
interface WithBeatmapPacktags {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    };
    beatmaps: WithMaxcombo[];
    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;
    };
    creator: string;
    deleted_at: null | Date;
    discussion_locked: boolean;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    pack_tags: string[];
    play_count: number;
    preview_url: string;
    ranked: RankStatus;
    ranked_date: null | Date;
    source: string;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

Properties

artist +WithBeatmapPacktags | osu-api-v2-js
interface WithBeatmapPacktags {
    artist: string;
    artist_unicode: string;
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    };
    beatmaps: WithMaxcombo[];
    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;
    };
    creator: string;
    deleted_at: null | Date;
    discussion_locked: boolean;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    is_scoreable: boolean;
    last_updated: Date;
    legacy_thread_url: string;
    nominations_summary: {
        current: number;
        eligible_main_rulesets: null | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        required_meta: {
            main_ruleset: number;
            non_main_ruleset: number;
        };
    };
    nsfw: boolean;
    offset: number;
    pack_tags: string[];
    play_count: number;
    preview_url: string;
    ranked: RankStatus;
    ranked_date: null | Date;
    source: string;
    spotlight: boolean;
    status: string;
    storyboard: boolean;
    submitted_date: null | Date;
    tags: string;
    title: string;
    title_unicode: string;
    track_id: null | number;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

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
beatmaps: WithMaxcombo[]
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 | Date
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;
    eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | ("osu" | "taiko" | "fruits" | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    -
    • main_ruleset: number
    • non_main_ruleset: 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
source: string
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

-
storyboard: boolean
submitted_date: null | Date
tags: string
title: string

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

-
title_unicode: string

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

-
user_id: number
video: boolean
\ 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
beatmaps: WithMaxcombo[]
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;
}
creator: string
deleted_at: null | Date
discussion_locked: boolean
favourite_count: number
hype: null | {
    current: number;
    required: number;
}
id: number
is_scoreable: boolean
last_updated: Date
legacy_thread_url: string
nominations_summary: {
    current: number;
    eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[];
    required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    };
}

Type declaration

  • current: number
  • eligible_main_rulesets: null | (
        | "osu"
        | "taiko"
        | "fruits"
        | "mania")[]
  • required_meta: {
        main_ruleset: number;
        non_main_ruleset: number;
    }

    Required nominations

    +
    • main_ruleset: number
    • non_main_ruleset: 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
source: string
spotlight: boolean
status: string

Is it ranked, is it graveyarded, etc

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

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

+
title_unicode: string

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

+
track_id: null | number

If the song exists on a featured artist's page, then it has a track_id

+

https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist

+
user_id: number
video: boolean
diff --git a/docs/interfaces/Beatmapset.WithHype.html b/docs/interfaces/Beatmapset.WithHype.html index 461570c..2b2e051 100644 --- a/docs/interfaces/Beatmapset.WithHype.html +++ b/docs/interfaces/Beatmapset.WithHype.html @@ -1,4 +1,4 @@ -WithHype | osu-api-v2-js
interface WithHype {
    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;
    };
    creator: string;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    source: string;
    spotlight: boolean;
    status: string;
    title: string;
    title_unicode: string;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

Properties

artist +WithHype | osu-api-v2-js
interface WithHype {
    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;
    };
    creator: string;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    source: string;
    spotlight: boolean;
    status: string;
    title: string;
    title_unicode: string;
    track_id: null | number;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

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
hype: null | {
    current: number;
    required: number;
}

Type declaration

  • current: number
  • required: 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
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 in romaji if the song's title is in Japanese

-
title_unicode: string

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

-
user_id: number
video: boolean
\ 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;
}
creator: string
favourite_count: number
hype: null | {
    current: number;
    required: 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
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 in romaji if the song's title is in Japanese

+
title_unicode: string

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

+
track_id: null | number

If the song exists on a featured artist's page, then it has a track_id

+

https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist

+
user_id: number
video: boolean
diff --git a/docs/interfaces/Beatmapset.WithUserHype.html b/docs/interfaces/Beatmapset.WithUserHype.html index c5eda40..4d661dd 100644 --- a/docs/interfaces/Beatmapset.WithUserHype.html +++ b/docs/interfaces/Beatmapset.WithUserHype.html @@ -1,4 +1,4 @@ -WithUserHype | osu-api-v2-js
interface WithUserHype {
    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;
    };
    creator: string;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    source: string;
    spotlight: boolean;
    status: string;
    title: string;
    title_unicode: string;
    user: User;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

Properties

artist +WithUserHype | osu-api-v2-js
interface WithUserHype {
    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;
    };
    creator: string;
    favourite_count: number;
    hype: null | {
        current: number;
        required: number;
    };
    id: number;
    nsfw: boolean;
    offset: number;
    play_count: number;
    preview_url: string;
    source: string;
    spotlight: boolean;
    status: string;
    title: string;
    title_unicode: string;
    track_id: null | number;
    user: User;
    user_id: number;
    video: boolean;
}

Hierarchy (view full)

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
hype: null | {
    current: number;
    required: number;
}

Type declaration

  • current: number
  • required: 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
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 in romaji if the song's title is in Japanese

-
title_unicode: string

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

-
user: User
user_id: number
video: boolean
\ 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;
}
creator: string
favourite_count: number
hype: null | {
    current: number;
    required: 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
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 in romaji if the song's title is in Japanese

+
title_unicode: string

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

+
track_id: null | number

If the song exists on a featured artist's page, then it has a track_id

+

https://osu.ppy.sh/beatmaps/artists/tracks/<track_id> redirects to the page of said featured artist

+
user: User
user_id: number
video: boolean
diff --git a/docs/interfaces/Changelog.Build-1.html b/docs/interfaces/Changelog.Build-1.html index 9ec7d2c..c0fb41f 100644 --- a/docs/interfaces/Changelog.Build-1.html +++ b/docs/interfaces/Changelog.Build-1.html @@ -1,11 +1,11 @@ -Build | osu-api-v2-js
interface Build {
    created_at: Date;
    display_version: string;
    id: number;
    users: number;
    version: null | string;
    youtube_id: null | string;
}

Hierarchy (view full)

Properties

created_at +Build | osu-api-v2-js
interface Build {
    created_at: Date;
    display_version: string;
    id: number;
    users: number;
    version: null | string;
    youtube_id: null | string;
}

Hierarchy (view full)

Properties

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

How many users are playing on this version of the game? (if web, should be 0)

-
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

-
\ No newline at end of file +

Properties

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

How many users are playing on this version of the game? (if web, should be 0)

+
version: null | string

The name of the version

+
youtube_id: null | string

If a video is showcased on the changelog

+

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

+
diff --git a/docs/interfaces/Changelog.Build.WithChangelogentriesVersions.html b/docs/interfaces/Changelog.Build.WithChangelogentriesVersions.html index b0b53ff..f90e5fb 100644 --- a/docs/interfaces/Changelog.Build.WithChangelogentriesVersions.html +++ b/docs/interfaces/Changelog.Build.WithChangelogentriesVersions.html @@ -1,5 +1,5 @@ -WithChangelogentriesVersions | osu-api-v2-js

Interface WithChangelogentriesVersions

Obtainable From

API.getChangelogBuild

-
interface WithChangelogentriesVersions {
    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;
    }[];
    created_at: Date;
    display_version: string;
    id: number;
    users: number;
    version: null | string;
    versions: {
        next: null | WithUpdatestreams;
        previous: null | WithUpdatestreams;
    };
    youtube_id: null | string;
}

Hierarchy

  • WithChangelogentries
    • WithChangelogentriesVersions

Properties

changelog_entries +WithChangelogentriesVersions | osu-api-v2-js

Interface WithChangelogentriesVersions

API.getChangelogBuild

+
interface WithChangelogentriesVersions {
    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;
    }[];
    created_at: Date;
    display_version: string;
    id: number;
    users: number;
    version: null | string;
    versions: {
        next: null | WithUpdatestreams;
        previous: null | WithUpdatestreams;
    };
    youtube_id: null | string;
}

Hierarchy

  • WithChangelogentries
    • WithChangelogentriesVersions

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

    Remarks

    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;
    }

    Remarks

    Doesn't exist if no github user is associated with the person 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

    -

    Remarks

    Exists only if Markdown was requested, may still be null if there is no message

    -
  • Optional message_html?: null | string

    Entry message in HTML format

    -

    Remarks

    Exists only if HTML was requested, may still be null if there is no message

    -
  • 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 web, should be 0)

-
version: null | string

The name of the version

-
versions: {
    next: null | WithUpdatestreams;
    previous: null | WithUpdatestreams;
}

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

-
\ No newline at end of file +

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
  • Optionalgithub_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 the person 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
  • Optionalmessage?: null | string

    Entry message in Markdown format, embedded HTML is allowed

    +

    Exists only if Markdown was requested, may still be null if there is no message

    +
  • Optionalmessage_html?: null | string

    Entry message in HTML format

    +

    Exists only if HTML was requested, may still be null if there is no message

    +
  • 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 web, should be 0)

+
version: null | string

The name of the version

+
versions: {
    next: null | WithUpdatestreams;
    previous: null | WithUpdatestreams;
}
youtube_id: null | string

If a video is showcased on the changelog

+

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

+
diff --git a/docs/interfaces/Changelog.Build.WithUpdatestreams.html b/docs/interfaces/Changelog.Build.WithUpdatestreams.html index de48898..adf81e4 100644 --- a/docs/interfaces/Changelog.Build.WithUpdatestreams.html +++ b/docs/interfaces/Changelog.Build.WithUpdatestreams.html @@ -1,13 +1,13 @@ -WithUpdatestreams | osu-api-v2-js
interface WithUpdatestreams {
    created_at: Date;
    display_version: string;
    id: number;
    update_stream: UpdateStream;
    users: number;
    version: null | string;
    youtube_id: null | string;
}

Hierarchy (view full)

Properties

created_at +WithUpdatestreams | osu-api-v2-js
interface WithUpdatestreams {
    created_at: Date;
    display_version: string;
    id: number;
    update_stream: UpdateStream;
    users: number;
    version: null | string;
    youtube_id: null | string;
}

Hierarchy (view full)

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 web, should be 0)

-
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

-
\ No newline at end of file +

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 web, should be 0)

+
version: null | string

The name of the version

+
youtube_id: null | string

If a video is showcased on the changelog

+

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

+
diff --git a/docs/interfaces/Changelog.Build.WithUpdatestreamsChangelogentries.html b/docs/interfaces/Changelog.Build.WithUpdatestreamsChangelogentries.html index 1003869..1cee309 100644 --- a/docs/interfaces/Changelog.Build.WithUpdatestreamsChangelogentries.html +++ b/docs/interfaces/Changelog.Build.WithUpdatestreamsChangelogentries.html @@ -1,5 +1,5 @@ -WithUpdatestreamsChangelogentries | osu-api-v2-js

Interface WithUpdatestreamsChangelogentries

Obtainable From

API.getChangelogBuilds

-
interface WithUpdatestreamsChangelogentries {
    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;
    }[];
    created_at: Date;
    display_version: string;
    id: number;
    update_stream: UpdateStream;
    users: number;
    version: null | string;
    youtube_id: null | string;
}

Hierarchy (view full)

Properties

changelog_entries +WithUpdatestreamsChangelogentries | osu-api-v2-js

Interface WithUpdatestreamsChangelogentries

API.getChangelogBuilds

+
interface WithUpdatestreamsChangelogentries {
    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;
    }[];
    created_at: Date;
    display_version: string;
    id: number;
    update_stream: UpdateStream;
    users: number;
    version: null | string;
    youtube_id: null | string;
}

Hierarchy (view full)

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

    Remarks

    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;
    }

    Remarks

    Doesn't exist if no github user is associated with the person 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

    -

    Remarks

    Exists only if Markdown was requested, may still be null if there is no message

    -
  • Optional message_html?: null | string

    Entry message in HTML format

    -

    Remarks

    Exists only if HTML was requested, may still be null if there is no message

    -
  • 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 web, should be 0)

-
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

-
\ No newline at end of file +

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
  • Optionalgithub_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 the person 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
  • Optionalmessage?: null | string

    Entry message in Markdown format, embedded HTML is allowed

    +

    Exists only if Markdown was requested, may still be null if there is no message

    +
  • Optionalmessage_html?: null | string

    Entry message in HTML format

    +

    Exists only if HTML was requested, may still be null if there is no message

    +
  • 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 web, should be 0)

+
version: null | string

The name of the version

+
youtube_id: null | string

If a video is showcased on the changelog

+

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

+
diff --git a/docs/interfaces/Changelog.UpdateStream-1.html b/docs/interfaces/Changelog.UpdateStream-1.html index 9b4249c..81c880c 100644 --- a/docs/interfaces/Changelog.UpdateStream-1.html +++ b/docs/interfaces/Changelog.UpdateStream-1.html @@ -1,8 +1,8 @@ -UpdateStream | osu-api-v2-js
interface UpdateStream {
    display_name: null | string;
    id: number;
    is_featured: boolean;
    name: string;
}

Hierarchy (view full)

Properties

display_name +UpdateStream | osu-api-v2-js
interface UpdateStream {
    display_name: null | string;
    id: number;
    is_featured: boolean;
    name: string;
}

Hierarchy (view full)

Properties

display_name: null | string

Stable would be Stable, Lazer would be Lazer

-
id: number
is_featured: boolean
name: string

Stable would be stable40, Lazer would be lazer

-
\ No newline at end of file +

Properties

display_name: null | string

Stable would be Stable, Lazer would be Lazer

+
id: number
is_featured: boolean
name: string

Stable would be stable40, Lazer would be lazer

+
diff --git a/docs/interfaces/Changelog.UpdateStream.WithLatestbuildUsercount.html b/docs/interfaces/Changelog.UpdateStream.WithLatestbuildUsercount.html index 39dbdb6..103b737 100644 --- a/docs/interfaces/Changelog.UpdateStream.WithLatestbuildUsercount.html +++ b/docs/interfaces/Changelog.UpdateStream.WithLatestbuildUsercount.html @@ -1,12 +1,12 @@ -WithLatestbuildUsercount | osu-api-v2-js

Obtainable From

API.getChangelogStreams

-
interface WithLatestbuildUsercount {
    display_name: null | string;
    id: number;
    is_featured: boolean;
    latest_build: null | Build;
    name: string;
    user_count: number;
}

Hierarchy (view full)

Properties

display_name +WithLatestbuildUsercount | osu-api-v2-js

API.getChangelogStreams

+
interface WithLatestbuildUsercount {
    display_name: null | string;
    id: number;
    is_featured: boolean;
    latest_build: null | Build;
    name: string;
    user_count: number;
}

Hierarchy (view full)

Properties

display_name: null | string

Stable would be Stable, Lazer would be Lazer

-
id: number
is_featured: boolean
latest_build: null | Build
name: string

Stable would be stable40, Lazer would be lazer

-
user_count: number

How many users are playing on this?

-

Remarks

Should be 0 if web

-
\ No newline at end of file +

Properties

display_name: null | string

Stable would be Stable, Lazer would be Lazer

+
id: number
is_featured: boolean
latest_build: null | Build
name: string

Stable would be stable40, Lazer would be lazer

+
user_count: number

How many users are playing on this?

+

Should be 0 if web

+
diff --git a/docs/interfaces/Chat.Channel-1.html b/docs/interfaces/Chat.Channel-1.html index 7dbaa1c..202ad46 100644 --- a/docs/interfaces/Chat.Channel-1.html +++ b/docs/interfaces/Chat.Channel-1.html @@ -1,10 +1,10 @@ -Channel | osu-api-v2-js

Interface Channel

Obtainable From

API.sendChatPrivateMessage / +Channel | osu-api-v2-js

Interface Channel

interface Channel {
    channel_id: number;
    description: null | string;
    icon: null | string;
    moderated: boolean;
    name: string;
    type: "PUBLIC" | "PRIVATE" | "MULTIPLAYER" | "SPECTATOR" | "TEMPORARY" | "PM" | "GROUP" | "ANNOUNCE";
    uuid: null | string;
}

Hierarchy (view full)

Properties

interface Channel {
    channel_id: number;
    description: null | string;
    icon: null | string;
    moderated: boolean;
    name: string;
    type:
        | "PUBLIC"
        | "PRIVATE"
        | "MULTIPLAYER"
        | "SPECTATOR"
        | "TEMPORARY"
        | "PM"
        | "GROUP"
        | "ANNOUNCE";
    uuid: null | string;
}

Hierarchy (view full)

Properties

channel_id: number
description: null | string
icon: null | string
moderated: boolean
name: string
type: "PUBLIC" | "PRIVATE" | "MULTIPLAYER" | "SPECTATOR" | "TEMPORARY" | "PM" | "GROUP" | "ANNOUNCE"
uuid: null | string
\ No newline at end of file +

Properties

channel_id: number
description: null | string
icon: null | string
moderated: boolean
name: string
type:
    | "PUBLIC"
    | "PRIVATE"
    | "MULTIPLAYER"
    | "SPECTATOR"
    | "TEMPORARY"
    | "PM"
    | "GROUP"
    | "ANNOUNCE"
uuid: null | string
diff --git a/docs/interfaces/Chat.Channel.WithDetails.html b/docs/interfaces/Chat.Channel.WithDetails.html index 90fe0f9..30a80ee 100644 --- a/docs/interfaces/Chat.Channel.WithDetails.html +++ b/docs/interfaces/Chat.Channel.WithDetails.html @@ -1,6 +1,6 @@ -WithDetails | osu-api-v2-js

Obtainable From

API.sendChatPrivateMessage / +WithDetails | osu-api-v2-js

interface WithDetails {
    channel_id: number;
    current_user_attributes: {
        can_message: boolean;
        can_message_error: null | string;
        last_read_id: null | number;
    };
    description: null | string;
    icon: null | string;
    last_message_id: number;
    moderated: boolean;
    name: string;
    type: "PUBLIC" | "PRIVATE" | "MULTIPLAYER" | "SPECTATOR" | "TEMPORARY" | "PM" | "GROUP" | "ANNOUNCE";
    users: number[];
    uuid: null | string;
}

Hierarchy (view full)

Properties

interface WithDetails {
    channel_id: number;
    current_user_attributes: {
        can_message: boolean;
        can_message_error: null | string;
        last_read_id: null | number;
    };
    description: null | string;
    icon: null | string;
    last_message_id: number;
    moderated: boolean;
    name: string;
    type:
        | "PUBLIC"
        | "PRIVATE"
        | "MULTIPLAYER"
        | "SPECTATOR"
        | "TEMPORARY"
        | "PM"
        | "GROUP"
        | "ANNOUNCE";
    users: number[];
    uuid: null | string;
}

Hierarchy (view full)

Properties

channel_id: number
current_user_attributes: {
    can_message: boolean;
    can_message_error: null | string;
    last_read_id: null | number;
}

Type declaration

  • can_message: boolean
  • can_message_error: null | string

    The reason why messages can't be sent in this channel

    -

    Remarks

    Is null if messages can be sent

    -
  • last_read_id: null | number

    Remarks

    Is null if no message has been read (I think)

    -
description: null | string
icon: null | string
last_message_id: number
moderated: boolean
name: string
type: "PUBLIC" | "PRIVATE" | "MULTIPLAYER" | "SPECTATOR" | "TEMPORARY" | "PM" | "GROUP" | "ANNOUNCE"
users: number[]

The ids of the users that are in the channel

-

Remarks

Is empty for public channels

-
uuid: null | string
\ No newline at end of file +

Properties

channel_id: number
current_user_attributes: {
    can_message: boolean;
    can_message_error: null | string;
    last_read_id: null | number;
}

Type declaration

  • can_message: boolean
  • can_message_error: null | string

    The reason why messages can't be sent in this channel

    +

    Is null if messages can be sent

    +
  • last_read_id: null | number

    Is null if no message has been read (I think)

    +
description: null | string
icon: null | string
last_message_id: number
moderated: boolean
name: string
type:
    | "PUBLIC"
    | "PRIVATE"
    | "MULTIPLAYER"
    | "SPECTATOR"
    | "TEMPORARY"
    | "PM"
    | "GROUP"
    | "ANNOUNCE"
users: number[]

The ids of the users that are in the channel

+

Is empty for public channels

+
uuid: null | string
diff --git a/docs/interfaces/Chat.Message-1.html b/docs/interfaces/Chat.Message-1.html index 3da2a96..c0d4c08 100644 --- a/docs/interfaces/Chat.Message-1.html +++ b/docs/interfaces/Chat.Message-1.html @@ -1,7 +1,7 @@ -Message | osu-api-v2-js

Interface Message

Obtainable From

API.sendChatPrivateMessage / +Message | osu-api-v2-js

Interface Message

interface Message {
    channel_id: number;
    content: string;
    is_action: boolean;
    message_id: number;
    sender: User;
    sender_id: number;
    timestamp: Date;
    type: string;
    uuid?: null | string;
}

Properties

interface Message {
    channel_id: number;
    content: string;
    is_action: boolean;
    message_id: number;
    sender: User;
    sender_id: number;
    timestamp: Date;
    type: string;
    uuid?: null | string;
}

Properties

Properties

channel_id: number
content: string
is_action: boolean
message_id: number
sender: User
sender_id: number
timestamp: Date
type: string

Like "action", "markdown", "plain"

-
uuid?: null | string
\ No newline at end of file +

Properties

channel_id: number
content: string
is_action: boolean
message_id: number
sender: User
sender_id: number
timestamp: Date
type: string

Like "action", "markdown", "plain"

+
uuid?: null | string
diff --git a/docs/interfaces/Chat.UserSilence.html b/docs/interfaces/Chat.UserSilence.html index 4d6239b..2a4253a 100644 --- a/docs/interfaces/Chat.UserSilence.html +++ b/docs/interfaces/Chat.UserSilence.html @@ -1,4 +1,4 @@ -UserSilence | osu-api-v2-js

Interface UserSilence

Obtainable From

API.keepChatAlive

-
interface UserSilence {
    id: number;
    user_id: number;
}

Properties

id +UserSilence | osu-api-v2-js

Interface UserSilence

API.keepChatAlive

+
interface UserSilence {
    id: number;
    user_id: number;
}

Properties

Properties

id: number
user_id: number
\ No newline at end of file +

Properties

id: number
user_id: number
diff --git a/docs/interfaces/Comment-1.html b/docs/interfaces/Comment-1.html index 5244f75..892ffeb 100644 --- a/docs/interfaces/Comment-1.html +++ b/docs/interfaces/Comment-1.html @@ -1,4 +1,4 @@ -Comment | osu-api-v2-js

Interface Comment

interface Comment {
    commentable_id: number;
    commentable_type: "beatmapset" | "build" | "news_post";
    created_at: Date;
    deleted_at: null | Date;
    edited_at: null | Date;
    edited_by_id: null | number;
    id: number;
    legacy_name: null | string;
    message?: string;
    message_html?: string;
    parent_id: null | number;
    pinned: boolean;
    replies_count: number;
    updated_at: Date;
    user_id: null | number;
    votes_count: number;
}

Properties

commentable_id +Comment | osu-api-v2-js

Interface Comment

interface Comment {
    commentable_id: number;
    commentable_type: "beatmapset" | "build" | "news_post";
    created_at: Date;
    deleted_at: null | Date;
    edited_at: null | Date;
    edited_by_id: null | number;
    id: number;
    legacy_name: null | string;
    message?: string;
    message_html?: string;
    parent_id: null | number;
    pinned: boolean;
    replies_count: number;
    updated_at: Date;
    user_id: null | number;
    votes_count: number;
}

Properties

commentable_id: number
commentable_type: "beatmapset" | "build" | "news_post"

"build" means changelog, like pretty much everywhere in the API

-
created_at: Date
deleted_at: null | Date
edited_at: null | Date
edited_by_id: null | number
id: number
legacy_name: null | string

I think it's the name used by the person who made the comment before a migration to a new comment system in 2018 or before?

-
message?: string

Yes comments may not have this property, yes this is stupid

-
message_html?: string

Yes comments may not have this property, yes this is stupid

-
parent_id: null | number
pinned: boolean
replies_count: number
updated_at: Date
user_id: null | number

Remarks

Is null if the author of the comment from the old comment system has no associated osu! user, presumably

-
votes_count: number
\ No newline at end of file +

Properties

commentable_id: number
commentable_type: "beatmapset" | "build" | "news_post"

"build" means changelog, like pretty much everywhere in the API

+
created_at: Date
deleted_at: null | Date
edited_at: null | Date
edited_by_id: null | number
id: number
legacy_name: null | string

I think it's the name used by the person who made the comment before a migration to a new comment system in 2018 or before?

+
message?: string

Yes comments may not have this property, yes this is stupid

+
message_html?: string

Yes comments may not have this property, yes this is stupid

+
parent_id: null | number
pinned: boolean
replies_count: number
updated_at: Date
user_id: null | number

Is null if the author of the comment from the old comment system has no associated osu! user, presumably

+
votes_count: number
diff --git a/docs/interfaces/Comment.Bundle-1.html b/docs/interfaces/Comment.Bundle-1.html index 2557097..5c31065 100644 --- a/docs/interfaces/Comment.Bundle-1.html +++ b/docs/interfaces/Comment.Bundle-1.html @@ -1,5 +1,5 @@ -Bundle | osu-api-v2-js

Obtainable From

API.getComment

-
interface Bundle {
    commentable_meta: {
        current_user_attributes: {
            can_new_comment_reason: null | string;
        };
        id: number;
        owner_id: null | number;
        owner_title: null | string;
        title: string;
        type: "beatmapset" | "build" | "news_post";
        url: string;
    }[];
    comments: Comment[];
    cursor: null | {
        created_at: Date;
        id: number;
    };
    deleted_commentable_meta: number;
    has_more: boolean;
    has_more_id: null | number;
    included_comments: Comment[];
    pinned_comments: Comment[];
    sort: "new" | "top" | "old";
    user_follow: boolean;
    user_votes: number[];
    users: User[];
}

Hierarchy (view full)

Properties

commentable_meta +Bundle | osu-api-v2-js

API.getComment

+
interface Bundle {
    commentable_meta: {
        current_user_attributes: {
            can_new_comment_reason: null | string;
        };
        id: number;
        owner_id: null | number;
        owner_title: null | string;
        title: string;
        type: "beatmapset" | "build" | "news_post";
        url: string;
    }[];
    comments: Comment[];
    cursor: null | {
        created_at: Date;
        id: number;
    };
    deleted_commentable_meta: number;
    has_more: boolean;
    has_more_id: null | number;
    included_comments: Comment[];
    pinned_comments: Comment[];
    sort: "new" | "top" | "old";
    user_follow: boolean;
    user_votes: number[];
    users: User[];
}

Hierarchy (view full)

Properties

commentable_meta: {
    current_user_attributes: {
        can_new_comment_reason: null | string;
    };
    id: number;
    owner_id: null | number;
    owner_title: null | string;
    title: string;
    type: "beatmapset" | "build" | "news_post";
    url: string;
}[]

Type declaration

  • current_user_attributes: {
        can_new_comment_reason: null | string;
    }
    • can_new_comment_reason: null | string

      The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can

      -

      Remarks

      If there is simply no authorized user, this'll be a string such as "Please sign in to proceed."

      +

Properties

commentable_meta: {
    current_user_attributes: {
        can_new_comment_reason: null | string;
    };
    id: number;
    owner_id: null | number;
    owner_title: null | string;
    title: string;
    type: "beatmapset" | "build" | "news_post";
    url: string;
}[]

Type declaration

  • current_user_attributes: {
        can_new_comment_reason: null | string;
    }
    • can_new_comment_reason: null | string

      The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can

      +

      If there is simply no authorized user, this'll be a string such as "Please sign in to proceed."

  • id: number
  • owner_id: null | number
  • owner_title: null | string

    Like MAPPER

    -
  • title: string
  • type: "beatmapset" | "build" | "news_post"
  • url: string
comments: Comment[]
cursor: null | {
    created_at: Date;
    id: number;
}

Type declaration

  • created_at: Date
  • id: number
deleted_commentable_meta: number

This is an original property of the package that lets you know how many CommentableMetas that only consist of a title of "Deleted Item" got removed

-

Remarks

This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077

-
has_more: boolean
has_more_id: null | number
included_comments: Comment[]
pinned_comments: Comment[]
sort: "new" | "top" | "old"
user_follow: boolean
user_votes: number[]
users: User[]
\ No newline at end of file +
  • title: string
  • type: "beatmapset" | "build" | "news_post"
  • url: string
  • comments: Comment[]
    cursor: null | {
        created_at: Date;
        id: number;
    }
    deleted_commentable_meta: number

    This is an original property of the package that lets you know how many CommentableMetas that only consist of a title of "Deleted Item" got removed

    +

    This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077

    +
    has_more: boolean
    has_more_id: null | number
    included_comments: Comment[]
    pinned_comments: Comment[]
    sort: "new" | "top" | "old"
    user_follow: boolean
    user_votes: number[]
    users: User[]
    diff --git a/docs/interfaces/Comment.Bundle.WithTotalToplevelcount.html b/docs/interfaces/Comment.Bundle.WithTotalToplevelcount.html index b82201e..755a62f 100644 --- a/docs/interfaces/Comment.Bundle.WithTotalToplevelcount.html +++ b/docs/interfaces/Comment.Bundle.WithTotalToplevelcount.html @@ -1,5 +1,5 @@ -WithTotalToplevelcount | osu-api-v2-js

    Interface WithTotalToplevelcount

    Obtainable From

    API.getComments

    -
    interface WithTotalToplevelcount {
        commentable_meta: {
            current_user_attributes: {
                can_new_comment_reason: null | string;
            };
            id: number;
            owner_id: null | number;
            owner_title: null | string;
            title: string;
            type: "beatmapset" | "build" | "news_post";
            url: string;
        }[];
        comments: Comment[];
        cursor: null | {
            created_at: Date;
            id: number;
        };
        deleted_commentable_meta: number;
        has_more: boolean;
        has_more_id: null | number;
        included_comments: Comment[];
        pinned_comments: Comment[];
        sort: "new" | "top" | "old";
        top_level_count: number;
        total: number;
        user_follow: boolean;
        user_votes: number[];
        users: User[];
    }

    Hierarchy (view full)

    Properties

    commentable_meta +WithTotalToplevelcount | osu-api-v2-js

    Interface WithTotalToplevelcount

    API.getComments

    +
    interface WithTotalToplevelcount {
        commentable_meta: {
            current_user_attributes: {
                can_new_comment_reason: null | string;
            };
            id: number;
            owner_id: null | number;
            owner_title: null | string;
            title: string;
            type: "beatmapset" | "build" | "news_post";
            url: string;
        }[];
        comments: Comment[];
        cursor: null | {
            created_at: Date;
            id: number;
        };
        deleted_commentable_meta: number;
        has_more: boolean;
        has_more_id: null | number;
        included_comments: Comment[];
        pinned_comments: Comment[];
        sort: "new" | "top" | "old";
        top_level_count: number;
        total: number;
        user_follow: boolean;
        user_votes: number[];
        users: User[];
    }

    Hierarchy (view full)

    Properties

    commentable_meta: {
        current_user_attributes: {
            can_new_comment_reason: null | string;
        };
        id: number;
        owner_id: null | number;
        owner_title: null | string;
        title: string;
        type: "beatmapset" | "build" | "news_post";
        url: string;
    }[]

    Type declaration

    • current_user_attributes: {
          can_new_comment_reason: null | string;
      }
      • can_new_comment_reason: null | string

        The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can

        -

        Remarks

        If there is simply no authorized user, this'll be a string such as "Please sign in to proceed."

        +

    Properties

    commentable_meta: {
        current_user_attributes: {
            can_new_comment_reason: null | string;
        };
        id: number;
        owner_id: null | number;
        owner_title: null | string;
        title: string;
        type: "beatmapset" | "build" | "news_post";
        url: string;
    }[]

    Type declaration

    • current_user_attributes: {
          can_new_comment_reason: null | string;
      }
      • can_new_comment_reason: null | string

        The string explains why the authorized user cannot post a new comment in this specific context, it's null if they can

        +

        If there is simply no authorized user, this'll be a string such as "Please sign in to proceed."

    • id: number
    • owner_id: null | number
    • owner_title: null | string

      Like MAPPER

      -
    • title: string
    • type: "beatmapset" | "build" | "news_post"
    • url: string
    comments: Comment[]
    cursor: null | {
        created_at: Date;
        id: number;
    }

    Type declaration

    • created_at: Date
    • id: number
    deleted_commentable_meta: number

    This is an original property of the package that lets you know how many CommentableMetas that only consist of a title of "Deleted Item" got removed

    -

    Remarks

    This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077

    -
    has_more: boolean
    has_more_id: null | number
    included_comments: Comment[]
    pinned_comments: Comment[]
    sort: "new" | "top" | "old"
    top_level_count: number
    total: number
    user_follow: boolean
    user_votes: number[]
    users: User[]
    \ No newline at end of file +
  • title: string
  • type: "beatmapset" | "build" | "news_post"
  • url: string
  • comments: Comment[]
    cursor: null | {
        created_at: Date;
        id: number;
    }
    deleted_commentable_meta: number

    This is an original property of the package that lets you know how many CommentableMetas that only consist of a title of "Deleted Item" got removed

    +

    This DOES COUNT the one that is always there, see https://github.com/ppy/osu-web/issues/11077

    +
    has_more: boolean
    has_more_id: null | number
    included_comments: Comment[]
    pinned_comments: Comment[]
    sort: "new" | "top" | "old"
    top_level_count: number
    total: number
    user_follow: boolean
    user_votes: number[]
    users: User[]
    diff --git a/docs/interfaces/Event-1.html b/docs/interfaces/Event-1.html index e590b8d..394ad9f 100644 --- a/docs/interfaces/Event-1.html +++ b/docs/interfaces/Event-1.html @@ -1,3 +1,3 @@ -Event | osu-api-v2-js

    Interface Event

    interface Event {
        created_at: Date;
        id: number;
    }

    Hierarchy (view full)

    Properties

    created_at +Event | osu-api-v2-js

    Interface Event

    interface Event {
        created_at: Date;
        id: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    created_at: Date
    id: number
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    diff --git a/docs/interfaces/Event.Achievement.html b/docs/interfaces/Event.Achievement.html index 387584e..a676dc7 100644 --- a/docs/interfaces/Event.Achievement.html +++ b/docs/interfaces/Event.Achievement.html @@ -1,8 +1,8 @@ -Achievement | osu-api-v2-js

    Interface Achievement

    interface Achievement {
        achievement: {
            description: string;
            grouping: string;
            icon_url: string;
            id: number;
            instructions: null | string;
            mode: null | "osu" | "taiko" | "fruits" | "mania";
            name: string;
            ordering: number;
            slug: string;
        };
        created_at: Date;
        id: number;
        type: "achievement";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    achievement +Achievement | osu-api-v2-js

    Interface Achievement

    interface Achievement {
        achievement: {
            description: string;
            grouping: string;
            icon_url: string;
            id: number;
            instructions: null | string;
            mode:
                | null
                | "osu"
                | "taiko"
                | "fruits"
                | "mania";
            name: string;
            ordering: number;
            slug: string;
        };
        created_at: Date;
        id: number;
        type: "achievement";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    achievement: {
        description: string;
        grouping: string;
        icon_url: string;
        id: number;
        instructions: null | string;
        mode: null | "osu" | "taiko" | "fruits" | "mania";
        name: string;
        ordering: number;
        slug: string;
    }

    Type declaration

    • description: string
    • grouping: string
    • icon_url: string
    • id: number
    • instructions: null | string

      Remarks

      May contain HTML (like have the text between )

      -
    • mode: null | "osu" | "taiko" | "fruits" | "mania"

      If the achievement is for a specific mode only (such as pass a 2* beatmap in taiko)

      -
    • name: string
    • ordering: number
    • slug: string
    created_at: Date
    id: number
    type: "achievement"
    \ No newline at end of file +

    Properties

    achievement: {
        description: string;
        grouping: string;
        icon_url: string;
        id: number;
        instructions: null | string;
        mode:
            | null
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        name: string;
        ordering: number;
        slug: string;
    }

    Type declaration

    • description: string
    • grouping: string
    • icon_url: string
    • id: number
    • instructions: null | string

      May contain HTML (like have the text between )

      +
    • mode:
          | null
          | "osu"
          | "taiko"
          | "fruits"
          | "mania"

      If the achievement is for a specific mode only (such as pass a 2* beatmap in taiko)

      +
    • name: string
    • ordering: number
    • slug: string
    created_at: Date
    id: number
    type: "achievement"
    diff --git a/docs/interfaces/Event.BeatmapPlaycount.html b/docs/interfaces/Event.BeatmapPlaycount.html index 673857c..702214a 100644 --- a/docs/interfaces/Event.BeatmapPlaycount.html +++ b/docs/interfaces/Event.BeatmapPlaycount.html @@ -1,6 +1,6 @@ -BeatmapPlaycount | osu-api-v2-js

    Interface BeatmapPlaycount

    interface BeatmapPlaycount {
        beatmap: Event.SharedProperties.Beatmap;
        count: number;
        created_at: Date;
        id: number;
        type: "beatmapPlaycount";
    }

    Hierarchy (view full)

    Properties

    beatmap +BeatmapPlaycount | osu-api-v2-js

    Interface BeatmapPlaycount

    interface BeatmapPlaycount {
        beatmap: Event.SharedProperties.Beatmap;
        count: number;
        created_at: Date;
        id: number;
        type: "beatmapPlaycount";
    }

    Hierarchy (view full)

    Properties

    count: number
    created_at: Date
    id: number
    type: "beatmapPlaycount"
    \ No newline at end of file +

    Properties

    count: number
    created_at: Date
    id: number
    type: "beatmapPlaycount"
    diff --git a/docs/interfaces/Event.BeatmapsetApprove.html b/docs/interfaces/Event.BeatmapsetApprove.html index 6da3231..6c593a2 100644 --- a/docs/interfaces/Event.BeatmapsetApprove.html +++ b/docs/interfaces/Event.BeatmapsetApprove.html @@ -1,7 +1,7 @@ -BeatmapsetApprove | osu-api-v2-js

    Interface BeatmapsetApprove

    interface BeatmapsetApprove {
        approval: "loved" | "ranked" | "qualified" | "approved";
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetApprove";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    approval +BeatmapsetApprove | osu-api-v2-js

    Interface BeatmapsetApprove

    interface BeatmapsetApprove {
        approval:
            | "loved"
            | "ranked"
            | "qualified"
            | "approved";
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetApprove";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    approval: "loved" | "ranked" | "qualified" | "approved"
    created_at: Date
    id: number
    type: "beatmapsetApprove"
    \ No newline at end of file +

    Properties

    approval:
        | "loved"
        | "ranked"
        | "qualified"
        | "approved"
    created_at: Date
    id: number
    type: "beatmapsetApprove"
    diff --git a/docs/interfaces/Event.BeatmapsetDelete.html b/docs/interfaces/Event.BeatmapsetDelete.html index d7b9fc3..9028552 100644 --- a/docs/interfaces/Event.BeatmapsetDelete.html +++ b/docs/interfaces/Event.BeatmapsetDelete.html @@ -1,5 +1,5 @@ -BeatmapsetDelete | osu-api-v2-js

    Interface BeatmapsetDelete

    interface BeatmapsetDelete {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetDelete";
    }

    Hierarchy (view full)

    Properties

    beatmapset +BeatmapsetDelete | osu-api-v2-js

    Interface BeatmapsetDelete

    interface BeatmapsetDelete {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetDelete";
    }

    Hierarchy (view full)

    Properties

    created_at: Date
    id: number
    type: "beatmapsetDelete"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "beatmapsetDelete"
    diff --git a/docs/interfaces/Event.BeatmapsetRevive.html b/docs/interfaces/Event.BeatmapsetRevive.html index 0cf59f7..484d57a 100644 --- a/docs/interfaces/Event.BeatmapsetRevive.html +++ b/docs/interfaces/Event.BeatmapsetRevive.html @@ -1,6 +1,6 @@ -BeatmapsetRevive | osu-api-v2-js

    Interface BeatmapsetRevive

    interface BeatmapsetRevive {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetRevive";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    beatmapset +BeatmapsetRevive | osu-api-v2-js

    Interface BeatmapsetRevive

    interface BeatmapsetRevive {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetRevive";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    created_at: Date
    id: number
    type: "beatmapsetRevive"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "beatmapsetRevive"
    diff --git a/docs/interfaces/Event.BeatmapsetUpdate.html b/docs/interfaces/Event.BeatmapsetUpdate.html index bd42a9a..0317e4a 100644 --- a/docs/interfaces/Event.BeatmapsetUpdate.html +++ b/docs/interfaces/Event.BeatmapsetUpdate.html @@ -1,6 +1,6 @@ -BeatmapsetUpdate | osu-api-v2-js

    Interface BeatmapsetUpdate

    interface BeatmapsetUpdate {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetUpdate";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    beatmapset +BeatmapsetUpdate | osu-api-v2-js

    Interface BeatmapsetUpdate

    interface BeatmapsetUpdate {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetUpdate";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    created_at: Date
    id: number
    type: "beatmapsetUpdate"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "beatmapsetUpdate"
    diff --git a/docs/interfaces/Event.BeatmapsetUpload.html b/docs/interfaces/Event.BeatmapsetUpload.html index ba779d2..18c118c 100644 --- a/docs/interfaces/Event.BeatmapsetUpload.html +++ b/docs/interfaces/Event.BeatmapsetUpload.html @@ -1,6 +1,6 @@ -BeatmapsetUpload | osu-api-v2-js

    Interface BeatmapsetUpload

    interface BeatmapsetUpload {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetUpload";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    beatmapset +BeatmapsetUpload | osu-api-v2-js

    Interface BeatmapsetUpload

    interface BeatmapsetUpload {
        beatmapset: Event.SharedProperties.Beatmapset;
        created_at: Date;
        id: number;
        type: "beatmapsetUpload";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    created_at: Date
    id: number
    type: "beatmapsetUpload"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "beatmapsetUpload"
    diff --git a/docs/interfaces/Event.Rank.html b/docs/interfaces/Event.Rank.html index 712796d..7b90406 100644 --- a/docs/interfaces/Event.Rank.html +++ b/docs/interfaces/Event.Rank.html @@ -1,4 +1,4 @@ -Rank | osu-api-v2-js
    interface Rank {
        beatmap: Event.SharedProperties.Beatmap;
        created_at: Date;
        id: number;
        mode: "osu" | "taiko" | "fruits" | "mania";
        rank: number;
        scoreRank: string;
        type: "rank";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    beatmap +Rank | osu-api-v2-js
    interface Rank {
        beatmap: Event.SharedProperties.Beatmap;
        created_at: Date;
        id: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        rank: number;
        scoreRank: string;
        type: "rank";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    Properties

    created_at: Date
    id: number
    mode: "osu" | "taiko" | "fruits" | "mania"
    rank: number

    The position achieved, like 14

    -
    scoreRank: string

    The grade, like "S"

    -
    type: "rank"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    rank: number

    The position achieved, like 14

    +
    scoreRank: string

    The grade, like "S"

    +
    type: "rank"
    diff --git a/docs/interfaces/Event.RankLost.html b/docs/interfaces/Event.RankLost.html index c33da0b..d07cc53 100644 --- a/docs/interfaces/Event.RankLost.html +++ b/docs/interfaces/Event.RankLost.html @@ -1,7 +1,7 @@ -RankLost | osu-api-v2-js

    Interface RankLost

    interface RankLost {
        beatmap: Event.SharedProperties.Beatmap;
        created_at: Date;
        id: number;
        mode: "osu" | "taiko" | "fruits" | "mania";
        type: "rankLost";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    beatmap +RankLost | osu-api-v2-js

    Interface RankLost

    interface RankLost {
        beatmap: Event.SharedProperties.Beatmap;
        created_at: Date;
        id: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        type: "rankLost";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    created_at: Date
    id: number
    mode: "osu" | "taiko" | "fruits" | "mania"
    type: "rankLost"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    type: "rankLost"
    diff --git a/docs/interfaces/Event.SharedProperties.Beatmap.html b/docs/interfaces/Event.SharedProperties.Beatmap.html index 005d7c7..ca4bc41 100644 --- a/docs/interfaces/Event.SharedProperties.Beatmap.html +++ b/docs/interfaces/Event.SharedProperties.Beatmap.html @@ -1,5 +1,5 @@ -Beatmap | osu-api-v2-js
    interface Beatmap {
        title: string;
        url: string;
    }

    Properties

    title +Beatmap | osu-api-v2-js
    interface Beatmap {
        title: string;
        url: string;
    }

    Properties

    Properties

    title: string

    Format: {artist} - {song_name} [{difficulty_name}]

    -
    url: string

    What goes after the website's URL, like it could be the /b/2980857?m=0 of https://osu.ppy.sh/b/2980857?m=0 (/{beatmap_id}?m={ruleset_id})

    -
    \ No newline at end of file +

    Properties

    title: string

    Format: {artist} - {song_name} [{difficulty_name}]

    +
    url: string

    What goes after the website's URL, like it could be the /b/2980857?m=0 of https://osu.ppy.sh/b/2980857?m=0 (/{beatmap_id}?m={ruleset_id})

    +
    diff --git a/docs/interfaces/Event.SharedProperties.Beatmapset.html b/docs/interfaces/Event.SharedProperties.Beatmapset.html index c6f1f9a..79ae58c 100644 --- a/docs/interfaces/Event.SharedProperties.Beatmapset.html +++ b/docs/interfaces/Event.SharedProperties.Beatmapset.html @@ -1,5 +1,5 @@ -Beatmapset | osu-api-v2-js
    interface Beatmapset {
        title: string;
        url: string;
    }

    Properties

    title +Beatmapset | osu-api-v2-js
    interface Beatmapset {
        title: string;
        url: string;
    }

    Properties

    Properties

    title: string

    Format: {artist} - {song_name}

    -
    url: string

    What goes after the website's URL, like it could be the /s/689155 of https://osu.ppy.sh/s/689155 (/{beatmapset_id})

    -
    \ No newline at end of file +

    Properties

    title: string

    Format: {artist} - {song_name}

    +
    url: string

    What goes after the website's URL, like it could be the /s/689155 of https://osu.ppy.sh/s/689155 (/{beatmapset_id})

    +
    diff --git a/docs/interfaces/Event.SharedProperties.User.html b/docs/interfaces/Event.SharedProperties.User.html index 45d365e..963a4b6 100644 --- a/docs/interfaces/Event.SharedProperties.User.html +++ b/docs/interfaces/Event.SharedProperties.User.html @@ -1,4 +1,4 @@ -User | osu-api-v2-js
    interface User {
        url: string;
        username: string;
    }

    Properties

    url +User | osu-api-v2-js
    interface User {
        url: string;
        username: string;
    }

    Properties

    Properties

    url: string

    What goes after the website's URL, so for example, it could be the /u/7276846 of https://osu.ppy.sh/u/7276846 (or users instead of u)

    -
    username: string
    \ No newline at end of file +

    Properties

    url: string

    What goes after the website's URL, so for example, it could be the /u/7276846 of https://osu.ppy.sh/u/7276846 (or users instead of u)

    +
    username: string
    diff --git a/docs/interfaces/Event.UserSupportAgain.html b/docs/interfaces/Event.UserSupportAgain.html index d232e67..8611dc9 100644 --- a/docs/interfaces/Event.UserSupportAgain.html +++ b/docs/interfaces/Event.UserSupportAgain.html @@ -1,5 +1,5 @@ -UserSupportAgain | osu-api-v2-js

    Interface UserSupportAgain

    interface UserSupportAgain {
        created_at: Date;
        id: number;
        type: "userSupportAgain";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    created_at +UserSupportAgain | osu-api-v2-js

    Interface UserSupportAgain

    interface UserSupportAgain {
        created_at: Date;
        id: number;
        type: "userSupportAgain";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    Properties

    created_at: Date
    id: number
    type: "userSupportAgain"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "userSupportAgain"
    diff --git a/docs/interfaces/Event.UserSupportFirst.html b/docs/interfaces/Event.UserSupportFirst.html index b809176..3a1c39f 100644 --- a/docs/interfaces/Event.UserSupportFirst.html +++ b/docs/interfaces/Event.UserSupportFirst.html @@ -1,5 +1,5 @@ -UserSupportFirst | osu-api-v2-js

    Interface UserSupportFirst

    interface UserSupportFirst {
        created_at: Date;
        id: number;
        type: "userSupportFirst";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    created_at +UserSupportFirst | osu-api-v2-js

    Interface UserSupportFirst

    interface UserSupportFirst {
        created_at: Date;
        id: number;
        type: "userSupportFirst";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    Properties

    created_at: Date
    id: number
    type: "userSupportFirst"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "userSupportFirst"
    diff --git a/docs/interfaces/Event.UserSupportGift.html b/docs/interfaces/Event.UserSupportGift.html index cecbe0a..ea209be 100644 --- a/docs/interfaces/Event.UserSupportGift.html +++ b/docs/interfaces/Event.UserSupportGift.html @@ -1,5 +1,5 @@ -UserSupportGift | osu-api-v2-js

    Interface UserSupportGift

    interface UserSupportGift {
        created_at: Date;
        id: number;
        type: "userSupportGift";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    created_at +UserSupportGift | osu-api-v2-js

    Interface UserSupportGift

    interface UserSupportGift {
        created_at: Date;
        id: number;
        type: "userSupportGift";
        user: Event.SharedProperties.User;
    }

    Hierarchy (view full)

    Properties

    Properties

    created_at: Date
    id: number
    type: "userSupportGift"
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "userSupportGift"
    diff --git a/docs/interfaces/Event.UsernameChange.html b/docs/interfaces/Event.UsernameChange.html index b665e20..753fa37 100644 --- a/docs/interfaces/Event.UsernameChange.html +++ b/docs/interfaces/Event.UsernameChange.html @@ -1,6 +1,6 @@ -UsernameChange | osu-api-v2-js

    Interface UsernameChange

    interface UsernameChange {
        created_at: Date;
        id: number;
        type: "usernameChange";
        user: {
            previousUsername: string;
            url: string;
            username: string;
        };
    }

    Hierarchy (view full)

    Properties

    created_at +UsernameChange | osu-api-v2-js

    Interface UsernameChange

    interface UsernameChange {
        created_at: Date;
        id: number;
        type: "usernameChange";
        user: {
            previousUsername: string;
            url: string;
            username: string;
        };
    }

    Hierarchy (view full)

    Properties

    Properties

    created_at: Date
    id: number
    type: "usernameChange"
    user: {
        previousUsername: string;
        url: string;
        username: string;
    }

    Type declaration

    • previousUsername: string
    • url: string

      What goes after the website's URL, so for example, it could be the /u/7276846 of https://osu.ppy.sh/u/7276846 (or users instead of u)

      -
    • username: string
    \ No newline at end of file +

    Properties

    created_at: Date
    id: number
    type: "usernameChange"
    user: {
        previousUsername: string;
        url: string;
        username: string;
    }

    Type declaration

    • previousUsername: string
    • url: string

      What goes after the website's URL, so for example, it could be the /u/7276846 of https://osu.ppy.sh/u/7276846 (or users instead of u)

      +
    • username: string
    diff --git a/docs/interfaces/Forum.Post-1.html b/docs/interfaces/Forum.Post-1.html index 8ad6b2b..b96758e 100644 --- a/docs/interfaces/Forum.Post-1.html +++ b/docs/interfaces/Forum.Post-1.html @@ -1,8 +1,8 @@ -Post | osu-api-v2-js

    Obtainable From

    API.replyForumTopic / +Post | osu-api-v2-js

    interface Post {
        body: {
            html: string;
            raw: string;
        };
        created_at: Date;
        deleted_at: null | Date;
        edited_at: null | Date;
        edited_by_id: null | number;
        forum_id: number;
        id: number;
        topic_id: number;
        user_id: number;
    }

    Properties

    interface Post {
        body: {
            html: string;
            raw: string;
        };
        created_at: Date;
        deleted_at: null | Date;
        edited_at: null | Date;
        edited_by_id: null | number;
        forum_id: number;
        id: number;
        topic_id: number;
        user_id: number;
    }

    Properties

    Properties

    body: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string

      Post content in HTML format

      +

    Properties

    body: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string

      Post content in HTML format

    • raw: string

      Post content in BBCode format

      -
    created_at: Date
    deleted_at: null | Date
    edited_at: null | Date
    edited_by_id: null | number
    forum_id: number
    id: number
    topic_id: number
    user_id: number
    \ No newline at end of file +
    created_at: Date
    deleted_at: null | Date
    edited_at: null | Date
    edited_by_id: null | number
    forum_id: number
    id: number
    topic_id: number
    user_id: number
    diff --git a/docs/interfaces/Forum.Topic-1.html b/docs/interfaces/Forum.Topic-1.html index da4fa51..702849e 100644 --- a/docs/interfaces/Forum.Topic-1.html +++ b/docs/interfaces/Forum.Topic-1.html @@ -1,7 +1,7 @@ -Topic | osu-api-v2-js

    Obtainable From

    API.createForumTopic / +Topic | osu-api-v2-js

    interface Topic {
        created_at: Date;
        deleted_at: null | Date;
        first_post_id: number;
        forum_id: number;
        id: number;
        is_locked: boolean;
        last_post_id: number;
        poll: null | {
            allow_vote_change: boolean;
            ended_at: null | Date;
            hide_incomplete_results: boolean;
            last_vote_at: null | Date;
            max_votes: number;
            options: {
                id: number;
                text: {
                    bbcode: string;
                    html: string;
                };
                vote_count?: number;
            }[];
            started_at: Date;
            title: {
                bbcode: string;
                html: string;
            };
            total_vote_count: number;
        };
        post_count: number;
        title: string;
        type: "normal" | "sticky" | "announcement";
        updated_at: Date;
        user_id: number;
    }

    Properties

    interface Topic {
        created_at: Date;
        deleted_at: null | Date;
        first_post_id: number;
        forum_id: number;
        id: number;
        is_locked: boolean;
        last_post_id: number;
        poll: null | {
            allow_vote_change: boolean;
            ended_at: null | Date;
            hide_incomplete_results: boolean;
            last_vote_at: null | Date;
            max_votes: number;
            options: {
                id: number;
                text: {
                    bbcode: string;
                    html: string;
                };
                vote_count?: number;
            }[];
            started_at: Date;
            title: {
                bbcode: string;
                html: string;
            };
            total_vote_count: number;
        };
        post_count: number;
        title: string;
        type: "normal" | "sticky" | "announcement";
        updated_at: Date;
        user_id: number;
    }

    Properties

    created_at: Date
    deleted_at: null | Date
    first_post_id: number
    forum_id: number
    id: number
    is_locked: boolean
    last_post_id: number
    poll: null | {
        allow_vote_change: boolean;
        ended_at: null | Date;
        hide_incomplete_results: boolean;
        last_vote_at: null | Date;
        max_votes: number;
        options: {
            id: number;
            text: {
                bbcode: string;
                html: string;
            };
            vote_count?: number;
        }[];
        started_at: Date;
        title: {
            bbcode: string;
            html: string;
        };
        total_vote_count: number;
    }

    Type declaration

    • allow_vote_change: boolean
    • ended_at: null | Date

      Remarks

      Can be in the future

      -
    • hide_incomplete_results: boolean
    • last_vote_at: null | Date
    • max_votes: number
    • options: {
          id: number;
          text: {
              bbcode: string;
              html: string;
          };
          vote_count?: number;
      }[]
    • started_at: Date
    • title: {
          bbcode: string;
          html: string;
      }
      • bbcode: string
      • html: string
    • total_vote_count: number
    post_count: number
    title: string
    type: "normal" | "sticky" | "announcement"
    updated_at: Date
    user_id: number
    \ No newline at end of file +

    Properties

    created_at: Date
    deleted_at: null | Date
    first_post_id: number
    forum_id: number
    id: number
    is_locked: boolean
    last_post_id: number
    poll: null | {
        allow_vote_change: boolean;
        ended_at: null | Date;
        hide_incomplete_results: boolean;
        last_vote_at: null | Date;
        max_votes: number;
        options: {
            id: number;
            text: {
                bbcode: string;
                html: string;
            };
            vote_count?: number;
        }[];
        started_at: Date;
        title: {
            bbcode: string;
            html: string;
        };
        total_vote_count: number;
    }

    Type declaration

    • allow_vote_change: boolean
    • ended_at: null | Date

      Can be in the future

      +
    • hide_incomplete_results: boolean
    • last_vote_at: null | Date
    • max_votes: number
    • options: {
          id: number;
          text: {
              bbcode: string;
              html: string;
          };
          vote_count?: number;
      }[]
    • started_at: Date
    • title: {
          bbcode: string;
          html: string;
      }
      • bbcode: string
      • html: string
    • total_vote_count: number
    post_count: number
    title: string
    type: "normal" | "sticky" | "announcement"
    updated_at: Date
    user_id: number
    diff --git a/docs/interfaces/Multiplayer.Match-1.html b/docs/interfaces/Multiplayer.Match-1.html index f066d82..6d612a6 100644 --- a/docs/interfaces/Multiplayer.Match-1.html +++ b/docs/interfaces/Multiplayer.Match-1.html @@ -1,10 +1,8 @@ -Match | osu-api-v2-js

    Obtainable From

    API.getMatch

    -
    interface Match {
        current_game_id: null | number;
        events: {
            detail: {
                text?: string;
                type: string;
            };
            game?: {
                beatmap: Beatmap.WithBeatmapset;
                beatmap_id: number;
                end_time: null | Date;
                id: number;
                mode: "osu" | "taiko" | "fruits" | "mania";
                mode_int: Ruleset;
                mods: string[];
                scores: WithMatch[];
                scoring_type: string;
                start_time: Date;
                team_type: string;
            };
            id: number;
            timestamp: Date;
            user_id: null | number;
        }[];
        first_event_id: number;
        latest_event_id: number;
        match: Info;
        users: WithCountry[];
    }

    Properties

    current_game_id +Match | osu-api-v2-js

    API.getMatch

    +
    interface Match {
        current_game_id: null | number;
        events: Multiplayer.Match.Event[];
        first_event_id: number;
        latest_event_id: number;
        match: Info;
        users: WithCountry[];
    }

    Properties

    current_game_id: null | number
    events: {
        detail: {
            text?: string;
            type: string;
        };
        game?: {
            beatmap: Beatmap.WithBeatmapset;
            beatmap_id: number;
            end_time: null | Date;
            id: number;
            mode: "osu" | "taiko" | "fruits" | "mania";
            mode_int: Ruleset;
            mods: string[];
            scores: WithMatch[];
            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: Beatmap.WithBeatmapset;
          beatmap_id: number;
          end_time: null | Date;
          id: number;
          mode: "osu" | "taiko" | "fruits" | "mania";
          mode_int: Ruleset;
          mods: string[];
          scores: WithMatch[];
          scoring_type: string;
          start_time: Date;
          team_type: string;
      }

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

      -
      • beatmap: Beatmap.WithBeatmapset
      • beatmap_id: number
      • end_time: null | Date
      • id: number
      • mode: "osu" | "taiko" | "fruits" | "mania"
      • mode_int: Ruleset
      • mods: string[]
      • scores: WithMatch[]
      • scoring_type: string
      • start_time: Date
      • team_type: string
    • id: number
    • timestamp: Date
    • user_id: null | number
    first_event_id: number
    latest_event_id: number
    match: Info
    users: WithCountry[]
    \ No newline at end of file +

    Properties

    current_game_id: null | number
    first_event_id: number
    latest_event_id: number
    match: Info
    users: WithCountry[]
    diff --git a/docs/interfaces/Multiplayer.Match.Event.html b/docs/interfaces/Multiplayer.Match.Event.html new file mode 100644 index 0000000..582679c --- /dev/null +++ b/docs/interfaces/Multiplayer.Match.Event.html @@ -0,0 +1,8 @@ +Event | osu-api-v2-js
    interface Event {
        detail: {
            text?: string;
            type: string;
        };
        game?: {
            beatmap: Beatmap.WithBeatmapset;
            beatmap_id: number;
            end_time: null | Date;
            id: number;
            mode:
                | "osu"
                | "taiko"
                | "fruits"
                | "mania";
            mode_int: Ruleset;
            mods: string[];
            scores: WithMatch[];
            scoring_type: string;
            start_time: Date;
            team_type: string;
        };
        id: number;
        timestamp: Date;
        user_id: null | number;
    }

    Properties

    Properties

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

    Type declaration

    • Optionaltext?: string

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

      +
    • type: string
    game?: {
        beatmap: Beatmap.WithBeatmapset;
        beatmap_id: number;
        end_time: null | Date;
        id: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        mode_int: Ruleset;
        mods: string[];
        scores: WithMatch[];
        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
    diff --git a/docs/interfaces/Multiplayer.Match.Info.html b/docs/interfaces/Multiplayer.Match.Info.html index 6b0f3f8..36b58e6 100644 --- a/docs/interfaces/Multiplayer.Match.Info.html +++ b/docs/interfaces/Multiplayer.Match.Info.html @@ -1,6 +1,6 @@ -Info | osu-api-v2-js

    Obtainable From

    API.getMatches

    -
    interface Info {
        end_time: null | Date;
        id: number;
        name: string;
        start_time: Date;
    }

    Properties

    end_time +Info | osu-api-v2-js

    API.getMatches

    +
    interface Info {
        end_time: null | Date;
        id: number;
        name: string;
        start_time: Date;
    }

    Properties

    end_time: null | Date
    id: number
    name: string
    start_time: Date
    \ No newline at end of file +

    Properties

    end_time: null | Date
    id: number
    name: string
    start_time: Date
    diff --git a/docs/interfaces/Multiplayer.Room-1.html b/docs/interfaces/Multiplayer.Room-1.html index 3d33f39..4b597a1 100644 --- a/docs/interfaces/Multiplayer.Room-1.html +++ b/docs/interfaces/Multiplayer.Room-1.html @@ -1,5 +1,5 @@ -Room | osu-api-v2-js

    Obtainable From

    API.getRoom

    -
    interface Room {
        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;
        };
        ends_at: null | Date;
        has_password: boolean;
        host: WithCountry;
        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;
    }

    Properties

    active +Room | osu-api-v2-js

    API.getRoom

    +
    interface Room {
        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;
        };
        ends_at: null | Date;
        has_password: boolean;
        host: WithCountry;
        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;
    }

    Properties

    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

    +

    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 the authorized user has played

    Type declaration

    • accuracy: number

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

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

      How many (completed (I think)) 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
    \ No newline at end of file +
  • 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
    diff --git a/docs/interfaces/Multiplayer.Room.Leader-1.html b/docs/interfaces/Multiplayer.Room.Leader-1.html index 6f5f066..d0dd8cd 100644 --- a/docs/interfaces/Multiplayer.Room.Leader-1.html +++ b/docs/interfaces/Multiplayer.Room.Leader-1.html @@ -1,4 +1,4 @@ -Leader | osu-api-v2-js
    interface Leader {
        accuracy: number;
        attempts: number;
        completed: number;
        pp: number;
        room_id: number;
        total_score: number;
        user: WithCountry;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +Leader | osu-api-v2-js
    interface Leader {
        accuracy: number;
        attempts: number;
        completed: number;
        pp: number;
        room_id: number;
        total_score: number;
        user: WithCountry;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    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
    \ 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
    diff --git a/docs/interfaces/Multiplayer.Room.Leader.WithPosition.html b/docs/interfaces/Multiplayer.Room.Leader.WithPosition.html index 57e054a..2d4d679 100644 --- a/docs/interfaces/Multiplayer.Room.Leader.WithPosition.html +++ b/docs/interfaces/Multiplayer.Room.Leader.WithPosition.html @@ -1,4 +1,4 @@ -WithPosition | osu-api-v2-js
    interface WithPosition {
        accuracy: number;
        attempts: number;
        completed: number;
        position: number;
        pp: number;
        room_id: number;
        total_score: number;
        user: WithCountry;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +WithPosition | osu-api-v2-js
    interface WithPosition {
        accuracy: number;
        attempts: number;
        completed: number;
        position: number;
        pp: number;
        room_id: number;
        total_score: number;
        user: WithCountry;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy: number

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

    -
    attempts: number
    completed: number
    position: number
    pp: number
    room_id: number
    total_score: number
    user_id: number
    \ 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
    position: number
    pp: number
    room_id: number
    total_score: number
    user_id: number
    diff --git a/docs/interfaces/Multiplayer.Room.PlaylistItem-1.html b/docs/interfaces/Multiplayer.Room.PlaylistItem-1.html index b28bc62..5561c8c 100644 --- a/docs/interfaces/Multiplayer.Room.PlaylistItem-1.html +++ b/docs/interfaces/Multiplayer.Room.PlaylistItem-1.html @@ -1,4 +1,4 @@ -PlaylistItem | osu-api-v2-js
    interface PlaylistItem {
        allowed_mods: Mod[];
        beatmap: WithBeatmapsetChecksumMaxcombo;
        beatmap_id: number;
        expired: boolean;
        id: number;
        owner_id: number;
        played_at: null | Date;
        playlist_order: null | number;
        required_mods: Mod[];
        room_id: number;
        ruleset_id: Ruleset;
    }

    Properties

    allowed_mods +PlaylistItem | osu-api-v2-js
    interface PlaylistItem {
        allowed_mods: Mod[];
        beatmap: WithBeatmapsetChecksumMaxcombo;
        beatmap_id: number;
        expired: boolean;
        id: number;
        owner_id: number;
        played_at: null | Date;
        playlist_order: null | number;
        required_mods: Mod[];
        room_id: number;
        ruleset_id: Ruleset;
    }

    Properties

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

    Remarks

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

    -
    playlist_order: null | number

    Remarks

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

    -
    required_mods: Mod[]
    room_id: number
    ruleset_id: Ruleset
    \ 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: Ruleset
    diff --git a/docs/interfaces/Multiplayer.Room.PlaylistItem.Scores.html b/docs/interfaces/Multiplayer.Room.PlaylistItem.Scores.html index 43b3ad8..4e6218a 100644 --- a/docs/interfaces/Multiplayer.Room.PlaylistItem.Scores.html +++ b/docs/interfaces/Multiplayer.Room.PlaylistItem.Scores.html @@ -1,10 +1,10 @@ -Scores | osu-api-v2-js

    Obtainable From

    API.getPlaylistItemScores

    -
    interface Scores {
        cursor_string: null | string;
        params: {
            limit: number;
            sort: string;
        };
        scores: Multiplayer[];
        total: number;
        user_score: null | Multiplayer;
    }

    Properties

    cursor_string +Scores | osu-api-v2-js

    API.getPlaylistItemScores

    +
    interface Scores {
        cursor_string: null | string;
        params: {
            limit: number;
            sort: string;
        };
        scores: Multiplayer[];
        total: number;
        user_score: null | Multiplayer;
    }

    Properties

    cursor_string: null | string

    Remarks

    Will be null if there is no next page

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

    Type declaration

    • limit: number
    • sort: string
    scores: Multiplayer[]
    total: number

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

    -
    user_score: null | Multiplayer

    Remarks

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

    -
    \ No newline at end of file +

    Properties

    cursor_string: null | string

    Will be null if there is no next page

    +
    params: {
        limit: number;
        sort: string;
    }
    scores: Multiplayer[]
    total: number

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

    +
    user_score: null | Multiplayer

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

    +
    diff --git a/docs/interfaces/NewsPost-1.html b/docs/interfaces/NewsPost-1.html index de47d0f..97bfefd 100644 --- a/docs/interfaces/NewsPost-1.html +++ b/docs/interfaces/NewsPost-1.html @@ -1,5 +1,5 @@ -NewsPost | osu-api-v2-js

    Interface NewsPost

    Obtainable From

    API.getNewsPosts

    -
    interface NewsPost {
        author: string;
        edit_url: string;
        first_image: null | string;
        id: number;
        published_at: Date;
        slug: string;
        title: string;
        updated_at: Date;
    }

    Hierarchy (view full)

    Properties

    author +NewsPost | osu-api-v2-js

    Interface NewsPost

    API.getNewsPosts

    +
    interface NewsPost {
        author: string;
        edit_url: string;
        first_image: null | string;
        id: number;
        published_at: Date;
        slug: string;
        title: string;
        updated_at: Date;
    }

    Hierarchy (view full)

    Properties

    Properties

    author: string
    edit_url: string

    Link to view the file on GitHub

    -
    first_image: null | string

    Link to the first image in the document

    -
    id: number
    published_at: Date
    slug: string

    Filename without the extension, used in URLs

    -
    title: string
    updated_at: Date
    \ No newline at end of file +

    Properties

    author: string
    edit_url: string

    Link to view the file on GitHub

    +
    first_image: null | string

    Link to the first image in the document

    +
    id: number
    published_at: Date
    slug: string

    Filename without the extension, used in URLs

    +
    title: string
    updated_at: Date
    diff --git a/docs/interfaces/NewsPost.WithContentNavigation.html b/docs/interfaces/NewsPost.WithContentNavigation.html index 6cf7ae5..a18e9a3 100644 --- a/docs/interfaces/NewsPost.WithContentNavigation.html +++ b/docs/interfaces/NewsPost.WithContentNavigation.html @@ -1,5 +1,5 @@ -WithContentNavigation | osu-api-v2-js

    Interface WithContentNavigation

    Obtainable From

    API.getNewsPost

    -
    interface WithContentNavigation {
        author: string;
        content: string;
        edit_url: string;
        first_image: null | string;
        id: number;
        navigation: {
            newer?: NewsPost;
            older?: NewsPost;
        };
        published_at: Date;
        slug: string;
        title: string;
        updated_at: Date;
    }

    Hierarchy (view full)

    Properties

    author +WithContentNavigation | osu-api-v2-js

    Interface WithContentNavigation

    API.getNewsPost

    +
    interface WithContentNavigation {
        author: string;
        content: string;
        edit_url: string;
        first_image: null | string;
        id: number;
        navigation: {
            newer?: NewsPost;
            older?: NewsPost;
        };
        published_at: Date;
        slug: string;
        title: string;
        updated_at: Date;
    }

    Hierarchy (view full)

    Properties

    Properties

    author: string
    content: string

    With HTML

    -
    edit_url: string

    Link to view the file on GitHub

    -
    first_image: null | string

    Link to the first image in the document

    -
    id: number
    navigation: {
        newer?: NewsPost;
        older?: NewsPost;
    }

    Type declaration

    published_at: Date
    slug: string

    Filename without the extension, used in URLs

    -
    title: string
    updated_at: Date
    \ No newline at end of file +

    Properties

    author: string
    content: string

    With HTML

    +
    edit_url: string

    Link to view the file on GitHub

    +
    first_image: null | string

    Link to the first image in the document

    +
    id: number
    navigation: {
        newer?: NewsPost;
        older?: NewsPost;
    }
    published_at: Date
    slug: string

    Filename without the extension, used in URLs

    +
    title: string
    updated_at: Date
    diff --git a/docs/interfaces/Ranking.Country.html b/docs/interfaces/Ranking.Country.html index 9f61536..f1dd19c 100644 --- a/docs/interfaces/Ranking.Country.html +++ b/docs/interfaces/Ranking.Country.html @@ -1,9 +1,9 @@ -Country | osu-api-v2-js

    Obtainable From

    API.getCountryRanking

    -
    interface Country {
        cursor: {
            page: null | number;
        };
        ranking: {
            active_users: number;
            code: string;
            country: {
                code: string;
                name: string;
            };
            performance: number;
            play_count: number;
            ranked_score: number;
        }[];
        total: number;
    }

    Hierarchy

    • Ranking
      • Country

    Properties

    cursor +Country | osu-api-v2-js

    API.getCountryRanking

    +
    interface Country {
        cursor: {
            page: null | number;
        };
        ranking: {
            active_users: number;
            code: string;
            country: {
                code: string;
                name: string;
            };
            performance: number;
            play_count: number;
            ranked_score: number;
        }[];
        total: number;
    }

    Hierarchy

    • Ranking
      • Country

    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

    -
    \ No newline at end of file +

    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

    +
    diff --git a/docs/interfaces/Ranking.Spotlight.html b/docs/interfaces/Ranking.Spotlight.html index 6ff9c23..93ea9e8 100644 --- a/docs/interfaces/Ranking.Spotlight.html +++ b/docs/interfaces/Ranking.Spotlight.html @@ -1,5 +1,5 @@ -Spotlight | osu-api-v2-js

    Obtainable From

    API.getSpotlightRanking

    -
    interface Spotlight {
        beatmapsets: Beatmapset.Extended[];
        ranking: User.Statistics.WithUser[];
        spotlight: WithParticipantcount;
    }

    Properties

    beatmapsets +Spotlight | osu-api-v2-js

    API.getSpotlightRanking

    +
    interface Spotlight {
        beatmapsets: Beatmapset.Extended[];
        ranking: User.Statistics.WithUser[];
        spotlight: WithParticipantcount;
    }

    Properties

    beatmapsets: Beatmapset.Extended[]
    \ No newline at end of file +

    Properties

    beatmapsets: Beatmapset.Extended[]
    diff --git a/docs/interfaces/Ranking.User.html b/docs/interfaces/Ranking.User.html index 9c55aeb..875bfee 100644 --- a/docs/interfaces/Ranking.User.html +++ b/docs/interfaces/Ranking.User.html @@ -1,7 +1,7 @@ -User | osu-api-v2-js

    Obtainable From

    API.getUserRanking

    -
    interface User {
        cursor: {
            page: null | number;
        };
        ranking: User.Statistics.WithUser[];
        total: number;
    }

    Hierarchy

    • Ranking
      • User

    Properties

    cursor +User | osu-api-v2-js

    API.getUserRanking

    +
    interface User {
        cursor: {
            page: null | number;
        };
        ranking: User.Statistics.WithUser[];
        total: number;
    }

    Hierarchy

    • Ranking
      • User

    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

    -
    \ No newline at end of file +

    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

    +
    diff --git a/docs/interfaces/Score-1.html b/docs/interfaces/Score-1.html index d94a191..e1408e8 100644 --- a/docs/interfaces/Score-1.html +++ b/docs/interfaces/Score-1.html @@ -1,4 +1,4 @@ -Score | osu-api-v2-js

    Interface Score

    interface Score {
        accuracy: number;
        best_id: null | number;
        id: null | number;
        max_combo: number;
        mods: string[] | Mod[];
        passed: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        type: string;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +Score | osu-api-v2-js

    Interface Score

    interface Score {
        accuracy: number;
        best_id: null | number;
        id: null | number;
        max_combo: number;
        mods: string[] | Mod[];
        passed: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        type: string;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    accuracy: number

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

    -
    best_id: null | number
    id: null | number
    max_combo: number
    mods: string[] | Mod[]
    passed: boolean
    pp: null | number

    Remarks

    Is 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?

    -
    type: string
    user_id: number

    The ID of the user who made the score

    -
    \ 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)

    +
    best_id: null | number
    id: null | number
    max_combo: number
    mods: string[] | Mod[]
    passed: boolean
    pp: null | number

    Is 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?

    +
    type: string
    user_id: number

    The ID of the user who made the score

    +
    diff --git a/docs/interfaces/Score.Legacy.html b/docs/interfaces/Score.Legacy.html index 525cdf2..4d7d7b6 100644 --- a/docs/interfaces/Score.Legacy.html +++ b/docs/interfaces/Score.Legacy.html @@ -1,6 +1,6 @@ -Legacy | osu-api-v2-js

    Interface Legacy

    The version of Score without lazer-related stuff, used almost everywhere!

    -

    Obtainable From

    API.getBeatmapUserScores

    -
    interface Legacy {
        accuracy: number;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode: "osu" | "taiko" | "fruits" | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +Legacy | osu-api-v2-js

    Interface Legacy

    The version of Score without lazer-related stuff, used almost everywhere!

    +

    API.getBeatmapUserScores

    +
    interface Legacy {
        accuracy: number;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    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: "osu" | "taiko" | "fruits" | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Remarks

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Remarks

      Is null if the score's gamemode is Taiko

      -
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    -
    \ 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)

    +
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Is null if the score's gamemode is Taiko

      +
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    diff --git a/docs/interfaces/Score.Multiplayer.html b/docs/interfaces/Score.Multiplayer.html index 4a3ce29..f3d5a49 100644 --- a/docs/interfaces/Score.Multiplayer.html +++ b/docs/interfaces/Score.Multiplayer.html @@ -1,4 +1,4 @@ -Multiplayer | osu-api-v2-js

    Interface Multiplayer

    interface Multiplayer {
        accuracy: number;
        beatmap_id: number;
        ended_at: Date;
        id: number;
        max_combo: number;
        maximum_statistics: Score.Statistics;
        mods: Mod[];
        passed: boolean;
        playlist_item_id: number;
        pp: null | number;
        rank: string;
        replay: boolean;
        room_id: number;
        ruleset_id: Ruleset;
        started_at: Date;
        statistics: Score.Statistics;
        total_score: number;
        type: string;
        user: WithCountryCover;
        user_id: number;
    }

    Hierarchy

    • Bare
      • Multiplayer

    Properties

    accuracy +Multiplayer | osu-api-v2-js

    Interface Multiplayer

    interface Multiplayer {
        accuracy: number;
        beatmap_id: number;
        ended_at: Date;
        id: number;
        max_combo: number;
        maximum_statistics: Score.Statistics;
        mods: Mod[];
        passed: boolean;
        playlist_item_id: number;
        pp: null | number;
        rank: string;
        replay: boolean;
        room_id: number;
        ruleset_id: Ruleset;
        started_at: Date;
        statistics: Score.Statistics;
        total_score: number;
        type: string;
        user: WithCountryCover;
        user_id: number;
    }

    Hierarchy

    • Bare
      • Multiplayer

    Properties

    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: Score.Statistics
    mods: Mod[]
    passed: boolean
    playlist_item_id: number
    pp: null | number
    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?

    -
    room_id: number
    ruleset_id: Ruleset
    started_at: Date
    statistics: Score.Statistics
    total_score: number
    type: string
    user_id: number

    The ID of the user who made the score

    -
    \ 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: Score.Statistics
    mods: Mod[]
    passed: boolean
    playlist_item_id: number
    pp: null | number
    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?

    +
    room_id: number
    ruleset_id: Ruleset
    started_at: Date
    statistics: Score.Statistics
    total_score: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    diff --git a/docs/interfaces/Score.Solo.html b/docs/interfaces/Score.Solo.html index 90f5956..5990177 100644 --- a/docs/interfaces/Score.Solo.html +++ b/docs/interfaces/Score.Solo.html @@ -1,6 +1,6 @@ -Solo | osu-api-v2-js

    Scores called "solo-scores" are more relevant to lazer stuff, it's the opposite of legacy

    -

    Obtainable From

    API.getBeatmapSoloScores

    -
    interface Solo {
        accuracy: number;
        beatmap_id: number;
        best_id: null | number;
        build_id: null | number;
        ended_at: Date;
        has_replay: boolean;
        id: null | number;
        is_perfect_combo: boolean;
        legacy_perfect: boolean;
        legacy_score_id: null | number;
        legacy_total_score: number;
        max_combo: number;
        maximum_statistics?: Score.Statistics;
        mods: Mod[];
        passed: boolean;
        pp: null | number;
        preserve: boolean;
        rank: string;
        ranked: boolean;
        replay: boolean;
        started_at: null | Date;
        statistics: Score.Statistics;
        total_score: number;
        type: string;
        user: WithCountryCover;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +Solo | osu-api-v2-js

    Scores called "solo-scores" are more relevant to lazer stuff, it's the opposite of legacy

    +

    API.getBeatmapSoloScores

    +
    interface Solo {
        accuracy: number;
        beatmap_id: number;
        best_id: null | number;
        build_id: null | number;
        ended_at: Date;
        has_replay: boolean;
        id: null | number;
        is_perfect_combo: boolean;
        legacy_perfect: boolean;
        legacy_score_id: null | number;
        legacy_total_score: number;
        max_combo: number;
        maximum_statistics?: Score.Statistics;
        mods: Mod[];
        passed: boolean;
        pp: null | number;
        preserve: boolean;
        rank: string;
        ranked: boolean;
        replay: boolean;
        started_at: null | Date;
        statistics: Score.Statistics;
        total_score: number;
        type: string;
        user: WithCountryCover;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    accuracy: number

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

    -
    beatmap_id: number
    best_id: null | number
    build_id: null | number

    Remarks

    Is null if the score has not been set on lazer

    -
    ended_at: Date
    has_replay: boolean
    id: null | number
    is_perfect_combo: boolean
    legacy_perfect: boolean
    legacy_score_id: null | number
    legacy_total_score: number
    max_combo: number
    maximum_statistics?: Score.Statistics
    mods: Mod[]
    passed: boolean
    pp: null | number

    Remarks

    Is null when Beatmap is Loved (for example)

    -
    preserve: boolean
    rank: string

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

    -
    ranked: boolean
    replay: boolean

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

    -
    started_at: null | Date
    statistics: Score.Statistics
    total_score: number
    type: string
    user_id: number

    The ID of the user who made the score

    -
    \ 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)

    +
    beatmap_id: number
    best_id: null | number
    build_id: null | number

    Is null if the score has not been set on lazer

    +
    ended_at: Date
    has_replay: boolean
    id: null | number
    is_perfect_combo: boolean
    legacy_perfect: boolean
    legacy_score_id: null | number
    legacy_total_score: number
    max_combo: number
    maximum_statistics?: Score.Statistics
    mods: Mod[]
    passed: boolean
    pp: null | number

    Is null when Beatmap is Loved (for example)

    +
    preserve: boolean
    rank: string

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

    +
    ranked: boolean
    replay: boolean

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

    +
    started_at: null | Date
    statistics: Score.Statistics
    total_score: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    diff --git a/docs/interfaces/Score.Statistics.html b/docs/interfaces/Score.Statistics.html index 9071073..ef0a6bc 100644 --- a/docs/interfaces/Score.Statistics.html +++ b/docs/interfaces/Score.Statistics.html @@ -1,5 +1,5 @@ -Statistics | osu-api-v2-js

    Interface Statistics

    All of its properties are optional because instead of being 0, the property actually disappears instead

    -
    interface Statistics {
        great?: number;
        ignore_hit?: number;
        ignore_miss?: number;
        large_bonus?: number;
        large_tick_hit?: number;
        legacy_combo_increase?: number;
        meh?: number;
        miss?: number;
        ok?: number;
        small_bonus?: number;
        small_tick_hit?: number;
        small_tick_miss?: number;
    }

    Properties

    great? +Statistics | osu-api-v2-js

    Interface Statistics

    All of its properties are optional because instead of being 0, the property actually disappears instead

    +
    interface Statistics {
        great?: number;
        ignore_hit?: number;
        ignore_miss?: number;
        large_bonus?: number;
        large_tick_hit?: number;
        legacy_combo_increase?: number;
        meh?: number;
        miss?: number;
        ok?: number;
        small_bonus?: number;
        small_tick_hit?: number;
        small_tick_miss?: number;
    }

    Properties

    great?: number
    ignore_hit?: number
    ignore_miss?: number
    large_bonus?: number
    large_tick_hit?: number
    legacy_combo_increase?: number

    Exclusively for the maximum_statistics of solo-scores that were not set on lazer

    -
    meh?: number
    miss?: number
    ok?: number
    small_bonus?: number
    small_tick_hit?: number
    small_tick_miss?: number
    \ No newline at end of file +

    Properties

    great?: number
    ignore_hit?: number
    ignore_miss?: number
    large_bonus?: number
    large_tick_hit?: number
    legacy_combo_increase?: number

    Exclusively for the maximum_statistics of solo-scores that were not set on lazer

    +
    meh?: number
    miss?: number
    ok?: number
    small_bonus?: number
    small_tick_hit?: number
    small_tick_miss?: number
    diff --git a/docs/interfaces/Score.WithMatch.html b/docs/interfaces/Score.WithMatch.html index 2f1ea05..4a93701 100644 --- a/docs/interfaces/Score.WithMatch.html +++ b/docs/interfaces/Score.WithMatch.html @@ -1,6 +1,6 @@ -WithMatch | osu-api-v2-js

    Interface WithMatch

    The version of Score without lazer-related stuff, used almost everywhere!

    -

    Obtainable From

    API.getBeatmapUserScores

    -
    interface WithMatch {
        accuracy: number;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        match: {
            pass: boolean;
            slot: number;
            team: string;
        };
        max_combo: number;
        mode: "osu" | "taiko" | "fruits" | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +WithMatch | osu-api-v2-js

    Interface WithMatch

    The version of Score without lazer-related stuff, used almost everywhere!

    +

    API.getBeatmapUserScores

    +
    interface WithMatch {
        accuracy: number;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        match: {
            pass: boolean;
            slot: number;
            team: string;
        };
        max_combo: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    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: "osu" | "taiko" | "fruits" | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Remarks

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Remarks

      Is null if the score's gamemode is Taiko

      -
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    -
    \ 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)

    +
    best_id: null | number
    created_at: Date
    id: null | number
    match: {
        pass: boolean;
        slot: number;
        team: string;
    }
    max_combo: number
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Is null if the score's gamemode is Taiko

      +
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    diff --git a/docs/interfaces/Score.WithUser.html b/docs/interfaces/Score.WithUser.html index 6366c0e..7109822 100644 --- a/docs/interfaces/Score.WithUser.html +++ b/docs/interfaces/Score.WithUser.html @@ -1,5 +1,5 @@ -WithUser | osu-api-v2-js

    Interface WithUser

    Obtainable From

    API.getBeatmapScores

    -
    interface WithUser {
        accuracy: number;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode: "osu" | "taiko" | "fruits" | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user: WithCountryCover;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +WithUser | osu-api-v2-js

    Interface WithUser

    API.getBeatmapScores

    +
    interface WithUser {
        accuracy: number;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user: WithCountryCover;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy best_id created_at id @@ -17,10 +17,10 @@ type user user_id -

    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: "osu" | "taiko" | "fruits" | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Remarks

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Remarks

      Is null if the score's gamemode is Taiko

      -
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    -
    \ 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)

    +
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Is null if the score's gamemode is Taiko

      +
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user_id: number

    The ID of the user who made the score

    +
    diff --git a/docs/interfaces/Score.WithUserBeatmap.html b/docs/interfaces/Score.WithUserBeatmap.html index 52cd57a..32046e2 100644 --- a/docs/interfaces/Score.WithUserBeatmap.html +++ b/docs/interfaces/Score.WithUserBeatmap.html @@ -1,6 +1,6 @@ -WithUserBeatmap | osu-api-v2-js

    Interface WithUserBeatmap

    The version of Score without lazer-related stuff, used almost everywhere!

    -

    Obtainable From

    API.getBeatmapUserScores

    -
    interface WithUserBeatmap {
        accuracy: number;
        beatmap: Beatmap.Extended;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode: "osu" | "taiko" | "fruits" | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user: User;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    accuracy +WithUserBeatmap | osu-api-v2-js

    Interface WithUserBeatmap

    The version of Score without lazer-related stuff, used almost everywhere!

    +

    API.getBeatmapUserScores

    +
    interface WithUserBeatmap {
        accuracy: number;
        beatmap: Beatmap.Extended;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user: User;
        user_id: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    accuracy: number

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

    -
    beatmap: Beatmap.Extended
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode: "osu" | "taiko" | "fruits" | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Remarks

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Remarks

      Is null if the score's gamemode is Taiko

      -
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user: User
    user_id: number

    The ID of the user who made the score

    -
    \ 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)

    +
    beatmap: Beatmap.Extended
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Is null if the score's gamemode is Taiko

      +
    • count_geki: null | number
    • count_katu: null | number
    • count_miss: number
    type: string
    user: User
    user_id: number

    The ID of the user who made the score

    +
    diff --git a/docs/interfaces/Score.WithUserBeatmapBeatmapset.html b/docs/interfaces/Score.WithUserBeatmapBeatmapset.html index dd1f83b..3e33db8 100644 --- a/docs/interfaces/Score.WithUserBeatmapBeatmapset.html +++ b/docs/interfaces/Score.WithUserBeatmapBeatmapset.html @@ -1,5 +1,5 @@ -WithUserBeatmapBeatmapset | osu-api-v2-js

    Interface WithUserBeatmapBeatmapset

    Obtainable From

    API.getUserScores

    -
    interface WithUserBeatmapBeatmapset {
        accuracy: number;
        beatmap: Beatmap.Extended;
        beatmapset: Beatmapset;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode: "osu" | "taiko" | "fruits" | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user: User;
        user_id: number;
        weight?: {
            percentage: number;
            pp: number;
        };
    }

    Hierarchy (view full)

    Properties

    accuracy +WithUserBeatmapBeatmapset | osu-api-v2-js

    Interface WithUserBeatmapBeatmapset

    API.getUserScores

    +
    interface WithUserBeatmapBeatmapset {
        accuracy: number;
        beatmap: Beatmap.Extended;
        beatmapset: Beatmapset;
        best_id: null | number;
        created_at: Date;
        id: null | number;
        max_combo: number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        mode_int: Ruleset;
        mods: string[];
        passed: boolean;
        perfect: boolean;
        pp: null | number;
        rank: string;
        replay: boolean;
        score: number;
        statistics: {
            count_100: number;
            count_300: number;
            count_50: null | number;
            count_geki: null | number;
            count_katu: null | number;
            count_miss: number;
        };
        type: string;
        user: User;
        user_id: number;
        weight?: {
            percentage: number;
            pp: number;
        };
    }

    Hierarchy (view full)

    Properties

    Properties

    accuracy: number

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

    -
    beatmap: Beatmap.Extended
    beatmapset: Beatmapset
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode: "osu" | "taiko" | "fruits" | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Remarks

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Remarks

      Is null if the score's gamemode is Taiko

      -
    • count_geki: null | number
    • count_katu: null | 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 API.getUserScores

    -
    \ 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)

    +
    beatmap: Beatmap.Extended
    beatmapset: Beatmapset
    best_id: null | number
    created_at: Date
    id: null | number
    max_combo: number
    mode:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    mode_int: Ruleset
    mods: string[]
    passed: boolean
    perfect: boolean
    pp: null | number

    Is 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: null | number;
        count_geki: null | number;
        count_katu: null | number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: null | number

      Is null if the score's gamemode is Taiko

      +
    • count_geki: null | number
    • count_katu: null | 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;
    }

    Only if type is set to best on API.getUserScores

    +
    diff --git a/docs/interfaces/Spotlight-1.html b/docs/interfaces/Spotlight-1.html index 5932f69..db2f4ce 100644 --- a/docs/interfaces/Spotlight-1.html +++ b/docs/interfaces/Spotlight-1.html @@ -1,9 +1,9 @@ -Spotlight | osu-api-v2-js

    Interface Spotlight

    Obtainable From

    API.getSpotlights

    -
    interface Spotlight {
        end_date: Date;
        id: number;
        mode_specific: boolean;
        name: string;
        start_date: Date;
        type: string;
    }

    Hierarchy (view full)

    Properties

    end_date +Spotlight | osu-api-v2-js

    Interface Spotlight

    API.getSpotlights

    +
    interface Spotlight {
        end_date: Date;
        id: number;
        mode_specific: boolean;
        name: string;
        start_date: Date;
        type: string;
    }

    Hierarchy (view full)

    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
    \ No newline at end of file +

    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
    diff --git a/docs/interfaces/Spotlight.WithParticipantcount.html b/docs/interfaces/Spotlight.WithParticipantcount.html index a623fe8..dc0c167 100644 --- a/docs/interfaces/Spotlight.WithParticipantcount.html +++ b/docs/interfaces/Spotlight.WithParticipantcount.html @@ -1,10 +1,10 @@ -WithParticipantcount | osu-api-v2-js

    Interface WithParticipantcount

    Obtainable From

    API.getSpotlights

    -
    interface WithParticipantcount {
        end_date: Date;
        id: number;
        mode_specific: boolean;
        name: string;
        participant_count: number;
        start_date: Date;
        type: string;
    }

    Hierarchy (view full)

    Properties

    end_date +WithParticipantcount | osu-api-v2-js

    Interface WithParticipantcount

    API.getSpotlights

    +
    interface WithParticipantcount {
        end_date: Date;
        id: number;
        mode_specific: boolean;
        name: string;
        participant_count: number;
        start_date: Date;
        type: string;
    }

    Hierarchy (view full)

    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
    \ No newline at end of file +

    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
    diff --git a/docs/interfaces/User-1.html b/docs/interfaces/User-1.html index f394023..81cda11 100644 --- a/docs/interfaces/User-1.html +++ b/docs/interfaces/User-1.html @@ -1,4 +1,4 @@ -User | osu-api-v2-js

    Interface User

    interface User {
        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;
    }

    Hierarchy (view full)

    Properties

    avatar_url +User | osu-api-v2-js

    Interface User

    interface User {
        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;
    }

    Hierarchy (view full)

    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
    \ 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
    diff --git a/docs/interfaces/User.Config.html b/docs/interfaces/User.Config.html index 8cd6dfb..c6975a8 100644 --- a/docs/interfaces/User.Config.html +++ b/docs/interfaces/User.Config.html @@ -1,7 +1,7 @@ -Config | osu-api-v2-js

    Interface Config

    An interface to tell the API how the returned Array should be like

    -
    interface Config {
        limit?: number;
        offset?: number;
    }

    Properties

    limit? +Config | osu-api-v2-js

    Interface Config

    An interface to tell the API how the returned Array should be like

    +
    interface Config {
        limit?: number;
        offset?: number;
    }

    Properties

    Properties

    limit?: number

    The maximum amount of elements returned in the array

    -

    Remarks

    The server could send less than the limit because it deliberately limits itself; Putting this at 1000 doesn't mean you'll even get close to 200

    -
    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)

    -
    \ No newline at end of file +

    Properties

    limit?: number

    The maximum amount of elements returned in the array

    +

    The server could send less than the limit because it deliberately limits itself; Putting this at 1000 doesn't mean you'll even get close to 200

    +
    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)

    +
    diff --git a/docs/interfaces/User.Extended-1.html b/docs/interfaces/User.Extended-1.html index 52dbd9d..22b8843 100644 --- a/docs/interfaces/User.Extended-1.html +++ b/docs/interfaces/User.Extended-1.html @@ -1,5 +1,5 @@ -Extended | osu-api-v2-js

    Interface Extended

    Obtainable From

    API.getUser

    -
    interface Extended {
        account_history: {
            description: null | string;
            id: number;
            length: number;
            permanent: boolean;
            timestamp: Date;
            type: "note" | "restriction" | "silence";
        }[];
        active_tournament_banners: {
            id: number;
            image: string;
            tournament_id: number;
        }[];
        avatar_url: string;
        badges: {
            awarded_at: Date;
            description: string;
            image_url: string;
            url: string;
        }[];
        beatmap_playcounts_count: number;
        comments_count: number;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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 | ("osu" | "taiko" | "fruits" | "mania")[];
            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;
        };
        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;
        }[];
        nominated_beatmapset_count: number;
        occupation: null | string;
        page: {
            html: string;
            raw: string;
        };
        pending_beatmapset_count: number;
        playmode: "osu" | "taiko" | "fruits" | "mania";
        playstyle: null | 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;
        };
        rank_history: null | {
            data: number[];
            mode: "osu" | "taiko" | "fruits" | "mania";
        };
        replays_watched_counts: {
            count: number;
            start_date: Date;
        }[];
        scores_best_count: number;
        scores_first_count: number;
        scores_pinned_count: number;
        scores_recent_count: number;
        statistics: WithCountryrank;
        support_level: number;
        title: null | string;
        title_url: null | string;
        twitter: null | string;
        user_achievements: {
            achieved_at: Date;
            achievement_id: number;
        }[];
        username: string;
        website: null | string;
    }

    Hierarchy (view full)

    Properties

    account_history +Extended | osu-api-v2-js

    Interface Extended

    API.getUser

    +
    interface Extended {
        account_history: {
            description: null | string;
            id: number;
            length: number;
            permanent: boolean;
            timestamp: Date;
            type: "note" | "restriction" | "silence";
        }[];
        active_tournament_banners: {
            id: number;
            image: string;
            tournament_id: number;
        }[];
        avatar_url: string;
        badges: {
            awarded_at: Date;
            description: string;
            image_url: string;
            url: string;
        }[];
        beatmap_playcounts_count: number;
        comments_count: number;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            custom_url: null | string;
            id: null | number;
            url: string;
        };
        cover_url: string;
        daily_challenge_user_stats: {
            daily_streak_best: number;
            daily_streak_current: number;
            last_update: null | Date;
            last_weekly_streak: null | Date;
            playcount: number;
            top_10p_placements: number;
            top_50p_placements: number;
            user_id: number;
            weekly_streak_best: number;
            weekly_streak_current: number;
        };
        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 | (
                | "osu"
                | "taiko"
                | "fruits"
                | "mania")[];
            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;
        };
        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;
        }[];
        nominated_beatmapset_count: number;
        occupation: null | string;
        page: {
            html: string;
            raw: string;
        };
        pending_beatmapset_count: number;
        playmode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        playstyle: null | string[];
        pm_friends_only: boolean;
        post_count: number;
        previous_usernames: string[];
        profile_colour: null | string;
        profile_hue: null | number;
        profile_order: (
            | "me"
            | "recent_activity"
            | "beatmaps"
            | "historical"
            | "kudosu"
            | "top_ranks"
            | "medals")[];
        rank_highest: null | {
            rank: number;
            updated_at: Date;
        };
        rank_history: null | {
            data: number[];
            mode:
                | "osu"
                | "taiko"
                | "fruits"
                | "mania";
        };
        replays_watched_counts: {
            count: number;
            start_date: Date;
        }[];
        scores_best_count: number;
        scores_first_count: number;
        scores_pinned_count: number;
        scores_recent_count: number;
        statistics: WithCountryrank;
        support_level: number;
        title: null | string;
        title_url: null | string;
        twitter: null | string;
        user_achievements: {
            achieved_at: Date;
            achievement_id: number;
        }[];
        username: string;
        website: null | string;
    }

    Hierarchy (view full)

    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_banners: {
        id: number;
        image: string;
        tournament_id: number;
    }[]

    Type declaration

    • id: number
    • image: string
    • tournament_id: number
    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 | ("osu" | "taiko" | "fruits" | "mania")[];
        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 | ("osu" | "taiko" | "fruits" | "mania")[]
    • 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: "osu" | "taiko" | "fruits" | "mania"
    playstyle: null | 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: null | {
        data: number[];
        mode: "osu" | "taiko" | "fruits" | "mania";
    }

    Type declaration

    • data: number[]
    • mode: "osu" | "taiko" | "fruits" | "mania"
    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: WithCountryrank
    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
    \ No newline at end of file +

    Properties

    account_history: {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banners: {
        id: number;
        image: string;
        tournament_id: number;
    }[]
    avatar_url: string
    badges: {
        awarded_at: Date;
        description: string;
        image_url: string;
        url: string;
    }[]
    beatmap_playcounts_count: number
    comments_count: number
    country: {
        code: string;
        name: string;
    }
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | number;
        url: string;
    }
    cover_url: string

    Please use cover instead!

    +
    daily_challenge_user_stats: {
        daily_streak_best: number;
        daily_streak_current: number;
        last_update: null | Date;
        last_weekly_streak: null | Date;
        playcount: number;
        top_10p_placements: number;
        top_50p_placements: number;
        user_id: number;
        weekly_streak_best: number;
        weekly_streak_current: number;
    }
    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 | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        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;
    }
    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;
    }[]
    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:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    playstyle: null | string[]
    pm_friends_only: boolean
    post_count: number
    previous_usernames: string[]
    profile_colour: null | string
    profile_hue: null | number
    profile_order: (
        | "me"
        | "recent_activity"
        | "beatmaps"
        | "historical"
        | "kudosu"
        | "top_ranks"
        | "medals")[]
    rank_highest: null | {
        rank: number;
        updated_at: Date;
    }
    rank_history: null | {
        data: number[];
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
    }
    replays_watched_counts: {
        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: WithCountryrank
    support_level: number
    title: null | string
    title_url: null | string
    twitter: null | string
    user_achievements: {
        achieved_at: Date;
        achievement_id: number;
    }[]
    username: string
    website: null | string
    diff --git a/docs/interfaces/User.Extended.WithStatisticsrulesets.html b/docs/interfaces/User.Extended.WithStatisticsrulesets.html index 3a7ae64..25040f5 100644 --- a/docs/interfaces/User.Extended.WithStatisticsrulesets.html +++ b/docs/interfaces/User.Extended.WithStatisticsrulesets.html @@ -1,5 +1,5 @@ -WithStatisticsrulesets | osu-api-v2-js

    Interface WithStatisticsrulesets

    Obtainable From

    API.getResourceOwner

    -
    interface WithStatisticsrulesets {
        account_history: {
            description: null | string;
            id: number;
            length: number;
            permanent: boolean;
            timestamp: Date;
            type: "note" | "restriction" | "silence";
        }[];
        active_tournament_banners: {
            id: number;
            image: string;
            tournament_id: number;
        }[];
        avatar_url: string;
        badges: {
            awarded_at: Date;
            description: string;
            image_url: string;
            url: string;
        }[];
        beatmap_playcounts_count: number;
        comments_count: number;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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 | ("osu" | "taiko" | "fruits" | "mania")[];
            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_restricted: boolean;
        is_supporter: boolean;
        join_date: Date;
        kudosu: {
            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;
        }[];
        nominated_beatmapset_count: number;
        occupation: null | string;
        page: {
            html: string;
            raw: string;
        };
        pending_beatmapset_count: number;
        playmode: "osu" | "taiko" | "fruits" | "mania";
        playstyle: null | 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;
        };
        rank_history: null | {
            data: number[];
            mode: "osu" | "taiko" | "fruits" | "mania";
        };
        replays_watched_counts: {
            count: number;
            start_date: Date;
        }[];
        scores_best_count: number;
        scores_first_count: number;
        scores_pinned_count: number;
        scores_recent_count: number;
        statistics: WithCountryrank;
        statistics_rulesets: {
            fruits?: User.Statistics;
            mania?: User.Statistics;
            osu?: User.Statistics;
            taiko?: User.Statistics;
        };
        support_level: number;
        title: null | string;
        title_url: null | string;
        twitter: null | string;
        user_achievements: {
            achieved_at: Date;
            achievement_id: number;
        }[];
        username: string;
        website: null | string;
    }

    Hierarchy (view full)

    Properties

    account_history +WithStatisticsrulesets | osu-api-v2-js

    Interface WithStatisticsrulesets

    API.getResourceOwner

    +
    interface WithStatisticsrulesets {
        account_history: {
            description: null | string;
            id: number;
            length: number;
            permanent: boolean;
            timestamp: Date;
            type: "note" | "restriction" | "silence";
        }[];
        active_tournament_banners: {
            id: number;
            image: string;
            tournament_id: number;
        }[];
        avatar_url: string;
        badges: {
            awarded_at: Date;
            description: string;
            image_url: string;
            url: string;
        }[];
        beatmap_playcounts_count: number;
        comments_count: number;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            custom_url: null | string;
            id: null | number;
            url: string;
        };
        cover_url: string;
        daily_challenge_user_stats: {
            daily_streak_best: number;
            daily_streak_current: number;
            last_update: null | Date;
            last_weekly_streak: null | Date;
            playcount: number;
            top_10p_placements: number;
            top_50p_placements: number;
            user_id: number;
            weekly_streak_best: number;
            weekly_streak_current: number;
        };
        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 | (
                | "osu"
                | "taiko"
                | "fruits"
                | "mania")[];
            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_restricted: boolean;
        is_supporter: boolean;
        join_date: Date;
        kudosu: {
            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;
        }[];
        nominated_beatmapset_count: number;
        occupation: null | string;
        page: {
            html: string;
            raw: string;
        };
        pending_beatmapset_count: number;
        playmode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        playstyle: null | string[];
        pm_friends_only: boolean;
        post_count: number;
        previous_usernames: string[];
        profile_colour: null | string;
        profile_hue: null | number;
        profile_order: (
            | "me"
            | "recent_activity"
            | "beatmaps"
            | "historical"
            | "kudosu"
            | "top_ranks"
            | "medals")[];
        rank_highest: null | {
            rank: number;
            updated_at: Date;
        };
        rank_history: null | {
            data: number[];
            mode:
                | "osu"
                | "taiko"
                | "fruits"
                | "mania";
        };
        replays_watched_counts: {
            count: number;
            start_date: Date;
        }[];
        scores_best_count: number;
        scores_first_count: number;
        scores_pinned_count: number;
        scores_recent_count: number;
        statistics: WithCountryrank;
        statistics_rulesets: {
            fruits?: User.Statistics;
            mania?: User.Statistics;
            osu?: User.Statistics;
            taiko?: User.Statistics;
        };
        support_level: number;
        title: null | string;
        title_url: null | string;
        twitter: null | string;
        user_achievements: {
            achieved_at: Date;
            achievement_id: number;
        }[];
        username: string;
        variants?: {
            country_rank: null | number;
            global_rank: null | number;
            mode:
                | "osu"
                | "taiko"
                | "fruits"
                | "mania";
            pp: number;
            variant: string;
        }[];
        website: null | string;
    }

    Hierarchy (view full)

    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_banners: {
        id: number;
        image: string;
        tournament_id: number;
    }[]

    Type declaration

    • id: number
    • image: string
    • tournament_id: number
    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 | ("osu" | "taiko" | "fruits" | "mania")[];
        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 | ("osu" | "taiko" | "fruits" | "mania")[]
    • 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_restricted: 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: "osu" | "taiko" | "fruits" | "mania"
    playstyle: null | 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: null | {
        data: number[];
        mode: "osu" | "taiko" | "fruits" | "mania";
    }

    Type declaration

    • data: number[]
    • mode: "osu" | "taiko" | "fruits" | "mania"
    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: WithCountryrank
    statistics_rulesets: {
        fruits?: User.Statistics;
        mania?: User.Statistics;
        osu?: User.Statistics;
        taiko?: User.Statistics;
    }

    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
    \ No newline at end of file +

    Properties

    account_history: {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banners: {
        id: number;
        image: string;
        tournament_id: number;
    }[]
    avatar_url: string
    badges: {
        awarded_at: Date;
        description: string;
        image_url: string;
        url: string;
    }[]
    beatmap_playcounts_count: number
    comments_count: number
    country: {
        code: string;
        name: string;
    }
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | number;
        url: string;
    }
    cover_url: string

    Please use cover instead!

    +
    daily_challenge_user_stats: {
        daily_streak_best: number;
        daily_streak_current: number;
        last_update: null | Date;
        last_weekly_streak: null | Date;
        playcount: number;
        top_10p_placements: number;
        top_50p_placements: number;
        user_id: number;
        weekly_streak_best: number;
        weekly_streak_current: number;
    }
    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 | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        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_restricted: boolean
    is_supporter: boolean
    join_date: Date
    kudosu: {
        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;
    }[]
    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:
        | "osu"
        | "taiko"
        | "fruits"
        | "mania"
    playstyle: null | string[]
    pm_friends_only: boolean
    post_count: number
    previous_usernames: string[]
    profile_colour: null | string
    profile_hue: null | number
    profile_order: (
        | "me"
        | "recent_activity"
        | "beatmaps"
        | "historical"
        | "kudosu"
        | "top_ranks"
        | "medals")[]
    rank_highest: null | {
        rank: number;
        updated_at: Date;
    }
    rank_history: null | {
        data: number[];
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
    }
    replays_watched_counts: {
        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: WithCountryrank
    statistics_rulesets: {
        fruits?: User.Statistics;
        mania?: User.Statistics;
        osu?: User.Statistics;
        taiko?: User.Statistics;
    }
    support_level: number
    title: null | string
    title_url: null | string
    twitter: null | string
    user_achievements: {
        achieved_at: Date;
        achievement_id: number;
    }[]
    username: string
    variants?: {
        country_rank: null | number;
        global_rank: null | number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        pp: number;
        variant: string;
    }[]

    Exists only if include_variant_statistics was ever specified to be true in a request

    +
    website: null | string
    diff --git a/docs/interfaces/User.KudosuHistory.html b/docs/interfaces/User.KudosuHistory.html index fe9488d..f028ab4 100644 --- a/docs/interfaces/User.KudosuHistory.html +++ b/docs/interfaces/User.KudosuHistory.html @@ -1,9 +1,9 @@ -KudosuHistory | osu-api-v2-js

    Interface KudosuHistory

    Obtainable From

    API.getUserKudosu

    -
    interface KudosuHistory {
        action: "reset" | "give" | "vote.give" | "vote.reset" | "revoke" | "vote.revoke";
        amount: number;
        created_at: Date;
        giver: null | {
            url: string;
            username: string;
        };
        id: number;
        model: string;
        post: {
            title: string;
            url: null | string;
        };
    }

    Properties

    action +KudosuHistory | osu-api-v2-js

    Interface KudosuHistory

    API.getUserKudosu

    +
    interface KudosuHistory {
        action:
            | "reset"
            | "give"
            | "vote.give"
            | "vote.reset"
            | "revoke"
            | "vote.revoke";
        amount: number;
        created_at: Date;
        giver: null | {
            url: string;
            username: string;
        };
        id: number;
        model: string;
        post: {
            title: string;
            url: null | string;
        };
    }

    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
    \ 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;
    }
    id: number
    model: string
    post: {
        title: string;
        url: null | string;
    }
    diff --git a/docs/interfaces/User.Statistics-1.html b/docs/interfaces/User.Statistics-1.html index ab2f3b9..d8b0355 100644 --- a/docs/interfaces/User.Statistics-1.html +++ b/docs/interfaces/User.Statistics-1.html @@ -1,4 +1,4 @@ -Statistics | osu-api-v2-js

    Interface Statistics

    interface Statistics {
        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;
        };
        hit_accuracy: number;
        is_ranked: boolean;
        level: {
            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;
    }

    Hierarchy (view full)

    Properties

    count_100 +Statistics | osu-api-v2-js

    Interface Statistics

    interface Statistics {
        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;
        };
        hit_accuracy: number;
        is_ranked: boolean;
        level: {
            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;
    }

    Hierarchy (view full)

    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 become 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
    \ No newline at end of file +

    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;
    }
    hit_accuracy: number

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

    +
    is_ranked: boolean

    Hasn't become inactive in the rankings

    +
    level: {
        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
    diff --git a/docs/interfaces/User.Statistics.WithCountryrank.html b/docs/interfaces/User.Statistics.WithCountryrank.html index dcafe27..ce11af5 100644 --- a/docs/interfaces/User.Statistics.WithCountryrank.html +++ b/docs/interfaces/User.Statistics.WithCountryrank.html @@ -1,4 +1,4 @@ -WithCountryrank | osu-api-v2-js
    interface WithCountryrank {
        count_100: number;
        count_300: number;
        count_50: number;
        count_miss: number;
        country_rank: null | number;
        global_rank: null | number;
        global_rank_exp: null | number;
        grade_counts: {
            a: number;
            s: number;
            sh: number;
            ss: number;
            ssh: number;
        };
        hit_accuracy: number;
        is_ranked: boolean;
        level: {
            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;
    }

    Hierarchy (view full)

    Properties

    count_100 +WithCountryrank | osu-api-v2-js
    interface WithCountryrank {
        count_100: number;
        count_300: number;
        count_50: number;
        count_miss: number;
        country_rank: null | number;
        global_rank: null | number;
        global_rank_exp: null | number;
        grade_counts: {
            a: number;
            s: number;
            sh: number;
            ss: number;
            ssh: number;
        };
        hit_accuracy: number;
        is_ranked: boolean;
        level: {
            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;
    }

    Hierarchy (view full)

    Properties

    count_100: number
    count_300: number
    count_50: number
    count_miss: number
    country_rank: null | 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 become 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
    \ No newline at end of file +

    Properties

    count_100: number
    count_300: number
    count_50: number
    count_miss: number
    country_rank: null | number
    global_rank: null | number
    global_rank_exp: null | number
    grade_counts: {
        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 become inactive in the rankings

    +
    level: {
        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
    diff --git a/docs/interfaces/User.Statistics.WithUser.html b/docs/interfaces/User.Statistics.WithUser.html index d4a0c24..e857de9 100644 --- a/docs/interfaces/User.Statistics.WithUser.html +++ b/docs/interfaces/User.Statistics.WithUser.html @@ -1,4 +1,4 @@ -WithUser | osu-api-v2-js
    interface WithUser {
        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;
        };
        hit_accuracy: number;
        is_ranked: boolean;
        level: {
            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;
        user: WithCountryCover;
    }

    Hierarchy (view full)

    Properties

    count_100 +WithUser | osu-api-v2-js
    interface WithUser {
        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;
        };
        hit_accuracy: number;
        is_ranked: boolean;
        level: {
            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;
        user: WithCountryCover;
    }

    Hierarchy (view full)

    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 become 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
    \ No newline at end of file +

    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;
    }
    hit_accuracy: number

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

    +
    is_ranked: boolean

    Hasn't become inactive in the rankings

    +
    level: {
        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
    diff --git a/docs/interfaces/User.WithCountry.html b/docs/interfaces/User.WithCountry.html index 3720a88..14b7b21 100644 --- a/docs/interfaces/User.WithCountry.html +++ b/docs/interfaces/User.WithCountry.html @@ -1,5 +1,5 @@ -WithCountry | osu-api-v2-js

    Interface WithCountry

    Obtainable From

    API.getMatch

    -
    interface WithCountry {
        avatar_url: string;
        country: {
            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;
    }

    Hierarchy (view full)

    Properties

    avatar_url +WithCountry | osu-api-v2-js

    Interface WithCountry

    API.getMatch

    +
    interface WithCountry {
        avatar_url: string;
        country: {
            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;
    }

    Hierarchy (view full)

    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
    \ No newline at end of file +

    Properties

    avatar_url: string
    country: {
        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
    diff --git a/docs/interfaces/User.WithCountryCover.html b/docs/interfaces/User.WithCountryCover.html index 6afd262..d819854 100644 --- a/docs/interfaces/User.WithCountryCover.html +++ b/docs/interfaces/User.WithCountryCover.html @@ -1,5 +1,5 @@ -WithCountryCover | osu-api-v2-js

    Interface WithCountryCover

    Obtainable From

    API.getMatch

    -
    interface WithCountryCover {
        avatar_url: string;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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;
    }

    Hierarchy (view full)

    Properties

    avatar_url +WithCountryCover | osu-api-v2-js

    Interface WithCountryCover

    API.getMatch

    +
    interface WithCountryCover {
        avatar_url: string;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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;
    }

    Hierarchy (view full)

    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
    \ No newline at end of file +

    Properties

    avatar_url: string
    country: {
        code: string;
        name: string;
    }
    country_code: string
    cover: {
        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
    diff --git a/docs/interfaces/User.WithCountryCoverGroupsStatisticsSupport.html b/docs/interfaces/User.WithCountryCoverGroupsStatisticsSupport.html index f253079..50d32a5 100644 --- a/docs/interfaces/User.WithCountryCoverGroupsStatisticsSupport.html +++ b/docs/interfaces/User.WithCountryCoverGroupsStatisticsSupport.html @@ -1,5 +1,5 @@ -WithCountryCoverGroupsStatisticsSupport | osu-api-v2-js

    Interface WithCountryCoverGroupsStatisticsSupport

    Obtainable From

    API.getFriends

    -
    interface WithCountryCoverGroupsStatisticsSupport {
        avatar_url: string;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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 | ("osu" | "taiko" | "fruits" | "mania")[];
            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: User.Statistics;
        support_level: number;
        username: string;
    }

    Hierarchy (view full)

    Properties

    avatar_url +WithCountryCoverGroupsStatisticsSupport | osu-api-v2-js

    Interface WithCountryCoverGroupsStatisticsSupport

    API.getFriends

    +
    interface WithCountryCoverGroupsStatisticsSupport {
        avatar_url: string;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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 | (
                | "osu"
                | "taiko"
                | "fruits"
                | "mania")[];
            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: User.Statistics;
        support_level: number;
        username: string;
    }

    Hierarchy (view full)

    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 | ("osu" | "taiko" | "fruits" | "mania")[];
        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 | ("osu" | "taiko" | "fruits" | "mania")[]
    • 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: User.Statistics
    support_level: number
    username: string
    \ No newline at end of file +

    Properties

    avatar_url: string
    country: {
        code: string;
        name: string;
    }
    country_code: string
    cover: {
        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 | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        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: User.Statistics
    support_level: number
    username: string
    diff --git a/docs/interfaces/User.WithCountryCoverGroupsStatisticsrulesets.html b/docs/interfaces/User.WithCountryCoverGroupsStatisticsrulesets.html index 462041c..b241da0 100644 --- a/docs/interfaces/User.WithCountryCoverGroupsStatisticsrulesets.html +++ b/docs/interfaces/User.WithCountryCoverGroupsStatisticsrulesets.html @@ -1,5 +1,5 @@ -WithCountryCoverGroupsStatisticsrulesets | osu-api-v2-js

    Interface WithCountryCoverGroupsStatisticsrulesets

    Obtainable From

    API.getUsers

    -
    interface WithCountryCoverGroupsStatisticsrulesets {
        avatar_url: string;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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 | ("osu" | "taiko" | "fruits" | "mania")[];
            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?: User.Statistics;
            mania?: User.Statistics;
            osu?: User.Statistics;
            taiko?: User.Statistics;
        };
        username: string;
    }

    Hierarchy (view full)

    Properties

    avatar_url +WithCountryCoverGroupsStatisticsrulesets | osu-api-v2-js

    Interface WithCountryCoverGroupsStatisticsrulesets

    API.getUsers

    +
    interface WithCountryCoverGroupsStatisticsrulesets {
        avatar_url: string;
        country: {
            code: string;
            name: string;
        };
        country_code: string;
        cover: {
            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 | (
                | "osu"
                | "taiko"
                | "fruits"
                | "mania")[];
            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?: User.Statistics;
            mania?: User.Statistics;
            osu?: User.Statistics;
            taiko?: User.Statistics;
        };
        username: string;
        variants?: {
            country_rank: null | number;
            global_rank: null | number;
            mode:
                | "osu"
                | "taiko"
                | "fruits"
                | "mania";
            pp: number;
            variant: string;
        }[];
    }

    Hierarchy (view full)

    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 | ("osu" | "taiko" | "fruits" | "mania")[];
        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 | ("osu" | "taiko" | "fruits" | "mania")[]
    • 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?: User.Statistics;
        mania?: User.Statistics;
        osu?: User.Statistics;
        taiko?: User.Statistics;
    }

    Type declaration

    username: string
    \ No newline at end of file +variants? +

    Properties

    avatar_url: string
    country: {
        code: string;
        name: string;
    }
    country_code: string
    cover: {
        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 | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        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?: User.Statistics;
        mania?: User.Statistics;
        osu?: User.Statistics;
        taiko?: User.Statistics;
    }
    username: string
    variants?: {
        country_rank: null | number;
        global_rank: null | number;
        mode:
            | "osu"
            | "taiko"
            | "fruits"
            | "mania";
        pp: number;
        variant: string;
    }[]

    Exists only if include_variant_statistics was ever specified to be true in a request

    +
    diff --git a/docs/interfaces/User.WithGroups.html b/docs/interfaces/User.WithGroups.html index 28e3d78..8a53dfb 100644 --- a/docs/interfaces/User.WithGroups.html +++ b/docs/interfaces/User.WithGroups.html @@ -1,4 +1,4 @@ -WithGroups | osu-api-v2-js

    Interface WithGroups

    interface WithGroups {
        avatar_url: string;
        country_code: 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 | ("osu" | "taiko" | "fruits" | "mania")[];
            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;
        username: string;
    }

    Hierarchy (view full)

    Properties

    avatar_url +WithGroups | osu-api-v2-js

    Interface WithGroups

    interface WithGroups {
        avatar_url: string;
        country_code: 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 | (
                | "osu"
                | "taiko"
                | "fruits"
                | "mania")[];
            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;
        username: string;
    }

    Hierarchy (view full)

    Properties

    avatar_url: string
    country_code: 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 | ("osu" | "taiko" | "fruits" | "mania")[];
        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 | ("osu" | "taiko" | "fruits" | "mania")[]
    • 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
    username: string
    \ No newline at end of file +

    Properties

    avatar_url: string
    country_code: 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 | (
            | "osu"
            | "taiko"
            | "fruits"
            | "mania")[];
        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
    username: string
    diff --git a/docs/interfaces/User.WithKudosu.html b/docs/interfaces/User.WithKudosu.html index 2916e31..d80db42 100644 --- a/docs/interfaces/User.WithKudosu.html +++ b/docs/interfaces/User.WithKudosu.html @@ -1,4 +1,4 @@ -WithKudosu | osu-api-v2-js

    Interface WithKudosu

    interface WithKudosu {
        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;
        };
        last_visit: null | Date;
        pm_friends_only: boolean;
        profile_colour: null | string;
        username: string;
    }

    Hierarchy (view full)

    Properties

    avatar_url +WithKudosu | osu-api-v2-js

    Interface WithKudosu

    interface WithKudosu {
        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;
        };
        last_visit: null | Date;
        pm_friends_only: boolean;
        profile_colour: null | string;
        username: string;
    }

    Hierarchy (view full)

    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
    \ 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
    kudosu: {
        available: number;
        total: number;
    }
    last_visit: null | Date
    pm_friends_only: boolean
    profile_colour: null | string
    username: string
    diff --git a/docs/interfaces/WebSocket.Event.ChatChannelJoin.html b/docs/interfaces/WebSocket.Event.ChatChannelJoin.html index ffbcb5b..df84cee 100644 --- a/docs/interfaces/WebSocket.Event.ChatChannelJoin.html +++ b/docs/interfaces/WebSocket.Event.ChatChannelJoin.html @@ -1,3 +1,3 @@ -ChatChannelJoin | osu-api-v2-js
    interface ChatChannelJoin {
        data: WithDetails;
        event: "chat.channel.join";
    }

    Properties

    data +ChatChannelJoin | osu-api-v2-js
    interface ChatChannelJoin {
        data: WithDetails;
        event: "chat.channel.join";
    }

    Properties

    Properties

    event: "chat.channel.join"
    \ No newline at end of file +

    Properties

    event: "chat.channel.join"
    diff --git a/docs/interfaces/WebSocket.Event.ChatChannelLeave.html b/docs/interfaces/WebSocket.Event.ChatChannelLeave.html index 7bbe871..fbb18c0 100644 --- a/docs/interfaces/WebSocket.Event.ChatChannelLeave.html +++ b/docs/interfaces/WebSocket.Event.ChatChannelLeave.html @@ -1,3 +1,3 @@ -ChatChannelLeave | osu-api-v2-js
    interface ChatChannelLeave {
        data: WithDetails;
        event: "chat.channel.part";
    }

    Properties

    data +ChatChannelLeave | osu-api-v2-js
    interface ChatChannelLeave {
        data: WithDetails;
        event: "chat.channel.part";
    }

    Properties

    Properties

    event: "chat.channel.part"
    \ No newline at end of file +

    Properties

    event: "chat.channel.part"
    diff --git a/docs/interfaces/WebSocket.Event.ChatMessageNew.html b/docs/interfaces/WebSocket.Event.ChatMessageNew.html index 5f99ccc..be663de 100644 --- a/docs/interfaces/WebSocket.Event.ChatMessageNew.html +++ b/docs/interfaces/WebSocket.Event.ChatMessageNew.html @@ -1,3 +1,3 @@ -ChatMessageNew | osu-api-v2-js
    interface ChatMessageNew {
        data: {
            messages: Message[];
            users: User[];
        };
        event: "chat.message.new";
    }

    Properties

    data +ChatMessageNew | osu-api-v2-js
    interface ChatMessageNew {
        data: {
            messages: Message[];
            users: User[];
        };
        event: "chat.message.new";
    }

    Properties

    Properties

    data: {
        messages: Message[];
        users: User[];
    }

    Type declaration

    event: "chat.message.new"
    \ No newline at end of file +

    Properties

    data: {
        messages: Message[];
        users: User[];
    }
    event: "chat.message.new"
    diff --git a/docs/interfaces/WikiPage-1.html b/docs/interfaces/WikiPage-1.html index c6a021b..18f6f29 100644 --- a/docs/interfaces/WikiPage-1.html +++ b/docs/interfaces/WikiPage-1.html @@ -1,5 +1,5 @@ -WikiPage | osu-api-v2-js

    Interface WikiPage

    Obtainable From

    API.getWikiPage

    -
    interface WikiPage {
        available_locales: string[];
        layout: string;
        locale: string;
        markdown: string;
        path: string;
        subtitle: null | string;
        tags: string[];
        title: string;
    }

    Properties

    available_locales +WikiPage | osu-api-v2-js

    Interface WikiPage

    API.getWikiPage

    +
    interface WikiPage {
        available_locales: string[];
        layout: string;
        locale: string;
        markdown: string;
        path: string;
        subtitle: null | string;
        tags: string[];
        title: string;
    }

    Properties

    available_locales: string[]
    layout: string
    locale: string

    Lowercase BCP 47 language (sub)tag (for example, en for english)

    -
    markdown: string
    path: string

    It's what should be after https://osu.ppy.sh/wiki/{locale}/

    -
    subtitle: null | string

    Think of it as the title of the parent wiki page

    -

    Remarks

    If the title in the path (assuming it's in it (very unlikely if locale is not en)) is after a slash (/), this is what is before the slash

    -
    tags: string[]
    title: string
    \ No newline at end of file +

    Properties

    available_locales: string[]
    layout: string
    locale: string

    Lowercase BCP 47 language (sub)tag (for example, en for english)

    +
    markdown: string
    path: string

    It's what should be after https://osu.ppy.sh/wiki/{locale}/

    +
    subtitle: null | string

    Think of it as the title of the parent wiki page

    +

    If the title in the path (assuming it's in it (very unlikely if locale is not en)) is after a slash (/), this is what is before the slash

    +
    tags: string[]
    title: string
    diff --git a/docs/modules.html b/docs/modules.html index ba0fdf9..0b93e78 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,4 +1,4 @@ -osu-api-v2-js

    osu-api-v2-js

    Index

    Namespaces

    Beatmap +osu-api-v2-js

    osu-api-v2-js

    Index

    Namespaces

    Beatmap Beatmapset Changelog Chat @@ -30,4 +30,4 @@

    Type Aliases

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Beatmap.DifficultyAttributes.html b/docs/modules/Beatmap.DifficultyAttributes.html index b688283..2de2202 100644 --- a/docs/modules/Beatmap.DifficultyAttributes.html +++ b/docs/modules/Beatmap.DifficultyAttributes.html @@ -1,4 +1,4 @@ -DifficultyAttributes | osu-api-v2-js

    Namespace DifficultyAttributes

    Index

    Interfaces

    Fruits +DifficultyAttributes | osu-api-v2-js

    Namespace DifficultyAttributes

    Index

    Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/Beatmap.Extended.html b/docs/modules/Beatmap.Extended.html index 5730d61..92e744b 100644 --- a/docs/modules/Beatmap.Extended.html +++ b/docs/modules/Beatmap.Extended.html @@ -1,5 +1,5 @@ -Extended | osu-api-v2-js

    Index

    Interfaces

    WithFailtimes +Extended | osu-api-v2-js
    \ No newline at end of file +
    diff --git a/docs/modules/Beatmap.Pack.html b/docs/modules/Beatmap.Pack.html index 0fe22a3..db8f6bb 100644 --- a/docs/modules/Beatmap.Pack.html +++ b/docs/modules/Beatmap.Pack.html @@ -1,4 +1,4 @@ -Pack | osu-api-v2-js

    Index

    Interfaces

    WithBeatmapset +Pack | osu-api-v2-js

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Beatmap.UserScore.html b/docs/modules/Beatmap.UserScore.html index 04642ae..eafddc1 100644 --- a/docs/modules/Beatmap.UserScore.html +++ b/docs/modules/Beatmap.UserScore.html @@ -1,3 +1,3 @@ -UserScore | osu-api-v2-js

    Index

    Functions

    getMultiple +UserScore | osu-api-v2-js

    Index

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Beatmap.html b/docs/modules/Beatmap.html index bb83ae3..07a8e1a 100644 --- a/docs/modules/Beatmap.html +++ b/docs/modules/Beatmap.html @@ -1,4 +1,4 @@ -Beatmap | osu-api-v2-js

    Namespace Beatmap

    Index

    Namespaces

    DifficultyAttributes +Beatmap | osu-api-v2-js

    Namespace Beatmap

    Index

    Namespaces

    Parameter Object Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/Beatmapset.Discussion.Post.html b/docs/modules/Beatmapset.Discussion.Post.html index 164c96c..23c57f6 100644 --- a/docs/modules/Beatmapset.Discussion.Post.html +++ b/docs/modules/Beatmapset.Discussion.Post.html @@ -1,2 +1,2 @@ -Post | osu-api-v2-js
    \ No newline at end of file +Post | osu-api-v2-js
    diff --git a/docs/modules/Beatmapset.Discussion.Vote.html b/docs/modules/Beatmapset.Discussion.Vote.html index 5a1843c..d4b143a 100644 --- a/docs/modules/Beatmapset.Discussion.Vote.html +++ b/docs/modules/Beatmapset.Discussion.Vote.html @@ -1,2 +1,2 @@ -Vote | osu-api-v2-js
    \ No newline at end of file +Vote | osu-api-v2-js
    diff --git a/docs/modules/Beatmapset.Discussion.html b/docs/modules/Beatmapset.Discussion.html index b68443a..840fa2d 100644 --- a/docs/modules/Beatmapset.Discussion.html +++ b/docs/modules/Beatmapset.Discussion.html @@ -1,7 +1,7 @@ -Discussion | osu-api-v2-js

    Index

    Namespaces

    Post +Discussion | osu-api-v2-js

    Index

    Namespaces

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Beatmapset.Event.Comment.html b/docs/modules/Beatmapset.Event.Comment.html index cc3e7c2..f789ad4 100644 --- a/docs/modules/Beatmapset.Event.Comment.html +++ b/docs/modules/Beatmapset.Event.Comment.html @@ -1,5 +1,5 @@ -Comment | osu-api-v2-js

    Remarks

    Unrelated to comments in bundles!

    -

    Index

    Interfaces

    WithDiscussionidPostid +Comment | osu-api-v2-js
    \ No newline at end of file +
    diff --git a/docs/modules/Beatmapset.Event.html b/docs/modules/Beatmapset.Event.html index a932b3d..3e4b7ad 100644 --- a/docs/modules/Beatmapset.Event.html +++ b/docs/modules/Beatmapset.Event.html @@ -1,4 +1,4 @@ -Event | osu-api-v2-js

    Index

    Namespaces

    Comment +Event | osu-api-v2-js
    \ No newline at end of file +KudosuRecalculate +
    diff --git a/docs/modules/Beatmapset.Extended.html b/docs/modules/Beatmapset.Extended.html index 42ae220..e67e691 100644 --- a/docs/modules/Beatmapset.Extended.html +++ b/docs/modules/Beatmapset.Extended.html @@ -1,4 +1,4 @@ -Extended | osu-api-v2-js

    Index

    Interfaces

    Plus +Extended | osu-api-v2-js
    \ No newline at end of file +
    diff --git a/docs/modules/Beatmapset.html b/docs/modules/Beatmapset.html index 22a4e2b..e3dd2f4 100644 --- a/docs/modules/Beatmapset.html +++ b/docs/modules/Beatmapset.html @@ -1,4 +1,4 @@ -Beatmapset | osu-api-v2-js

    Namespace Beatmapset

    Index

    Namespaces

    Discussion +Beatmapset | osu-api-v2-js

    Namespace Beatmapset

    Index

    Namespaces

    Enumerations

    Genre @@ -13,4 +13,4 @@ lookup search

    Parameter Object Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/Changelog.Build.html b/docs/modules/Changelog.Build.html index ff559b4..c459fa7 100644 --- a/docs/modules/Changelog.Build.html +++ b/docs/modules/Changelog.Build.html @@ -1,7 +1,7 @@ -Build | osu-api-v2-js

    Index

    Interfaces

    WithChangelogentriesVersions +Build | osu-api-v2-js
    \ No newline at end of file +
    diff --git a/docs/modules/Changelog.UpdateStream.html b/docs/modules/Changelog.UpdateStream.html index 5648130..23db5f2 100644 --- a/docs/modules/Changelog.UpdateStream.html +++ b/docs/modules/Changelog.UpdateStream.html @@ -1,3 +1,3 @@ -UpdateStream | osu-api-v2-js

    Index

    Interfaces

    WithLatestbuildUsercount +UpdateStream | osu-api-v2-js

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Changelog.html b/docs/modules/Changelog.html index 4a887c3..67628c6 100644 --- a/docs/modules/Changelog.html +++ b/docs/modules/Changelog.html @@ -1,5 +1,5 @@ -Changelog | osu-api-v2-js

    Namespace Changelog

    Index

    Namespaces

    Build +Changelog | osu-api-v2-js

    Namespace Changelog

    Index

    Namespaces

    Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/Chat.Channel.html b/docs/modules/Chat.Channel.html index a782ff5..9440ec3 100644 --- a/docs/modules/Chat.Channel.html +++ b/docs/modules/Chat.Channel.html @@ -1,4 +1,4 @@ -Channel | osu-api-v2-js

    Namespace Channel

    Index

    Interfaces

    WithDetails +Channel | osu-api-v2-js

    Namespace Channel

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Chat.Message.html b/docs/modules/Chat.Message.html index 1e9a4e9..713dd87 100644 --- a/docs/modules/Chat.Message.html +++ b/docs/modules/Chat.Message.html @@ -1,4 +1,4 @@ -Message | osu-api-v2-js

    Namespace Message

    Index

    Functions

    getMultiple +Message | osu-api-v2-js

    Namespace Message

    Index

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Chat.html b/docs/modules/Chat.html index bb4d7a8..dfef13e 100644 --- a/docs/modules/Chat.html +++ b/docs/modules/Chat.html @@ -1,7 +1,7 @@ -Chat | osu-api-v2-js

    Namespace Chat

    Index

    Namespaces

    Channel +Chat | osu-api-v2-js

    Namespace Chat

    Index

    Namespaces

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Comment.Bundle.html b/docs/modules/Comment.Bundle.html index dd23578..d7d98df 100644 --- a/docs/modules/Comment.Bundle.html +++ b/docs/modules/Comment.Bundle.html @@ -1,2 +1,2 @@ -Bundle | osu-api-v2-js

    Index

    Interfaces

    \ No newline at end of file +Bundle | osu-api-v2-js

    Index

    Interfaces

    diff --git a/docs/modules/Comment.html b/docs/modules/Comment.html index be40097..450f54a 100644 --- a/docs/modules/Comment.html +++ b/docs/modules/Comment.html @@ -1,5 +1,5 @@ -Comment | osu-api-v2-js

    Namespace Comment

    Index

    Namespaces

    Bundle +Comment | osu-api-v2-js

    Namespace Comment

    Index

    Namespaces

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Event.SharedProperties.html b/docs/modules/Event.SharedProperties.html index 3bf16d1..b084dbf 100644 --- a/docs/modules/Event.SharedProperties.html +++ b/docs/modules/Event.SharedProperties.html @@ -1,5 +1,5 @@ -SharedProperties | osu-api-v2-js

    Namespace SharedProperties

    Those are used as properties by Events, they're not events themselves

    -

    Index

    Interfaces

    Beatmap +SharedProperties | osu-api-v2-js

    Namespace SharedProperties

    Those are used as properties by Events, they're not events themselves

    +

    Index

    Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/Event.html b/docs/modules/Event.html index 5c54b4f..6b7d129 100644 --- a/docs/modules/Event.html +++ b/docs/modules/Event.html @@ -1,4 +1,4 @@ -Event | osu-api-v2-js

    Namespace Event

    Index

    Namespaces

    SharedProperties +Event | osu-api-v2-js

    Namespace Event

    Index

    Namespaces

    Interfaces

    Type Aliases

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Forum.Post.html b/docs/modules/Forum.Post.html index 44cba6e..73f9b30 100644 --- a/docs/modules/Forum.Post.html +++ b/docs/modules/Forum.Post.html @@ -1,2 +1,2 @@ -Post | osu-api-v2-js

    Index

    Functions

    \ No newline at end of file +Post | osu-api-v2-js

    Index

    Functions

    diff --git a/docs/modules/Forum.Topic.html b/docs/modules/Forum.Topic.html index eb5eb1a..6d177e8 100644 --- a/docs/modules/Forum.Topic.html +++ b/docs/modules/Forum.Topic.html @@ -1,4 +1,4 @@ -Topic | osu-api-v2-js

    Index

    Functions

    create +Topic | osu-api-v2-js

    Index

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Forum.html b/docs/modules/Forum.html index 0d8fa48..2bffb8c 100644 --- a/docs/modules/Forum.html +++ b/docs/modules/Forum.html @@ -1,6 +1,6 @@ -Forum | osu-api-v2-js

    Namespace Forum

    Index

    Namespaces

    Post +Forum | osu-api-v2-js

    Namespace Forum

    Index

    Namespaces

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Home.Search.html b/docs/modules/Home.Search.html index b547779..4e197da 100644 --- a/docs/modules/Home.Search.html +++ b/docs/modules/Home.Search.html @@ -1,3 +1,3 @@ -Search | osu-api-v2-js

    Namespace Search

    Index

    Functions

    getUsers +Search | osu-api-v2-js

    Namespace Search

    Index

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Home.html b/docs/modules/Home.html index bc004f0..db8d185 100644 --- a/docs/modules/Home.html +++ b/docs/modules/Home.html @@ -1,2 +1,2 @@ -Home | osu-api-v2-js

    Namespace Home

    Index

    Namespaces

    \ No newline at end of file +Home | osu-api-v2-js

    Namespace Home

    Index

    Namespaces

    diff --git a/docs/modules/Multiplayer.Match.html b/docs/modules/Multiplayer.Match.html index 545d558..6cc06ea 100644 --- a/docs/modules/Multiplayer.Match.html +++ b/docs/modules/Multiplayer.Match.html @@ -1,4 +1,5 @@ -Match | osu-api-v2-js

    Index

    Interfaces

    Info +Match | osu-api-v2-js

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Multiplayer.Room.Leader.html b/docs/modules/Multiplayer.Room.Leader.html index 30767e5..16369a0 100644 --- a/docs/modules/Multiplayer.Room.Leader.html +++ b/docs/modules/Multiplayer.Room.Leader.html @@ -1,3 +1,3 @@ -Leader | osu-api-v2-js

    Index

    Interfaces

    WithPosition +Leader | osu-api-v2-js

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Multiplayer.Room.PlaylistItem.html b/docs/modules/Multiplayer.Room.PlaylistItem.html index c626d49..374777d 100644 --- a/docs/modules/Multiplayer.Room.PlaylistItem.html +++ b/docs/modules/Multiplayer.Room.PlaylistItem.html @@ -1,3 +1,3 @@ -PlaylistItem | osu-api-v2-js

    Index

    Interfaces

    Scores +PlaylistItem | osu-api-v2-js

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Multiplayer.Room.html b/docs/modules/Multiplayer.Room.html index 4d1dc80..3e6c14b 100644 --- a/docs/modules/Multiplayer.Room.html +++ b/docs/modules/Multiplayer.Room.html @@ -1,7 +1,7 @@ -Room | osu-api-v2-js

    Index

    Namespaces

    Leader +Room | osu-api-v2-js

    Index

    Namespaces

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Multiplayer.html b/docs/modules/Multiplayer.html index 6ddd7d4..df75fe2 100644 --- a/docs/modules/Multiplayer.html +++ b/docs/modules/Multiplayer.html @@ -1,5 +1,5 @@ -Multiplayer | osu-api-v2-js

    Namespace Multiplayer

    Index

    Namespaces

    Match +Multiplayer | osu-api-v2-js

    Namespace Multiplayer

    Index

    Namespaces

    Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/NewsPost.html b/docs/modules/NewsPost.html index 38b308e..ccea2e8 100644 --- a/docs/modules/NewsPost.html +++ b/docs/modules/NewsPost.html @@ -1,4 +1,4 @@ -NewsPost | osu-api-v2-js

    Namespace NewsPost

    Index

    Interfaces

    WithContentNavigation +NewsPost | osu-api-v2-js

    Namespace NewsPost

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Ranking.html b/docs/modules/Ranking.html index ac88cb9..c267e3f 100644 --- a/docs/modules/Ranking.html +++ b/docs/modules/Ranking.html @@ -1,8 +1,8 @@ -Ranking | osu-api-v2-js

    Namespace Ranking

    Index

    Interfaces

    Country +Ranking | osu-api-v2-js
    \ No newline at end of file +
    diff --git a/docs/modules/Score.html b/docs/modules/Score.html index f594694..7686a3b 100644 --- a/docs/modules/Score.html +++ b/docs/modules/Score.html @@ -1,4 +1,4 @@ -Score | osu-api-v2-js

    Namespace Score

    Index

    Interfaces

    Legacy +Score | osu-api-v2-js

    Namespace Score

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/Spotlight.html b/docs/modules/Spotlight.html index f6bcf22..b93e0f4 100644 --- a/docs/modules/Spotlight.html +++ b/docs/modules/Spotlight.html @@ -1,3 +1,3 @@ -Spotlight | osu-api-v2-js

    Namespace Spotlight

    Index

    Interfaces

    WithParticipantcount +Spotlight | osu-api-v2-js

    Namespace Spotlight

    Index

    Interfaces

    Functions

    \ No newline at end of file +
    diff --git a/docs/modules/User.Extended.html b/docs/modules/User.Extended.html index 2ce5138..c6b9d25 100644 --- a/docs/modules/User.Extended.html +++ b/docs/modules/User.Extended.html @@ -1,2 +1,2 @@ -Extended | osu-api-v2-js

    Namespace Extended

    Index

    Interfaces

    \ No newline at end of file +Extended | osu-api-v2-js

    Namespace Extended

    Index

    Interfaces

    diff --git a/docs/modules/User.Statistics.html b/docs/modules/User.Statistics.html index a199375..3f5f963 100644 --- a/docs/modules/User.Statistics.html +++ b/docs/modules/User.Statistics.html @@ -1,3 +1,3 @@ -Statistics | osu-api-v2-js

    Namespace Statistics

    Index

    Interfaces

    WithCountryrank +Statistics | osu-api-v2-js

    Namespace Statistics

    Index

    Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/User.html b/docs/modules/User.html index 89298fc..fb28ea4 100644 --- a/docs/modules/User.html +++ b/docs/modules/User.html @@ -1,4 +1,4 @@ -User | osu-api-v2-js

    Namespace User

    Index

    Namespaces

    Extended +User | osu-api-v2-js

    Namespace User

    Index

    Namespaces

    Interfaces

    Parameter Object Interfaces

    \ No newline at end of file +
    diff --git a/docs/modules/WebSocket.Command.html b/docs/modules/WebSocket.Command.html index 0687dd6..c16d5ee 100644 --- a/docs/modules/WebSocket.Command.html +++ b/docs/modules/WebSocket.Command.html @@ -1,6 +1,7 @@ -Command | osu-api-v2-js

    Use any of those with socket.send() to send a command to the WebSocket!

    -

    Example

    `socket.send(osu.WebSocket.Command.chatStart)`
    -
    -

    Index

    Variables

    chatEnd +Command | osu-api-v2-js

    Use any of those with socket.send() to send a command to the WebSocket!

    +
    `socket.send(osu.WebSocket.Command.chatStart)`
    +
    + +

    Index

    Variables

    \ No newline at end of file +
    diff --git a/docs/modules/WebSocket.Event.html b/docs/modules/WebSocket.Event.html index d4039af..05e1c7d 100644 --- a/docs/modules/WebSocket.Event.html +++ b/docs/modules/WebSocket.Event.html @@ -1,6 +1,6 @@ -Event | osu-api-v2-js

    Those are what you'll get from WebSocket's MessageEvents!

    -

    Index

    Interfaces

    ChatChannelJoin +Event | osu-api-v2-js

    Those are what you'll get from WebSocket's MessageEvents!

    +

    Index

    Interfaces

    Type Aliases

    Any -
    \ No newline at end of file +
    diff --git a/docs/modules/WebSocket.html b/docs/modules/WebSocket.html index 58ff22b..2b174e4 100644 --- a/docs/modules/WebSocket.html +++ b/docs/modules/WebSocket.html @@ -1,4 +1,4 @@ -WebSocket | osu-api-v2-js

    Namespace WebSocket

    Everything here is great to use with the WebSocket you can get with API.generateWebSocket!

    -

    Index

    Namespaces

    Command +WebSocket | osu-api-v2-js

    Namespace WebSocket

    Everything here is great to use with the WebSocket you can get with API.generateWebSocket!

    +

    Index

    Namespaces

    \ No newline at end of file +
    diff --git a/docs/modules/WikiPage.html b/docs/modules/WikiPage.html index fe687db..8375852 100644 --- a/docs/modules/WikiPage.html +++ b/docs/modules/WikiPage.html @@ -1,2 +1,2 @@ -WikiPage | osu-api-v2-js

    Namespace WikiPage

    Index

    Functions

    \ No newline at end of file +WikiPage | osu-api-v2-js

    Namespace WikiPage

    Index

    Functions

    diff --git a/docs/types/Beatmap.DifficultyAttributes.Any.html b/docs/types/Beatmap.DifficultyAttributes.Any.html index 743a94e..e792411 100644 --- a/docs/types/Beatmap.DifficultyAttributes.Any.html +++ b/docs/types/Beatmap.DifficultyAttributes.Any.html @@ -1 +1 @@ -Any | osu-api-v2-js
    \ No newline at end of file +Any | osu-api-v2-js
    Any:
        | Osu
        | Taiko
        | Fruits
        | Mania
    diff --git a/docs/types/Beatmapset.Event.Any.html b/docs/types/Beatmapset.Event.Any.html index 52a3b9f..b5f6e1a 100644 --- a/docs/types/Beatmapset.Event.Any.html +++ b/docs/types/Beatmapset.Event.Any.html @@ -1 +1 @@ -Any | osu-api-v2-js
    \ No newline at end of file +Any | osu-api-v2-js
    diff --git a/docs/types/Beatmapset.Event.AnyBeatmapChange.html b/docs/types/Beatmapset.Event.AnyBeatmapChange.html index 0d50618..f4c1072 100644 --- a/docs/types/Beatmapset.Event.AnyBeatmapChange.html +++ b/docs/types/Beatmapset.Event.AnyBeatmapChange.html @@ -1 +1 @@ -AnyBeatmapChange | osu-api-v2-js
    \ No newline at end of file +AnyBeatmapChange | osu-api-v2-js
    AnyBeatmapChange:
        | BeatmapOwnerChange
        | GenreEdit
        | LanguageEdit
        | NsfwToggle
        | OffsetEdit
        | TagsEdit
    diff --git a/docs/types/Beatmapset.Event.AnyBeatmapsetStatusChange.html b/docs/types/Beatmapset.Event.AnyBeatmapsetStatusChange.html index a792922..53991af 100644 --- a/docs/types/Beatmapset.Event.AnyBeatmapsetStatusChange.html +++ b/docs/types/Beatmapset.Event.AnyBeatmapsetStatusChange.html @@ -1 +1 @@ -AnyBeatmapsetStatusChange | osu-api-v2-js
    \ No newline at end of file +AnyBeatmapsetStatusChange | osu-api-v2-js

    Type Alias AnyBeatmapsetStatusChange

    AnyBeatmapsetStatusChange:
        | QualifyORRank
        | Love
        | Nominate
        | RemoveFromLoved
        | DisqualifyORNominationReset
        | NominationResetReceived
    diff --git a/docs/types/Beatmapset.Event.AnyDiscussionChange.html b/docs/types/Beatmapset.Event.AnyDiscussionChange.html index 0e56a0d..e9dc994 100644 --- a/docs/types/Beatmapset.Event.AnyDiscussionChange.html +++ b/docs/types/Beatmapset.Event.AnyDiscussionChange.html @@ -1 +1 @@ -AnyDiscussionChange | osu-api-v2-js
    \ No newline at end of file +AnyDiscussionChange | osu-api-v2-js
    diff --git a/docs/types/Event.Any.html b/docs/types/Event.Any.html index c492da4..14cd228 100644 --- a/docs/types/Event.Any.html +++ b/docs/types/Event.Any.html @@ -1 +1 @@ -Any | osu-api-v2-js
    \ No newline at end of file +Any | osu-api-v2-js
    diff --git a/docs/types/Event.AnyRecentActivity.html b/docs/types/Event.AnyRecentActivity.html index e06d9d7..07fe6ee 100644 --- a/docs/types/Event.AnyRecentActivity.html +++ b/docs/types/Event.AnyRecentActivity.html @@ -1,2 +1,2 @@ -AnyRecentActivity | osu-api-v2-js

    Type alias AnyRecentActivity

    This includes everything in this namespace, except BeatmapPlaycount

    -
    \ No newline at end of file +AnyRecentActivity | osu-api-v2-js

    Type Alias AnyRecentActivity

    AnyRecentActivity:
        | Achievement
        | BeatmapsetApprove
        | BeatmapsetDelete
        | BeatmapsetRevive
        | BeatmapsetUpdate
        | BeatmapsetUpload
        | Rank
        | RankLost
        | UserSupportAgain
        | UserSupportFirst
        | UserSupportGift
        | UsernameChange

    This includes everything in this namespace, except BeatmapPlaycount

    +
    diff --git a/docs/types/Mod.html b/docs/types/Mod.html index 0d8b991..0778dce 100644 --- a/docs/types/Mod.html +++ b/docs/types/Mod.html @@ -1 +1 @@ -Mod | osu-api-v2-js

    Type alias Mod

    Mod: {
        acronym: string;
        settings?: {
            [k: string]: any;
        };
    }

    Type declaration

    • acronym: string
    • Optional settings?: {
          [k: string]: any;
      }
      • [k: string]: any
    \ No newline at end of file +Mod | osu-api-v2-js

    Type Alias Mod

    Mod: {
        acronym: string;
        settings?: {
            [k: string]: any;
        };
    }
    diff --git a/docs/types/Scope.html b/docs/types/Scope.html index 2fa70ff..96fb80e 100644 --- a/docs/types/Scope.html +++ b/docs/types/Scope.html @@ -1,5 +1,5 @@ -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! +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! https://osu.ppy.sh/docs/index.html#scopes

    -

    Remarks

    "identify" is always implicity provided, "public" is implicitly needed for almost everything!! -The need for the "public" scope is only made explicit when the function can't be used unless the application acts as as a user (non-guest)

    -
    \ No newline at end of file +

    "identify" is always implicity provided, "public" is implicitly needed for almost everything!! +The need for the "public" scope is only made explicit when the function can't be used unless the application acts as as a user (non-guest)

    +
    diff --git a/docs/types/WebSocket.Event.Any.html b/docs/types/WebSocket.Event.Any.html index 39f74fa..55a108e 100644 --- a/docs/types/WebSocket.Event.Any.html +++ b/docs/types/WebSocket.Event.Any.html @@ -1,2 +1,2 @@ -Any | osu-api-v2-js

    That's the type of JSON.parse(m.toString()) where m is a WebSocket's MessageEvent!

    -
    \ No newline at end of file +Any | osu-api-v2-js

    That's the type of JSON.parse(m.toString()) where m is a WebSocket's MessageEvent!

    +
    diff --git a/docs/variables/WebSocket.Command.chatEnd.html b/docs/variables/WebSocket.Command.chatEnd.html index e76ec82..49cb77b 100644 --- a/docs/variables/WebSocket.Command.chatEnd.html +++ b/docs/variables/WebSocket.Command.chatEnd.html @@ -1 +1 @@ -chatEnd | osu-api-v2-js
    chatEnd: string = ...
    \ No newline at end of file +chatEnd | osu-api-v2-js
    chatEnd: string = ...
    diff --git a/docs/variables/WebSocket.Command.chatStart.html b/docs/variables/WebSocket.Command.chatStart.html index 64b1c5e..936eaae 100644 --- a/docs/variables/WebSocket.Command.chatStart.html +++ b/docs/variables/WebSocket.Command.chatStart.html @@ -1 +1 @@ -chatStart | osu-api-v2-js
    chatStart: string = ...
    \ No newline at end of file +chatStart | osu-api-v2-js
    chatStart: string = ...
    diff --git a/package.json b/package.json index a4ff4fb..bd6df8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "osu-api-v2-js", - "version": "1.0.4", + "version": "1.0.5", "description": "Package to easily access the new api of osu!", "type": "module", "main": "dist/index.js", @@ -39,7 +39,7 @@ "dotenv": "^16.4.5", "prompt-sync": "^4.2.0", "ts-json-schema-generator": "1.5.0", - "typedoc": "^0.25.13", + "typedoc": "^0.26.5", "typescript": "~5.3.2" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index 6f87f83..6db5a47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,22 +2,36 @@ # yarn lockfile v1 +"@shikijs/core@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.12.1.tgz#32626494bef573cce01f9e0a36d5776cbc1b2e58" + integrity sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA== + dependencies: + "@types/hast" "^3.0.4" + +"@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + "@types/json-schema@^7.0.12": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/node@*": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.0.1.tgz#98e3ed275e511da5b2391bbcbc88caf2831baa1f" - integrity sha512-RVKWL+s4ax6syie/ev3FXFIs38mke4ZsCDPBcLF2Gu6MbQXKe9Fo9iU0EPUxDB1mDVvC0vCgkV3lKa2f6xIuHg== + version "22.1.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.1.0.tgz#6d6adc648b5e03f0e83c78dc788c2b037d0ad94b" + integrity sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw== dependencies: - undici-types "~6.11.1" + undici-types "~6.13.0" "@types/node@^20.8.10": - version "20.14.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.13.tgz#bf4fe8959ae1c43bc284de78bd6c01730933736b" - integrity sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w== + version "20.14.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.14.tgz#6b655d4a88623b0edb98300bb9dd2107225f885e" + integrity sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ== dependencies: undici-types "~5.26.4" @@ -26,6 +40,11 @@ resolved "https://registry.yarnpkg.com/@types/prompt-sync/-/prompt-sync-4.2.3.tgz#b6a9fe88fc4b4cacb8ab59f87f2614d6e674e177" integrity sha512-Ox77gCSx0YyeakGt/qfOZUSFNSSi+sh3ABoGOiCwiO2KODx492BJnUm9oIXS+AHJtqp12iM4RduY6viTJ9bYwA== +"@types/unist@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + "@types/ws@^8.5.10": version "8.5.12" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" @@ -48,10 +67,10 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== -ansi-sequence-parser@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" - integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== balanced-match@^1.0.0: version "1.0.2" @@ -80,6 +99,11 @@ dotenv@^16.4.5: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -144,20 +168,34 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" - integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" lunr@^2.3.9: version "2.3.9" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== -marked@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== +markdown-it@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== minimatch@^5.0.1: version "5.1.6" @@ -166,7 +204,7 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.3: +minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -206,6 +244,11 @@ prompt-sync@^4.2.0: dependencies: strip-ansi "^5.0.0" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -216,15 +259,13 @@ safe-stable-stringify@^2.4.3: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -shiki@^0.14.7: - version "0.14.7" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" - integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== +shiki@^1.9.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.12.1.tgz#72d9d230a8d68ddaf8cf7c94a1dc6a5f2625324e" + integrity sha512-nwmjbHKnOYYAe1aaQyEBHvQymJgfm86ZSS7fT8OaPRr4sbAcBNz7PbfAikMEFSDQ6se2j2zobkXvVKcBOm0ysg== dependencies: - ansi-sequence-parser "^1.1.0" - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" + "@shikijs/core" "1.12.1" + "@types/hast" "^3.0.4" strip-ansi@^5.0.0: version "5.2.0" @@ -246,40 +287,36 @@ ts-json-schema-generator@1.5.0: safe-stable-stringify "^2.4.3" typescript "~5.3.2" -typedoc@^0.25.13: - version "0.25.13" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.13.tgz#9a98819e3b2d155a6d78589b46fa4c03768f0922" - integrity sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ== +typedoc@^0.26.5: + version "0.26.5" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.26.5.tgz#08032bd57cac3d56e8ac296a07e3482dc0c645ac" + integrity sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg== dependencies: lunr "^2.3.9" - marked "^4.3.0" - minimatch "^9.0.3" - shiki "^0.14.7" + markdown-it "^14.1.0" + minimatch "^9.0.5" + shiki "^1.9.1" + yaml "^2.4.5" typescript@~5.3.2: version "5.3.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.11.1.tgz#432ea6e8efd54a48569705a699e62d8f4981b197" - integrity sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ== - -vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - -vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== +undici-types@~6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.13.0.tgz#e3e79220ab8c81ed1496b5812471afd7cf075ea5" + integrity sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg== web-streams-polyfill@^3.0.3: version "3.3.3" @@ -295,3 +332,8 @@ ws@^8.17.1: version "8.18.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +yaml@^2.4.5: + version "2.5.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" + integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==