change: .wikia slightly changed and refactored

This commit is contained in:
Kwoth
2024-07-31 10:55:34 +00:00
parent 6fefce4c4d
commit 8f181eed85
5 changed files with 80 additions and 42 deletions

View File

@@ -487,35 +487,16 @@ public partial class Searches : NadekoModule<SearchesService>
return; return;
} }
await ctx.Channel.TriggerTypingAsync(); var maybeRes = await _service.GetWikiaPageAsync(target, query);
using var http = _httpFactory.CreateClient();
http.DefaultRequestHeaders.Clear();
try
{
var res = await http.GetStringAsync($"https://{Uri.EscapeDataString(target)}.fandom.com/api.php"
+ "?action=query"
+ "&format=json"
+ "&list=search"
+ $"&srsearch={Uri.EscapeDataString(query)}"
+ "&srlimit=1");
var items = JObject.Parse(res);
var title = items["query"]?["search"]?.FirstOrDefault()?["title"]?.ToString();
if (string.IsNullOrWhiteSpace(title)) if (!maybeRes.TryPickT0(out var res, out var error))
{
await Response().Error(strs.wikia_error).SendAsync();
return;
}
var url = Uri.EscapeDataString($"https://{target}.fandom.com/wiki/{title}");
var response = $@"`{GetText(strs.title)}` {title.SanitizeMentions()}
`{GetText(strs.url)}:` {url}";
await Response().Text(response).SendAsync();
}
catch
{ {
await Response().Error(strs.wikia_error).SendAsync(); await HandleErrorAsync(error);
return;
} }
var response = $"### {res.Title}\n{res.Url}";
await Response().Text(response).Sanitize().SendAsync();
} }
[Cmd] [Cmd]

View File

@@ -468,22 +468,52 @@ public class SearchesService : INService
return factElement.ToString(); return factElement.ToString();
} }
}
public enum ErrorType public async Task<OneOf<WikiaResponse, ErrorType>> GetWikiaPageAsync(string target, string query)
{
InvalidInput,
NotFound,
Unknown,
ApiKeyMissing
}
public class WikipediaReply
{
public class Info
{ {
public required string Url { get; init; } if (string.IsNullOrWhiteSpace(target) || string.IsNullOrWhiteSpace(query))
} {
return ErrorType.InvalidInput;
}
public required Info Data { get; init; } query = Uri.EscapeDataString(query.Trim());
target = Uri.EscapeDataString(target.Trim());
if (string.IsNullOrEmpty(query))
{
return ErrorType.InvalidInput;
}
using var http = _httpFactory.CreateClient();
http.DefaultRequestHeaders.Clear();
try
{
var res = await http.GetStringAsync($"https://{Uri.EscapeDataString(target)}.fandom.com/api.php"
+ "?action=query"
+ "&format=json"
+ "&list=search"
+ $"&srsearch={Uri.EscapeDataString(query)}"
+ "&srlimit=1");
var items = JObject.Parse(res);
var title = items["query"]?["search"]?.FirstOrDefault()?["title"]?.ToString();
if (string.IsNullOrWhiteSpace(title))
{
return ErrorType.NotFound;
}
var url = $"https://{target}.fandom.com/wiki/{title}";
return new WikiaResponse()
{
Url = url,
Title = title,
};
}
catch (Exception ex)
{
Log.Warning(ex, "Error getting wikia page: {Message}", ex.Message);
return ErrorType.Unknown;
}
}
} }

View File

@@ -0,0 +1,9 @@
namespace NadekoBot.Modules.Searches.Services;
public enum ErrorType
{
InvalidInput,
NotFound,
Unknown,
ApiKeyMissing
}

View File

@@ -0,0 +1,7 @@
namespace NadekoBot.Modules.Searches.Services;
public sealed class WikiaResponse
{
public required string Url { get; init; }
public required string Title { get; init; }
}

View File

@@ -0,0 +1,11 @@
namespace NadekoBot.Modules.Searches.Services;
public class WikipediaReply
{
public class Info
{
public required string Url { get; init; }
}
public required Info Data { get; init; }
}