Started cleaning the .osu command

This commit is contained in:
Toastie (DCS Team) 2024-08-13 13:56:33 +12:00
parent cd92577095
commit 6128703bcc
Signed by: toastie_t0ast
GPG key ID: 27F3B6855AFD40A4
3 changed files with 95 additions and 40 deletions

View file

@ -7,7 +7,7 @@ namespace EllieBot.Modules.Searches;
public partial class Searches
{
[Group]
public partial class OsuCommands : EllieModule
public partial class OsuCommands : EllieModule<OsuService>
{
private readonly IBotCredentials _creds;
private readonly IHttpClientFactory _httpFactory;
@ -24,9 +24,6 @@ public partial class Searches
if (string.IsNullOrWhiteSpace(user))
return;
using var http = _httpFactory.CreateClient();
var modeNumber = string.IsNullOrWhiteSpace(mode) ? 0 : ResolveGameMode(mode);
try
{
if (string.IsNullOrWhiteSpace(_creds.OsuApiKey))
@ -35,37 +32,32 @@ public partial class Searches
return;
}
var smode = ResolveGameMode(modeNumber);
var userReq = $"https://osu.ppy.sh/api/get_user?k={_creds.OsuApiKey}&u={user}&m={modeNumber}";
var userResString = await http.GetStringAsync(userReq);
var objs = JsonConvert.DeserializeObject<List<OsuUserData>>(userResString);
if (objs.Count == 0)
var obj = await _service.GetOsuData(user, mode);
if (obj is null)
{
await Response().Error(strs.osu_user_not_found).SendAsync();
return;
}
var obj = objs[0];
var userId = obj.UserId;
var smode = ResolveGameMode(obj.ModeNumber);
await Response().Embed(_sender.CreateEmbed()
.WithOkColor()
.WithTitle($"osu! {smode} profile for {user}")
.WithThumbnailUrl($"https://a.ppy.sh/{userId}")
.WithDescription($"https://osu.ppy.sh/u/{userId}")
.AddField("Official Rank", $"#{obj.PpRank}", true)
.AddField("Country Rank",
$"#{obj.PpCountryRank} :flag_{obj.Country.ToLower()}:",
true)
.AddField("Total PP", Math.Round(obj.PpRaw, 2), true)
.AddField("Accuracy", Math.Round(obj.Accuracy, 2) + "%", true)
.AddField("Playcount", obj.Playcount, true)
.AddField("Level", Math.Round(obj.Level), true)).SendAsync();
}
catch (ArgumentOutOfRangeException)
{
await Response().Error(strs.osu_user_not_found).SendAsync();
await Response()
.Embed(_sender.CreateEmbed()
.WithOkColor()
.WithTitle($"osu! {smode} profile for {user}")
.WithThumbnailUrl($"https://a.ppy.sh/{userId}")
.WithDescription($"https://osu.ppy.sh/u/{userId}")
.AddField("Official Rank", $"#{obj.PpRank}", true)
.AddField("Country Rank",
$"#{obj.PpCountryRank} :flag_{obj.Country.ToLower()}:",
true)
.AddField("Total PP", Math.Round(obj.PpRaw, 2), true)
.AddField("Accuracy", Math.Round(obj.Accuracy, 2) + "%", true)
.AddField("Playcount", obj.Playcount, true)
.AddField("Level", Math.Round(obj.Level), true))
.SendAsync();
}
catch (Exception ex)
{
@ -96,18 +88,18 @@ public partial class Searches
var userStats = statsResponse.Stats;
var embed = _sender.CreateEmbed()
.WithOkColor()
.WithTitle($"osu!Gatari {modeStr} profile for {user}")
.WithThumbnailUrl($"https://a.gatari.pw/{userStats.Id}")
.WithDescription($"https://osu.gatari.pw/u/{userStats.Id}")
.AddField("Official Rank", $"#{userStats.Rank}", true)
.AddField("Country Rank",
$"#{userStats.CountryRank} :flag_{userData.Country.ToLower()}:",
true)
.AddField("Total PP", userStats.Pp, true)
.AddField("Accuracy", $"{Math.Round(userStats.AvgAccuracy, 2)}%", true)
.AddField("Playcount", userStats.Playcount, true)
.AddField("Level", userStats.Level, true);
.WithOkColor()
.WithTitle($"osu!Gatari {modeStr} profile for {user}")
.WithThumbnailUrl($"https://a.gatari.pw/{userStats.Id}")
.WithDescription($"https://osu.gatari.pw/u/{userStats.Id}")
.AddField("Official Rank", $"#{userStats.Rank}", true)
.AddField("Country Rank",
$"#{userStats.CountryRank} :flag_{userData.Country.ToLower()}:",
true)
.AddField("Total PP", userStats.Pp, true)
.AddField("Accuracy", $"{Math.Round(userStats.AvgAccuracy, 2)}%", true)
.AddField("Playcount", userStats.Playcount, true)
.AddField("Level", userStats.Level, true);
await Response().Embed(embed).SendAsync();
}

View file

@ -0,0 +1,60 @@
#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;
}
private static int ResolveGameMode(string mode)
{
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;
}
}
}

View file

@ -67,4 +67,7 @@ public class OsuUserData
[JsonProperty("pp_country_rank")]
public string PpCountryRank { get; set; }
[JsonIgnore]
public int ModeNumber { get; set; }
}