dsharp-bot/Bot_Discord_CSharp/Commands/TestCommand.cs
Álvaro Gómez Cuenca 171a935d21 Actualiced commands
2020-12-09 16:03:20 +01:00

210 lines
8.1 KiB
C#

using DSharpPlus.CommandsNext;
using DSharpPlus.CommandsNext.Attributes;
using DSharpPlus.Entities;
using DSharpPlus.Interactivity.Extensions;
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
namespace Bot_Discord_CSharp.Commands
{
class TestCommand : BaseCommandModule
{
[Command("ping")]
[Description("Dices ping y te responde pong")]
[RequireRoles(RoleCheckMode.Any, "Tester", "Senador")]
public async Task Ping(CommandContext ctx)
{
await ctx.Channel.SendMessageAsync("Pong").ConfigureAwait(false);
}
[Command("response")]
[Hidden]
public async Task Response(CommandContext ctx)
{
var interactivity = ctx.Client.GetInteractivity();
var message = await interactivity.WaitForMessageAsync(x => x.Channel == ctx.Channel && x.Author == ctx.User).ConfigureAwait(false);
await ctx.Channel.SendMessageAsync(message.Result.Content);
await ctx.Member.SendMessageAsync("Hijo de puta");
}
[Command("respondReaction")]
[Hidden]
public async Task ResponseReaction(CommandContext ctx)
{
var interactivity = ctx.Client.GetInteractivity();
var message = await interactivity.WaitForReactionAsync(x => x.Channel == ctx.Channel).ConfigureAwait(false);
await ctx.Channel.SendMessageAsync(message.Result.Emoji);
}
[Command("acontecimientos")]
[Description("Muestra todos los acontecimientos históricos que han pasado hoy")]
public async Task GetDocumentWeb(CommandContext ctx)
{
var interactivity = ctx.Client.GetInteractivity();
Uri address = new Uri("https://es.wikipedia.org/wiki/" + Today().Replace(" ", "_"));
HtmlNode node = GetHtmlNodeFromPage(address);
//< innertext >
int numH2 = 0;
List<ulong> emojiKeyList = ctx.Guild.Emojis.Keys.Cast<ulong>().ToList();
string extractedData = "";
DiscordEmbedBuilder embedBuilder = new DiscordEmbedBuilder();
List<DiscordEmbed> embedList = new List<DiscordEmbed>();
embedBuilder.WithTitle("Acontecimientos del día: " + Today());
foreach (HtmlNode line in node.Descendants())
{
if (line.Name.ToString() == "h2" && line.OuterHtml.Contains("mw-headline")) numH2++;
if (numH2 == 1 && line.Name == "li")
{
if (extractedData.Length + line.InnerText.Length > 2000)
{
embedList.Add(embedBuilder.WithDescription(extractedData).Build());
extractedData = "";
}
ulong randomEmoji = emojiKeyList[new Random().Next(0, emojiKeyList.Count)];
extractedData += DiscordEmoji.FromGuildEmote(ctx.Client, randomEmoji) + line.InnerText + "\n";
}
else if (numH2 > 1) break;
}
embedList.Add(embedBuilder.WithDescription(extractedData).Build());
await SendEmbeds(ctx, embedList);
}
[Command("fecha")]
[Description("Te devuelve la fecha de hoy")]
public async Task GetCurrentDay(CommandContext ctx)
{
await ctx.Channel.SendMessageAsync(Today());
}
[Command("borrar")]
[Description("Borra los últimos X mensajes o si no se pone nada los últimos 100")]
public async Task DeleteAllMessages(CommandContext ctx, params string[] command)
{
int numberOfMenssages;
if (!command.Any()) numberOfMenssages = 100;
else numberOfMenssages = Int32.Parse(command[0]);
IReadOnlyCollection<DiscordMessage> messages = await ctx.Channel.GetMessagesAsync(numberOfMenssages);
await ctx.Channel.DeleteMessagesAsync(messages);
}
[Command("random")]
[Description("Te da un número aleatorio entre 0 y X o entre X y Y")]
public async Task GetRandomNumber(CommandContext ctx, params string[] command)
{
if (!command.Any())
{
await ctx.Channel.SendMessageAsync("Se necesita uno o dos valores para funcionar." +
"\nEj: `!random 5` o `!random 5 10`");
} else
{
int length = command.Length;
await ctx.Channel.SendMessageAsync(new Random().Next(length > 1 ? Int32.Parse(command[0]) : 0,
Int32.Parse(command[length - 1]) + 1).ToString());
}
}
[Command("dice")]
[Description("Tira un dado de 6 caras")]
public async Task ThrowDice(CommandContext ctx)
{
await ctx.Channel.SendMessageAsync((new Random().Next(6) + 1).ToString());
}
[Command("coin")]
[Description("Tira una moneda")]
public async Task ThrowCoin(CommandContext ctx)
{
int randomValue = new Random().Next(2);
string ladoMoneda = randomValue == 0 ? "Cara" : "Cruz";
await ctx.Channel.SendMessageAsync(ladoMoneda);
}
private string Today()
{
DateTime currentTime = DateTime.Today;
IFormatProvider culture = new CultureInfo("es-ES", true);
string[] currentTimeToString = currentTime.GetDateTimeFormats('m', culture);
return currentTimeToString[0];
}
private HtmlNode GetHtmlNodeFromPage(Uri url)
{
WebClient webClient = new WebClient();
webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
string sDocument = webClient.DownloadString(url);
var document = new HtmlDocument();
document.LoadHtml(sDocument);
HtmlNode node = document.DocumentNode.SelectSingleNode("//div[@class=\"mw-parser-output\"]");
string output = node != null ? node.InnerText : "Error!!";
System.Diagnostics.Debug.WriteLine(output);
return node;
}
private async Task SendEmbeds(CommandContext ctx, List<DiscordEmbed> embedList)
{
List<string> colours = ProgresiveColour(embedList.Count());
for (int i = 0; i < embedList.Count; i++)
{
DiscordEmbedBuilder embedBuilder = new DiscordEmbedBuilder(embedList[i]);
embedBuilder.WithTitle(embedBuilder.Title + " | Parte " + (i+1) + "/" + embedList.Count());
embedBuilder.WithColor(new DiscordColor(colours[i]));
await ctx.Channel.SendMessageAsync("", false, embedBuilder.Build());
}
}
private List<string> ProgresiveColour(int steps)
{
List<string> colours = new List<string>();
for (int i = 1; i <= steps; i++)
{
int decimalHex = ColourCalculus(i, steps);
string hex = decimalHex.ToString("x");
colours.Add(FormatHex(hex));
}
return colours;
}
private int ColourCalculus(int iteration, int max)
{
if (iteration == 1)
{
return (int)((15 * Math.Pow(16, 5)) + (15 * Math.Pow(16, 4)));
}
if (iteration != 1 && iteration != max)
{
return (int)((15 / (iteration - 1) * Math.Pow(16, 5)) + (15 / (iteration - 1) * Math.Pow(16, 4))
+ (15 / (max - iteration) * Math.Pow(16, 3)) + (15 / (max - iteration) * Math.Pow(16, 2)));
}
return (int)((15 * Math.Pow(16, 3)) + (15 * Math.Pow(16, 2)));
}
private string FormatHex(string hex)
{
if (hex.Length == 4) return "#00" + hex;
return "#" + hex;
}
}
}