Merge remote-tracking branch 'refs/remotes/Kwoth/master'

# Conflicts:
#	NadekoBot/NadekoBot.cs
This commit is contained in:
appelemac
2016-03-27 11:00:29 +02:00
8 changed files with 861 additions and 50 deletions

View File

@ -1,20 +1,24 @@
using System;
using Discord.Commands;
using Discord.Modules;
using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;
using Discord.Commands;
using NadekoBot.Classes;
using NadekoBot.Classes.IMDB;
using NadekoBot.Commands;
using NadekoBot.Extensions;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using NadekoBot.Classes;
using NadekoBot.Commands;
using System.Net;
namespace NadekoBot.Modules {
internal class Searches : DiscordModule {
namespace NadekoBot.Modules
{
internal class Searches : DiscordModule
{
private readonly Random rng;
public Searches() {
public Searches()
{
commands.Add(new LoLCommands(this));
commands.Add(new StreamNotifications(this));
rng = new Random();
@ -22,8 +26,10 @@ namespace NadekoBot.Modules {
public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Searches;
public override void Install(ModuleManager manager) {
manager.CreateCommands("", cgb => {
public override void Install(ModuleManager manager)
{
manager.CreateCommands("", cgb =>
{
cgb.AddCheck(Classes.Permissions.PermissionChecker.Instance);
@ -33,7 +39,8 @@ namespace NadekoBot.Modules {
.Description("Shows weather data for a specified city and a country BOTH ARE REQUIRED. Weather api is very random if you make a mistake.")
.Parameter("city", ParameterType.Required)
.Parameter("country", ParameterType.Required)
.Do(async e => {
.Do(async e =>
{
var city = e.GetArg("city").Replace(" ", "");
var country = e.GetArg("country").Replace(" ", "");
var response = await SearchHelper.GetResponseStringAsync($"http://api.lawlypopzz.xyz/nadekobot/weather/?city={city}&country={country}");
@ -51,7 +58,8 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "yt")
.Parameter("query", ParameterType.Unparsed)
.Description("Searches youtubes and shows the first result")
.Do(async e => {
.Do(async e =>
{
if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")))) return;
var shortUrl = await SearchHelper.ShortenUrl(await SearchHelper.FindYoutubeUrlByKeywords(e.GetArg("query")));
@ -62,12 +70,16 @@ $@"🌍 **Weather for** 【{obj["target"]}】
.Alias(Prefix + "anime", Prefix + "aq")
.Parameter("query", ParameterType.Unparsed)
.Description("Queries anilist for an anime and shows the first result.")
.Do(async e => {
.Do(async e =>
{
if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")))) return;
string result;
try {
try
{
result = (await SearchHelper.GetAnimeData(e.GetArg("query"))).ToString();
} catch {
}
catch
{
await e.Channel.SendMessage("Failed to find that anime.");
return;
}
@ -75,16 +87,43 @@ $@"🌍 **Weather for** 【{obj["target"]}】
await e.Channel.SendMessage(result.ToString());
});
cgb.CreateCommand(Prefix + "imdb")
.Parameter("query", ParameterType.Unparsed)
.Description("Queries imdb for movies or series, show first result.")
.Do(async e =>
{
if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")))) return;
await e.Channel.SendIsTyping();
string result;
try
{
var movie = ImdbScraper.ImdbScrape(e.GetArg("query"), true);
if (movie.Status) result = movie.ToString();
else result = "Failed to find that movie.";
}
catch
{
await e.Channel.SendMessage("Failed to find that movie.");
return;
}
await e.Channel.SendMessage(result.ToString());
});
cgb.CreateCommand(Prefix + "mang")
.Alias(Prefix + "manga").Alias(Prefix + "mq")
.Parameter("query", ParameterType.Unparsed)
.Description("Queries anilist for a manga and shows the first result.")
.Do(async e => {
.Do(async e =>
{
if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")))) return;
string result;
try {
try
{
result = (await SearchHelper.GetMangaData(e.GetArg("query"))).ToString();
} catch {
}
catch
{
await e.Channel.SendMessage("Failed to find that anime.");
return;
}
@ -93,7 +132,8 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "randomcat")
.Description("Shows a random cat image.")
.Do(async e => {
.Do(async e =>
{
await e.Channel.SendMessage(JObject.Parse(
await SearchHelper.GetResponseStringAsync("http://www.random.cat/meow"))["file"].ToString());
});
@ -101,14 +141,18 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "i")
.Description("Pulls the first image found using a search parameter. Use ~ir for different results.\n**Usage**: ~i cute kitten")
.Parameter("query", ParameterType.Unparsed)
.Do(async e => {
.Do(async e =>
{
if (string.IsNullOrWhiteSpace(e.GetArg("query")))
return;
try {
try
{
var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(e.GetArg("query"))}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&fields=items%2Flink&key={NadekoBot.Creds.GoogleAPIKey}";
var obj = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString));
await e.Channel.SendMessage(obj["items"][0]["link"].ToString());
} catch (Exception ex) {
}
catch (Exception ex)
{
await e.Channel.SendMessage($"💢 {ex.Message}");
}
});
@ -116,21 +160,26 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "ir")
.Description("Pulls a random image using a search parameter.\n**Usage**: ~ir cute kitten")
.Parameter("query", ParameterType.Unparsed)
.Do(async e => {
.Do(async e =>
{
if (string.IsNullOrWhiteSpace(e.GetArg("query")))
return;
try {
try
{
var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(e.GetArg("query"))}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 150) }&fields=items%2Flink&key={NadekoBot.Creds.GoogleAPIKey}";
var obj = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString));
await e.Channel.SendMessage(obj["items"][0]["link"].ToString());
} catch (Exception ex) {
}
catch (Exception ex)
{
await e.Channel.SendMessage($"💢 {ex.Message}");
}
});
cgb.CreateCommand(Prefix + "lmgtfy")
.Description("Google something for an idiot.")
.Parameter("ffs", ParameterType.Unparsed)
.Do(async e => {
.Do(async e =>
{
if (e.GetArg("ffs") == null || e.GetArg("ffs").Length < 1) return;
await e.Channel.SendMessage(await $"http://lmgtfy.com/?q={ Uri.EscapeUriString(e.GetArg("ffs").ToString()) }".ShortenUrl());
});
@ -138,31 +187,38 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "hs")
.Description("Searches for a Hearthstone card and shows its image. Takes a while to complete.\n**Usage**:~hs Ysera")
.Parameter("name", ParameterType.Unparsed)
.Do(async e => {
.Do(async e =>
{
var arg = e.GetArg("name");
if (string.IsNullOrWhiteSpace(arg)) {
if (string.IsNullOrWhiteSpace(arg))
{
await e.Channel.SendMessage("💢 Please enter a card name to search for.");
return;
}
await e.Channel.SendIsTyping();
var headers = new Dictionary<string, string> { { "X-Mashape-Key", NadekoBot.Creds.MashapeKey } };
var res = await SearchHelper.GetResponseStringAsync($"https://omgvamp-hearthstone-v1.p.mashape.com/cards/search/{Uri.EscapeUriString(arg)}", headers);
try {
try
{
var items = JArray.Parse(res);
var images = new List<Image>();
if (items == null)
throw new KeyNotFoundException("Cannot find a card by that name");
var cnt = 0;
items.Shuffle();
foreach (var item in items.TakeWhile(item => cnt++ < 4).Where(item => item.HasValues && item["img"] != null)) {
foreach (var item in items.TakeWhile(item => cnt++ < 4).Where(item => item.HasValues && item["img"] != null))
{
images.Add(
Image.FromStream(await SearchHelper.GetResponseStreamAsync(item["img"].ToString())));
}
if (items.Count > 4) {
if (items.Count > 4)
{
await e.Channel.SendMessage("⚠ Found over 4 images. Showing random 4.");
}
await e.Channel.SendFile(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png));
} catch (Exception ex) {
}
catch (Exception ex)
{
await e.Channel.SendMessage($"💢 Error {ex.Message}");
}
});
@ -170,22 +226,30 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "osu")
.Description("Shows osu stats for a player.\n**Usage**:~osu Name")
.Parameter("usr", ParameterType.Unparsed)
.Do(async e => {
.Do(async e =>
{
if (string.IsNullOrWhiteSpace(e.GetArg("usr")))
return;
using (WebClient cl = new WebClient()) {
try {
using (WebClient cl = new WebClient())
{
try
{
cl.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
cl.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.2; Win64; x64)");
cl.DownloadDataAsync(new Uri($"http://lemmmy.pw/osusig/sig.php?uname={ e.GetArg("usr") }&flagshadow&xpbar&xpbarhex&pp=2"));
cl.DownloadDataCompleted += async (s, cle) => {
try {
cl.DownloadDataCompleted += async (s, cle) =>
{
try
{
await e.Channel.SendFile($"{e.GetArg("usr")}.png", new MemoryStream(cle.Result));
await e.Channel.SendMessage($"`Profile Link:`https://osu.ppy.sh/u/{Uri.EscapeDataString(e.GetArg("usr"))}\n`Image provided by https://lemmmy.pw/osusig`");
} catch { }
}
catch { }
};
} catch {
}
catch
{
await e.Channel.SendMessage("💢 Failed retrieving osu signature :\\");
}
}
@ -194,23 +258,28 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "ud")
.Description("Searches Urban Dictionary for a word.\n**Usage**:~ud Pineapple")
.Parameter("query", ParameterType.Unparsed)
.Do(async e => {
.Do(async e =>
{
var arg = e.GetArg("query");
if (string.IsNullOrWhiteSpace(arg)) {
if (string.IsNullOrWhiteSpace(arg))
{
await e.Channel.SendMessage("💢 Please enter a search term.");
return;
}
await e.Channel.SendIsTyping();
var headers = new Dictionary<string, string> { { "X-Mashape-Key", NadekoBot.Creds.MashapeKey } };
var res = await SearchHelper.GetResponseStringAsync($"https://mashape-community-urban-dictionary.p.mashape.com/define?term={Uri.EscapeUriString(arg)}", headers);
try {
try
{
var items = JObject.Parse(res);
var sb = new System.Text.StringBuilder();
sb.AppendLine($"`Term:` {items["list"][0]["word"].ToString()}");
sb.AppendLine($"`Definition:` {items["list"][0]["definition"].ToString()}");
sb.Append($"`Link:` <{await items["list"][0]["permalink"].ToString().ShortenUrl()}>");
await e.Channel.SendMessage(sb.ToString());
} catch {
}
catch
{
await e.Channel.SendMessage("💢 Failed finding a definition for that term.");
}
});
@ -218,30 +287,36 @@ $@"🌍 **Weather for** 【{obj["target"]}】
cgb.CreateCommand(Prefix + "#")
.Description("Searches Tagdef.com for a hashtag.\n**Usage**:~# ff")
.Parameter("query", ParameterType.Unparsed)
.Do(async e => {
.Do(async e =>
{
var arg = e.GetArg("query");
if (string.IsNullOrWhiteSpace(arg)) {
if (string.IsNullOrWhiteSpace(arg))
{
await e.Channel.SendMessage("💢 Please enter a search term.");
return;
}
await e.Channel.SendIsTyping();
var headers = new Dictionary<string, string> { { "X-Mashape-Key", NadekoBot.Creds.MashapeKey } };
var res = await SearchHelper.GetResponseStringAsync($"https://tagdef.p.mashape.com/one.{Uri.EscapeUriString(arg)}.json", headers);
try {
try
{
var items = JObject.Parse(res);
var sb = new System.Text.StringBuilder();
sb.AppendLine($"`Hashtag:` {items["defs"]["def"]["hashtag"].ToString()}");
sb.AppendLine($"`Definition:` {items["defs"]["def"]["text"].ToString()}");
sb.Append($"`Link:` <{await items["defs"]["def"]["uri"].ToString().ShortenUrl()}>");
await e.Channel.SendMessage(sb.ToString());
} catch {
}
catch
{
await e.Channel.SendMessage("💢 Failed finidng a definition for that tag.");
}
});
cgb.CreateCommand(Prefix + "quote")
.Description("Shows a random quote.")
.Do(async e => {
.Do(async e =>
{
await
e.Channel.SendMessage(
NadekoBot.Config.Quotes[new Random().Next(0, NadekoBot.Config.Quotes.Count)].ToString());

View File

@ -0,0 +1,325 @@
// Copyright (c) 2015 Ravi Bhavnani
// License: Code Project Open License
// http://www.codeproject.com/info/cpol10.aspx
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
namespace NadekoBot.Modules.Translator.Helpers
{
/// <summary>
/// Translates text using Google's online language tools.
/// </summary>
public class GoogleTranslator
{
#region Properties
/// <summary>
/// Gets the supported languages.
/// </summary>
public static IEnumerable<string> Languages {
get {
GoogleTranslator.EnsureInitialized();
return GoogleTranslator._languageModeMap.Keys.OrderBy(p => p);
}
}
/// <summary>
/// Gets the time taken to perform the translation.
/// </summary>
public TimeSpan TranslationTime {
get;
private set;
}
/// <summary>
/// Gets the url used to speak the translation.
/// </summary>
/// <value>The url used to speak the translation.</value>
public string TranslationSpeechUrl {
get;
private set;
}
/// <summary>
/// Gets the error.
/// </summary>
public Exception Error {
get;
private set;
}
#endregion
#region Public methods
/// <summary>
/// Translates the specified source text.
/// </summary>
/// <param name="sourceText">The source text.</param>
/// <param name="sourceLanguage">The source language.</param>
/// <param name="targetLanguage">The target language.</param>
/// <returns>The translation.</returns>
public string Translate
(string sourceText,
string sourceLanguage,
string targetLanguage)
{
// Initialize
this.Error = null;
this.TranslationSpeechUrl = null;
this.TranslationTime = TimeSpan.Zero;
DateTime tmStart = DateTime.Now;
string translation = string.Empty;
try
{
// Download translation
string url = string.Format("https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}",
GoogleTranslator.LanguageEnumToIdentifier(sourceLanguage),
GoogleTranslator.LanguageEnumToIdentifier(targetLanguage),
HttpUtility.UrlEncode(sourceText));
string outputFile = Path.GetTempFileName();
using (WebClient wc = new WebClient())
{
wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
wc.DownloadFile(url, outputFile);
}
// Get translated text
if (File.Exists(outputFile))
{
// Get phrase collection
string text = File.ReadAllText(outputFile);
int index = text.IndexOf(string.Format(",,\"{0}\"", GoogleTranslator.LanguageEnumToIdentifier(sourceLanguage)));
if (index == -1)
{
// Translation of single word
int startQuote = text.IndexOf('\"');
if (startQuote != -1)
{
int endQuote = text.IndexOf('\"', startQuote + 1);
if (endQuote != -1)
{
translation = text.Substring(startQuote + 1, endQuote - startQuote - 1);
}
}
}
else {
// Translation of phrase
text = text.Substring(0, index);
text = text.Replace("],[", ",");
text = text.Replace("]", string.Empty);
text = text.Replace("[", string.Empty);
text = text.Replace("\",\"", "\"");
// Get translated phrases
string[] phrases = text.Split(new[] { '\"' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; (i < phrases.Count()); i += 2)
{
string translatedPhrase = phrases[i];
if (translatedPhrase.StartsWith(",,"))
{
i--;
continue;
}
translation += translatedPhrase + " ";
}
}
// Fix up translation
translation = translation.Trim();
translation = translation.Replace(" ?", "?");
translation = translation.Replace(" !", "!");
translation = translation.Replace(" ,", ",");
translation = translation.Replace(" .", ".");
translation = translation.Replace(" ;", ";");
// And translation speech URL
this.TranslationSpeechUrl = string.Format("https://translate.googleapis.com/translate_tts?ie=UTF-8&q={0}&tl={1}&total=1&idx=0&textlen={2}&client=gtx",
HttpUtility.UrlEncode(translation), GoogleTranslator.LanguageEnumToIdentifier(targetLanguage), translation.Length);
}
}
catch (Exception ex)
{
this.Error = ex;
}
// Return result
this.TranslationTime = DateTime.Now - tmStart;
return translation;
}
#endregion
#region Private methods
/// <summary>
/// Converts a language to its identifier.
/// </summary>
/// <param name="language">The language."</param>
/// <returns>The identifier or <see cref="string.Empty"/> if none.</returns>
private static string LanguageEnumToIdentifier
(string language)
{
string mode = string.Empty;
GoogleTranslator.EnsureInitialized();
GoogleTranslator._languageModeMap.TryGetValue(language, out mode);
return mode;
}
/// <summary>
/// Ensures the translator has been initialized.
/// </summary>
public static void EnsureInitialized()
{
if (GoogleTranslator._languageModeMap == null)
{
GoogleTranslator._languageModeMap = new Dictionary<string, string>();
GoogleTranslator._languageModeMap.Add("afrikaans", "af");
GoogleTranslator._languageModeMap.Add("albanian", "sq");
GoogleTranslator._languageModeMap.Add("arabic", "ar");
GoogleTranslator._languageModeMap.Add("armenian", "hy");
GoogleTranslator._languageModeMap.Add("azerbaijani", "az");
GoogleTranslator._languageModeMap.Add("basque", "eu");
GoogleTranslator._languageModeMap.Add("belarusian", "be");
GoogleTranslator._languageModeMap.Add("bengali", "bn");
GoogleTranslator._languageModeMap.Add("bulgarian", "bg");
GoogleTranslator._languageModeMap.Add("catalan", "ca");
GoogleTranslator._languageModeMap.Add("chinese", "zh-CN");
GoogleTranslator._languageModeMap.Add("croatian", "hr");
GoogleTranslator._languageModeMap.Add("czech", "cs");
GoogleTranslator._languageModeMap.Add("danish", "da");
GoogleTranslator._languageModeMap.Add("dutch", "nl");
GoogleTranslator._languageModeMap.Add("english", "en");
GoogleTranslator._languageModeMap.Add("esperanto", "eo");
GoogleTranslator._languageModeMap.Add("estonian", "et");
GoogleTranslator._languageModeMap.Add("filipino", "tl");
GoogleTranslator._languageModeMap.Add("finnish", "fi");
GoogleTranslator._languageModeMap.Add("french", "fr");
GoogleTranslator._languageModeMap.Add("galician", "gl");
GoogleTranslator._languageModeMap.Add("german", "de");
GoogleTranslator._languageModeMap.Add("georgian", "ka");
GoogleTranslator._languageModeMap.Add("greek", "el");
GoogleTranslator._languageModeMap.Add("haitian Creole", "ht");
GoogleTranslator._languageModeMap.Add("hebrew", "iw");
GoogleTranslator._languageModeMap.Add("hindi", "hi");
GoogleTranslator._languageModeMap.Add("hungarian", "hu");
GoogleTranslator._languageModeMap.Add("icelandic", "is");
GoogleTranslator._languageModeMap.Add("indonesian", "id");
GoogleTranslator._languageModeMap.Add("irish", "ga");
GoogleTranslator._languageModeMap.Add("italian", "it");
GoogleTranslator._languageModeMap.Add("japanese", "ja");
GoogleTranslator._languageModeMap.Add("korean", "ko");
GoogleTranslator._languageModeMap.Add("lao", "lo");
GoogleTranslator._languageModeMap.Add("latin", "la");
GoogleTranslator._languageModeMap.Add("latvian", "lv");
GoogleTranslator._languageModeMap.Add("lithuanian", "lt");
GoogleTranslator._languageModeMap.Add("macedonian", "mk");
GoogleTranslator._languageModeMap.Add("malay", "ms");
GoogleTranslator._languageModeMap.Add("maltese", "mt");
GoogleTranslator._languageModeMap.Add("norwegian", "no");
GoogleTranslator._languageModeMap.Add("persian", "fa");
GoogleTranslator._languageModeMap.Add("polish", "pl");
GoogleTranslator._languageModeMap.Add("portuguese", "pt");
GoogleTranslator._languageModeMap.Add("romanian", "ro");
GoogleTranslator._languageModeMap.Add("russian", "ru");
GoogleTranslator._languageModeMap.Add("serbian", "sr");
GoogleTranslator._languageModeMap.Add("slovak", "sk");
GoogleTranslator._languageModeMap.Add("slovenian", "sl");
GoogleTranslator._languageModeMap.Add("spanish", "es");
GoogleTranslator._languageModeMap.Add("swahili", "sw");
GoogleTranslator._languageModeMap.Add("swedish", "sv");
GoogleTranslator._languageModeMap.Add("tamil", "ta");
GoogleTranslator._languageModeMap.Add("telugu", "te");
GoogleTranslator._languageModeMap.Add("thai", "th");
GoogleTranslator._languageModeMap.Add("turkish", "tr");
GoogleTranslator._languageModeMap.Add("ukrainian", "uk");
GoogleTranslator._languageModeMap.Add("urdu", "ur");
GoogleTranslator._languageModeMap.Add("vietnamese", "vi");
GoogleTranslator._languageModeMap.Add("welsh", "cy");
GoogleTranslator._languageModeMap.Add("yiddish", "yi");
GoogleTranslator._languageModeMap.Add("af", "af");
GoogleTranslator._languageModeMap.Add("sq", "sq");
GoogleTranslator._languageModeMap.Add("ar", "ar");
GoogleTranslator._languageModeMap.Add("hy", "hy");
GoogleTranslator._languageModeMap.Add("az", "az");
GoogleTranslator._languageModeMap.Add("eu", "eu");
GoogleTranslator._languageModeMap.Add("be", "be");
GoogleTranslator._languageModeMap.Add("bn", "bn");
GoogleTranslator._languageModeMap.Add("bg", "bg");
GoogleTranslator._languageModeMap.Add("ca", "ca");
GoogleTranslator._languageModeMap.Add("zh-CN", "zh-CN");
GoogleTranslator._languageModeMap.Add("hr", "hr");
GoogleTranslator._languageModeMap.Add("cs", "cs");
GoogleTranslator._languageModeMap.Add("da", "da");
GoogleTranslator._languageModeMap.Add("nl", "nl");
GoogleTranslator._languageModeMap.Add("en", "en");
GoogleTranslator._languageModeMap.Add("eo", "eo");
GoogleTranslator._languageModeMap.Add("et", "et");
GoogleTranslator._languageModeMap.Add("tl", "tl");
GoogleTranslator._languageModeMap.Add("fi", "fi");
GoogleTranslator._languageModeMap.Add("fr", "fr");
GoogleTranslator._languageModeMap.Add("gl", "gl");
GoogleTranslator._languageModeMap.Add("de", "de");
GoogleTranslator._languageModeMap.Add("ka", "ka");
GoogleTranslator._languageModeMap.Add("el", "el");
GoogleTranslator._languageModeMap.Add("ht", "ht");
GoogleTranslator._languageModeMap.Add("iw", "iw");
GoogleTranslator._languageModeMap.Add("hi", "hi");
GoogleTranslator._languageModeMap.Add("hu", "hu");
GoogleTranslator._languageModeMap.Add("is", "is");
GoogleTranslator._languageModeMap.Add("id", "id");
GoogleTranslator._languageModeMap.Add("ga", "ga");
GoogleTranslator._languageModeMap.Add("it", "it");
GoogleTranslator._languageModeMap.Add("ja", "ja");
GoogleTranslator._languageModeMap.Add("ko", "ko");
GoogleTranslator._languageModeMap.Add("lo", "lo");
GoogleTranslator._languageModeMap.Add("la", "la");
GoogleTranslator._languageModeMap.Add("lv", "lv");
GoogleTranslator._languageModeMap.Add("lt", "lt");
GoogleTranslator._languageModeMap.Add("mk", "mk");
GoogleTranslator._languageModeMap.Add("ms", "ms");
GoogleTranslator._languageModeMap.Add("mt", "mt");
GoogleTranslator._languageModeMap.Add("no", "no");
GoogleTranslator._languageModeMap.Add("fa", "fa");
GoogleTranslator._languageModeMap.Add("pl", "pl");
GoogleTranslator._languageModeMap.Add("pt", "pt");
GoogleTranslator._languageModeMap.Add("ro", "ro");
GoogleTranslator._languageModeMap.Add("ru", "ru");
GoogleTranslator._languageModeMap.Add("sr", "sr");
GoogleTranslator._languageModeMap.Add("sk", "sk");
GoogleTranslator._languageModeMap.Add("sl", "sl");
GoogleTranslator._languageModeMap.Add("es", "es");
GoogleTranslator._languageModeMap.Add("sw", "sw");
GoogleTranslator._languageModeMap.Add("sv", "sv");
GoogleTranslator._languageModeMap.Add("ta", "ta");
GoogleTranslator._languageModeMap.Add("te", "te");
GoogleTranslator._languageModeMap.Add("th", "th");
GoogleTranslator._languageModeMap.Add("tr", "tr");
GoogleTranslator._languageModeMap.Add("uk", "uk");
GoogleTranslator._languageModeMap.Add("ur", "ur");
GoogleTranslator._languageModeMap.Add("vi", "vi");
GoogleTranslator._languageModeMap.Add("cy", "cy");
GoogleTranslator._languageModeMap.Add("yi", "yi");
}
}
#endregion
#region Fields
/// <summary>
/// The language to translation mode map.
/// </summary>
public static Dictionary<string, string> _languageModeMap;
#endregion
}
}

View File

@ -0,0 +1,40 @@
using Discord.Commands;
using NadekoBot.Commands;
using NadekoBot.Modules.Translator.Helpers;
using System;
using System.Threading.Tasks;
namespace NadekoBot.Modules.Translator
{
class TranslateCommand : DiscordCommand
{
public TranslateCommand(DiscordModule module) : base(module) { }
internal override void Init(CommandGroupBuilder cgb)
{
cgb.CreateCommand(Module.Prefix + "trans")
.Description("Translates from>to text. From the given language to the destiation language.")
.Parameter("langs", ParameterType.Required)
.Parameter("text", ParameterType.Unparsed)
.Do(TranslateFunc());
}
private GoogleTranslator t = new GoogleTranslator();
private Func<CommandEventArgs, Task> TranslateFunc() => async e =>
{
try
{
await e.Channel.SendIsTyping();
string from = e.GetArg("langs").ToLowerInvariant().Split('>')[0];
string to = e.GetArg("langs").ToLowerInvariant().Split('>')[1];
string translation = t.Translate(e.GetArg("text"), from, to);
await e.Channel.SendMessage(translation);
}
catch
{
await e.Channel.SendMessage("Bad input format, or sth went wrong...");
}
};
}
}

View File

@ -0,0 +1,26 @@
using Discord.Modules;
using NadekoBot.Extensions;
namespace NadekoBot.Modules.Translator
{
internal class TranslatorModule : DiscordModule
{
public TranslatorModule()
{
commands.Add(new TranslateCommand(this));
commands.Add(new ValidLanguagesCommand(this));
}
public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Searches;
public override void Install(ModuleManager manager)
{
manager.CreateCommands("", cgb =>
{
cgb.AddCheck(Classes.Permissions.PermissionChecker.Instance);
commands.ForEach(cmd => cmd.Init(cgb));
});
}
}
}

View File

@ -0,0 +1,50 @@
using Discord.Commands;
using NadekoBot.Commands;
using NadekoBot.Modules.Translator.Helpers;
using System;
using System.Threading.Tasks;
namespace NadekoBot.Modules.Translator
{
class ValidLanguagesCommand : DiscordCommand
{
public ValidLanguagesCommand(DiscordModule module) : base(module) { }
internal override void Init(CommandGroupBuilder cgb)
{
cgb.CreateCommand(Module.Prefix + "translangs")
.Description("List the valid languages for translation.")
.Parameter("search", ParameterType.Optional)
.Do(ListLanguagesFunc());
}
private Func<CommandEventArgs, Task> ListLanguagesFunc() => async e =>
{
try
{
GoogleTranslator.EnsureInitialized();
string s = e.GetArg("search");
string ret = "";
foreach (string key in GoogleTranslator._languageModeMap.Keys)
{
if (!s.Equals(""))
{
if (key.ToLower().Contains(s))
{
ret += " " + key + ";";
}
}
else
{
ret += " " + key + ";";
}
}
await e.Channel.SendMessage(ret);
}
catch
{
await e.Channel.SendMessage("Bad input format, or sth went wrong...");
}
};
}
}