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); } }
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); }
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); }); }
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); }); }
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); } }
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); }
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); }); }); }
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); } }); }); }
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); }); }); }
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); } }
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); }; }
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); } }); }); }
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); }
public static Func <Command, User, Channel, bool> OwnerOnly() => (com, user, ch) => MidnightBot.IsOwner(user.Id);