reworked music controls, prune fix, cleanup, other fixes

This commit is contained in:
Master Kwoth
2016-01-31 19:51:27 +01:00
parent 40b64407f2
commit e869972127
7 changed files with 105 additions and 139 deletions

View File

@ -13,8 +13,8 @@ using System.IO;
namespace NadekoBot.Modules {
class Administration : DiscordModule {
public Administration() : base() {
commands.Add(new HelpCommand());
commands.Add(new ServerGreetCommand());
// commands.Add(new HelpCommand());
// commands.Add(new ServerGreetCommand());
}
public override void Install(ModuleManager manager) {
@ -381,18 +381,12 @@ namespace NadekoBot.Modules {
return;
}
try {
var msgs = await e.Channel.DownloadMessages(100);
var lastmessage = e.Channel.Messages.LastOrDefault();
while (num > 0 && lastmessage != null) {
Message last = null;
while (num > 0) {
var msgs = await e.Channel.DownloadMessages(num, last?.Id);
last = msgs.LastOrDefault();
msgs.ForEach(async m => await m.Delete());
int toDelete;
if (num > 100)
toDelete = 100;
else
toDelete = num;
num -= toDelete;
lastmessage = msgs.LastOrDefault();
msgs = await e.Channel.DownloadMessages(toDelete, lastmessage?.Id);
num -= 100;
}
} catch (Exception) { await e.Send("Failed pruning. Make sure the bot has correct permissions."); }

View File

@ -372,7 +372,17 @@ namespace NadekoBot.Modules {
await e.Send($"Got invites for {i} servers and failed to get invites for {j} servers");
});
cgb.CreateCommand("ab")
.Description("Try to get 'abalabahaha'")
.Do(async e => {
string[] strings = { "ba", "la", "ha" };
string construct = "@a";
int cnt = rng.Next(4,7);
while (cnt-- > 0) {
construct += strings[rng.Next(0, strings.Length)];
}
await e.Send(construct);
});
cgb.CreateCommand("av").Alias("avatar")
.Parameter("mention", ParameterType.Required)

View File

@ -77,6 +77,7 @@ namespace NadekoBot.Modules {
.Description("Queue a song using keywords or link. **You must be in a voice channel**.\n**Usage**: `!m q Dream Of Venice`")
.Parameter("query", ParameterType.Unparsed)
.Do(async e => {
if (musicPlayers.ContainsKey(e.Server) == false)
if (!musicPlayers.TryAdd(e.Server, new MusicControls(e.User.VoiceChannel))) {
await e.Send("Failed to create a music player for this server");
@ -94,16 +95,18 @@ namespace NadekoBot.Modules {
try {
if (e.User.VoiceChannel?.Server != e.Server)
throw new ArgumentException("You need to be in the voice channel on this server.");
var sr = await player.CreateStreamRequest(e, e.GetArg("query"), e.User.VoiceChannel);
Message qmsg = await e.Channel.SendMessage(":musical_note: **Searching...**");
var sr = new StreamRequest(e, e.GetArg("query"), player);
if (sr == null)
throw new NullReferenceException("StreamRequest is null.");
Message msg = null;
Message qmsg = null;
sr.OnResolving += async () => {
qmsg = await e.Send($":musical_note: **Resolving**... \"{e.GetArg("query")}\"");
await qmsg.Edit($":musical_note: **Resolving**... \"{e.GetArg("query")}\"");
};
sr.OnResolvingFailed += async (err) => {
qmsg = await e.Send($":anger: :musical_note: **Resolving failed** for `{e.GetArg("query")}`");
await qmsg.Edit($":anger: :musical_note: **Resolving failed** for `{e.GetArg("query")}`");
};
sr.OnQueued += async () => {
await qmsg.Edit($":musical_note:**Queued** {sr.Title.TrimTo(55)}");
@ -162,14 +165,14 @@ namespace NadekoBot.Modules {
player.SongQueue.Shuffle();
await e.Send(":musical_note: Songs shuffled!");
});
bool setgameEnabled = true;
bool setgameEnabled = false;
Timer setgameTimer = new Timer();
setgameTimer.Interval = 20000;
setgameTimer.Elapsed += (s, e) => {
int num = musicPlayers.Count;
int num = musicPlayers.Where(kvp=>kvp.Value.CurrentSong != null).Count();
NadekoBot.client.SetGame($"{num} songs".SnPl(num) + $", {musicPlayers.Sum(kvp => kvp.Value.SongQueue.Count())} queued");
};
setgameTimer.Start();
cgb.CreateCommand("setgame")
.Description("Sets the game of the bot to the number of songs playing.**Owner only**")
.Do(async e => {

View File

@ -9,48 +9,40 @@ using Newtonsoft.Json;
using Discord.Commands;
using NadekoBot.Extensions;
namespace NadekoBot.Modules
{
class Searches : DiscordModule
{
public Searches() : base()
{
namespace NadekoBot.Modules {
class Searches : DiscordModule {
public Searches() : base() {
}
public override void Install(ModuleManager manager)
{
public override void Install(ModuleManager manager) {
var client = NadekoBot.client;
manager.CreateCommands("",cgb =>
{
manager.CreateCommands("", cgb => {
cgb.CreateCommand("~yt")
.Parameter("query",Discord.Commands.ParameterType.Unparsed)
.Parameter("query", Discord.Commands.ParameterType.Unparsed)
.Description("Queries youtubes and embeds the first result")
.Do(async e =>
{
.Do(async e => {
if (!(await ValidateQuery(e.Channel, e.GetArg("query")))) return;
var str = ShortenUrl(FindYoutubeUrlByKeywords(e.GetArg("query")));
if (string.IsNullOrEmpty(str.Trim()))
{
await e.Send( "Query failed");
if (string.IsNullOrEmpty(str.Trim())) {
await e.Send("Query failed");
return;
}
await e.Send( str);
await e.Send(str);
});
cgb.CreateCommand("~ani")
.Alias("~anime").Alias("~aq")
.Parameter("query", Discord.Commands.ParameterType.Unparsed)
.Description("Queries anilist for an anime and shows the first result.")
.Do(async e =>
{
.Do(async e => {
if (!(await ValidateQuery(e.Channel, e.GetArg("query")))) return;
var result = GetAnimeQueryResultLink(e.GetArg("query"));
if (result == null) {
await e.Send( "Failed to find that anime.");
if (result == null) {
await e.Send("Failed to find that anime.");
return;
}
@ -61,17 +53,15 @@ namespace NadekoBot.Modules
.Alias("~manga").Alias("~mq")
.Parameter("query", Discord.Commands.ParameterType.Unparsed)
.Description("Queries anilist for a manga and shows the first result.")
.Do(async e =>
{
.Do(async e => {
if (!(await ValidateQuery(e.Channel, e.GetArg("query")))) return;
var result = GetMangaQueryResultLink(e.GetArg("query"));
if (result == null)
{
await e.Send( "Failed to find that anime.");
if (result == null) {
await e.Send("Failed to find that anime.");
return;
}
await e.Send( result.ToString());
await e.Send(result.ToString());
});
cgb.CreateCommand("~randomcat")
@ -92,7 +82,7 @@ namespace NadekoBot.Modules
.Parameter("all", ParameterType.Unparsed)
.Do(async e => {
await e.Send("This feature is being reconstructed.");
});
cgb.CreateCommand("~ir")
@ -146,10 +136,8 @@ namespace NadekoBot.Modules
new StreamReader(((HttpWebRequest)WebRequest.Create(v)).GetResponse().GetResponseStream()).ReadToEnd();
private string token = "";
private AnimeResult GetAnimeQueryResultLink(string query)
{
try
{
private AnimeResult GetAnimeQueryResultLink(string query) {
try {
var cl = new RestSharp.RestClient("http://anilist.co/api");
var rq = new RestSharp.RestRequest("/auth/access_token", RestSharp.Method.POST);
@ -163,39 +151,32 @@ namespace NadekoBot.Modules
rq = new RestSharp.RestRequest("anime/" + smallObj["id"]);
rq.AddParameter("access_token", token);
return JsonConvert.DeserializeObject<AnimeResult>(cl.Execute(rq).Content);
}
catch (Exception)
{
} catch (Exception) {
return null;
}
}
private MangaResult GetMangaQueryResultLink(string query)
{
try
{
private MangaResult GetMangaQueryResultLink(string query) {
try {
RefreshToken();
var cl = new RestSharp.RestClient("http://anilist.co/api");
var rq = new RestSharp.RestRequest("/auth/access_token", RestSharp.Method.POST);
rq = new RestSharp.RestRequest("/manga/search/"+Uri.EscapeUriString(query));
rq = new RestSharp.RestRequest("/manga/search/" + Uri.EscapeUriString(query));
rq.AddParameter("access_token", token);
var smallObj = JArray.Parse(cl.Execute(rq).Content)[0];
rq = new RestSharp.RestRequest("manga/" + smallObj["id"]);
rq.AddParameter("access_token", token);
return JsonConvert.DeserializeObject<MangaResult> (cl.Execute(rq).Content);
}
catch (Exception ex)
{
return JsonConvert.DeserializeObject<MangaResult>(cl.Execute(rq).Content);
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
return null;
}
}
private void RefreshToken()
{
private void RefreshToken() {
var cl = new RestSharp.RestClient("http://anilist.co/api");
var rq = new RestSharp.RestRequest("/auth/access_token", RestSharp.Method.POST);
rq.AddParameter("grant_type", "client_credentials");
@ -211,9 +192,8 @@ namespace NadekoBot.Modules
token = JObject.Parse(exec.Content)["access_token"].ToString();
}
private static async Task<bool> ValidateQuery(Discord.Channel ch,string query) {
if (string.IsNullOrEmpty(query.Trim()))
{
private static async Task<bool> ValidateQuery(Discord.Channel ch, string query) {
if (string.IsNullOrEmpty(query.Trim())) {
await ch.Send("Please specify search parameters.");
return false;
}
@ -226,6 +206,14 @@ namespace NadekoBot.Modules
return @"https://www.youtube.com/watch?v=dQw4w9WgXcQ";
}
try {
//maybe it is already a youtube url, in which case we will just extract the id and prepend it with youtube.com?v=
var match = new Regex("(?:youtu\\.be\\/|v=)(?<id>[\\da-zA-Z\\-_]*)").Match(v);
if (match.Length > 1) {
string str = $"http://www.youtube.com?v={ match.Groups["id"].Value }";
return str;
}
WebRequest wr = WebRequest.Create("https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=1&q=" + Uri.EscapeDataString(v) + "&key=" + NadekoBot.GoogleAPIKey);
var sr = new StreamReader(wr.GetResponse().GetResponseStream());
@ -233,7 +221,8 @@ namespace NadekoBot.Modules
dynamic obj = JObject.Parse(sr.ReadToEnd());
string toReturn = "http://www.youtube.com/watch?v=" + obj.items[0].id.videoId.ToString();
return toReturn;
} catch (Exception) {
} catch (Exception ex) {
Console.WriteLine($"Error in findyoutubeurl: {ex.Message}");
return string.Empty;
}
}
@ -245,7 +234,7 @@ namespace NadekoBot.Modules
if (tag == "loli") //loli doesn't work for some reason atm
tag = "flat_chest";
var webpage = MakeRequestAndGetResponse($"http://danbooru.donmai.us/posts?page={ rng.Next(0, 30) }&tags={ tag.Replace(" ","_") }");
var webpage = MakeRequestAndGetResponse($"http://danbooru.donmai.us/posts?page={ rng.Next(0, 30) }&tags={ tag.Replace(" ", "_") }");
var matches = Regex.Matches(webpage, "data-large-file-url=\"(?<id>.*?)\"");
return $"http://danbooru.donmai.us{ matches[rng.Next(0, matches.Count)].Groups["id"].Value }".ShortenUrl();
@ -270,30 +259,25 @@ namespace NadekoBot.Modules
}
}
public static string ShortenUrl(string url)
{
public static string ShortenUrl(string url) {
if (NadekoBot.GoogleAPIKey == null || NadekoBot.GoogleAPIKey == "") return url;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url?key=" + NadekoBot.GoogleAPIKey);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
string json = "{\"longUrl\":\"" + url + "\"}";
streamWriter.Write(json);
}
try
{
try {
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) {
var responseText = streamReader.ReadToEnd();
string MATCH_PATTERN = @"""id"": ?""(?<id>.+)""";
return Regex.Match(responseText, MATCH_PATTERN).Groups["id"].Value;
}
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); return ""; }
} catch (Exception ex) { Console.WriteLine(ex.ToString()); return ""; }
}
}
}