2024-08-13 13:56:33 +12:00
#nullable disable
using EllieBot.Modules.Searches.Common ;
using Newtonsoft.Json ;
namespace EllieBot.Modules.Searches ;
public sealed class OsuService : IEService
{
private readonly IHttpClientFactory _httpFactory ;
private readonly IBotCredentials _creds ;
public OsuService ( IHttpClientFactory httpFactory , IBotCredentials creds )
{
_httpFactory = httpFactory ;
_creds = creds ;
}
public async Task < OsuUserData > GetOsuData ( string username , string mode )
{
using var http = _httpFactory . CreateClient ( ) ;
var modeNumber = string . IsNullOrWhiteSpace ( mode ) ? 0 : ResolveGameMode ( mode ) ;
var userReq = $"https://osu.ppy.sh/api/get_user?k={_creds.OsuApiKey}&u={username}&m={modeNumber}" ;
var userResString = await http . GetStringAsync ( userReq ) ;
if ( string . IsNullOrWhiteSpace ( userResString ) )
return null ;
var objs = JsonConvert . DeserializeObject < List < OsuUserData > > ( userResString ) ;
if ( objs . Count = = 0 )
{
return null ;
}
var obj = objs [ 0 ] ;
obj . ModeNumber = modeNumber ;
return obj ;
}
2024-08-13 14:21:31 +12:00
public static int ResolveGameMode ( string mode )
2024-08-13 13:56:33 +12:00
{
switch ( mode . ToUpperInvariant ( ) )
{
case "STD" :
case "STANDARD" :
return 0 ;
case "TAIKO" :
return 1 ;
case "CTB" :
case "CATCHTHEBEAT" :
return 2 ;
case "MANIA" :
case "OSU!MANIA" :
return 3 ;
default :
return 0 ;
}
}
2024-08-13 14:21:31 +12:00
public static string ResolveGameMode ( int mode )
{
switch ( mode )
{
case 0 :
return "Standard" ;
case 1 :
return "Taiko" ;
case 2 :
return "Catch" ;
case 3 :
return "Mania" ;
default :
return "Standard" ;
}
}
public async Task < ( GatariUserData userData , GatariUserStats userStats ) > GetGatariDataAsync (
string user ,
string mode )
{
using var http = _httpFactory . CreateClient ( ) ;
var modeNumber = string . IsNullOrWhiteSpace ( mode ) ? 0 : ResolveGameMode ( mode ) ;
var resString = await http . GetStringAsync ( $"https://api.gatari.pw/user/stats?u={user}&mode={modeNumber}" ) ;
var statsResponse = JsonConvert . DeserializeObject < GatariUserStatsResponse > ( resString ) ;
if ( statsResponse . Code ! = 200 | | statsResponse . Stats . Id = = 0 )
{
return default ;
}
var usrResString = await http . GetStringAsync ( $"https://api.gatari.pw/users/get?u={user}" ) ;
var userData = JsonConvert . DeserializeObject < GatariUserResponse > ( usrResString ) . Users [ 0 ] ;
var userStats = statsResponse . Stats ;
return ( userData , userStats ) ;
}
2024-08-13 13:56:33 +12:00
}