Nhentai removed as it's currently unfixable, closes #396

This commit is contained in:
Kwoth
2023-02-11 22:12:52 +01:00
parent 51e887fe04
commit 98956481e9
7 changed files with 189 additions and 198 deletions

View File

@@ -22,6 +22,6 @@ public interface ISearchImagesService
ValueTask<bool> ToggleBlacklistTag(ulong guildId, string tag); ValueTask<bool> ToggleBlacklistTag(ulong guildId, string tag);
ValueTask<string[]> GetBlacklistedTags(ulong guildId); ValueTask<string[]> GetBlacklistedTags(ulong guildId);
Task<UrlReply> Butts(); Task<UrlReply> Butts();
Task<Gallery> GetNhentaiByIdAsync(uint id); // Task<Gallery> GetNhentaiByIdAsync(uint id);
Task<Gallery> GetNhentaiBySearchAsync(string search); // Task<Gallery> GetNhentaiBySearchAsync(string search);
} }

View File

@@ -1,9 +1,9 @@
using NadekoBot.Modules.Searches.Common; // using NadekoBot.Modules.Searches.Common;
//
namespace NadekoBot.Modules.Nsfw; // namespace NadekoBot.Modules.Nsfw;
//
public interface INhentaiService // public interface INhentaiService
{ // {
Task<Gallery?> GetAsync(uint id); // Task<Gallery?> GetAsync(uint id);
Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search); // Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search);
} // }

View File

@@ -1,115 +1,115 @@
using AngleSharp.Html.Dom; // using AngleSharp.Html.Dom;
using AngleSharp.Html.Parser; // using AngleSharp.Html.Parser;
using NadekoBot.Modules.Searches.Common; // using NadekoBot.Modules.Searches.Common;
//
namespace NadekoBot.Modules.Nsfw; // namespace NadekoBot.Modules.Nsfw;
//
public sealed class NhentaiScraperService : INhentaiService, INService // public sealed class NhentaiScraperService : INhentaiService, INService
{ // {
private readonly IHttpClientFactory _httpFactory; // private readonly IHttpClientFactory _httpFactory;
//
private static readonly HtmlParser _htmlParser = new(new() // private static readonly HtmlParser _htmlParser = new(new()
{ // {
IsScripting = false, // IsScripting = false,
IsEmbedded = false, // IsEmbedded = false,
IsSupportingProcessingInstructions = false, // IsSupportingProcessingInstructions = false,
IsKeepingSourceReferences = false, // IsKeepingSourceReferences = false,
IsNotSupportingFrames = true // IsNotSupportingFrames = true
}); // });
//
public NhentaiScraperService(IHttpClientFactory httpFactory) // public NhentaiScraperService(IHttpClientFactory httpFactory)
{ // {
_httpFactory = httpFactory; // _httpFactory = httpFactory;
} // }
//
private HttpClient GetHttpClient() // private HttpClient GetHttpClient()
{ // {
var http = _httpFactory.CreateClient(); // var http = _httpFactory.CreateClient();
http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36"); // http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36");
http.DefaultRequestHeaders.Add("Cookie", "cf_clearance=I5pR71P4wJkRBFTLFjBndI.GwfKwT.Gx06uS8XNmRJo-1657214595-0-150; csrftoken=WMWRLtsQtBVQYvYkbqXKJHI9T1JwWCdd3tNhoxHn7aHLUYHAqe60XFUKAoWsJtda"); // http.DefaultRequestHeaders.Add("Cookie", "cf_clearance=I5pR71P4wJkRBFTLFjBndI.GwfKwT.Gx06uS8XNmRJo-1657214595-0-150; csrftoken=WMWRLtsQtBVQYvYkbqXKJHI9T1JwWCdd3tNhoxHn7aHLUYHAqe60XFUKAoWsJtda");
return http; // return http;
} // }
//
public async Task<Gallery?> GetAsync(uint id) // public async Task<Gallery?> GetAsync(uint id)
{ // {
using var http = GetHttpClient(); // using var http = GetHttpClient();
try // try
{ // {
var url = $"https://nhentai.net/g/{id}/"; // var url = $"https://nhentai.net/g/{id}/";
var strRes = await http.GetStringAsync(url); // var strRes = await http.GetStringAsync(url);
var doc = await _htmlParser.ParseDocumentAsync(strRes); // var doc = await _htmlParser.ParseDocumentAsync(strRes);
//
var title = doc.QuerySelector("#info .title")?.TextContent; // var title = doc.QuerySelector("#info .title")?.TextContent;
var fullTitle = doc.QuerySelector("meta[itemprop=\"name\"]")?.Attributes["content"]?.Value // var fullTitle = doc.QuerySelector("meta[itemprop=\"name\"]")?.Attributes["content"]?.Value
?? title; // ?? title;
var thumb = (doc.QuerySelector("#cover a img") as IHtmlImageElement)?.Dataset["src"]; // var thumb = (doc.QuerySelector("#cover a img") as IHtmlImageElement)?.Dataset["src"];
//
var tagsElem = doc.QuerySelector("#tags"); // var tagsElem = doc.QuerySelector("#tags");
//
var pageCount = tagsElem?.QuerySelector("a.tag[href^=\"/search/?q=pages\"] span")?.TextContent; // var pageCount = tagsElem?.QuerySelector("a.tag[href^=\"/search/?q=pages\"] span")?.TextContent;
var likes = doc.QuerySelector(".buttons .btn-disabled.btn.tooltip span span")?.TextContent?.Trim('(', ')'); // var likes = doc.QuerySelector(".buttons .btn-disabled.btn.tooltip span span")?.TextContent?.Trim('(', ')');
var uploadedAt = (tagsElem?.QuerySelector(".tag-container .tags time.nobold") as IHtmlTimeElement)?.DateTime; // var uploadedAt = (tagsElem?.QuerySelector(".tag-container .tags time.nobold") as IHtmlTimeElement)?.DateTime;
//
var tags = tagsElem?.QuerySelectorAll(".tag-container .tags > a.tag[href^=\"/tag\"]") // var tags = tagsElem?.QuerySelectorAll(".tag-container .tags > a.tag[href^=\"/tag\"]")
.Cast<IHtmlAnchorElement>() // .Cast<IHtmlAnchorElement>()
.Select(x => new Tag() // .Select(x => new Tag()
{ // {
Name = x.QuerySelector("span:first-child")?.TextContent, // Name = x.QuerySelector("span:first-child")?.TextContent,
Url = $"https://nhentai.net{x.PathName}" // Url = $"https://nhentai.net{x.PathName}"
}) // })
.ToArray(); // .ToArray();
//
if (string.IsNullOrWhiteSpace(fullTitle)) // if (string.IsNullOrWhiteSpace(fullTitle))
return null; // return null;
//
if (!int.TryParse(pageCount, out var pc)) // if (!int.TryParse(pageCount, out var pc))
return null; // return null;
//
if (!int.TryParse(likes, out var lc)) // if (!int.TryParse(likes, out var lc))
return null; // return null;
//
if (!DateTime.TryParse(uploadedAt, out var ua)) // if (!DateTime.TryParse(uploadedAt, out var ua))
return null; // return null;
//
return new Gallery(id, // return new Gallery(id,
url, // url,
fullTitle, // fullTitle,
title, // title,
thumb, // thumb,
pc, // pc,
lc, // lc,
ua, // ua,
tags); // tags);
} // }
catch (HttpRequestException) // catch (HttpRequestException)
{ // {
Log.Warning("Nhentai with id {NhentaiId} not found", id); // Log.Warning("Nhentai with id {NhentaiId} not found", id);
return null; // return null;
} // }
} // }
//
public async Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search) // public async Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search)
{ // {
using var http = GetHttpClient(); // using var http = GetHttpClient();
try // try
{ // {
var url = $"https://nhentai.net/search/?q={Uri.EscapeDataString(search)}&sort=popular-today"; // var url = $"https://nhentai.net/search/?q={Uri.EscapeDataString(search)}&sort=popular-today";
var strRes = await http.GetStringAsync(url); // var strRes = await http.GetStringAsync(url);
var doc = await _htmlParser.ParseDocumentAsync(strRes); // var doc = await _htmlParser.ParseDocumentAsync(strRes);
//
var elems = doc.QuerySelectorAll(".container .gallery a") // var elems = doc.QuerySelectorAll(".container .gallery a")
.Cast<IHtmlAnchorElement>() // .Cast<IHtmlAnchorElement>()
.Where(x => x.PathName.StartsWith("/g/")) // .Where(x => x.PathName.StartsWith("/g/"))
.Select(x => x.PathName[3..^1]) // .Select(x => x.PathName[3..^1])
.Select(uint.Parse) // .Select(uint.Parse)
.ToArray(); // .ToArray();
//
return elems; // return elems;
} // }
catch (HttpRequestException) // catch (HttpRequestException)
{ // {
Log.Warning("Nhentai search for {NhentaiSearch} failed", search); // Log.Warning("Nhentai search for {NhentaiSearch} failed", search);
return Array.Empty<uint>(); // return Array.Empty<uint>();
} // }
} // }
} // }

View File

@@ -360,67 +360,65 @@ public partial class NSFW : NadekoModule<ISearchImagesService>
} }
} }
[Cmd] // [RequireNsfw(Group = "nsfw_or_dm")]
[RequireContext(ContextType.Guild)] // [RequireContext(ContextType.DM, Group = "nsfw_or_dm")]
[RequireNsfw(Group = "nsfw_or_dm")] // [Priority(1)]
[RequireContext(ContextType.DM, Group = "nsfw_or_dm")] // public async Task Nhentai(uint id)
[Priority(1)] // {
public async Task Nhentai(uint id) // var g = await _service.GetNhentaiByIdAsync(id);
{ //
var g = await _service.GetNhentaiByIdAsync(id); // if (g is null)
// {
if (g is null) // await ReplyErrorLocalizedAsync(strs.not_found);
{ // return;
await ReplyErrorLocalizedAsync(strs.not_found); // }
return; //
} // await SendNhentaiGalleryInternalAsync(g);
// }
await SendNhentaiGalleryInternalAsync(g); //
} // [Cmd]
// [RequireContext(ContextType.Guild)]
[Cmd] // [RequireNsfw(Group = "nsfw_or_dm")]
[RequireContext(ContextType.Guild)] // [RequireContext(ContextType.DM, Group = "nsfw_or_dm")]
[RequireNsfw(Group = "nsfw_or_dm")] // [Priority(0)]
[RequireContext(ContextType.DM, Group = "nsfw_or_dm")] // public async Task Nhentai([Leftover] string query)
[Priority(0)] // {
public async Task Nhentai([Leftover] string query) // var g = await _service.GetNhentaiBySearchAsync(query);
{ //
var g = await _service.GetNhentaiBySearchAsync(query); // if (g is null)
// {
if (g is null) // await ReplyErrorLocalizedAsync(strs.not_found);
{ // return;
await ReplyErrorLocalizedAsync(strs.not_found); // }
return; //
} // await SendNhentaiGalleryInternalAsync(g);
// }
await SendNhentaiGalleryInternalAsync(g); //
} // private async Task SendNhentaiGalleryInternalAsync(Gallery g)
// {
private async Task SendNhentaiGalleryInternalAsync(Gallery g) // var count = 0;
{ // var tagString = g.Tags.Shuffle()
var count = 0; // .Select(tag => $"[{tag.Name}]({tag.Url})")
var tagString = g.Tags.Shuffle() // .TakeWhile(tag => (count += tag.Length) < 1000)
.Select(tag => $"[{tag.Name}]({tag.Url})") // .Join(" ");
.TakeWhile(tag => (count += tag.Length) < 1000) //
.Join(" "); // var embed = _eb.Create()
// .WithTitle(g.Title)
var embed = _eb.Create() // .WithDescription(g.FullTitle)
.WithTitle(g.Title) // .WithImageUrl(g.Thumbnail)
.WithDescription(g.FullTitle) // .WithUrl(g.Url)
.WithImageUrl(g.Thumbnail) // .AddField(GetText(strs.favorites), g.Likes, true)
.WithUrl(g.Url) // .AddField(GetText(strs.pages), g.PageCount, true)
.AddField(GetText(strs.favorites), g.Likes, true) // .AddField(GetText(strs.tags),
.AddField(GetText(strs.pages), g.PageCount, true) // string.IsNullOrWhiteSpace(tagString)
.AddField(GetText(strs.tags), // ? "?"
string.IsNullOrWhiteSpace(tagString) // : tagString,
? "?" // true)
: tagString, // .WithFooter(g.UploadedAt.ToString("f"))
true) // .WithOkColor();
.WithFooter(g.UploadedAt.ToString("f")) //
.WithOkColor(); // await ctx.Channel.EmbedAsync(embed);
// }
await ctx.Channel.EmbedAsync(embed);
}
private async Task InternalDapiCommand( private async Task InternalDapiCommand(
string[] tags, string[] tags,

View File

@@ -19,17 +19,15 @@ public class SearchImagesService : ISearchImagesService, INService
private readonly SearchImageCacher _cache; private readonly SearchImageCacher _cache;
private readonly IHttpClientFactory _httpFactory; private readonly IHttpClientFactory _httpFactory;
private readonly DbService _db; private readonly DbService _db;
private readonly INhentaiService _nh;
private readonly object _taglock = new(); private readonly object _taglock = new();
public SearchImagesService( public SearchImagesService(
DbService db, DbService db,
SearchImageCacher cacher, SearchImageCacher cacher,
IHttpClientFactory httpFactory, IHttpClientFactory httpFactory
INhentaiService nh) )
{ {
_nh = nh;
_db = db; _db = db;
_rng = new NadekoRandom(); _rng = new NadekoRandom();
_cache = cacher; _cache = cacher;
@@ -277,6 +275,7 @@ public class SearchImagesService : ISearchImagesService, INService
} }
} }
/*
#region Nhentai #region Nhentai
public Task<Gallery?> GetNhentaiByIdAsync(uint id) public Task<Gallery?> GetNhentaiByIdAsync(uint id)
@@ -294,4 +293,5 @@ public class SearchImagesService : ISearchImagesService, INService
} }
#endregion #endregion
*/
} }

View File

@@ -664,8 +664,6 @@ avatar:
- av - av
hentai: hentai:
- hentai - hentai
nhentai:
- nhentai
danbooru: danbooru:
- danbooru - danbooru
derpibooru: derpibooru:

View File

@@ -1117,11 +1117,6 @@ hentai:
desc: "Shows a hentai image from a random website (gelbooru, danbooru, konachan or yandere) with a given tag. Tag(s) are optional but preferred. Maximum is usually 2 tags. Only 1 tag allowed." desc: "Shows a hentai image from a random website (gelbooru, danbooru, konachan or yandere) with a given tag. Tag(s) are optional but preferred. Maximum is usually 2 tags. Only 1 tag allowed."
args: args:
- "yuri" - "yuri"
nhentai:
desc: "Shows basic information about a hentai with the specified id, or a valid nhentai search query."
args:
- "273426"
- "cute girl"
autohentai: autohentai:
desc: "Posts a hentai every X seconds with a random tag from the provided tags. Use `|` to separate tag groups. Random group will be chosen every time the image is sent. Max 2 tags per group. 20 seconds minimum. Provide no parameters to disable." desc: "Posts a hentai every X seconds with a random tag from the provided tags. Use `|` to separate tag groups. Random group will be chosen every time the image is sent. Max 2 tags per group. 20 seconds minimum. Provide no parameters to disable."
args: args: