NadekoBot/src/NadekoBot/Modules/NSFW/NSFW.cs

294 lines
11 KiB
C#
Raw Normal View History

2016-08-15 14:57:40 +00:00
using Discord;
using Discord.Commands;
using NadekoBot.Attributes;
using Newtonsoft.Json.Linq;
using System;
using System.Linq;
using System.Threading.Tasks;
using NadekoBot.Services;
using System.Net.Http;
using System.Text.RegularExpressions;
2016-08-15 16:46:40 +00:00
using System.Xml.Linq;
2016-08-18 21:00:54 +00:00
using System.Net;
using Discord.WebSocket;
using NadekoBot.Extensions;
2016-08-15 14:57:40 +00:00
namespace NadekoBot.Modules.NSFW
{
[NadekoModule("NSFW", "~")]
2016-08-18 21:00:54 +00:00
public class NSFW : DiscordModule
2016-08-15 14:57:40 +00:00
{
public NSFW(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client)
2016-08-15 14:57:40 +00:00
{
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task Hentai(IUserMessage umsg, [Remainder] string tag = null)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
tag = tag?.Trim() ?? "";
var links = await Task.WhenAll(GetGelbooruImageLink("rating%3Aexplicit+" + tag), GetDanbooruImageLink("rating%3Aexplicit+" + tag)).ConfigureAwait(false);
if (links.All(l => l == null))
{
await channel.SendMessageAsync("`No results.`");
2016-08-15 14:57:40 +00:00
return;
}
await channel.SendMessageAsync(String.Join("\n\n", links)).ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
2016-11-05 17:57:34 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task ATFbooru(IUserMessage umsg, [Remainder] string tag = null)
{
var channel = (ITextChannel)umsg.Channel;
tag = tag?.Trim() ?? "";
var link = await GetATFbooruImageLink(tag).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(link))
await channel.SendMessageAsync("Search yielded no results ;(");
else
await channel.SendMessageAsync(link).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task Danbooru(IUserMessage umsg, [Remainder] string tag = null)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
tag = tag?.Trim() ?? "";
var link = await GetDanbooruImageLink(tag).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(link))
await channel.SendMessageAsync("Search yielded no results ;(");
2016-08-15 14:57:40 +00:00
else
await channel.SendMessageAsync(link).ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
2016-10-19 04:22:18 +00:00
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Konachan(IUserMessage umsg, [Remainder] string tag = null)
{
var channel = (ITextChannel)umsg.Channel;
tag = tag?.Trim() ?? "";
var link = await GetKonachanImageLink(tag).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(link))
await channel.SendMessageAsync("Search yielded no results ;(");
else
await channel.SendMessageAsync(link).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task Gelbooru(IUserMessage umsg, [Remainder] string tag = null)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
tag = tag?.Trim() ?? "";
var link = await GetGelbooruImageLink(tag).ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
if (string.IsNullOrWhiteSpace(link))
await channel.SendMessageAsync("Search yielded no results ;(");
2016-08-15 14:57:40 +00:00
else
await channel.SendMessageAsync(link).ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task Rule34(IUserMessage umsg, [Remainder] string tag = null)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
tag = tag?.Trim() ?? "";
var link = await GetRule34ImageLink(tag).ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
if (string.IsNullOrWhiteSpace(link))
await channel.SendMessageAsync("Search yielded no results ;(");
2016-08-15 14:57:40 +00:00
else
await channel.SendMessageAsync(link).ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task E621(IUserMessage umsg, [Remainder] string tag = null)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
tag = tag?.Trim() ?? "";
var link = await GetE621ImageLink(tag).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(link))
await channel.SendMessageAsync("Search yielded no results ;(");
2016-08-15 14:57:40 +00:00
else
await channel.SendMessageAsync(link).ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task Cp(IUserMessage umsg)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
await channel.SendMessageAsync("http://i.imgur.com/MZkY1md.jpg").ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task Boobs(IUserMessage umsg)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
try
{
JToken obj;
using (var http = new HttpClient())
{
obj = JArray.Parse(await http.GetStringAsync($"http://api.oboobs.ru/boobs/{ new NadekoRandom().Next(0, 9880) }").ConfigureAwait(false))[0];
2016-08-15 14:57:40 +00:00
}
await channel.SendMessageAsync($"http://media.oboobs.ru/{ obj["preview"].ToString() }").ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
catch (Exception ex)
{
await channel.SendMessageAsync($"💢 {ex.Message}").ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
}
[NadekoCommand, Usage, Description, Aliases]
2016-08-15 14:57:40 +00:00
[RequireContext(ContextType.Guild)]
public async Task Butts(IUserMessage umsg)
2016-08-15 14:57:40 +00:00
{
var channel = (ITextChannel)umsg.Channel;
2016-08-15 14:57:40 +00:00
try
{
JToken obj;
using (var http = new HttpClient())
{
obj = JArray.Parse(await http.GetStringAsync($"http://api.obutts.ru/butts/{ new NadekoRandom().Next(0, 3873) }").ConfigureAwait(false))[0];
2016-08-15 14:57:40 +00:00
}
await channel.SendMessageAsync($"http://media.obutts.ru/{ obj["preview"].ToString() }").ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
catch (Exception ex)
{
await channel.SendMessageAsync($"💢 {ex.Message}").ConfigureAwait(false);
2016-08-15 14:57:40 +00:00
}
}
2016-10-19 04:22:18 +00:00
public static async Task<string> GetKonachanImageLink(string tag)
{
var rng = new NadekoRandom();
var link = $"http://konachan.com/post?" +
$"page={rng.Next(0, 5)}";
if (!string.IsNullOrWhiteSpace(tag))
link += $"&tags={tag.Replace(" ", "_")}";
using (var http = new HttpClient())
{
var webpage = await http.GetStringAsync(link).ConfigureAwait(false);
var matches = Regex.Matches(webpage, "<a class=\"directlink largeimg\" href=\"(?<ll>.*?)\">");
if (matches.Count == 0)
return null;
return await NadekoBot.Google.ShortenUrl(matches[rng.Next(0, matches.Count)].Groups["ll"].Value).ConfigureAwait(false);
}
}
2016-08-15 14:57:40 +00:00
public static async Task<string> GetDanbooruImageLink(string tag)
{
var rng = new NadekoRandom();
2016-08-15 14:57:40 +00:00
if (tag == "loli") //loli doesn't work for some reason atm
tag = "flat_chest";
var link = $"http://danbooru.donmai.us/posts?" +
$"page={rng.Next(0, 15)}";
if (!string.IsNullOrWhiteSpace(tag))
link += $"&tags={tag.Replace(" ", "_")}";
using (var http = new HttpClient())
{
var webpage = await http.GetStringAsync(link).ConfigureAwait(false);
var matches = Regex.Matches(webpage, "data-large-file-url=\"(?<id>.*?)\"");
if (matches.Count == 0)
return null;
return $"http://danbooru.donmai.us" +
$"{matches[rng.Next(0, matches.Count)].Groups["id"].Value}";
}
}
public static async Task<string> GetGelbooruImageLink(string tag)
{
2016-08-15 16:46:40 +00:00
using (var http = new HttpClient())
{
http.AddFakeHeaders();
2016-08-15 16:46:40 +00:00
var webpage = await http.GetStringAsync("http://gelbooru.com/index.php?page=dapi&s=post&q=index&limit=100&tags="+ tag.Replace(" ", "_")).ConfigureAwait(false);
var matches = Regex.Matches(webpage, "file_url=\"(?<url>.*?)\"");
if (matches.Count == 0)
return null;
var rng = new NadekoRandom();
2016-08-15 16:46:40 +00:00
var match = matches[rng.Next(0, matches.Count)];
return matches[rng.Next(0, matches.Count)].Groups["url"].Value;
}
2016-08-15 14:57:40 +00:00
}
public static async Task<string> GetRule34ImageLink(string tag)
{
var rng = new NadekoRandom();
2016-08-15 14:57:40 +00:00
var url =
$"http://rule34.xxx/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}";
2016-08-15 16:46:40 +00:00
using (var http = new HttpClient())
{
var webpage = await http.GetStringAsync(url).ConfigureAwait(false);
var matches = Regex.Matches(webpage, "file_url=\"(?<url>.*?)\"");
if (matches.Count == 0)
return null;
var match = matches[rng.Next(0, matches.Count)];
return "http:" + matches[rng.Next(0, matches.Count)].Groups["url"].Value;
}
2016-08-15 14:57:40 +00:00
}
2016-09-01 01:12:08 +00:00
public static async Task<string> GetE621ImageLink(string tags)
2016-08-15 14:57:40 +00:00
{
try
{
2016-08-15 16:46:40 +00:00
using (var http = new HttpClient())
{
http.AddFakeHeaders();
2016-08-18 21:00:54 +00:00
var data = await http.GetStreamAsync("http://e621.net/post/index.xml?tags=" + Uri.EscapeUriString(tags) + "%20order:random&limit=1");
2016-08-15 16:46:40 +00:00
var doc = XDocument.Load(data);
return doc.Descendants("file_url").FirstOrDefault().Value;
}
2016-08-15 14:57:40 +00:00
}
catch (Exception ex)
{
Console.WriteLine("Error in e621 search: \n" + ex);
return "Error, do you have too many tags?";
}
}
2016-11-05 17:57:34 +00:00
public static async Task<string> GetATFbooruImageLink(string tag)
{
var rng = new NadekoRandom();
var link = $"https://atfbooru.ninja/posts?" +
$"limit=100";
if (!string.IsNullOrWhiteSpace(tag))
link += $"&tags={tag.Replace(" ", "+")}";
using (var http = new HttpClient())
{
var webpage = await http.GetStringAsync(link).ConfigureAwait(false);
var matches = Regex.Matches(webpage, "data-file-url=\"(?<id>.*?)\"");
if (matches.Count == 0)
return null;
return $"https://atfbooru.ninja" +
$"{matches[rng.Next(0, matches.Count)].Groups["id"].Value}";
}
}
2016-08-15 14:57:40 +00:00
}
}