diff --git a/NadekoBot/Classes/Music/MusicControls.cs b/NadekoBot/Classes/Music/MusicControls.cs index 40201b26..fac665c3 100644 --- a/NadekoBot/Classes/Music/MusicControls.cs +++ b/NadekoBot/Classes/Music/MusicControls.cs @@ -43,8 +43,7 @@ namespace NadekoBot.Classes.Music { public Channel PlaybackVoiceChannel { get; private set; } - private bool Stopped { get; set; } - private readonly object disconnectLock = new object(); + private bool Stopped { get; set; } = false; public MusicPlayer(Channel startingVoiceChannel, float? defaultVolume) { if (startingVoiceChannel == null) @@ -99,7 +98,7 @@ namespace NadekoBot.Classes.Music { } } - public void Stop(bool disconnect = false) { + public void Stop() { lock (playlistLock) { playlist.Clear(); if (!SongCancelSource.IsCancellationRequested) @@ -178,6 +177,7 @@ namespace NadekoBot.Classes.Music { if (!SongCancelSource.IsCancellationRequested) SongCancelSource.Cancel(); try { + Stopped = true; audioClient.Disconnect(); } catch {} diff --git a/NadekoBot/Classes/Music/Song.cs b/NadekoBot/Classes/Music/Song.cs index 6f35e587..3ab59603 100644 --- a/NadekoBot/Classes/Music/Song.cs +++ b/NadekoBot/Classes/Music/Song.cs @@ -124,7 +124,7 @@ namespace NadekoBot.Classes.Music { $"**【 {SongInfo.Title.TrimTo(55)} 】**`{(SongInfo.Provider ?? "-")}`"; public SongInfo SongInfo { get; } - private PoopyBuffer songBuffer { get; } = new PoopyBuffer(10.MiB()); + private PoopyBuffer songBuffer { get; } = new PoopyBuffer(4.MiB()); private bool prebufferingComplete { get; set; } = false; public MusicPlayer MusicPlayer { get; set; } @@ -149,35 +149,38 @@ namespace NadekoBot.Classes.Music { var buffer = new byte[blockSize]; var attempt = 0; while (!cancelToken.IsCancellationRequested) { - var read = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, blockSize, cancelToken); + var read = 0; + try { + read = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, blockSize, cancelToken); + } catch { + return; + } if (read == 0) if (attempt++ == 20) break; else - await Task.Delay(50, cancelToken); + await Task.Delay(40, cancelToken); else attempt = 0; await songBuffer.WriteAsync(buffer, read, cancelToken); if (songBuffer.ContentLength > 2.MB()) prebufferingComplete = true; } - } catch { - Console.WriteLine("Buffering errored"); + } catch (Exception ex) { + Console.WriteLine($"Buffering errored: {ex.Message}"); } finally { Console.WriteLine($"Buffering done." + $" [{songBuffer.ContentLength}]"); if (p != null) { try { p.Kill(); - p.WaitForExit(); - } - catch {} + } catch { } p.Dispose(); } } }); internal async Task Play(IAudioClient voiceClient, CancellationToken cancelToken) { - var bufferTask = BufferSong(cancelToken); + var bufferTask = BufferSong(cancelToken).ConfigureAwait(false); var bufferAttempts = 0; const int waitPerAttempt = 500; var toAttemptTimes = SongInfo.ProviderType != MusicType.Normal ? 5 : 9; @@ -194,28 +197,33 @@ namespace NadekoBot.Classes.Music { var read = songBuffer.Read(buffer, blockSize); if (read == 0) if (attempt++ == 20) { - Console.WriteLine("Nothing to read."); voiceClient.Wait(); + await bufferTask; return; - } else - await Task.Delay(50); + } + else + await Task.Delay(50, cancelToken); else attempt = 0; while (this.MusicPlayer.Paused) await Task.Delay(200, cancelToken); - buffer = AdjustVolume(buffer, read, MusicPlayer.Volume); + buffer = AdjustVolume(buffer, MusicPlayer.Volume); + Console.WriteLine("ADJUST VOLUME ERROR"); + voiceClient.Send(buffer, 0, read); } + await bufferTask; + voiceClient.Clear(); cancelToken.ThrowIfCancellationRequested(); } //stackoverflow ftw - private static byte[] AdjustVolume(byte[] audioSamples, int dataLength, float volume) { + private static byte[] AdjustVolume(byte[] audioSamples, float volume) { if (Math.Abs(volume - 1.0f) < 0.01f) return audioSamples; var array = new byte[audioSamples.Length]; - for (var i = 0; i < dataLength; i += 2) { + for (var i = 0; i < array.Length; i += 2) { // convert byte pair to int short buf1 = audioSamples[i + 1]; diff --git a/NadekoBot/Modules/Administration.cs b/NadekoBot/Modules/Administration.cs index 4b185689..ac5a2f26 100644 --- a/NadekoBot/Modules/Administration.cs +++ b/NadekoBot/Modules/Administration.cs @@ -20,6 +20,8 @@ namespace NadekoBot.Modules { commands.Add(new PlayingRotate()); } + public override string Prefix { get; } = "."; + public override void Install(ModuleManager manager) { manager.CreateCommands("", cgb => { @@ -146,8 +148,7 @@ namespace NadekoBot.Modules { await role.Edit(color: new Color(red, green, blue)); await e.Channel.SendMessage($"Role {role.Name}'s color has been changed."); } catch (Exception ex) { - await e.Channel.SendMessage("Error occured, most likely invalid parameters."); - Console.WriteLine($".rolecolor error: {ex}"); + await e.Channel.SendMessage("Error occured, most likely invalid parameters or insufficient permissions."); } }); @@ -166,35 +167,56 @@ namespace NadekoBot.Modules { }); cgb.CreateCommand(".b").Alias(".ban") - .Parameter("everything", ParameterType.Unparsed) - .Description("Bans a mentioned user.") + .Parameter("user", ParameterType.Required) + .Parameter("msg", ParameterType.Optional) + .Description("Bans a user by id or name with an optional message.\n**Usage**: .b \"@some Guy\" Your behaviour is toxic.") .Do(async e => { - try { - if (e.User.ServerPermissions.BanMembers && e.Message.MentionedUsers.Any()) { - var usr = e.Message.MentionedUsers.First(); - await usr.Server.Ban(usr); - await e.Channel.SendMessage("Banned user " + usr.Name + " Id: " + usr.Id); + var msg = e.GetArg("msg"); + var user = e.GetArg("user"); + if (e.User.ServerPermissions.BanMembers) { + var usr = e.Server.FindUsers(user).FirstOrDefault(); + if (usr == null) { + await e.Channel.SendMessage("User not found."); + return; + } + if (!string.IsNullOrWhiteSpace(msg)) { + await usr.SendMessage($"**You have been BANNED from `{e.Server.Name}` server.**\n" + + $"Reason: {msg}"); + await Task.Delay(2000); // temp solution; give time for a message to be send, fu volt + } + try { + await e.Server.Ban(usr); + await e.Channel.SendMessage("Banned user " + usr.Name + " Id: " + usr.Id); + } catch { + await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions."); } - } - catch (Exception ex) { - } }); cgb.CreateCommand(".k").Alias(".kick") .Parameter("user") + .Parameter("msg",ParameterType.Unparsed) .Description("Kicks a mentioned user.") .Do(async e => { - try { - if (e.User.ServerPermissions.KickMembers && e.Message.MentionedUsers.Any()) { - var usr = e.Message.MentionedUsers.FirstOrDefault(); - if (usr == null) - return; + var msg = e.GetArg("msg"); + var user = e.GetArg("user"); + if (e.User.ServerPermissions.KickMembers) { + var usr = e.Server.FindUsers(user).FirstOrDefault(); + if (usr == null) { + await e.Channel.SendMessage("User not found."); + return; + } + if (!string.IsNullOrWhiteSpace(msg)) { + await usr.SendMessage($"**You have been KICKED from `{e.Server.Name}` server.**\n" + + $"Reason: {msg}"); + await Task.Delay(2000); // temp solution; give time for a message to be send, fu volt + } + try { await usr.Kick(); await e.Channel.SendMessage("Kicked user " + usr.Name + " Id: " + usr.Id); + } catch { + await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions."); } - } catch { - await e.Channel.SendMessage("No sufficient permissions."); } }); cgb.CreateCommand(".mute") diff --git a/NadekoBot/Modules/Conversations.cs b/NadekoBot/Modules/Conversations.cs index f5df2526..bc261675 100644 --- a/NadekoBot/Modules/Conversations.cs +++ b/NadekoBot/Modules/Conversations.cs @@ -15,7 +15,7 @@ using NadekoBot.Commands; namespace NadekoBot.Modules { internal class Conversations : DiscordModule { - private string firestr = "🔥 ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้ 🔥"; + private const string firestr = "🔥 ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้ 🔥"; public Conversations() { commands.Add(new CopyCommand()); commands.Add(new RequestsCommand());