added ~mal command
This commit is contained in:
		@@ -1,4 +1,7 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using AngleSharp;
 | 
			
		||||
using AngleSharp.Dom.Html;
 | 
			
		||||
using AngleSharp.Extensions;
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Attributes;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
@@ -8,6 +11,7 @@ using Newtonsoft.Json.Linq;
 | 
			
		||||
using NLog;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Net.Http;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
@@ -52,6 +56,116 @@ namespace NadekoBot.Modules.Searches
 | 
			
		||||
                }, null, TimeSpan.FromSeconds(0), TimeSpan.FromMinutes(29));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            [Priority(1)]
 | 
			
		||||
            public async Task Mal([Remainder] string name)
 | 
			
		||||
            {
 | 
			
		||||
                if (string.IsNullOrWhiteSpace(name))
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                var fullQueryLink = "https://myanimelist.net/profile/" + name;
 | 
			
		||||
 | 
			
		||||
                var config = Configuration.Default.WithDefaultLoader();
 | 
			
		||||
                var document = await BrowsingContext.New(config).OpenAsync(fullQueryLink);
 | 
			
		||||
 | 
			
		||||
                var imageElem = document.QuerySelector("body > div#myanimelist > div.wrapper > div#contentWrapper > div#content > div.content-container > div.container-left > div.user-profile > div.user-image > img");
 | 
			
		||||
                var imageUrl = ((IHtmlImageElement)imageElem)?.Source ?? "http://icecream.me/uploads/870b03f36b59cc16ebfe314ef2dde781.png";
 | 
			
		||||
 | 
			
		||||
                var stats = document.QuerySelectorAll("body > div#myanimelist > div.wrapper > div#contentWrapper > div#content > div.content-container > div.container-right > div#statistics > div.user-statistics-stats > div.stats > div.clearfix > ul.stats-status > li > span").Select(x => x.InnerHtml).ToList();
 | 
			
		||||
 | 
			
		||||
                var favorites = document.QuerySelectorAll("div.user-favorites > div.di-tc");
 | 
			
		||||
 | 
			
		||||
                var favAnime = "No favorite anime yet";
 | 
			
		||||
                if (favorites[0].QuerySelector("p") == null)
 | 
			
		||||
                    favAnime = string.Join("\n", favorites[0].QuerySelectorAll("ul > li > div.di-tc.va-t > a")
 | 
			
		||||
                       .Shuffle()
 | 
			
		||||
                       .Take(3)
 | 
			
		||||
                       .Select(x =>
 | 
			
		||||
                       {
 | 
			
		||||
                           var elem = (IHtmlAnchorElement)x;
 | 
			
		||||
                           return $"[{elem.InnerHtml}]({elem.Href})";
 | 
			
		||||
                       }));
 | 
			
		||||
 | 
			
		||||
                //var favManga = "No favorite manga yet.";
 | 
			
		||||
                //if (favorites[1].QuerySelector("p") == null)
 | 
			
		||||
                //    favManga = string.Join("\n", favorites[1].QuerySelectorAll("ul > li > div.di-tc.va-t > a")
 | 
			
		||||
                //       .Take(3)
 | 
			
		||||
                //       .Select(x =>
 | 
			
		||||
                //       {
 | 
			
		||||
                //           var elem = (IHtmlAnchorElement)x;
 | 
			
		||||
                //           return $"[{elem.InnerHtml}]({elem.Href})";
 | 
			
		||||
                //       }));
 | 
			
		||||
 | 
			
		||||
                var info = document.QuerySelectorAll("ul.user-status:nth-child(3) > li")
 | 
			
		||||
                    .Select(x => Tuple.Create(x.Children[0].InnerHtml, x.Children[1].InnerHtml))
 | 
			
		||||
                    .ToList();
 | 
			
		||||
 | 
			
		||||
                var daysAndMean = document.QuerySelectorAll("div.anime:nth-child(1) > div:nth-child(2) > div")
 | 
			
		||||
                    .Select(x => x.TextContent.Split(':').Select(y => y.Trim()).ToArray())
 | 
			
		||||
                    .ToArray();
 | 
			
		||||
 | 
			
		||||
                var embed = new EmbedBuilder()
 | 
			
		||||
                    .WithOkColor()
 | 
			
		||||
                    .WithTitle($"{name}'s MAL profile")
 | 
			
		||||
                    .AddField(efb => efb.WithName("💚 Watching").WithValue(stats[0]).WithIsInline(true))
 | 
			
		||||
                    .AddField(efb => efb.WithName("💙 Completed").WithValue(stats[1]).WithIsInline(true));
 | 
			
		||||
                if (info.Count < 3)
 | 
			
		||||
                    embed.AddField(efb => efb.WithName("💛 On-Hold").WithValue(stats[2]).WithIsInline(true));
 | 
			
		||||
                embed
 | 
			
		||||
                    .AddField(efb => efb.WithName("💔 Dropped").WithValue(stats[3]).WithIsInline(true))
 | 
			
		||||
                    .AddField(efb => efb.WithName("⚪ Plan to watch").WithValue(stats[4]).WithIsInline(true))
 | 
			
		||||
                    .AddField(efb => efb.WithName("🕐 " + daysAndMean[0][0]).WithValue(daysAndMean[0][1]).WithIsInline(true))
 | 
			
		||||
                    .AddField(efb => efb.WithName("📊 " + daysAndMean[1][0]).WithValue(daysAndMean[1][1]).WithIsInline(true))
 | 
			
		||||
                    .AddField(efb => efb.WithName(MalInfoToEmoji(info[0].Item1) + " " + info[0].Item1).WithValue(info[0].Item2.TrimTo(20)).WithIsInline(true))
 | 
			
		||||
                    .AddField(efb => efb.WithName(MalInfoToEmoji(info[1].Item1) + " " + info[1].Item1).WithValue(info[1].Item2.TrimTo(20)).WithIsInline(true));
 | 
			
		||||
                if (info.Count > 2)
 | 
			
		||||
                    embed.AddField(efb => efb.WithName(MalInfoToEmoji(info[2].Item1) + " " + info[2].Item1).WithValue(info[2].Item2.TrimTo(20)).WithIsInline(true));
 | 
			
		||||
                //if(info.Count > 3)
 | 
			
		||||
                //    embed.AddField(efb => efb.WithName(MalInfoToEmoji(info[3].Item1) + " " + info[3].Item1).WithValue(info[3].Item2).WithIsInline(true))
 | 
			
		||||
                embed
 | 
			
		||||
                    .WithDescription($@"
 | 
			
		||||
** https://myanimelist.net/animelist/{ name } **
 | 
			
		||||
 | 
			
		||||
**Top 3 Favorite Anime:**
 | 
			
		||||
{favAnime}"
 | 
			
		||||
 | 
			
		||||
//**[Manga List](https://myanimelist.net/mangalist/{name})**
 | 
			
		||||
//💚`Reading:` {stats[5]}
 | 
			
		||||
//💙`Completed:` {stats[6]}
 | 
			
		||||
//💔`Dropped:` {stats[8]}
 | 
			
		||||
//⚪`Plan to read:` {stats[9]}
 | 
			
		||||
 | 
			
		||||
//**Top 3 Favorite Manga:**
 | 
			
		||||
//{favManga}"
 | 
			
		||||
 | 
			
		||||
)
 | 
			
		||||
                    .WithUrl(fullQueryLink)
 | 
			
		||||
                    .WithImageUrl(imageUrl);
 | 
			
		||||
 | 
			
		||||
                await Context.Channel.EmbedAsync(embed).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private static string MalInfoToEmoji(string info) {
 | 
			
		||||
                info = info.Trim().ToLowerInvariant();
 | 
			
		||||
                switch (info)
 | 
			
		||||
                {
 | 
			
		||||
                    case "gender":
 | 
			
		||||
                        return "🚁";
 | 
			
		||||
                    case "location":
 | 
			
		||||
                        return "🗺";
 | 
			
		||||
                    case "last online":
 | 
			
		||||
                        return "👥";
 | 
			
		||||
                    case "birthday":
 | 
			
		||||
                        return "📆";
 | 
			
		||||
                    default:
 | 
			
		||||
                        return "❔";
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            [Priority(0)]
 | 
			
		||||
            public Task Mal(IUser usr) => Mal(usr.Username);
 | 
			
		||||
 | 
			
		||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
			
		||||
            public async Task Anime([Remainder] string query)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										27
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							@@ -4406,6 +4406,33 @@ namespace NadekoBot.Resources {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to mal.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string mal_cmd {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("mal_cmd", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to Shows basic info from myanimelist profile..
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string mal_desc {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("mal_desc", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to `{0}mal straysocks`.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string mal_usage {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("mal_usage", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to manga mang mq.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -3024,4 +3024,13 @@
 | 
			
		||||
  <data name="waifuinfo_usage" xml:space="preserve">
 | 
			
		||||
    <value>`{0}waifuinfo @MyCrush` or `{0}waifuinfo`</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="mal_cmd" xml:space="preserve">
 | 
			
		||||
    <value>mal</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="mal_desc" xml:space="preserve">
 | 
			
		||||
    <value>Shows basic info from myanimelist profile.</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="mal_usage" xml:space="preserve">
 | 
			
		||||
    <value>`{0}mal straysocks`</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
		Reference in New Issue
	
	Block a user