void IModule.Install(ModuleManager manager) { _manager = manager; _client = manager.Client; manager.CreateCommands("music", cgb => { //queue all more complex commands // commands.ForEach(cmd => cmd.Init(cgb)); cgb.CreateCommand("next") .Description("Goes to the next song in the queue.") .Do(async e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } await musicPlayers[e.Server].LoadNextSong(); }); cgb.CreateCommand("stop") .Description("Completely stops the music and unbinds the bot from the channel and cleanes up files.") .Do(e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } musicPlayers[e.Server].Stop(); }); cgb.CreateCommand("pause") .Description("Pauses or Unpauses the song") .Do(async e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } if (musicPlayers[e.Server].TogglePause()) { await _client.Reply(e, "🎵`Music player paused.`"); } else { await _client.Reply(e, "🎵`Music player unpaused.`"); } }); cgb.CreateCommand("q") .Alias("yq") .Description("Queue a song using keywords or link. Bot will join your voice channel. **You must be in a voice channel**.\n**Usage**: `!m q Dream Of Venice`") .Parameter("query", ParameterType.Unparsed) .Do(async e => await QueueSong(e, e.GetArg("query"))); cgb.CreateCommand("listq") .Alias("ls").Alias("lp") .Description("Lists up to 10 currently queued songs.") .Do(async e => { if (musicPlayers.ContainsKey(e.Server) == false) { await _client.Reply(e, "🎵 No active music player."); return; } var player = musicPlayers[e.Server]; string toSend = "🎵 **" + player.SongQueue.Count + "** `videos currently queued.` "; if (player.SongQueue.Count >= 25) { toSend += "**Song queue is full!**\n"; } await _client.Reply(e, toSend); int number = 1; await _client.Reply(e, string.Join("\n", player.SongQueue.Take(10).Select(v => $"`{number++}.` {v.FullPrettyName}"))); }); cgb.CreateCommand("nowplaying") .Alias("playing") .Description("Shows the song currently playing.") .Do(async e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } var player = musicPlayers[e.Server]; await _client.Reply(e, $"🎵`Now Playing` {player.CurrentSong.FullPrettyName}"); }); cgb.CreateCommand("vol") .Description("Sets the music volume 0-150%") .Parameter("val", ParameterType.Required) .Do(async e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } var player = musicPlayers[e.Server]; var arg = e.GetArg("val"); int volume; if (!int.TryParse(arg, out volume)) { await _client.Reply(e, "Volume number invalid."); return; } volume = player.SetVolume(volume); await _client.Reply(e, $"🎵 `Volume set to {volume}%`"); }); cgb.CreateCommand("min").Alias("mute") .Description("Sets the music volume to 0%") .Do(e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } var player = musicPlayers[e.Server]; player.SetVolume(0); }); cgb.CreateCommand("max") .Description("Sets the music volume to 100% (real max is actually 150%).") .Do(e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } var player = musicPlayers[e.Server]; player.SetVolume(100); }); cgb.CreateCommand("half") .Description("Sets the music volume to 50%.") .Do(e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } var player = musicPlayers[e.Server]; player.SetVolume(50); }); cgb.CreateCommand("shuffle") .Description("Shuffles the current playlist.") .Do(async e => { if (musicPlayers.ContainsKey(e.Server) == false) { return; } var player = musicPlayers[e.Server]; if (player.SongQueue.Count < 2) { await _client.Reply(e, "Not enough songs in order to perform the shuffle."); return; } player.SongQueue.Shuffle(); await _client.Reply(e, "🎵 `Songs shuffled.`"); }); bool setgameEnabled = true; Timer setgameTimer = new Timer(); setgameTimer.Interval = 20000; setgameTimer.Elapsed += (s, e) => { int num = musicPlayers.Where(kvp => kvp.Value.CurrentSong != null).Count(); _client.SetGame($"{num} songs".SnPl(num) + $", {musicPlayers.Sum(kvp => kvp.Value.SongQueue.Count())} queued"); }; cgb.CreateCommand("setgame") .Description("Sets the game of the bot to the number of songs playing.**Owner only**") .Do(async e => { setgameEnabled = !setgameEnabled; if (setgameEnabled) { setgameTimer.Start(); } else { setgameTimer.Stop(); } await _client.Reply(e, "`Music status " + (setgameEnabled ? "enabled`" : "disabled`")); }); cgb.CreateCommand("playlist") .Description("Queues up to 25 songs from a youtube playlist specified by a link, or keywords.") .Parameter("playlist", ParameterType.Unparsed) .Do(async e => { if (e.User.VoiceChannel?.Server != e.Server) { await _client.Reply(e, "💢 You need to be in the voice channel on this server."); return; } var ids = await Searches.GetVideoIDs(await Searches.GetPlaylistIdByKeyword(e.GetArg("playlist"))); //todo TEMPORARY SOLUTION, USE RESOLVE QUEUE IN THE FUTURE await _client.Reply(e, $"🎵 Attempting to queue **{ids.Count}** songs".SnPl(ids.Count)); foreach (var id in ids) { Task.Run(async() => await QueueSong(e, id, true)).ConfigureAwait(false); await Task.Delay(150); } await _client.Reply(e, $"🎵 Attempting to queue **{ids.Count}** songs".SnPl(ids.Count)); }); /* cgb.CreateCommand("radio").Alias("ra") * .Description("Queues a direct radio stream from a link.") * .Parameter("radio_link", ParameterType.Required) * .Do(async e => { * if (e.User.VoiceChannel?.Server != e.Server) { * await _client.Reply(e, "💢 You need to be in the voice channel on this server."); * return; * } * await QueueSong(e, e.GetArg("radio_link"),_client, radio: true); * });*/ cgb.CreateCommand("debug") .Description("Writes some music data to console.") .Do(e => { var output = "SERVER_NAME---SERVER_ID-----USERCOUNT----QUEUED\n" + string.Join("\n", musicPlayers.Select(kvp => kvp.Key.Name + "--" + kvp.Key.Id + " --" + kvp.Key.Users.Count() + "--" + kvp.Value.SongQueue.Count)); Console.WriteLine(output); }); }); }