diff --git a/NadekoBot/Modules/Music/Classes/MusicControls.cs b/NadekoBot/Modules/Music/Classes/MusicControls.cs index 70c5ef98..7011f092 100644 --- a/NadekoBot/Modules/Music/Classes/MusicControls.cs +++ b/NadekoBot/Modules/Music/Classes/MusicControls.cs @@ -175,6 +175,14 @@ namespace NadekoBot.Modules.Music.Classes } } + public void AddSong(Song s, int index) { + if (s == null) + throw new ArgumentNullException(nameof(s)); + lock (playlistLock) { + playlist.Insert(index, s); + } + } + public void RemoveSong(Song s) { if (s == null) diff --git a/NadekoBot/Modules/Music/Classes/Song.cs b/NadekoBot/Modules/Music/Classes/Song.cs index 2abf22f3..5c2a7466 100644 --- a/NadekoBot/Modules/Music/Classes/Song.cs +++ b/NadekoBot/Modules/Music/Classes/Song.cs @@ -43,11 +43,30 @@ namespace NadekoBot.Modules.Music.Classes private ulong bytesSent { get; set; } = 0; + public bool PrintStatusMessage { get; set; } = true; + + private int skipTo = 0; + public int SkipTo { + get { return SkipTo; } + set { + skipTo = value; + bytesSent = (ulong)skipTo * 3840 * 50; + } + } + private Song(SongInfo songInfo) { this.SongInfo = songInfo; } + public Song Clone() + { + var s = new Song(SongInfo); + s.MusicPlayer = MusicPlayer; + s.State = StreamState.Queued; + return s; + } + private Task BufferSong(CancellationToken cancelToken) => Task.Factory.StartNew(async () => { @@ -57,7 +76,7 @@ namespace NadekoBot.Modules.Music.Classes p = Process.Start(new ProcessStartInfo { FileName = "ffmpeg", - Arguments = $"-i {SongInfo.Uri} -f s16le -ar 48000 -ac 2 pipe:1 -loglevel quiet", + Arguments = $"-ss {skipTo} -i {SongInfo.Uri} -f s16le -ar 48000 -ac 2 pipe:1 -loglevel quiet", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = false, diff --git a/NadekoBot/Modules/Music/MusicModule.cs b/NadekoBot/Modules/Music/MusicModule.cs index c770d75a..bcd2bc0e 100644 --- a/NadekoBot/Modules/Music/MusicModule.cs +++ b/NadekoBot/Modules/Music/MusicModule.cs @@ -1,8 +1,8 @@ using Discord; using Discord.Commands; using Discord.Modules; -using NadekoBot.DataModels; using NadekoBot.Classes; +using NadekoBot.DataModels; using NadekoBot.Extensions; using NadekoBot.Modules.Music.Classes; using NadekoBot.Modules.Permissions.Classes; @@ -534,6 +534,42 @@ namespace NadekoBot.Modules.Music } } }); + + cgb.CreateCommand("goto") + .Description("Goes to a specific time in seconds in a song.") + .Parameter("time") + .Do(async e => + { + var skipToStr = e.GetArg("time")?.Trim(); + MusicPlayer musicPlayer; + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) + 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}`"); + }); }); } @@ -561,27 +597,35 @@ namespace NadekoBot.Modules.Music Message lastFinishedMessage = null; mp.OnCompleted += async (s, song) => { - try + if (song.PrintStatusMessage) { - if (lastFinishedMessage != null) - await lastFinishedMessage.Delete(); - if (playingMessage != null) - await playingMessage.Delete(); - lastFinishedMessage = await textCh.SendMessage($"🎵`Finished`{song.PrettyName}"); + try + { + if (lastFinishedMessage != null) + await lastFinishedMessage.Delete(); + if (playingMessage != null) + await playingMessage.Delete(); + lastFinishedMessage = await textCh.SendMessage($"🎵`Finished`{song.PrettyName}"); + } + catch { } } - catch { } }; mp.OnStarted += async (s, song) => { - var sender = s as MusicPlayer; - if (sender == null) - return; - try + if (song.PrintStatusMessage) { - var msgTxt = $"🎵`Playing`{song.PrettyName} `Vol: {(int)(sender.Volume * 100)}%`"; - playingMessage = await textCh.SendMessage(msgTxt); + var sender = s as MusicPlayer; + if (sender == null) + return; + + try + { + + var msgTxt = $"🎵`Playing`{song.PrettyName} `Vol: {(int)(sender.Volume * 100)}%`"; + playingMessage = await textCh.SendMessage(msgTxt); + } + catch { } } - catch { } }; return mp; }); diff --git a/NadekoBot/NadekoBot.csproj b/NadekoBot/NadekoBot.csproj index e098355f..12f1a2bc 100644 --- a/NadekoBot/NadekoBot.csproj +++ b/NadekoBot/NadekoBot.csproj @@ -40,7 +40,7 @@ full false bin\Debug\ - DEBUG;TRACE + TRACE;DEBUG;__DEMO__,__DEMO_EXPERIMENTAL__ prompt 4 true