コード例 #1
0
        public static async Task <string> GetRelatedVideoId(string id)
        {
            if (string.IsNullOrWhiteSpace(id))
            {
                throw new ArgumentNullException(nameof(id));
            }
            var match = new Regex("(?:youtu\\.be\\/|v=)(?<id>[\\da-zA-Z\\-_]*)").Match(id);

            if (match.Length > 1)
            {
                id = match.Groups["id"].Value;
            }
            var response = await GetResponseStringAsync(
                $"https://www.googleapis.com/youtube/v3/search?" +
                $"part=snippet&maxResults=1&type=video" +
                $"&relatedToVideoId={id}" +
                $"&key={MidnightBot.GetRndGoogleAPIKey()}").ConfigureAwait(false);

            JObject obj = JObject.Parse(response);

            var data = JsonConvert.DeserializeObject <YoutubeVideoSearch>(response);

            if (data.items.Length > 0)
            {
                var toReturn = "http://www.youtube.com/watch?v=" + data.items[0].id.videoId.ToString();
                return(toReturn);
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        public static async Task <string> GetPlaylistIdByKeyword(string query)
        {
            if (string.IsNullOrWhiteSpace(MidnightBot.GetRndGoogleAPIKey()))
            {
                throw new ArgumentNullException(nameof(query));
            }

            var match = new Regex("(?:youtu\\.be\\/|list=)(?<id>[\\da-zA-Z\\-_]*)").Match(query);

            if (match.Length > 1)
            {
                return(match.Groups["id"].Value.ToString());
            }

            var link = "https://www.googleapis.com/youtube/v3/search?part=snippet" +
                       "&maxResults=1&type=playlist" +
                       $"&q={Uri.EscapeDataString (query)}" +
                       $"&key={MidnightBot.GetRndGoogleAPIKey ()}";

            var response = await GetResponseStringAsync(link).ConfigureAwait(false);

            var     data = JsonConvert.DeserializeObject <YoutubePlaylistSearch> (response);
            JObject obj  = JObject.Parse(response);

            return(data.items.Length > 0 ? data.items[0].id.playlistId.ToString() : null);
        }
コード例 #3
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "typestart")
            .Description($"Startet einen Tipp-Wettbewerb. | `{Prefix}typestart`")
            .Do(DoFunc());

            cgb.CreateCommand(Module.Prefix + "typestop")
            .Description($"Stoppt einen Tipp-Wettbewerb auf dem derzeitigen Channel. | `{Prefix}typestop`")
            .Do(QuitFunc());

            cgb.CreateCommand(Module.Prefix + "typeadd")
            .Description($"Fügt einen neuen Text hinzu. Owner only. | `{Prefix}typeadd wordswords`")
            .Parameter("text", ParameterType.Unparsed)
            .Do(async e =>
            {
                if (!MidnightBot.IsOwner(e.User.Id) || string.IsNullOrWhiteSpace(e.GetArg("text")))
                {
                    return;
                }

                DbHandler.Instance.Connection.Insert(new TypingArticle
                {
                    Text      = e.GetArg("text"),
                    DateAdded = DateTime.Now
                });

                await e.Channel.SendMessage("Neuer Text hinzugefügt.").ConfigureAwait(false);
            });
        }
コード例 #4
0
 internal override void Init(CommandGroupBuilder cgb)
 {
     cgb.CreateCommand(Module.Prefix + "leave")
     .Description($"Lässt {BotName} den Server verlassen. Entweder Name, oder ID benötigt. | `{Prefix}leave 123123123331`")
     .Parameter("arg", ParameterType.Required)
     .AddCheck(SimpleCheckers.OwnerOnly())
     .Do(async e =>
     {
         var arg    = e.GetArg("arg").Trim();
         var server = MidnightBot.Client.Servers.FirstOrDefault(s => s.Id.ToString() == arg) ??
                      MidnightBot.Client.FindServers(arg).FirstOrDefault();
         if (server == null)
         {
             await e.Channel.SendMessage("Kann Server nicht finden.").ConfigureAwait(false);
             return;
         }
         if (!server.IsOwner)
         {
             await server.Leave().ConfigureAwait(false);
         }
         else
         {
             await server.Delete().ConfigureAwait(false);
         }
         await MidnightBot.SendMessageToOwner($"Server {server.Name} verlassen.").ConfigureAwait(false);
     });
 }
コード例 #5
0
        public static async Task <string> FindYoutubeUrlByKeywords(string keywords)
        {
            if (string.IsNullOrWhiteSpace(keywords))
            {
                throw new ArgumentNullException(nameof(keywords), "Query not specified.");
            }
            if (keywords.Length > 150)
            {
                throw new ArgumentException("Query is too long.");
            }

            //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(keywords);

            if (match.Length > 1)
            {
                return($"https://www.youtube.com/watch?v={match.Groups["id"].Value}");
            }

            if (string.IsNullOrWhiteSpace(MidnightBot.GetRndGoogleAPIKey()))
            {
                throw new InvalidCredentialException("Google API Key is missing.");
            }
            var response = await GetResponseStringAsync(
                $"https://www.googleapis.com/youtube/v3/search?" +
                $"part=snippet&maxResults=1" +
                $"&q={Uri.EscapeDataString (keywords)}" +
                $"&key={MidnightBot.GetRndGoogleAPIKey ()}").ConfigureAwait(false);

            JObject obj = JObject.Parse(response);

            var data = JsonConvert.DeserializeObject <YoutubeVideoSearch> (response);

            if (data.items.Length > 0)
            {
                var toReturn = "http://www.youtube.com/watch?v=" + data.items[0].id.videoId.ToString();
                return(toReturn);
            }
            else
            {
                return(null);
            }
        }
コード例 #6
0
        public static async Task <IList <string> > GetVideoIDs(string playlist, int number = 50)
        {
            if (string.IsNullOrWhiteSpace(MidnightBot.GetRndGoogleAPIKey()))
            {
                throw new ArgumentNullException(nameof(playlist));
            }
            if (number < 1)
            {
                throw new ArgumentOutOfRangeException();
            }
            string nextPageToken = null;

            List <string> toReturn = new List <string> ();

            do
            {
                var toGet = number > 50 ? 50 : number;
                number -= toGet;
                var link =
                    $"https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails" +
                    $"&maxResults={toGet}" +
                    $"&playlistId={playlist}" +
                    $"&key={MidnightBot.GetRndGoogleAPIKey ()}";
                if (!string.IsNullOrWhiteSpace(nextPageToken))
                {
                    link += $"&pageToken={nextPageToken}";
                }
                var response = await GetResponseStringAsync(link).ConfigureAwait(false);

                var data = await Task.Run(() => JsonConvert.DeserializeObject <PlaylistItemsSearch> (response)).ConfigureAwait(false);

                nextPageToken = data.nextPageToken;
                toReturn.AddRange(data.items.Select(i => i.contentDetails.videoId));
            } while (number > 0 && !string.IsNullOrWhiteSpace(nextPageToken));

            return(toReturn);
        }
コード例 #7
0
        public override void Install(ModuleManager manager)
        {
            var rng = new Random();

            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                cgb.CreateCommand("..")
                .Description("Fügt ein neues Zitat mit Keyword (einzelnes Wort) und Nachricht (kein Limit). | `.. abc My message`")
                .Parameter("keyword", ParameterType.Required)
                .Parameter("text", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var text = e.GetArg("text");
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                                   Classes.DbHandler.Instance.Connection.Insert(new DataModels.UserQuote()
                    {
                        DateAdded = DateTime.Now,
                        Keyword   = e.GetArg("keyword").ToLowerInvariant(),
                        Text      = text,
                        UserName  = e.User.Name,
                    })).ConfigureAwait(false);

                    await e.Channel.SendMessage("`Neues Zitat hinzugefügt.`").ConfigureAwait(false);
                });


                cgb.CreateCommand("...")
                .Description("Zeigt ein zufälliges Zitat eines Benutzers. | `... abc`")
                .Parameter("keyword", ParameterType.Required)
                .Do(async e =>
                {
                    var keyword = e.GetArg("keyword")?.ToLowerInvariant();
                    if (string.IsNullOrWhiteSpace(keyword))
                    {
                        return;
                    }

                    var quote =
                        Classes.DbHandler.Instance.GetRandom <UserQuote> (
                            uqm => uqm.Keyword == keyword);

                    if (quote != null)
                    {
                        await e.Channel.SendMessage($"📣 {quote.Text}").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("💢`Kein Zitat gefunden.`").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("..qdel")
                .Alias("..quotedelete")
                .Description("Löscht alle Zitate mit angegebenen Keyword. Du musst entweder der Bot-Besitzer oder der Ersteller des Quotes sein um es zu löschen. | `..qdel abc`")
                .Parameter("quote", ParameterType.Required)
                .Do(async e =>
                {
                    var text = e.GetArg("quote")?.Trim();
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                    {
                        if (MidnightBot.IsOwner(e.User.Id))
                        {
                            Classes.DbHandler.Instance.DeleteWhere <UserQuote> (uq => uq.Keyword == text);
                        }
                        else
                        {
                            Classes.DbHandler.Instance.DeleteWhere <UserQuote> (uq => uq.Keyword == text && uq.UserName == e.User.Name || uq.Keyword == e.User.Name.ToLowerInvariant());
                        }
                    }).ConfigureAwait(false);

                    await e.Channel.SendMessage("`Erledigt.`").ConfigureAwait(false);
                });

                cgb.CreateCommand("..qdelothers")
                .Alias("..quotedeleteothers")
                .Description("Löscht alle Zitate mit eigenem Namen als Keyword, welche von anderen geaddet wurden.  | `..qdelothers`")
                .Do(async e =>
                {
                    var text = e.User.Name.ToLowerInvariant();
                    await Task.Run(() =>
                    {
                        Classes.DbHandler.Instance.DeleteWhere <UserQuote> (uq => uq.Keyword == text && uq.UserName != e.User.Name);
                    }).ConfigureAwait(false);

                    await e.Channel.SendMessage("`Erledigt.`").ConfigureAwait(false);
                });

                cgb.CreateCommand("..qshow")
                .Description("Zeigt alle Zitate mit angegebenen Keyword. | `..qshow abc`")
                .Parameter("quote", ParameterType.Required)
                .Do(async e =>
                {
                    var text      = e.GetArg("quote")?.Trim();
                    var allQuotes = "";
                    var number    = 1;
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }
                    await Task.Run(() =>
                    {
                        var quoteList = Classes.DbHandler.Instance.FindAll <UserQuote> (uq => uq.Keyword == text);
                        foreach (UserQuote quote in quoteList)
                        {
                            allQuotes += $"{number}. `{quote.Text}` **Hinzugefügt von: {quote.UserName}**\n";
                            number++;
                        }
                    }).ConfigureAwait(false);

                    await e.Channel.SendMessage(allQuotes).ConfigureAwait(false);
                });
            });

            manager.CreateCommands(MidnightBot.BotMention, cgb =>
            {
                var client = manager.Client;

                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand("die")
                .Description($"Funktioniert nur für den Owner. Fährt den Bot herunter. | `@{BotName} die`")
                .Do(async e =>
                {
                    if (MidnightBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Alles klar Chef.").ConfigureAwait(false);
                        await Task.Delay(5000).ConfigureAwait(false);
                        Environment.Exit(0);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Nein.");
                    }
                });

                var randServerSw = new Stopwatch();
                randServerSw.Start();

                cgb.CreateCommand("do you love me")
                .Alias("do you love me?")
                .Description($"Antwortet nur dem Owner positiv. | `@{BotName} do you love me`")
                .Do(async e =>
                {
                    if (MidnightBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Aber natürlich tue ich das. <3").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + ", Sei doch nicht dumm. :P").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("how are you")
                .Alias("how are you?")
                .Description($"Antwortet nur positiv, wenn der Owner online ist. | `@{BotName} do you love me`")
                .Do(async e =>
                {
                    if (MidnightBot.IsOwner(e.User.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + " Mir geht es gut, solange du da bist.").ConfigureAwait(false);
                        return;
                    }
                    var kw = e.Server.GetUser(MidnightBot.Creds.OwnerIds[0]);
                    if (kw != null && kw.Status == UserStatus.Online)
                    {
                        await e.Channel.SendMessage(e.User.Mention + " Mir geht es gut, solange " + kw.Mention + " hier mit mir ist.").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage(e.User.Mention + " Ich bin traurig. Mein Meister ist nicht hier.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("insult")
                .Parameter("mention", ParameterType.Required)
                .Description($"Beleidigt @X Person. | @{BotName} insult @X.")
                .Do(async e =>
                {
                    var u = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();
                    if (u == null)
                    {
                        await e.Channel.SendMessage("Ungültiger Benutzer.").ConfigureAwait(false);
                        return;
                    }

                    if (MidnightBot.IsOwner(u.Id))
                    {
                        await e.Channel.SendMessage("Ich würde nie meinen Meister beleidigen. <3").ConfigureAwait(false);
                        return;
                    }
                    else if (u.Id == e.User.Id)
                    {
                        await e.Channel.SendMessage("Man muss schon doof sein, wenn man sich selber beleidigen will.")
                        .ConfigureAwait(false);
                        return;
                    }
                    else if (u.Id == MidnightBot.Client.CurrentUser.Id)
                    {
                        await e.Channel.SendMessage(e.User.Mention + " Denkst du wirklich ich beleidige mich selbst, du Schwachkopf. :P")
                        .ConfigureAwait(false);
                        return;
                    }
                    else
                    {
                        tester = 0;
                        //var msgs = (await e.Channel.DownloadMessages (100)).Where (m => m.User.Id == MidnightBot.client.CurrentUser.Id);
                        foreach (var m in (await e.Channel.DownloadMessages(10)).Where(m => m.User.Id == e.User.Id))
                        {
                            if (tester == 0)
                            {
                                await m.Delete();
                                tester++;
                            }
                        }
                        await e.Channel.SendMessage(u.Mention + MidnightBot.Locale.Insults[rng.Next(0, MidnightBot.Locale.Insults.Length)])
                        .ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("praise")
                .Description($"Lobt @X Person. | @{BotName} praise @X.")
                .Parameter("mention", ParameterType.Required)
                .Do(async e =>
                {
                    var u = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();

                    if (u == null)
                    {
                        await e.Channel.SendMessage("Ungültiger Benutzer.").ConfigureAwait(false);
                        return;
                    }

                    if (MidnightBot.IsOwner(u.Id))
                    {
                        await e.Channel.SendMessage(e.User.Mention + " Ich brauche deine Erlaubnis nicht, um meinen Meister zu loben <3")
                        .ConfigureAwait(false);
                        return;
                    }
                    else if (u.Id == e.User.Id)
                    {
                        await e.Channel.SendMessage($"Eigenlob stinkt {e.User.Mention}")
                        .ConfigureAwait(false);
                        return;
                    }
                    else
                    {
                        await e.Channel.SendMessage(u.Mention + MidnightBot.Locale.Praises[rng.Next(0, MidnightBot.Locale.Praises.Length)])
                        .ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand("fire")
                .Description($"Zeigt eine unicode Feuer Nachricht. Optionaler Parameter [x] sagt ihm wie oft er das Feuer wiederholen soll. | `@{BotName} fire [x]`")
                .Parameter("times", ParameterType.Optional)
                .Do(async e =>
                {
                    int count;
                    if (string.IsNullOrWhiteSpace(e.Args[0]))
                    {
                        count = 1;
                    }
                    else
                    {
                        int.TryParse(e.Args[0], out count);
                    }
                    if (count < 1 || count > 12)
                    {
                        await e.Channel.SendMessage("Nummer muss zwischen 1 und 12 sein.").ConfigureAwait(false);
                        return;
                    }

                    var str = new StringBuilder();
                    for (var i = 0; i < count; i++)
                    {
                        str.Append(firestr);
                    }
                    await e.Channel.SendMessage(str.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand("dump")
                .Description($"Dumped alle Einladungen die er findet in dump.txt.** Owner Only.** | `@{BotName} dump`")
                .Do(async e =>
                {
                    if (!MidnightBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    var i       = 0;
                    var j       = 0;
                    var invites = "";
                    foreach (var s in client.Servers)
                    {
                        try
                        {
                            var invite = await s.CreateInvite(0).ConfigureAwait(false);
                            invites   += invite.Url + "\n";
                            i++;
                        }
                        catch
                        {
                            j++;
                            continue;
                        }
                    }
                    File.WriteAllText("dump.txt", invites);
                    await e.Channel.SendMessage($"Ich habe Einladungen für {i} Server bekommen und konnte für {j} Server keine Einladungen finden.")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand("ab")
                .Description($"Versuche 'abalabahaha' zu bekommen.| `@{BotName} ab`")
                .Do(async e =>
                {
                    string[] strings = { "ba", "la", "ha" };
                    var construct    = "@a";
                    var cnt          = rng.Next(4, 7);
                    while (cnt-- > 0)
                    {
                        construct += strings[rng.Next(0, strings.Length)];
                    }
                    await e.Channel.SendMessage(construct).ConfigureAwait(false);
                });
            });
        }
コード例 #8
0
        public override void Install(ModuleManager manager)
        {
            var client = MidnightBot.Client;

            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand(Prefix + "next")
                .Alias(Prefix + "n")
                .Alias(Prefix + "skip")
                .Description($"Goes to the next song in the queue. You have to be in the same voice channel as the bot. | `{Prefix}n`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (musicPlayer.PlaybackVoiceChannel == e.User.VoiceChannel)
                    {
                        musicPlayer.Next();
                    }
                });

                cgb.CreateCommand(Prefix + "stop")
                .Alias(Prefix + "s")
                .Description($"Stops the music and clears the playlist. Stays in the channel. | `{Prefix}s`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel == musicPlayer.PlaybackVoiceChannel)
                    {
                        musicPlayer.Autoplay = false;
                        musicPlayer.Stop();
                    }
                });

                cgb.CreateCommand(Prefix + "destroy")
                .Alias(Prefix + "d")
                .Description("Completely stops the music and unbinds the bot from the channel. " +
                             $"(may cause weird behaviour) | `{Prefix}d`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryRemove(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel == musicPlayer.PlaybackVoiceChannel)
                    {
                        musicPlayer.Destroy();
                    }
                });

                cgb.CreateCommand(Prefix + "pause")
                .Alias(Prefix + "p")
                .Description($"Pauses or Unpauses the song. | `{Prefix}p`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.TogglePause();
                    if (musicPlayer.Paused)
                    {
                        await e.Channel.SendMessage("🎵`Music Player paused.`").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("🎵`Music Player unpaused.`").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "queue")
                .Alias(Prefix + "q")
                .Alias(Prefix + "yq")
                .Description("Queue a song using keywords or a link. Bot will join your voice channel." +
                             $"**You must be in a voice channel**. | `{Prefix}q Dream Of Venice`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("query")).ConfigureAwait(false);
                    if (e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages)
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await e.Message.Delete().ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "soundcloudqueue")
                .Alias(Prefix + "sq")
                .Description("Queue a soundcloud song using keywords. Bot will join your voice channel." +
                             $"**You must be in a voice channel**. | `{Prefix}sq Dream Of Venice`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("query"), musicType: MusicType.Soundcloud).ConfigureAwait(false);
                    if (e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages)
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await e.Message.Delete().ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "listqueue")
                .Alias(Prefix + "lq")
                .Description($"Lists 15 currently queued songs per page. Default page is 1. | `{Prefix}lq` or `{Prefix}lq 2`")
                .Parameter("page", ParameterType.Optional)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        await e.Channel.SendMessage("🎵 No active music player.").ConfigureAwait(false);
                        return;
                    }

                    int page;
                    if (!int.TryParse(e.GetArg("page"), out page) || page <= 0)
                    {
                        page = 1;
                    }

                    var currentSong = musicPlayer.CurrentSong;
                    if (currentSong == null)
                    {
                        return;
                    }
                    var toSend = $"🎵`Now Playing` {currentSong.PrettyName} " + $"{currentSong.PrettyCurrentTime()}\n";
                    if (musicPlayer.RepeatSong)
                    {
                        toSend += "🔂";
                    }
                    else if (musicPlayer.RepeatPlaylist)
                    {
                        toSend += "🔁";
                    }
                    toSend += $" **{musicPlayer.Playlist.Count}** `tracks currently queued. Showing page {page}` ";
                    if (musicPlayer.MaxQueueSize != 0 && musicPlayer.Playlist.Count >= musicPlayer.MaxQueueSize)
                    {
                        toSend += "**Song queue is full!**\n";
                    }
                    else
                    {
                        toSend += "\n";
                    }
                    const int itemsPerPage = 15;
                    int startAt            = itemsPerPage * (page - 1);
                    var number             = 1 + startAt;
                    await e.Channel.SendMessage(toSend + string.Join("\n", musicPlayer.Playlist.Skip(startAt).Take(15).Select(v => $"`{number++}.` {v.PrettyName}"))).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "nowplaying")
                .Alias(Prefix + "np")
                .Description($"Shows the song currently playing. | `{Prefix}np`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var currentSong = musicPlayer.CurrentSong;
                    if (currentSong == null)
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"🎵`Now Playing` {currentSong.PrettyName} " +
                                                $"{currentSong.PrettyCurrentTime()}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "volume")
                .Alias(Prefix + "vol")
                .Description($"Sets the music volume 0-100% | `{Prefix}vol 50`")
                .Parameter("val", ParameterType.Required)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    var arg = e.GetArg("val");
                    int volume;
                    if (!int.TryParse(arg, out volume))
                    {
                        await e.Channel.SendMessage("Volume number invalid.").ConfigureAwait(false);
                        return;
                    }
                    volume = musicPlayer.SetVolume(volume);
                    await e.Channel.SendMessage($"🎵 `Volume set to {volume}%`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "defvol")
                .Alias(Prefix + "dv")
                .Description("Sets the default music volume when music playback is started (0-100)." +
                             $" Persists through restarts. | `{Prefix}dv 80`")
                .Parameter("val", ParameterType.Required)
                .Do(async e =>
                {
                    var arg = e.GetArg("val");
                    float volume;
                    if (!float.TryParse(arg, out volume) || volume < 0 || volume > 100)
                    {
                        await e.Channel.SendMessage("Volume number invalid.").ConfigureAwait(false);
                        return;
                    }
                    var conf = SpecificConfigurations.Default.Of(e.Server.Id);
                    conf.DefaultMusicVolume = volume / 100;
                    await e.Channel.SendMessage($"🎵 `Default volume set to {volume}%`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "mute")
                .Alias(Prefix + "min")
                .Description($"Sets the music volume to 0% | `{Prefix}min`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.SetVolume(0);
                });

                cgb.CreateCommand(Prefix + "max")
                .Description($"Sets the music volume to 100%. | `{Prefix}max`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.SetVolume(100);
                });

                cgb.CreateCommand(Prefix + "half")
                .Description($"Sets the music volume to 50%. | `{Prefix}half`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    musicPlayer.SetVolume(50);
                });

                cgb.CreateCommand(Prefix + "shuffle")
                .Alias(Prefix + "sh")
                .Description($"Shuffles the current playlist. | `{Prefix}sh`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    if (musicPlayer.Playlist.Count < 2)
                    {
                        await e.Channel.SendMessage("💢 Not enough songs in order to perform the shuffle.").ConfigureAwait(false);
                        return;
                    }

                    musicPlayer.Shuffle();
                    await e.Channel.SendMessage("🎵 `Songs shuffled.`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "playlist")
                .Alias(Prefix + "pl")
                .Description($"Queues up to 500 songs from a youtube playlist specified by a link, or keywords. | `{Prefix}pl playlist link or name`")
                .Parameter("playlist", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("playlist");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel?.Server != e.Server)
                    {
                        await e.Channel.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false);
                        return;
                    }
                    var plId = await SearchHelper.GetPlaylistIdByKeyword(arg).ConfigureAwait(false);
                    if (plId == null)
                    {
                        await e.Channel.SendMessage("No search results for that query.");
                        return;
                    }
                    var ids = await SearchHelper.GetVideoIDs(plId, 500).ConfigureAwait(false);
                    if (ids == null || ids.Count == 0)
                    {
                        await e.Channel.SendMessage($"🎵 `Failed to find any songs.`").ConfigureAwait(false);
                        return;
                    }
                    var idArray = ids as string[] ?? ids.ToArray();
                    var count   = idArray.Length;
                    var msg     =
                        await e.Channel.SendMessage($"🎵 `Attempting to queue {count} songs".SnPl(count) + "...`").ConfigureAwait(false);
                    foreach (var id in idArray)
                    {
                        try
                        {
                            await QueueSong(e.User, e.Channel, e.User.VoiceChannel, id, true).ConfigureAwait(false);
                        }
                        catch (PlaylistFullException)
                        { break; }
                        catch { }
                    }
                    await msg.Edit("🎵 `Playlist queue complete.`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "soundcloudpl")
                .Alias(Prefix + "scpl")
                .Description($"Queue a soundcloud playlist using a link. | `{Prefix}scpl https://soundcloud.com/saratology/sets/symphony`")
                .Parameter("pl", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var pl = e.GetArg("pl")?.Trim();

                    if (string.IsNullOrWhiteSpace(pl))
                    {
                        return;
                    }

                    var scvids = JObject.Parse(await SearchHelper.GetResponseStringAsync($"http://api.soundcloud.com/resolve?url={pl}&client_id={MidnightBot.Creds.SoundCloudClientID}").ConfigureAwait(false))["tracks"].ToObject <SoundCloudVideo[]>();
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, scvids[0].TrackLink).ConfigureAwait(false);

                    MusicPlayer mp;
                    if (!MusicPlayers.TryGetValue(e.Server, out mp))
                    {
                        return;
                    }

                    foreach (var svideo in scvids.Skip(1))
                    {
                        try
                        {
                            mp.AddSong(new Song(new Classes.SongInfo
                            {
                                Title        = svideo.FullName,
                                Provider     = "SoundCloud",
                                Uri          = svideo.StreamLink,
                                ProviderType = MusicType.Normal,
                                Query        = svideo.TrackLink,
                            }), e.User.Name);
                        }
                        catch (PlaylistFullException) { break; }
                    }
                });

                cgb.CreateCommand(Prefix + "localplaylst")
                .Alias(Prefix + "lopl")
                .Description($"Queues all songs from a directory. **Bot Owner Only!** | `{Prefix}lopl C:/music/classical`")
                .Parameter("directory", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var arg = e.GetArg("directory");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        return;
                    }
                    try
                    {
                        var fileEnum = new DirectoryInfo(arg).GetFiles()
                                       .Where(x => !x.Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System));
                        foreach (var file in fileEnum)
                        {
                            try
                            {
                                await QueueSong(e.User, e.Channel, e.User.VoiceChannel, file.FullName, true, MusicType.Local).ConfigureAwait(false);
                            }
                            catch (PlaylistFullException)
                            {
                                break;
                            }
                            catch { }
                        }
                        await e.Channel.SendMessage("🎵 `Directory queue complete.`").ConfigureAwait(false);
                    }
                    catch { }
                });

                cgb.CreateCommand(Prefix + "radio").Alias(Prefix + "ra")
                .Description($"Queues a radio stream from a link. It can be a direct mp3 radio stream, .m3u, .pls .asx or .xspf (Usage Video: <https://streamable.com/al54>) | `{Prefix}ra radio link here`")
                .Parameter("radio_link", ParameterType.Required)
                .Do(async e =>
                {
                    if (e.User.VoiceChannel?.Server != e.Server)
                    {
                        await e.Channel.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false);
                        return;
                    }
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("radio_link"), musicType: MusicType.Radio).ConfigureAwait(false);
                    if (e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages)
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await e.Message.Delete().ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "local")
                .Alias(Prefix + "lo")
                .Description($"Queues a local file by specifying a full path. **Bot Owner Only!** | `{Prefix}lo C:/music/mysong.mp3`")
                .Parameter("path", ParameterType.Unparsed)
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(async e =>
                {
                    var arg = e.GetArg("path");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        return;
                    }
                    await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("path"), musicType: MusicType.Local).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "move")
                .Alias(Prefix + "mv")
                .Description($"Moves the bot to your voice channel. (works only if music is already playing) | `{Prefix}mv`")
                .Do(e =>
                {
                    MusicPlayer musicPlayer;
                    var voiceChannel = e.User.VoiceChannel;
                    if (voiceChannel == null || voiceChannel.Server != e.Server || !MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    musicPlayer.MoveToVoiceChannel(voiceChannel);
                });

                cgb.CreateCommand(Prefix + "remove")
                .Alias(Prefix + "rm")
                .Description($"Remove a song by its # in the queue, or 'all' to remove whole queue. | `{Prefix}rm 5`")
                .Parameter("num", ParameterType.Required)
                .Do(async e =>
                {
                    var arg = e.GetArg("num");
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    if (arg?.ToLower() == "all")
                    {
                        musicPlayer.ClearQueue();
                        await e.Channel.SendMessage($"🎵`Queue cleared!`").ConfigureAwait(false);
                        return;
                    }
                    int num;
                    if (!int.TryParse(arg, out num))
                    {
                        return;
                    }
                    if (num <= 0 || num > musicPlayer.Playlist.Count)
                    {
                        return;
                    }
                    var song = (musicPlayer.Playlist as List <Song>)?[num - 1];
                    musicPlayer.RemoveSongAt(num - 1);
                    await e.Channel.SendMessage($"🎵**Track {song.PrettyName} at position `#{num}` has been removed.**").ConfigureAwait(false);
                });

                //var msRegex = new Regex(@"(?<n1>\d+)>(?<n2>\d+)", RegexOptions.Compiled);
                cgb.CreateCommand(Prefix + "movesong")
                .Alias(Prefix + "ms")
                .Description($"Moves a song from one position to another. | `{Prefix} ms` 5>3")
                .Parameter("fromto")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var fromto    = e.GetArg("fromto").Trim();
                    var fromtoArr = fromto.Split('>');

                    int n1;
                    int n2;

                    var playlist = musicPlayer.Playlist as List <Song> ?? musicPlayer.Playlist.ToList();

                    if (fromtoArr.Length != 2 || !int.TryParse(fromtoArr[0], out n1) ||
                        !int.TryParse(fromtoArr[1], out n2) || n1 <1 || n2 <1 || n1 == n2 ||
                                                                            n1> playlist.Count || n2> playlist.Count)
                    {
                        await e.Channel.SendMessage("`Invalid input.`").ConfigureAwait(false);
                        return;
                    }

                    var s = playlist[n1 - 1];
                    playlist.Insert(n2 - 1, s);
                    var nn1 = n2 < n1 ? n1 : n1 - 1;
                    playlist.RemoveAt(nn1);

                    await e.Channel.SendMessage($"🎵`Moved` {s.PrettyName} `from #{n1} to #{n2}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "setmaxqueue")
                .Alias(Prefix + "smq")
                .Description($"Sets a maximum queue size. Supply 0 or no argument to have no limit.  | `{Prefix}smq` 50 or `{Prefix}smq`")
                .Parameter("size", ParameterType.Unparsed)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }

                    var sizeStr = e.GetArg("size")?.Trim();
                    uint size   = 0;
                    if (string.IsNullOrWhiteSpace(sizeStr) || !uint.TryParse(sizeStr, out size))
                    {
                        size = 0;
                    }

                    musicPlayer.MaxQueueSize = size;
                    await e.Channel.SendMessage($"🎵 `Max queue set to {(size == 0 ? ("unlimited") : size + " tracks")}`");
                });

                cgb.CreateCommand(Prefix + "cleanup")
                .Description($"Cleans up hanging voice connections. **Bot Owner Only!** | `{Prefix}cleanup`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Do(e =>
                {
                    foreach (var kvp in MusicPlayers)
                    {
                        var songs       = kvp.Value.Playlist;
                        var currentSong = kvp.Value.CurrentSong;
                        if (songs.Count == 0 && currentSong == null)
                        {
                            MusicPlayer throwaway;
                            MusicPlayers.TryRemove(kvp.Key, out throwaway);
                            throwaway.Destroy();
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "reptcursong")
                .Alias(Prefix + "rcs")
                .Description($"Toggles repeat of current song. | `{Prefix}rcs`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var currentSong = musicPlayer.CurrentSong;
                    if (currentSong == null)
                    {
                        return;
                    }
                    var currentValue = musicPlayer.ToggleRepeatSong();
                    await e.Channel.SendMessage(currentValue ?
                                                $"🎵🔂`Repeating track:`{currentSong.PrettyName}" :
                                                $"🎵🔂`Current track repeat stopped.`")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "rpeatplaylst")
                .Alias(Prefix + "rpl")
                .Description($"Toggles repeat of all songs in the queue (every song that finishes is added to the end of the queue). | `{Prefix}rpl`")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    var currentValue = musicPlayer.ToggleRepeatPlaylist();
                    await e.Channel.SendMessage($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "save")
                .Description($"Saves a playlist under a certain name. Name must be no longer than 20 characters and mustn't contain dashes. | `{Prefix}save classical1`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var name = e.GetArg("name")?.Trim();

                    if (string.IsNullOrWhiteSpace(name) ||
                        name.Length > 20 ||
                        name.Contains("-"))
                    {
                        return;
                    }

                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }

                    //to avoid concurrency issues
                    var currentPlaylist = new List <Song>(musicPlayer.Playlist);
                    var curSong         = musicPlayer.CurrentSong;
                    if (curSong != null)
                    {
                        currentPlaylist.Insert(0, curSong);
                    }

                    if (!currentPlaylist.Any())
                    {
                        return;
                    }


                    var songInfos = currentPlaylist.Select(s => new DataModels.SongInfo
                    {
                        Provider     = s.SongInfo.Provider,
                        ProviderType = (int)s.SongInfo.ProviderType,
                        Title        = s.SongInfo.Title,
                        Uri          = s.SongInfo.Uri,
                        Query        = s.SongInfo.Query,
                    }).ToList();

                    var playlist = new MusicPlaylist
                    {
                        CreatorId   = (long)e.User.Id,
                        CreatorName = e.User.Name,
                        Name        = name.ToLowerInvariant(),
                    };
                    DbHandler.Instance.SaveAll(songInfos);
                    DbHandler.Instance.Save(playlist);
                    DbHandler.Instance.Connection.InsertAll(songInfos.Select(s => new PlaylistSongInfo
                    {
                        PlaylistId = playlist.Id.Value,
                        SongInfoId = s.Id.Value
                    }), typeof(PlaylistSongInfo));

                    await e.Channel.SendMessage($"🎵 `Saved playlist as {name}-{playlist.Id}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "load")
                .Description($"Loads a playlist under a certain name.  | `{Prefix}load classical-1`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var voiceCh = e.User.VoiceChannel;
                    var textCh  = e.Channel;
                    if (voiceCh == null || voiceCh.Server != textCh.Server)
                    {
                        await textCh.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining.").ConfigureAwait(false);
                        return;
                    }
                    var name = e.GetArg("name")?.Trim().ToLowerInvariant();

                    if (string.IsNullOrWhiteSpace(name))
                    {
                        return;
                    }

                    var parts = name.Split('-');
                    if (parts.Length != 2)
                    {
                        return;
                    }
                    var playlistName = parts[0];

                    int playlistNumber;
                    if (!int.TryParse(parts[1], out playlistNumber))
                    {
                        return;
                    }

                    var playlist = DbHandler.Instance.FindOne <MusicPlaylist>(
                        p => p.Id == playlistNumber);

                    if (playlist == null)
                    {
                        await e.Channel.SendMessage("Can't find playlist under that name.").ConfigureAwait(false);
                        return;
                    }

                    var psis = DbHandler.Instance.FindAll <PlaylistSongInfo>(psi =>
                                                                             psi.PlaylistId == playlist.Id);

                    var songInfos = psis.Select(psi => DbHandler.Instance
                                                .FindOne <DataModels.SongInfo>(si => si.Id == psi.SongInfoId));

                    await e.Channel.SendMessage($"`Attempting to load {songInfos.Count()} songs`").ConfigureAwait(false);
                    foreach (var si in songInfos)
                    {
                        try
                        {
                            await QueueSong(e.User, textCh, voiceCh, si.Query, true, (MusicType)si.ProviderType).ConfigureAwait(false);
                        }
                        catch (PlaylistFullException)
                        {
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"Failed QueueSong in load playlist. {ex}");
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "playlists")
                .Alias(Prefix + "pls")
                .Description($"Lists all playlists. Paginated. 20 per page. Default page is 0. |`{Prefix}pls 1`")
                .Parameter("num", ParameterType.Optional)
                .Do(e =>
                {
                    int num = 0;
                    int.TryParse(e.GetArg("num"), out num);
                    if (num < 0)
                    {
                        return;
                    }
                    var result = DbHandler.Instance.GetPlaylistData(num);
                    if (result.Count == 0)
                    {
                        e.Channel.SendMessage($"`No saved playlists found on page {num}`").ConfigureAwait(false);
                    }
                    else
                    {
                        e.Channel.SendMessage($"```js\n--- List of saved playlists ---\n\n" + string.Join("\n", result.Select(r => $"'{r.Name}-{r.Id}' by {r.Creator} ({r.SongCnt} songs)")) + $"\n\n        --- Page {num} ---```").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "deleteplaylist")
                .Alias(Prefix + "delpls")
                .Description($"Deletes a saved playlist. Only if you made it or if you are the bot owner. | `{Prefix}delpls animu-5`")
                .Parameter("pl", ParameterType.Required)
                .Do(async e =>
                {
                    var pl = e.GetArg("pl").Trim().Split('-')[1];
                    if (string.IsNullOrWhiteSpace(pl))
                    {
                        return;
                    }
                    var plnum = int.Parse(pl);
                    if (MidnightBot.IsOwner(e.User.Id))
                    {
                        DbHandler.Instance.Delete <MusicPlaylist>(plnum);
                    }
                    else
                    {
                        DbHandler.Instance.DeleteWhere <MusicPlaylist>(mp => mp.Id == plnum && (long)e.User.Id == mp.CreatorId);
                    }
                    await e.Channel.SendMessage("`Ok.` :ok:").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "goto")
                .Description($"Goes to a specific time in seconds in a song. | `{Prefix}goto 30`")
                .Parameter("time")
                .Do(async e =>
                {
                    var skipToStr = e.GetArg("time")?.Trim();
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    if (e.User.VoiceChannel != musicPlayer.PlaybackVoiceChannel)
                    {
                        return;
                    }
                    int skipTo;
                    if (!int.TryParse(skipToStr, out skipTo) || skipTo < 0)
                    {
                        return;
                    }

                    var currentSong = musicPlayer.CurrentSong;

                    if (currentSong == null)
                    {
                        return;
                    }

                    //currentSong.PrintStatusMessage = false;
                    var gotoSong    = currentSong.Clone();
                    gotoSong.SkipTo = skipTo;
                    musicPlayer.AddSong(gotoSong, 0);
                    musicPlayer.Next();

                    var minutes = (skipTo / 60).ToString();
                    var seconds = (skipTo % 60).ToString();

                    if (minutes.Length == 1)
                    {
                        minutes = "0" + minutes;
                    }
                    if (seconds.Length == 1)
                    {
                        seconds = "0" + seconds;
                    }

                    await e.Channel.SendMessage($"`Skipped to {minutes}:{seconds}`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "getlink")
                .Alias(Prefix + "gl")
                .Description("Shows a link to the song in the queue by index, or the currently playing song by default.")
                .Parameter("index", ParameterType.Optional)
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }
                    int index;
                    string arg = e.GetArg("index")?.Trim();
                    if (!string.IsNullOrEmpty(arg) && int.TryParse(arg, out index))
                    {
                        var selSong = musicPlayer.Playlist.DefaultIfEmpty(null).ElementAtOrDefault(index - 1);
                        if (selSong == null)
                        {
                            await e.Channel.SendMessage("Could not select song, likely wrong index");
                        }
                        else
                        {
                            await e.Channel.SendMessage($"🎶`Selected song {selSong.SongInfo.Title}:` <{selSong.SongInfo.Query}>").ConfigureAwait(false);
                        }
                    }
                    else
                    {
                        var curSong = musicPlayer.CurrentSong;
                        if (curSong == null)
                        {
                            return;
                        }
                        await e.Channel.SendMessage($"🎶`Current song:` <{curSong.SongInfo.Query}>").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "autoplay")
                .Alias(Prefix + "ap")
                .Description("Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty)")
                .Do(async e =>
                {
                    MusicPlayer musicPlayer;
                    if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
                    {
                        return;
                    }

                    if (!musicPlayer.ToggleAutoplay())
                    {
                        await e.Channel.SendMessage("🎶`Autoplay disabled.`").ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("🎶`Autoplay enabled.`").ConfigureAwait(false);
                    }
                });
            });
        }
コード例 #9
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand(Prefix + "we")
                .Description($"Zeigt Wetter-Daten für eine genannte Stadt und ein Land. BEIDES IST BENÖTIGT. Wetter Api ist sehr zufällig, wenn du einen Fehler machst. | `{Prefix}we Moskau RF`")
                .Parameter("city", ParameterType.Required)
                .Parameter("country", ParameterType.Required)
                .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}").ConfigureAwait(false);

                    var obj = JObject.Parse(response)["weather"];

                    await e.Channel.SendMessage(
                        $@"🌍 **Wetter in** 【{obj["target"]}】
                        📏 **Lat,Long:** ({obj["latitude"]}, {obj["longitude"]}) ☁ **Condition:** {obj["condition"]}
                        😓 **Luftfeuchtigkeit:** {obj["humidity"]}% 💨 **Wind Geschwindigkeit:** {obj["windspeedk"]}km/h / {obj["windspeedm"]}mph 
                        🔆 **Temperatur:** {obj["centigrade"]}°C / {obj["fahrenheit"]}°F 🔆 **Gefühlt:** {obj["feelscentigrade"]}°C / {obj["feelsfahrenheit"]}°F
                        🌄 **Sonnenaufgang:** {obj["sunrise"]} 🌇 **Sonnenuntergang:** {obj["sunset"]}").ConfigureAwait(false);
                });



                cgb.CreateCommand(Prefix + "yt")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht Youtube und zeigt das erste Ergebnis. | `{Prefix}yt query`")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query"))))
                    {
                        return;
                    }

                    var link = await SearchHelper.FindYoutubeUrlByKeywords(e.GetArg("query")).ConfigureAwait(false);
                    if (string.IsNullOrWhiteSpace(link))
                    {
                        await e.Channel.SendMessage("Kein Ergebnis mit diesem Begriff gefunden.");
                        return;
                    }
                    var shortUrl = await SearchHelper.ShortenUrl(link).ConfigureAwait(false);
                    await e.Channel.SendMessage(shortUrl).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "ani")
                .Alias(Prefix + "anime", Prefix + "aq")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht anilist nach einem Anime und zeigt das erste Ergebnis. | `{Prefix}aq aquerion evol`")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")).ConfigureAwait(false)))
                    {
                        return;
                    }
                    string result;
                    try
                    {
                        result = (await SearchHelper.GetAnimeData(e.GetArg("query")).ConfigureAwait(false)).ToString();
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Anime konnte nicht gefunden werden.").ConfigureAwait(false);
                        return;
                    }

                    await e.Channel.SendMessage(result.ToString()).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "imdb")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht IMDB nach Filmen oder Serien und zeigt erstes Ergebnis. | `{Prefix}imdb query`")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")).ConfigureAwait(false)))
                    {
                        return;
                    }
                    await e.Channel.SendIsTyping().ConfigureAwait(false);
                    string result;
                    try
                    {
                        var movie = ImdbScraper.ImdbScrape(e.GetArg("query"), true);
                        if (movie.Status)
                        {
                            result = movie.ToString();
                        }
                        else
                        {
                            result = "Film nicht gefunden.";
                        }
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Film nicht gefunden.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(result.ToString());
                });

                cgb.CreateCommand(Prefix + "mang")
                .Alias(Prefix + "manga").Alias(Prefix + "mq")
                .Parameter("query", ParameterType.Unparsed)
                .Description($"Durchsucht anilist nach einem Manga und zeigt das erste Ergebnis. | `{Prefix}mq query`")
                .Do(async e =>
                {
                    if (!(await SearchHelper.ValidateQuery(e.Channel, e.GetArg("query")).ConfigureAwait(false)))
                    {
                        return;
                    }
                    string result;
                    try
                    {
                        result = (await SearchHelper.GetMangaData(e.GetArg("query")).ConfigureAwait(false)).ToString();
                    }
                    catch
                    {
                        await e.Channel.SendMessage("Manga konnte nicht gefunden werden.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(result).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randomcat")
                .Alias(Prefix + "meow")
                .Description($"Zeigt ein zufälliges Katzenbild. | `{Prefix}meow`")
                .Do(async e =>
                {
                    await e.Channel.SendMessage(JObject.Parse(
                                                    await SearchHelper.GetResponseStringAsync("http://www.random.cat/meow").ConfigureAwait(false))["file"].ToString())
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randomdog")
                .Alias(Prefix + "woof")
                .Description($"Zeigt ein zufälliges Hundebild. | `{Prefix}woof`")
                .Do(async e =>
                {
                    await e.Channel.SendMessage("http://random.dog/" + await SearchHelper.GetResponseStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "i")
                .Description($"Zeigt das erste Ergebnis für eine Suche. Benutze ~ir für unterschiedliche Ergebnisse. | `{Prefix}i cute kitten`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    IMG:
                    if (string.IsNullOrWhiteSpace(e.GetArg("query")))
                    {
                        return;
                    }
                    try
                    {
                        var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString (e.GetArg ("query"))}&cx=018084019232060951019%3Ahs5piey28-e&safe=medium&num=1&searchType=image&fields=items%2Flink&key={MidnightBot.GetRndGoogleAPIKey ()}";
                        var obj       = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false));

                        await e.Channel.SendMessage(obj["items"][0]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Limit erreicht!").ConfigureAwait(false);
                        }
                        else
                        {
                            goto IMG;
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "ir")
                .Description($"Zeigt ein zufälliges Bild bei einem angegeben Suchwort. | `{Prefix}ir cute kitten`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var apikey = MidnightBot.GetRndGoogleAPIKey();
                    RANDOMIMG:
                    await e.Channel.SendIsTyping();
                    if (string.IsNullOrWhiteSpace(e.GetArg("query")))
                    {
                        return;
                    }
                    try
                    {
                        var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(e.GetArg("query"))}&cx=018084019232060951019%3Ahs5piey28-e&safe=medium&num=1&searchType=image&start={rng.Next(1,50)}&fields=items%2Flink&key={apikey}";
                        var obj       = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false));
                        var items     = obj["items"] as JArray;
                        await e.Channel.SendMessage(items[0]["link"].ToString()).ConfigureAwait(false);
                    }
                    catch (HttpRequestException exception)
                    {
                        if (exception.Message.Contains("403 (Forbidden)"))
                        {
                            await e.Channel.SendMessage("Tägliches Limit erreicht!").ConfigureAwait(false);
                        }
                        else
                        {
                            goto RANDOMIMG;
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "lmgtfy")
                .Description($"Google etwas für einen Idioten. | `{Prefix}lmgtfy query`")
                .Parameter("ffs", ParameterType.Unparsed)
                .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())
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "google")
                .Alias(Prefix + "g")
                .Description($"Gibt einen Google-Suchlink für einen Begriff zurück. | `{Prefix}google query`")
                .Parameter("terms", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var terms = e.GetArg("terms")?.Trim();
                    if (string.IsNullOrWhiteSpace(terms))
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"https://google.com/search?q={ HttpUtility.UrlEncode(terms).Replace(' ', '+') }")
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "hs")
                .Description($"Sucht eine Heartstone-Karte und zeigt ihr Bild. Braucht eine Weile zum beenden. | `{Prefix}hs Ysera`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("name");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Bitte gib einen Kartennamen ein.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    var headers = new Dictionary <string, string> {
                        { "X-Mashape-Key", MidnightBot.Creds.MashapeKey }
                    };
                    var res = await SearchHelper.GetResponseStringAsync($"https://omgvamp-hearthstone-v1.p.mashape.com/cards/search/{Uri.EscapeUriString (arg)}", headers)
                              .ConfigureAwait(false);
                    try
                    {
                        var items  = JArray.Parse(res);
                        var images = new List <Image> ();
                        if (items == null)
                        {
                            throw new KeyNotFoundException("Es wurde keine Karte mit diesem Namen gefunden.");
                        }
                        var cnt = 0;
                        items.Shuffle();
                        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()).ConfigureAwait(false)));
                        }
                        if (items.Count > 4)
                        {
                            await e.Channel.SendMessage("⚠ Mehr als 4 Bilder gefunden. Zeige 4 Zufällige.").ConfigureAwait(false);
                        }
                        await e.Channel.SendFile(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png))
                        .ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await e.Channel.SendMessage($"💢 Error {ex.Message}").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "ud")
                .Description($"Durchsucht das Urban Dictionary nach einem Wort. | `{Prefix}ud Pineapple`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Bitte gib einen Suchbegriff ein.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendIsTyping().ConfigureAwait(false);
                    var headers = new Dictionary <string, string> {
                        { "X-Mashape-Key", MidnightBot.Creds.MashapeKey }
                    };
                    var res = await SearchHelper.GetResponseStringAsync($"https://mashape-community-urban-dictionary.p.mashape.com/define?term={Uri.EscapeUriString (arg)}", headers).ConfigureAwait(false);
                    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 ().ConfigureAwait (false)}>");
                        await e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Keine Definition für den Begriff gefunden.").ConfigureAwait(false);
                    }
                });
                // thanks to Blaubeerwald
                cgb.CreateCommand(Prefix + "#")
                .Description($"Durchsucht Tagdef.com nach einem Hashtag. | `{Prefix}# ff`")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg = e.GetArg("query");
                    if (string.IsNullOrWhiteSpace(arg))
                    {
                        await e.Channel.SendMessage("💢 Bitte gib einen Suchbegriff ein.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    var headers = new Dictionary <string, string> {
                        { "X-Mashape-Key", MidnightBot.Creds.MashapeKey }
                    };
                    var res = await SearchHelper.GetResponseStringAsync($"https://tagdef.p.mashape.com/one.{Uri.EscapeUriString (arg)}.json", headers).ConfigureAwait(false);
                    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 ().ConfigureAwait (false)}>");
                        await e.Channel.SendMessage(sb.ToString());
                    }
                    catch
                    {
                        await e.Channel.SendMessage("💢 Keine Definition gefunden.").ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "quote")
                .Description($"Zeigt ein zufälliges Zitat. | `{Prefix}quote`")
                .Do(async e =>
                {
                    var quote = MidnightBot.Config.Quotes[rng.Next(0, MidnightBot.Config.Quotes.Count)].ToString();
                    await e.Channel.SendMessage(quote).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "catfact")
                .Description($"Zeigt einen zufälligen Katzenfakt von <http://catfacts-api.appspot.com/api/facts> | `{Prefix}catfact`")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://catfacts-api.appspot.com/api/facts").ConfigureAwait(false);
                    if (response == null)
                    {
                        return;
                    }
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["facts"].ToString() + "`").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "yomama")
                .Alias(Prefix + "ym")
                .Description($"Zeigt einen zufälligen Witz von <http://api.yomomma.info/> | `{Prefix}ym`")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://api.yomomma.info/").ConfigureAwait(false);
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "randjoke")
                .Alias(Prefix + "rj")
                .Description($"Zeigt einen zufälligen Witz von <http://tambal.azurewebsites.net/joke/random> | `{Prefix}rj`")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false);
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "chucknorris")
                .Alias(Prefix + "cn")
                .Description($"Zeigt einen zufälligen Chuck Norris Witz von <http://tambal.azurewebsites.net/joke/random> | `{Prefix}cn`")
                .Do(async e =>
                {
                    var response = await SearchHelper.GetResponseStringAsync("http://api.icndb.com/jokes/random/").ConfigureAwait(false);
                    await e.Channel.SendMessage("`" + JObject.Parse(response)["value"]["joke"].ToString() + "` 😆").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "stardew")
                .Description($"Gibt einen Link zum Stardew Valley Wiki mit gegebenem Topic zurück. | `{Prefix}stardew Cow`")
                .Parameter("topic", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var topic = e.GetArg("topic")?.Trim().ToLowerInvariant();
                    if (string.IsNullOrWhiteSpace(topic))
                    {
                        return;
                    }

                    var upperTopic = topic[0].ToString().ToUpper() + topic.Substring(1);
                    topic.Replace(" ", "_");

                    await e.Channel.SendMessage($"Ich habe nach: {upperTopic} gesucht und folgendes gefunden: http://stardewvalleywiki.com/{topic}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "magicitem")
                .Alias(Prefix + "mi")
                .Description($"Zeigt ein zufälliges Magic-Item von <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items> | `{Prefix}mi`")
                .Do(async e =>
                {
                    var magicItems = JsonConvert.DeserializeObject <List <MagicItem> > (File.ReadAllText("data/magicitems.json"));
                    var item       = magicItems[rng.Next(0, magicItems.Count)].ToString();

                    await e.Channel.SendMessage(item).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "revav")
                .Description($"Gibt ein Google Reverse Image Search für das Profilbild einer Person zurück. | `{Prefix}revav \"@SomeGuy\"`")
                .Parameter("user", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usrStr = e.GetArg("user")?.Trim();

                    if (string.IsNullOrWhiteSpace(usrStr))
                    {
                        return;
                    }

                    var usr = e.Server.FindUsers(usrStr).FirstOrDefault();

                    if (usr == null || string.IsNullOrWhiteSpace(usr.AvatarUrl))
                    {
                        return;
                    }
                    await e.Channel.SendIsTyping();
                    await e.Channel.SendMessage($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "revimg")
                .Description($"Gibt eine 'Google Reverse Image Search' für ein Bild von einem Link zurück. | `{Prefix}revav Image link`")
                .Parameter("image", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var imgLink = e.GetArg("image")?.Trim();

                    if (string.IsNullOrWhiteSpace(imgLink))
                    {
                        return;
                    }
                    await e.Channel.SendMessage($"https://images.google.com/searchbyimage?image_url={imgLink}").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "safebooru")
                .Description($"Zeigt ein zufälliges Hentai Bild von safebooru  mit einem gegebenen Tag. Ein Tag ist optional aber bevorzugt. Benutze + für mehrere Tags. | `{Prefix}safebooru yuri +kissing`")
                .Parameter("tag", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var tag  = e.GetArg("tag")?.Trim() ?? "";
                    var link = await SearchHelper.GetSafebooruImageLink(tag).ConfigureAwait(false);
                    if (link == null)
                    {
                        await e.Channel.SendMessage("`Keine Ergebnisse.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(link).ConfigureAwait(false);
                    }
                });

                cgb.CreateCommand(Prefix + "pony")
                .Alias(Prefix + "broni")
                .Description($"Shows a random image from bronibooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `{Prefix}pony scootaloo`")
                .Parameter("tag", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var tag   = e.GetArg("tag")?.Trim() ?? "";
                    var broni = await SearchHelper.GetBronibooruImageLink(tag).ConfigureAwait(false);
                    if (broni != null)
                    {
                        await e.Channel.SendMessage("Bronibooru: " + broni).ConfigureAwait(false);
                    }
                    await e.Channel.SendMessage("Search yielded no results.");
                });

                cgb.CreateCommand(Prefix + "wiki")
                .Description("Gibt einen Wikipedia-Link zurück.")
                .Parameter("query", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var query  = e.GetArg("query");
                    var result = await SearchHelper.GetResponseStringAsync("https://en.wikipedia.org//w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles=" + Uri.EscapeDataString(query));
                    var data   = JsonConvert.DeserializeObject <WikipediaApiModel> (result);
                    if (data.Query.Pages[0].Missing)
                    {
                        await e.Channel.SendMessage("`Diese Seite konnte nicht gefunden werden.`");
                    }
                    else
                    {
                        await e.Channel.SendMessage(data.Query.Pages[0].FullUrl);
                    }
                });

                cgb.CreateCommand(Prefix + "clr")
                .Description($"Zeigt dir die zum Hex zugehörige Farbe.\n**Benutzung**: `{Prefix}clr 00ff00`")
                .Parameter("color", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var arg1 = e.GetArg("color")?.Trim()?.Replace("#", "");
                    if (string.IsNullOrWhiteSpace(arg1))
                    {
                        return;
                    }
                    var img = new Bitmap(50, 50);

                    var red   = Convert.ToInt32(arg1.Substring(0, 2), 16);
                    var green = Convert.ToInt32(arg1.Substring(2, 2), 16);
                    var blue  = Convert.ToInt32(arg1.Substring(4, 2), 16);
                    var brush = new SolidBrush(System.Drawing.Color.FromArgb(red, green, blue));

                    using (Graphics g = Graphics.FromImage(img))
                    {
                        g.FillRectangle(brush, 0, 0, 50, 50);
                        g.Flush();
                    }

                    await e.Channel.SendFile("arg1.png", img.ToStream());
                });

                cgb.CreateCommand(Prefix + "videocall")
                .Description($"Erstellt einen privaten <http://www.appear.in> Video Anruf Link für dich und andere erwähnte Personen. Der Link wird allen erwähnten Personen per persönlicher Nachricht geschickt. | `{Prefix}videocall \"@SomeGuy\"`")
                .Parameter("arg", ParameterType.Unparsed)
                .Do(async e =>
                {
                    try
                    {
                        var allUsrs      = e.Message.MentionedUsers.Union(new User[] { e.User });
                        var allUsrsArray = allUsrs as User[] ?? allUsrs.ToArray();
                        var str          = allUsrsArray.Aggregate("http://appear.in/", (current, usr) => current + Uri.EscapeUriString(usr.Name[0].ToString()));
                        str += new Random().Next();
                        foreach (var usr in allUsrsArray)
                        {
                            await usr.SendMessage(str).ConfigureAwait(false);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                });

                cgb.CreateCommand(Prefix + "av").Alias(Prefix + "avatar")
                .Parameter("mention", ParameterType.Required)
                .Description($"Zeigt den Avatar einer erwähnten Person. | `{Prefix}av @X`")
                .Do(async e =>
                {
                    var usr = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("Ungültiger Benutzer.").ConfigureAwait(false);
                        return;
                    }
                    await e.Channel.SendMessage(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false);
                });
            });
        }
コード例 #10
0
        public bool CanRun(Command command, User user, Channel channel, out string error)
        {
            error = String.Empty;

            if (!MidnightBot.Ready)
            {
                return(false);
            }

            if (channel.IsPrivate)
            {
                return(true);
            }

            if (ConfigHandler.IsUserBlacklisted(user.Id) ||
                (!channel.IsPrivate &&
                 (ConfigHandler.IsServerBlacklisted(channel.Server.Id) || ConfigHandler.IsChannelBlacklisted(channel.Id))))
            {
                return(false);
            }

            if (timeBlackList.Contains(user.Id))
            {
                return(false);
            }

            if (!channel.IsPrivate && !channel.Server.CurrentUser.GetPermissions(channel).SendMessages)
            {
                return(false);
            }

            timeBlackList.Add(user.Id);

            ServerPermissions perms;

            PermissionsHandler.PermissionsDict.TryGetValue(user.Server.Id, out perms);

            AddUserCooldown(user.Server.Id, user.Id, command.Text.ToLower());
            if (!MidnightBot.IsOwner(user.Id) && commandCooldowns.Keys.Contains(user.Server.Id + ":" + command.Text.ToLower()))
            {
                if (perms?.Verbose == true)
                {
                    error = $"{user.Mention} Du hast einen Cooldown auf diesem Befehl.";
                }
                return(false);
            }

            try
            {
                //is it a permission command?
                // if it is, check if the user has the correct role
                // if yes return true, if no return false
                if (command.Category == "Permissions")
                {
                    Discord.Role role = null;
                    try
                    {
                        role = PermissionHelper.ValidateRole(user.Server,
                                                             PermissionsHandler.GetServerPermissionsRoleName(user.Server));
                    }
                    catch { }
                    if (user.Server.Owner.Id == user.Id || (role != null && user.HasRole(role)) || MidnightBot.IsOwner(user.Id))
                    {
                        return(true);
                    }
                    throw new Exception($"Du hast nicht die benötigte Rolle (**{(perms?.PermissionsControllerRole ?? "Admin")}**) um die Berechtigungen zu ändern.");
                }

                var permissionType = PermissionsHandler.GetPermissionBanType(command, user, channel);

                string msg;

                if (permissionType == PermissionsHandler.PermissionBanType.ServerBanModule &&
                    command.Category.ToLower() == "nsfw")
                {
                    msg = $"**{command.Category}** Modul wurde gebannt von diesem **server**.\nNSFW Modul ist standardmäßig deaktiviert. Der Server-Owner kann `;sm nsfw enable` eingeben, um es zu aktivieren.";
                }
                else
                {
                    switch (permissionType)
                    {
                    case PermissionsHandler.PermissionBanType.None:
                        return(true);

                    case PermissionsHandler.PermissionBanType.ServerBanCommand:
                        msg = $"Befehl **{command.Text}** wurde gebannt von diesem **Server**.";
                        break;

                    case PermissionsHandler.PermissionBanType.ServerBanModule:
                        msg = $"Modul **{command.Category}** wurde gebannt von diesem **Server**.";
                        break;

                    case PermissionsHandler.PermissionBanType.ChannelBanCommand:
                        msg = $"Befehl **{command.Text}** wurde gebannt von diesem **Channel**.";
                        break;

                    case PermissionsHandler.PermissionBanType.ChannelBanModule:
                        msg = $"Modul **{command.Category}** wurde gebannt von diesem **Channel**.";
                        break;

                    case PermissionsHandler.PermissionBanType.RoleBanCommand:
                        msg = $"Du hast nicht die benötigte **Rolle** welche dich zur Benutzung vom **{command.Text}** Befehl berechtigt.";
                        break;

                    case PermissionsHandler.PermissionBanType.RoleBanModule:
                        msg = $"Du hast keine **Rolle** welche dich zur Benutzung vom **{command.Category}** Modul berechtigt.";
                        break;

                    case PermissionsHandler.PermissionBanType.UserBanCommand:
                        msg = $"{user.Mention}, Du wurdest gebannt von der Benutzung des **{command.Text}** Befehls.";
                        break;

                    case PermissionsHandler.PermissionBanType.UserBanModule:
                        msg = $"{user.Mention}, Du wurdest gebannt von der Benutzung des **{command.Category}** Modules.";
                        break;

                    default:
                        return(true);
                    }
                }
                if (PermissionsHandler.PermissionsDict[user.Server.Id].Verbose) //if verbose - print errors
                {
                    error = msg;
                }
                return(false);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception in canrun: {ex}");
                try
                {
                    if (perms != null && perms.Verbose)
                    {
                        //if verbose - print errors
                        error = ex.Message;
                    }
                }
                catch (Exception ex2)
                {
                    Console.WriteLine($"SERIOUS PERMISSION ERROR {ex2}\n\nUser:{user} Server: {user?.Server?.Name}/{user?.Server?.Id}");
                }
                return(false);
            }
        }
コード例 #11
0
 public RatelimitCommand(DiscordModule module) : base(module)
 {
     MidnightBot.Client.MessageReceived += async(s, e) =>
     {
         if (e.Channel.IsPrivate || e.User.Id == MidnightBot.Client.CurrentUser.Id || MidnightBot.IsOwner(e.User.Id))
         {
             return;
         }
         ConcurrentDictionary <ulong, DateTime> userTimePair;
         if (!RatelimitingChannels.TryGetValue(e.Channel.Id, out userTimePair))
         {
             return;
         }
         DateTime lastMessageTime;
         if (userTimePair.TryGetValue(e.User.Id, out lastMessageTime))
         {
             if (DateTime.Now - lastMessageTime < ratelimitTime)
             {
                 try
                 {
                     await e.Message.Delete().ConfigureAwait(false);
                 }
                 catch { }
                 return;
             }
         }
         userTimePair.AddOrUpdate(e.User.Id, id => DateTime.Now, (id, dt) => DateTime.Now);
     };
 }
コード例 #12
0
        public override void Install(ModuleManager manager)
        {
            var client = manager.Client;

            var serializer = new ManateeSerializer();

            TrelloConfiguration.Serializer         = serializer;
            TrelloConfiguration.Deserializer       = serializer;
            TrelloConfiguration.JsonFactory        = new ManateeFactory();
            TrelloConfiguration.RestClientProvider = new Manatee.Trello.WebApi.WebApiClientProvider();
            TrelloAuthorization.Default.AppKey     = MidnightBot.Creds.TrelloAppKey;
            //TrelloAuthorization.Default.UserToken = "[your user token]";

            Discord.Channel bound = null;
            Board           board = null;

            List <string> last5ActionIDs = null;

            t.Elapsed += async(s, e) =>
            {
                try
                {
                    if (board == null || bound == null)
                    {
                        return; //do nothing if there is no bound board
                    }
                    board.Refresh();
                    var cur5Actions      = board.Actions.Take(board.Actions.Count() < 5 ? board.Actions.Count() : 5);
                    var cur5ActionsArray = cur5Actions as Action[] ?? cur5Actions.ToArray();

                    if (last5ActionIDs == null)
                    {
                        last5ActionIDs = cur5ActionsArray.Select(a => a.Id).ToList();
                        return;
                    }

                    foreach (var a in cur5ActionsArray.Where(ca => !last5ActionIDs.Contains(ca.Id)))
                    {
                        await bound.Send("**--TRELLO NOTIFICATION--**\n" + a.ToString()).ConfigureAwait(false);
                    }
                    last5ActionIDs.Clear();
                    last5ActionIDs.AddRange(cur5ActionsArray.Select(a => a.Id));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Timer failed " + ex.ToString());
                }
            };

            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                cgb.CreateCommand(Prefix + "bind")
                .Description("Bindet einen trello Bot an einen einzigen Server. " +
                             "Du erhälst Benachrichtigungen, wenn etwas entfernt, oder hinzugefügt wird." +
                             $" | `{Prefix}bind [board_id]`")
                .Parameter("board_id", Discord.Commands.ParameterType.Required)
                .Do(async e =>
                {
                    if (!MidnightBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound != null)
                    {
                        return;
                    }
                    try
                    {
                        bound = e.Channel;
                        board = new Board(e.GetArg("board_id").Trim());
                        board.Refresh();
                        await e.Channel.SendMessage("Erfolgreich zu diesem Board und Channel gebunden " + board.Name).ConfigureAwait(false);
                        t.Start();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Board konnte nicht beigetreten werden. " + ex.ToString());
                    }
                });

                cgb.CreateCommand(Prefix + "unbind")
                .Description("Entknüpft einen Bot vom Channel und Board.")
                .Do(async e =>
                {
                    if (!MidnightBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound == null || bound != e.Channel)
                    {
                        return;
                    }
                    t.Stop();
                    bound = null;
                    board = null;
                    await e.Channel.SendMessage("Erfolgreich trello von diesem Channel entknüpft.").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "lists")
                .Alias(Prefix + "list")
                .Description("Listet alle Listen")
                .Do(async e =>
                {
                    if (!MidnightBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound == null || board == null || bound != e.Channel)
                    {
                        return;
                    }
                    await e.Channel.SendMessage("Lists for a board '" + board.Name + "'\n" + string.Join("\n", board.Lists.Select(l => "**• " + l.ToString() + "**")))
                    .ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "cards")
                .Description($"Lists all cards from the supplied list. You can supply either a name or an index. | `{Prefix}cards index`")
                .Parameter("list_name", Discord.Commands.ParameterType.Unparsed)
                .Do(async e =>
                {
                    if (!MidnightBot.IsOwner(e.User.Id))
                    {
                        return;
                    }
                    if (bound == null || board == null || bound != e.Channel || e.GetArg("list_name") == null)
                    {
                        return;
                    }

                    int num;
                    var success = int.TryParse(e.GetArg("list_name"), out num);
                    List list   = null;
                    if (success && num <= board.Lists.Count() && num > 0)
                    {
                        list = board.Lists[num - 1];
                    }
                    else
                    {
                        list = board.Lists.FirstOrDefault(l => l.Name == e.GetArg("list_name"));
                    }


                    if (list != null)
                    {
                        await e.Channel.SendMessage("There are " + list.Cards.Count() + " cards in a **" + list.Name + "** list\n" + string.Join("\n", list.Cards.Select(c => "**• " + c.ToString() + "**")))
                        .ConfigureAwait(false);
                    }
                    else
                    {
                        await e.Channel.SendMessage("No such list.").ConfigureAwait(false);
                    }
                });
            });
        }
コード例 #13
0
        internal static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel)
        {
            var server = user.Server;
            ServerPermissions serverPerms = PermissionsDict.GetOrAdd(server.Id, id => new ServerPermissions(id, server.Name));
            bool        val;
            Permissions perm;

            //If User is Owner. He can run blocked commands and modules
            if (MidnightBot.IsOwner(user.Id))
            {
                return(PermissionBanType.None);
            }
            //server
            if (serverPerms.Permissions.Modules.TryGetValue(command.Category, out val) && val == false)
            {
                return(PermissionBanType.ServerBanModule);
            }
            if (serverPerms.Permissions.Commands.TryGetValue(command.Text, out val) && val == false)
            {
                return(PermissionBanType.ServerBanCommand);
            }
            //channel
            if (serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perm) &&
                perm.Modules.TryGetValue(command.Category, out val) && val == false)
            {
                return(PermissionBanType.ChannelBanModule);
            }
            if (serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perm) &&
                perm.Commands.TryGetValue(command.Text, out val) && val == false)
            {
                return(PermissionBanType.ChannelBanCommand);
            }

            //ROLE PART - TWO CASES
            // FIRST CASE:
            // IF EVERY ROLE USER HAS IS BANNED FROM THE MODULE,
            // THAT MEANS USER CANNOT RUN THIS COMMAND
            // IF AT LEAST ONE ROLE EXIST THAT IS NOT BANNED,
            // USER CAN RUN THE COMMAND
            var foundNotBannedRole = false;

            foreach (var role in user.Roles)
            {
                //if every role is banned from using the module -> rolebanmodule
                if (serverPerms.RolePermissions.TryGetValue(role.Id, out perm) &&
                    perm.Modules.TryGetValue(command.Category, out val) && val == false)
                {
                    continue;
                }
                foundNotBannedRole = true;
                break;
            }
            if (!foundNotBannedRole)
            {
                return(PermissionBanType.RoleBanModule);
            }

            // SECOND CASE:
            // IF EVERY ROLE USER HAS IS BANNED FROM THE COMMAND,
            // THAT MEANS USER CANNOT RUN THAT COMMAND
            // IF AT LEAST ONE ROLE EXISTS THAT IS NOT BANNED,
            // USER CAN RUN THE COMMAND
            foundNotBannedRole = false;
            foreach (var role in user.Roles)
            {
                //if every role is banned from using the module -> rolebanmodule
                if (serverPerms.RolePermissions.TryGetValue(role.Id, out perm) &&
                    perm.Commands.TryGetValue(command.Text, out val) && val == false)
                {
                    continue;
                }
                else
                {
                    foundNotBannedRole = true;
                    break;
                }
            }
            if (!foundNotBannedRole)
            {
                return(PermissionBanType.RoleBanCommand);
            }

            //user
            if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) &&
                perm.Modules.TryGetValue(command.Category, out val) && val == false)
            {
                return(PermissionBanType.UserBanModule);
            }
            if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) &&
                perm.Commands.TryGetValue(command.Text, out val) && val == false)
            {
                return(PermissionBanType.UserBanCommand);
            }

            return(PermissionBanType.None);
        }
コード例 #14
0
 public static Func <Command, User, Channel, bool> OwnerOnly() =>
 (com, user, ch) => MidnightBot.IsOwner(user.Id);