Started cleaning the .osu command
This commit is contained in:
parent
cd92577095
commit
6128703bcc
3 changed files with 95 additions and 40 deletions
|
@ -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();
|
||||
}
|
||||
|
|
60
src/EllieBot/Modules/Searches/OsuService.cs
Normal file
60
src/EllieBot/Modules/Searches/OsuService.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -67,4 +67,7 @@ public class OsuUserData
|
|||
|
||||
[JsonProperty("pp_country_rank")]
|
||||
public string PpCountryRank { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public int ModeNumber { get; set; }
|
||||
}
|
Loading…
Reference in a new issue