Ability to change wikipedia instance and make !wiki nicer
This commit is contained in:
parent
f5fd9ba017
commit
b97fca787c
4 changed files with 47 additions and 15 deletions
|
@ -138,6 +138,24 @@ namespace Geekbot.net.Commands
|
||||||
_errorHandler.HandleCommandException(e, Context);
|
_errorHandler.HandleCommandException(e, Context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Command("wiki", RunMode = RunMode.Async)]
|
||||||
|
[Remarks(CommandCategories.Admin)]
|
||||||
|
[Summary("Change the wikipedia instance (use lang code in xx.wikipedia.org)")]
|
||||||
|
public async Task setWikiLanguage([Summary("language")] string languageRaw)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var language = languageRaw.ToLower();
|
||||||
|
_redis.HashSet($"{Context.Guild.Id}:Settings", new[] {new HashEntry("WikiLang", language) });
|
||||||
|
|
||||||
|
await ReplyAsync($"Now using the {language} wikipedia");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_errorHandler.HandleCommandException(e, Context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Command("lang", RunMode = RunMode.Async)]
|
[Command("lang", RunMode = RunMode.Async)]
|
||||||
[Remarks(CommandCategories.Admin)]
|
[Remarks(CommandCategories.Admin)]
|
||||||
|
|
|
@ -5,9 +5,9 @@ using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.Net;
|
|
||||||
using Geekbot.net.Lib;
|
using Geekbot.net.Lib;
|
||||||
using HtmlAgilityPack;
|
using HtmlAgilityPack;
|
||||||
|
using StackExchange.Redis;
|
||||||
using WikipediaApi;
|
using WikipediaApi;
|
||||||
using WikipediaApi.Page;
|
using WikipediaApi.Page;
|
||||||
|
|
||||||
|
@ -17,11 +17,13 @@ namespace Geekbot.net.Commands
|
||||||
{
|
{
|
||||||
private readonly IErrorHandler _errorHandler;
|
private readonly IErrorHandler _errorHandler;
|
||||||
private readonly IWikipediaClient _wikipediaClient;
|
private readonly IWikipediaClient _wikipediaClient;
|
||||||
|
private readonly IDatabase _redis;
|
||||||
public Wikipedia(IErrorHandler errorHandler, IWikipediaClient wikipediaClient)
|
|
||||||
|
public Wikipedia(IErrorHandler errorHandler, IWikipediaClient wikipediaClient, IDatabase redis)
|
||||||
{
|
{
|
||||||
_errorHandler = errorHandler;
|
_errorHandler = errorHandler;
|
||||||
_wikipediaClient = wikipediaClient;
|
_wikipediaClient = wikipediaClient;
|
||||||
|
_redis = redis;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Command("wiki", RunMode = RunMode.Async)]
|
[Command("wiki", RunMode = RunMode.Async)]
|
||||||
|
@ -31,7 +33,12 @@ namespace Geekbot.net.Commands
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var article = await _wikipediaClient.GetPreview(articleName.Replace(" ", "_"));
|
var wikiLang = _redis.HashGet($"{Context.Guild.Id}:Settings", "WikiLang").ToString();
|
||||||
|
if (string.IsNullOrEmpty(wikiLang))
|
||||||
|
{
|
||||||
|
wikiLang = "en";
|
||||||
|
}
|
||||||
|
var article = await _wikipediaClient.GetPreview(articleName.Replace(" ", "_"), wikiLang);
|
||||||
|
|
||||||
if (article.Type != PageTypes.Standard)
|
if (article.Type != PageTypes.Standard)
|
||||||
{
|
{
|
||||||
|
@ -58,10 +65,20 @@ namespace Geekbot.net.Commands
|
||||||
var eb = new EmbedBuilder
|
var eb = new EmbedBuilder
|
||||||
{
|
{
|
||||||
Title = article.Title,
|
Title = article.Title,
|
||||||
Description = article.Extract,
|
Description = article.Description,
|
||||||
ImageUrl = article.Thumbnail?.Source.ToString(),
|
ImageUrl = article.Thumbnail?.Source.ToString(),
|
||||||
Url = article.ContentUrls.Desktop.Page.ToString()
|
Url = article.ContentUrls.Desktop.Page.ToString(),
|
||||||
|
Color = new Color(246,246,246),
|
||||||
|
Timestamp = article.Timestamp,
|
||||||
|
Footer = new EmbedFooterBuilder
|
||||||
|
{
|
||||||
|
Text = "Last Edit",
|
||||||
|
IconUrl = "http://icons.iconarchive.com/icons/sykonist/popular-sites/256/Wikipedia-icon.png"
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
eb.AddField("Description", article.Extract);
|
||||||
|
if (article.Coordinates != null) eb.AddField("Coordinates", $"{article.Coordinates.lat} Lat {article.Coordinates.lon} Lon");
|
||||||
await ReplyAsync("", false, eb.Build());
|
await ReplyAsync("", false, eb.Build());
|
||||||
}
|
}
|
||||||
catch (HttpRequestException)
|
catch (HttpRequestException)
|
||||||
|
@ -86,7 +103,7 @@ namespace Geekbot.net.Commands
|
||||||
var split = node.InnerText.Split(',');
|
var split = node.InnerText.Split(',');
|
||||||
var title = split.First();
|
var title = split.First();
|
||||||
var desc = string.Join(",", split.Skip(1));
|
var desc = string.Join(",", split.Skip(1));
|
||||||
sb.AppendLine($"**{title}** - {desc}");
|
sb.AppendLine($"• **{title}** -{desc}");
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
|
|
@ -5,6 +5,6 @@ namespace WikipediaApi
|
||||||
{
|
{
|
||||||
public interface IWikipediaClient
|
public interface IWikipediaClient
|
||||||
{
|
{
|
||||||
Task<PagePreview> GetPreview(string pageName);
|
Task<PagePreview> GetPreview(string pageName, string language = "en");
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -9,17 +9,14 @@ namespace WikipediaApi
|
||||||
public class WikipediaClient : IWikipediaClient
|
public class WikipediaClient : IWikipediaClient
|
||||||
{
|
{
|
||||||
private readonly HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
public WikipediaClient(string language = "en")
|
public WikipediaClient()
|
||||||
{
|
{
|
||||||
_httpClient = new HttpClient
|
_httpClient = new HttpClient();
|
||||||
{
|
|
||||||
BaseAddress = new Uri($"https://{language}.wikipedia.org")
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PagePreview> GetPreview(string pageName)
|
public async Task<PagePreview> GetPreview(string pageName, string language = "en")
|
||||||
{
|
{
|
||||||
var response = await _httpClient.GetAsync($"/api/rest_v1/page/summary/{pageName}");
|
var response = await _httpClient.GetAsync($"https://{language}.wikipedia.org/api/rest_v1/page/summary/{pageName}");
|
||||||
response.EnsureSuccessStatusCode();
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
var stringResponse = await response.Content.ReadAsStringAsync();
|
var stringResponse = await response.Content.ReadAsStringAsync();
|
||||||
|
|
Loading…
Reference in a new issue