.wikia slightly changed and refactored
This commit is contained in:
parent
219c122f1c
commit
fe5c8622dd
5 changed files with 80 additions and 41 deletions
|
@ -487,35 +487,16 @@ public partial class Searches : EllieModule<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]
|
||||||
|
|
|
@ -460,6 +460,7 @@ public class SearchesService : IEService
|
||||||
|
|
||||||
var doc = JsonDocument.Parse(response);
|
var doc = JsonDocument.Parse(response);
|
||||||
|
|
||||||
|
|
||||||
if (!doc.RootElement.TryGetProperty("fact", out var factElement))
|
if (!doc.RootElement.TryGetProperty("fact", out var factElement))
|
||||||
{
|
{
|
||||||
return ErrorType.Unknown;
|
return ErrorType.Unknown;
|
||||||
|
@ -467,22 +468,52 @@ public class SearchesService : IEService
|
||||||
|
|
||||||
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
9
src/EllieBot/Modules/Searches/_common/ErrorType.cs
Normal file
9
src/EllieBot/Modules/Searches/_common/ErrorType.cs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
namespace EllieBot.Modules.Searches.Services;
|
||||||
|
|
||||||
|
public enum ErrorType
|
||||||
|
{
|
||||||
|
InvalidInput,
|
||||||
|
NotFound,
|
||||||
|
Unknown,
|
||||||
|
ApiKeyMissing
|
||||||
|
}
|
7
src/EllieBot/Modules/Searches/_common/WikiaResponse.cs
Normal file
7
src/EllieBot/Modules/Searches/_common/WikiaResponse.cs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
namespace EllieBot.Modules.Searches.Services;
|
||||||
|
|
||||||
|
public sealed class WikiaResponse
|
||||||
|
{
|
||||||
|
public required string Url { get; init; }
|
||||||
|
public required string Title { get; init; }
|
||||||
|
}
|
11
src/EllieBot/Modules/Searches/_common/WikipediaReply.cs
Normal file
11
src/EllieBot/Modules/Searches/_common/WikipediaReply.cs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
namespace EllieBot.Modules.Searches.Services;
|
||||||
|
|
||||||
|
public class WikipediaReply
|
||||||
|
{
|
||||||
|
public class Info
|
||||||
|
{
|
||||||
|
public required string Url { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public required Info Data { get; init; }
|
||||||
|
}
|
Loading…
Reference in a new issue