Added anime and manga search w/o restsharp
This commit is contained in:
		| @@ -1,99 +1,134 @@ | ||||
| //using Discord; | ||||
| //using Discord.Commands; | ||||
| //using NadekoBot.Attributes; | ||||
| //using System; | ||||
| //using System.Collections.Generic; | ||||
| //using System.Linq; | ||||
| //using System.Threading.Tasks; | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Modules.Searches.Models; | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| //// todo RestSharp | ||||
| //namespace NadekoBot.Modules.Searches | ||||
| //{ | ||||
| //    public partial class SearchesModule | ||||
| //    { | ||||
| //        [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
| //        [RequireContext(ContextType.Guild)] | ||||
| //        public async Task Anime(IUserMessage umsg, [Remainder] string query = null) | ||||
| //        { | ||||
| //            var channel = (ITextChannel)umsg.Channel; | ||||
| // todo RestSharp | ||||
| namespace NadekoBot.Modules.Searches | ||||
| { | ||||
|     public partial class Searches | ||||
|     { | ||||
|         [Group] | ||||
|         public class AnimeSearchCommands | ||||
|         { | ||||
|             private Logger _log; | ||||
|  | ||||
| //            if (!(await ValidateQuery(umsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; | ||||
| //            string result; | ||||
| //            try | ||||
| //            { | ||||
| //                result = (await GetAnimeData(query).ConfigureAwait(false)).ToString(); | ||||
| //            } | ||||
| //            catch | ||||
| //            { | ||||
| //                await channel.SendMessageAsync("Failed to find that anime.").ConfigureAwait(false); | ||||
| //                return; | ||||
| //            } | ||||
|             private string anilistToken { get; set; } | ||||
|             private DateTime lastRefresh { get; set; } | ||||
|  | ||||
| //            await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); | ||||
| //        } | ||||
|             public AnimeSearchCommands() | ||||
|             { | ||||
|                 _log = LogManager.GetCurrentClassLogger(); | ||||
|             } | ||||
|  | ||||
| //        [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
| //        [RequireContext(ContextType.Guild)] | ||||
| //        public async Task Manga(IUserMessage umsg, [Remainder] string query = null) | ||||
| //        { | ||||
| //            var channel = (ITextChannel)umsg.Channel; | ||||
|             [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task Anime(IUserMessage umsg, [Remainder] string query) | ||||
|             { | ||||
|                 var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
| //            if (!(await ValidateQuery(umsg.Channel as ITextChannel, query).ConfigureAwait(false))) return; | ||||
| //            string result; | ||||
| //            try | ||||
| //            { | ||||
| //                result = (await GetMangaData(query).ConfigureAwait(false)).ToString(); | ||||
| //            } | ||||
| //            catch | ||||
| //            { | ||||
| //                await channel.SendMessageAsync("Failed to find that manga.").ConfigureAwait(false); | ||||
| //                return; | ||||
| //            } | ||||
| //            await channel.SendMessageAsync(result).ConfigureAwait(false); | ||||
| //        } | ||||
|                 if (string.IsNullOrWhiteSpace(query)) | ||||
|                     return; | ||||
|  | ||||
| //        public static async Task<AnimeResult> GetAnimeData(string query) | ||||
| //        { | ||||
| //            if (string.IsNullOrWhiteSpace(query)) | ||||
| //                throw new ArgumentNullException(nameof(query)); | ||||
|                 var result = await GetAnimeData(query).ConfigureAwait(false); | ||||
|  | ||||
| //            await RefreshAnilistToken().ConfigureAwait(false); | ||||
|                 await channel.SendMessageAsync(result.ToString() ?? "`No anime found.`").ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
| //            var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); | ||||
| //            var smallContent = ""; | ||||
| //            var cl = new RestSharp.RestClient("http://anilist.co/api"); | ||||
| //            var rq = new RestSharp.RestRequest("/anime/search/" + Uri.EscapeUriString(query)); | ||||
| //            rq.AddParameter("access_token", token); | ||||
| //            smallContent = cl.Execute(rq).Content; | ||||
| //            var smallObj = JArray.Parse(smallContent)[0]; | ||||
|             [LocalizedCommand, LocalizedDescription, LocalizedSummary] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task Manga(IUserMessage umsg, [Remainder] string query) | ||||
|             { | ||||
|                 var channel = (ITextChannel)umsg.Channel; | ||||
|  | ||||
| //            rq = new RestSharp.RestRequest("/anime/" + smallObj["id"]); | ||||
| //            rq.AddParameter("access_token", token); | ||||
| //            var content = cl.Execute(rq).Content; | ||||
|                 if (string.IsNullOrWhiteSpace(query)) | ||||
|                     return; | ||||
|  | ||||
| //            return await Task.Run(() => JsonConvert.DeserializeObject<AnimeResult>(content)).ConfigureAwait(false); | ||||
| //        } | ||||
|                 var result = await GetMangaData(query).ConfigureAwait(false); | ||||
|  | ||||
| //        public static async Task<MangaResult> GetMangaData(string query) | ||||
| //        { | ||||
| //            if (string.IsNullOrWhiteSpace(query)) | ||||
| //                throw new ArgumentNullException(nameof(query)); | ||||
|                 await channel.SendMessageAsync(result.ToString() ?? "`No manga found.`").ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
| //            await RefreshAnilistToken().ConfigureAwait(false); | ||||
|             private async Task<AnimeResult> GetAnimeData(string query) | ||||
|             { | ||||
|                 if (string.IsNullOrWhiteSpace(query)) | ||||
|                     throw new ArgumentNullException(nameof(query)); | ||||
|                 try | ||||
|                 { | ||||
|                     await RefreshAnilistToken().ConfigureAwait(false); | ||||
|  | ||||
| //            var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); | ||||
| //            var smallContent = ""; | ||||
| //            var cl = new RestSharp.RestClient("http://anilist.co/api"); | ||||
| //            var rq = new RestSharp.RestRequest("/manga/search/" + Uri.EscapeUriString(query)); | ||||
| //            rq.AddParameter("access_token", token); | ||||
| //            smallContent = cl.Execute(rq).Content; | ||||
| //            var smallObj = JArray.Parse(smallContent)[0]; | ||||
|                     var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); | ||||
|                     using (var http = new HttpClient()) | ||||
|                     { | ||||
|                         var res = await http.GetStringAsync("http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query) + $"?access_token={anilistToken}").ConfigureAwait(false); | ||||
|                         var smallObj = JArray.Parse(res)[0]; | ||||
|                         var aniData = await http.GetStringAsync("http://anilist.co/api/anime/" + smallObj["id"] + $"?access_token={anilistToken}").ConfigureAwait(false); | ||||
|  | ||||
| //            rq = new RestSharp.RestRequest("/manga/" + smallObj["id"]); | ||||
| //            rq.AddParameter("access_token", token); | ||||
| //            var content = cl.Execute(rq).Content; | ||||
|                         return await Task.Run(() => JsonConvert.DeserializeObject<AnimeResult>(aniData)).ConfigureAwait(false); | ||||
|                     } | ||||
|                 } | ||||
|                 catch (Exception ex) { | ||||
|                     _log.Warn(ex, "Failed anime search for {0}", query); | ||||
|                     return null; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| //            return await Task.Run(() => JsonConvert.DeserializeObject<MangaResult>(content)).ConfigureAwait(false); | ||||
| //        } | ||||
| //    } | ||||
| //} | ||||
|             private async Task RefreshAnilistToken() | ||||
|             { | ||||
|                 if (DateTime.Now - lastRefresh > TimeSpan.FromMinutes(29)) | ||||
|                     lastRefresh = DateTime.Now; | ||||
|                 else | ||||
|                 { | ||||
|                     return; | ||||
|                 } | ||||
|                 var headers = new Dictionary<string, string> { | ||||
|                     {"grant_type", "client_credentials"}, | ||||
|                     {"client_id", "kwoth-w0ki9"}, | ||||
|                     {"client_secret", "Qd6j4FIAi1ZK6Pc7N7V4Z"}, | ||||
|                 }; | ||||
|                 using (var http = new HttpClient()) | ||||
|                 { | ||||
|                     http.AddFakeHeaders(); | ||||
|                     var formContent = new FormUrlEncodedContent(headers); | ||||
|                     var response = await http.PostAsync("http://anilist.co/api/auth/access_token", formContent).ConfigureAwait(false); | ||||
|                     var stringContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); | ||||
|                     anilistToken = JObject.Parse(stringContent)["access_token"].ToString(); | ||||
|                 } | ||||
|                  | ||||
|             } | ||||
|  | ||||
|             private async Task<MangaResult> GetMangaData(string query) | ||||
|             { | ||||
|                 if (string.IsNullOrWhiteSpace(query)) | ||||
|                     throw new ArgumentNullException(nameof(query)); | ||||
|                 try | ||||
|                 { | ||||
|                     await RefreshAnilistToken().ConfigureAwait(false); | ||||
|                     using (var http = new HttpClient()) | ||||
|                     { | ||||
|                         var res = await http.GetStringAsync("http://anilist.co/api/manga/search/" + Uri.EscapeUriString(query) + $"?access_token={anilistToken}").ConfigureAwait(false); | ||||
|                         var smallObj = JArray.Parse(res)[0]; | ||||
|                         //todo check if successfull | ||||
|                         var aniData = await http.GetStringAsync("http://anilist.co/api/manga/" + smallObj["id"] + $"?access_token={anilistToken}").ConfigureAwait(false); | ||||
|  | ||||
|                         return await Task.Run(() => JsonConvert.DeserializeObject<MangaResult>(aniData)).ConfigureAwait(false); | ||||
|                     } | ||||
|                 } | ||||
|                 catch (Exception ex) | ||||
|                 { | ||||
|                     _log.Warn(ex, "Failed anime search for {0}", query); | ||||
|                     return null; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| namespace NadekoBot.Classes.JSONModels | ||||
| namespace NadekoBot.Modules.Searches.Models | ||||
| { | ||||
|     public class AnimeResult | ||||
|     { | ||||
| @@ -1,4 +1,4 @@ | ||||
| namespace NadekoBot.Classes.JSONModels | ||||
| namespace NadekoBot.Modules.Searches.Models | ||||
| { | ||||
|     public class MangaResult | ||||
|     { | ||||
		Reference in New Issue
	
	Block a user