{"id":20159503,"url":"https://github.com/kiritsu/osusharp","last_synced_at":"2025-04-09T23:35:50.295Z","repository":{"id":38814860,"uuid":"177542766","full_name":"Kiritsu/OsuSharp","owner":"Kiritsu","description":"Unofficial wrapper for the osu! API (V1, V2) written in C# and compatible with .NET 6 - Not really maintained due to lack of time and very bad design","archived":false,"fork":false,"pushed_at":"2023-12-30T18:35:13.000Z","size":1499,"stargazers_count":22,"open_issues_count":1,"forks_count":5,"subscribers_count":1,"default_branch":"dev","last_synced_at":"2024-05-16T04:57:22.036Z","etag":null,"topics":["api","azure","azure-pipelines","ci","cs","csharp","hacktoberfest","library","net-5","nuget","oppai","osu","pp","wrapper"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kiritsu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-25T08:14:30.000Z","updated_at":"2024-02-27T09:15:04.000Z","dependencies_parsed_at":"2023-12-30T17:52:09.380Z","dependency_job_id":"c6a7eda1-41a2-4a54-9fb5-2f43d05f5fb0","html_url":"https://github.com/Kiritsu/OsuSharp","commit_stats":{"total_commits":253,"total_committers":7,"mean_commits":"36.142857142857146","dds":0.04743083003952564,"last_synced_commit":"648f466f73713654b6fb2c14d2114279061a8739"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiritsu%2FOsuSharp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiritsu%2FOsuSharp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiritsu%2FOsuSharp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiritsu%2FOsuSharp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kiritsu","download_url":"https://codeload.github.com/Kiritsu/OsuSharp/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248130712,"owners_count":21052786,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","azure","azure-pipelines","ci","cs","csharp","hacktoberfest","library","net-5","nuget","oppai","osu","pp","wrapper"],"created_at":"2024-11-14T00:08:39.855Z","updated_at":"2025-04-09T23:35:50.267Z","avatar_url":"https://github.com/Kiritsu.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OsuSharp\n\n[![NuGet version](https://badge.fury.io/nu/OsuSharp.svg)](https://badge.fury.io/nu/OsuSharp)\n[![Build Status](https://dev.azure.com/allanmercou/OsuSharp/_apis/build/status/Kiritsu.OsuSharp?branchName=dev)](https://dev.azure.com/allanmercou/OsuSharp/_build/latest?definitionId=11\u0026branchName=dev)\n\n**OsuSharp is a wrapper written in C# for the osu! API.**\n\n- Compatible with .NET 6\n\n## Installation\n\nYou can install the stable version of the wrapper with NuGet (only supports API v1 for packages prior to 6.0.0):\n\n```\nPM\u003e Install-Package OsuSharp\n```\n\nYou can also compile from source:\n\n```git\ngit clone https://github.com/Kiritsu/OsuSharp.git\n```\n\n## Basic Usage\n\nYou can use the following example to get started with the library:\n\n\u003e Program.cs\n\n```cs\npublic static class Program\n{\n    public static void Main(string[] args)\n    {\n        CreateHostBuilder(args).Build().Run();\n    }\n\n    public static IHostBuilder CreateHostBuilder(string[] args)\n    {\n        return Host.CreateDefaultBuilder(args)\n            .ConfigureOsuSharp((ctx, options) =\u003e options.Configuration = new OsuClientConfiguration\n            {\n                ClientId = 123,\n                ClientSecret = \"my-super-secret\"\n            })\n            .ConfigureServices((ctx, services) =\u003e services.AddSingleton\u003cIOsuService, OsuService\u003e());\n    }\n}\n```\n\n\u003e IOsuService.cs\n\n```cs\ninternal interface IOsuService\n{\n    IAsyncEnumerable\u003cIBeatmapset\u003e GetLastRankedBeatmapsetsAsync(int count);\n    Task\u003cstring\u003e GetUserAvatarUrlAsync(string username);\n}\n```\n\n\u003e OsuService.cs\n\n```cs\npublic class OsuService : IOsuService\n{\n    private readonly IOsuClient _client;\n\n    public OsuService(IOsuClient client)\n    {\n        _client = client;\n    }\n\n    public async IAsyncEnumerable\u003cIBeatmapset\u003e GetLastRankedBeatmapsetsAsync(int count)\n    {\n        var builder = new BeatmapsetsLookupBuilder()\n            .WithGameMode(GameMode.Osu)\n            .WithConvertedBeatmaps()\n            .WithCategory(BeatmapsetCategory.Ranked);\n\n        await foreach (var beatmap in _client.EnumerateBeatmapsetsAsync(builder, BeatmapSorting.Ranked_Desc))\n        {\n            yield return beatmap;\n\n            count--;\n            if (count == 0)\n            {\n                break;\n            }\n        }\n    }\n\n    public async Task\u003cstring\u003e GetUserAvatarUrlAsync(string username)\n    {\n        var user = await _client.GetUserAsync(username);\n        return user.AvatarUrl.ToString();\n    }\n}\n```\n\n## Contributing\n\nIf you want to contribute, feel free to use Issues or Pull Requests!\n\n### Todo: \n```\nBeatmapset Discussions\n - /beatmapsets/discussions/posts (Get Beatmapset Discussion Posts)\n - /beatmapsets/discussions/votes (Get Beatmapset Discussion Votes)\n - /beatmapsets/discussions/ (Get Beatmapset Discussions)\n\nChangelog\n - /changelog/{stream}/{build} (Get Changelog Build)\n - /changelog (Get Changelog Listing)\n - /changelog/{changelog} (Lookup Changelog Build)\n\nChat\n - /chat/new (Create New PM)\n\nComments\n - /comments (Get Comments)\n - /comments/{comment} (Get a Comment)\n\nForum\n - /forums/topics/{topic}/reply (Reply Topic)\n - /forums/topics (Create Topic)\n - /forums/topics/{topic} (Get Topic and Posts)\n - /forums/topics/{topic} (Edit Topic)\n - /forums/posts/{topic} (Edit Post)\n\nHome\n - /search (Search | Users AND/OR Wiki pages) \n\nMultiplayer\n - /rooms/{room}/playlist/{playlist}/scores (Get Scores)\n\nNews\n - /news (Get News Listing)\n - /news/{news} (Get News Post)\n\nRanking\n - /spotlights (Get Spotlights)\n\nWiki\n - /wiki/{locale}/{path}\n\nUndocumented\n - /beatmapsets/events\n - /matches\n - /matches/{match}\n - /rooms/{mode?}\n - /rooms/{room}/leaderboard\n - /rooms/{room}\n - /beatmapsets/lookup (doesn't seem to work?)\n - /friends\n```\n\n### Done already\n```\nUsers\n - /me/{mode} (Get Own Data)\n - /users/{user}/kudosu (Get User Kudosu)\n - /users/{user}/scores/{types} (Get User Scores)\n - /users/{user}/beatmapsets/{type} (Get User Beatmaps)\n - /users/{user}/recent_activity (Get User Recent Activity)\n - /users/{user}/{mode?} (Get User)\n\nBeatmaps\n - /beatmaps/{beatmap} (Get Beatmap)\n - /beatmaps/{beatmap}/scores/users/{user} (Get a User Beatmap score)\n - /beatmaps/{beatmap}/scores/users/{user}/all (Get all User Beatmap score)\n - /beatmaps/{beatmap}/scores (Get Beatmap scores)\n - /beatmaps/lookup (Lookup Beatmap)\n - /beatmaps/{beatmap}/attributes (Get Beatmap Attributes)\n\nBeatmapsets\n - /beatmapsets/{beatmapset} (Get Beatmapset)\n - /beatmapsets/search/{filters?} (Search beatmapsets)\n\nScores\n - /scores/{mode}/{score} (Get Score)\n - /scores/{mode}/{score}/download (Get Replay ; Needs Authorization Code Grant)\n\nOAuth Tokens\n - /oauth/tokens/current (Revoke current token)\n\nMisc\n - /seasonal-backgrounds (Get Current Seasonal Backgrounds ; No Auth)\n\nRanking\n - /rankings/{mode}/{type} (Get Ranking)\n```\n\n## Thanks\n\nThanks to the following contributors: \n- [Naamloos](https://github.com/Naamloos)\n- [Kamdzy](https://github.com/Kamdzy)\n- [Bond-009](https://github.com/Bond-009)\n- [jacksonrakena](https://github.com/jacksonrakena)\n- [Piotrekol](https://github.com/Piotrekol)\n- [Quahu](https://github.com/Quahu)\n- [Kieran](https://github.com/k-boyle)\n- [Francesco149](https://github.com/Francesco149) for Oppai.\n- [TheOmyNomy](https://github.com/TheOmyNomy)\n\nThanks to JetBrains for giving an open source license for their products!\n\n\u003ca href=\"https://www.jetbrains.com/?from=jensyl\"\u003e\u003cimg src=\"imgs/jetbrains.svg\" alt=\"JetBrains IDEs\" width=\"150px\"\u003e\u003c/img\u003e\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiritsu%2Fosusharp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkiritsu%2Fosusharp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiritsu%2Fosusharp/lists"}