From 6e23aa2d6799c08f4dffd59a440e78567f7d75ca Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Sun, 28 Feb 2016 18:42:34 +0100 Subject: [PATCH] optimizations, tried to fix queue of longs songs. --- NadekoBot/Classes/Music/Song.cs | 10 +- NadekoBot/Classes/NadekoStats.cs | 111 +++++++++++++------ NadekoBot/Modules/Administration.cs | 11 +- NadekoBot/NadekoBot.cs | 4 +- NadekoBot/bin/Debug/Discord.Net.Audio.dll | Bin 65536 -> 65536 bytes NadekoBot/bin/Debug/Discord.Net.Commands.dll | Bin 40448 -> 40448 bytes NadekoBot/bin/Debug/Discord.Net.Modules.dll | Bin 35328 -> 35328 bytes NadekoBot/bin/Debug/Discord.Net.dll | Bin 311808 -> 311808 bytes 8 files changed, 90 insertions(+), 46 deletions(-) diff --git a/NadekoBot/Classes/Music/Song.cs b/NadekoBot/Classes/Music/Song.cs index 18448373..bc595d44 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(2.MB()); + private PoopyBuffer songBuffer { get; } = new PoopyBuffer(10.MB()); private bool prebufferingComplete { get; set; } = false; public MusicPlayer MusicPlayer { get; set; } @@ -148,24 +148,24 @@ namespace NadekoBot.Classes.Music { while (!cancelToken.IsCancellationRequested) { int read = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, blockSize); if (read == 0) - if (attempt++ == 10) + if (attempt++ == 20) break; else await Task.Delay(50); else attempt = 0; await songBuffer.WriteAsync(buffer, read, cancelToken); - if (songBuffer.ContentLength > 1.MB()) + if (songBuffer.ContentLength > 2.MB()) prebufferingComplete = true; } - Console.WriteLine("Buffering done."); + Console.WriteLine($"Buffering done. [{songBuffer.ContentLength}]"); }); internal async Task Play(IAudioClient voiceClient, CancellationToken cancelToken) { var t = BufferSong(cancelToken).ConfigureAwait(false); int bufferAttempts = 0; int waitPerAttempt = 500; - int toAttemptTimes = SongInfo.ProviderType != MusicType.Normal ? 4 : 8; + int toAttemptTimes = SongInfo.ProviderType != MusicType.Normal ? 5 : 9; while (!prebufferingComplete && bufferAttempts++ < toAttemptTimes) { await Task.Delay(waitPerAttempt); } diff --git a/NadekoBot/Classes/NadekoStats.cs b/NadekoBot/Classes/NadekoStats.cs index 346349a5..b980149e 100644 --- a/NadekoBot/Classes/NadekoStats.cs +++ b/NadekoBot/Classes/NadekoStats.cs @@ -7,10 +7,8 @@ using System.Linq; using NadekoBot.Extensions; using System.Threading.Tasks; -namespace NadekoBot -{ - public class NadekoStats - { +namespace NadekoBot { + public class NadekoStats { public string BotVersion = "NadekoBot 0.8-beta14"; private static readonly NadekoStats _instance = new NadekoStats(); @@ -23,6 +21,10 @@ namespace NadekoBot private string _statsCache = ""; private Stopwatch _statsSW = new Stopwatch(); + public int ServerCount { get; private set; } = 0; + public int TextChannelsCount { get; private set; } = 0; + public int VoiceChannelsCount { get; private set; } = 0; + List messages = new List(); static NadekoStats() { } @@ -37,6 +39,50 @@ namespace NadekoBot Task.Run(() => StartCollecting()); Console.WriteLine("Logging enabled."); + + ServerCount = _client.Servers.Count(); + var channels = _client.Servers.SelectMany(s => s.AllChannels); + TextChannelsCount = channels.Where(c => c.Type == ChannelType.Text).Count(); + VoiceChannelsCount = channels.Count() - TextChannelsCount; + + _client.JoinedServer += (s, e) => { + try { + ServerCount++; + TextChannelsCount += e.Server.TextChannels.Count(); + VoiceChannelsCount += e.Server.VoiceChannels.Count(); + } + catch { } + }; + _client.LeftServer += (s, e) => { + try { + ServerCount--; + TextChannelsCount -= e.Server.TextChannels.Count(); + VoiceChannelsCount -= e.Server.VoiceChannels.Count(); + } + catch { } + }; + _client.ChannelCreated += (s, e) => { + try { + if (e.Channel.IsPrivate) + return; + if (e.Channel.Type == ChannelType.Text) + TextChannelsCount++; + else if (e.Channel.Type == ChannelType.Voice) + VoiceChannelsCount++; + } + catch { } + }; + _client.ChannelDestroyed += (s, e) => { + try { + if (e.Channel.IsPrivate) + return; + if (e.Channel.Type == ChannelType.Text) + VoiceChannelsCount++; + else if (e.Channel.Type == ChannelType.Voice) + VoiceChannelsCount--; + } + catch { } + }; } public TimeSpan GetUptime() => @@ -47,29 +93,31 @@ namespace NadekoBot return time.Days + " days, " + time.Hours + " hours, and " + time.Minutes + " minutes."; } - public void LoadStats() { - var sb = new System.Text.StringBuilder(); - sb.AppendLine("`Author: Kwoth` `Library: Discord.Net`"); - //$"\nDiscord.Net version: {DiscordConfig.LibVersion}" + - //$"\nRuntime: {_client.GetRuntime()}" + - sb.AppendLine($"`Bot Version: {BotVersion}`"); - //$"\nLogged in as: {_client.CurrentUser.Name}" + - sb.AppendLine($"`Bot id: {_client.CurrentUser.Id}`"); - sb.AppendLine($"`Owner id: {NadekoBot.OwnerID}`"); - sb.AppendLine($"`Uptime: {GetUptimeString()}`"); - sb.Append($"`Servers: {_client.Servers.Count()}"); - sb.AppendLine($" | Channels: {_client.Servers.Sum(s => s.AllChannels.Count())}`"); - //$"\nUsers: {_client.Servers.SelectMany(x => x.Users.Select(y => y.Id)).Count()} (non-unique)" + - sb.AppendLine($"`Heap: {Math.Round((double)GC.GetTotalMemory(true) / 1.MiB(), 2).ToString()} MB`"); - sb.AppendLine($"`Commands Ran this session: {_commandsRan}`"); - sb.AppendLine($"`Message queue size:{_client.MessageQueue.Count}`"); - sb.AppendLine($"`Greeted {Commands.ServerGreetCommand.Greeted} times.`"); - _statsCache = sb.ToString(); - } + public Task LoadStats() => + Task.Run(() => { + var sb = new System.Text.StringBuilder(); + sb.AppendLine("`Author: Kwoth` `Library: Discord.Net`"); + //$"\nDiscord.Net version: {DiscordConfig.LibVersion}" + + //$"\nRuntime: {_client.GetRuntime()}" + + sb.AppendLine($"`Bot Version: {BotVersion}`"); + //$"\nLogged in as: {_client.CurrentUser.Name}" + + sb.AppendLine($"`Bot id: {_client.CurrentUser.Id}`"); + sb.AppendLine($"`Owner id: {NadekoBot.OwnerID}`"); + sb.AppendLine($"`Uptime: {GetUptimeString()}`"); + sb.Append($"`Servers: {ServerCount}"); + sb.Append($" | TextChannels: {TextChannelsCount}"); + sb.AppendLine($" | VoiceChannels: {VoiceChannelsCount}`"); + //$"\nUsers: {_client.Servers.SelectMany(x => x.Users.Select(y => y.Id)).Count()} (non-unique)" + + sb.AppendLine($"`Heap: {Math.Round((double)GC.GetTotalMemory(false) / 1.MiB(), 2).ToString()} MB`"); + sb.AppendLine($"`Commands Ran this session: {_commandsRan}`"); + sb.AppendLine($"`Message queue size:{_client.MessageQueue.Count}`"); + sb.AppendLine($"`Greeted {Commands.ServerGreetCommand.Greeted} times.`"); + _statsCache = sb.ToString(); + }); - public string GetStats() { - if (_statsSW.ElapsedTicks > 5) { - LoadStats(); + public async Task GetStats() { + if (_statsSW.Elapsed.Seconds > 5) { + await LoadStats(); _statsSW.Restart(); } return _statsCache; @@ -91,28 +139,29 @@ namespace NadekoBot ConnectedServers = connectedServers, DateAdded = DateTime.Now }); - } catch { + } + catch { Console.WriteLine("DB Exception in stats collecting."); break; } } } //todo - batch save this - private void StatsCollector_RanCommand(object sender, CommandEventArgs e) - { + private void StatsCollector_RanCommand(object sender, CommandEventArgs e) { try { _commandsRan++; Classes.DBHandler.Instance.InsertData(new Classes._DataModels.Command { ServerId = (long)e.Server.Id, ServerName = e.Server.Name, ChannelId = (long)e.Channel.Id, - ChannelName =e.Channel.Name, + ChannelName = e.Channel.Name, UserId = (long)e.User.Id, UserName = e.User.Name, CommandName = e.Command.Text, DateAdded = DateTime.Now }); - } catch { + } + catch { Console.WriteLine("Parse error in ran command."); } } diff --git a/NadekoBot/Modules/Administration.cs b/NadekoBot/Modules/Administration.cs index 78f984db..d1300e39 100644 --- a/NadekoBot/Modules/Administration.cs +++ b/NadekoBot/Modules/Administration.cs @@ -368,21 +368,16 @@ namespace NadekoBot.Modules { cgb.CreateCommand(".stats") .Description("Shows some basic stats for Nadeko.") .Do(async e => { - var t = Task.Run(() => { - return NadekoStats.Instance.GetStats(); //+ "`" + Music.GetMusicStats() + "`"; - }); - - await e.Channel.SendMessage(await t); - + await e.Channel.SendMessage(await NadekoStats.Instance.GetStats()); }); - + /* cgb.CreateCommand(".leaveall") .Description("Nadeko leaves all servers **OWNER ONLY**") .Do(e => { if (e.User.Id == NadekoBot.OwnerID) NadekoBot.client.Servers.ForEach(async s => { if (s.Name == e.Server.Name) return; await s.Leave(); }); }); - + */ cgb.CreateCommand(".prune") .Parameter("num", ParameterType.Required) .Description("Prunes a number of messages from the current channel.\n**Usage**: .prune 5") diff --git a/NadekoBot/NadekoBot.cs b/NadekoBot/NadekoBot.cs index 25411069..3955d61a 100644 --- a/NadekoBot/NadekoBot.cs +++ b/NadekoBot/NadekoBot.cs @@ -69,7 +69,7 @@ namespace NadekoBot { LogLevel = LogSeverity.Warning, LogHandler = (s, e) => { try { - Console.WriteLine($"Severity: {e.Severity}\nMessage: {e.Message}\nExceptionMessage: {e.Exception?.Message ?? "-"}\nException: {(e.Exception?.ToString() ?? "-")}"); + Console.WriteLine($"Severity: {e.Severity}\nMessage: {e.Message}\nExceptionMessage: {e.Exception?.Message ?? "-"}");//\nException: {(e.Exception?.ToString() ?? "-")}"); } catch { } } @@ -135,7 +135,7 @@ namespace NadekoBot { return; } Console.WriteLine("-----------------"); - Console.WriteLine(NadekoStats.Instance.GetStats()); + Console.WriteLine(await NadekoStats.Instance.GetStats()); Console.WriteLine("-----------------"); try { diff --git a/NadekoBot/bin/Debug/Discord.Net.Audio.dll b/NadekoBot/bin/Debug/Discord.Net.Audio.dll index d78758e65d04e6f749e698bbaea26989c4176268..3c1178d6d2b793d2266af432c2e3c18dc7c71361 100644 GIT binary patch delta 11885 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 EABA*uPyhe` delta 12205 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 diff --git a/NadekoBot/bin/Debug/Discord.Net.Modules.dll b/NadekoBot/bin/Debug/Discord.Net.Modules.dll index 9d8214f215c461d54b035b4ff0ed07f06d6a27e0..e0c10031890b25d490d948dedd337457d8debff6 100644 GIT binary patch delta 88 zcmZpe!qhN@X+j5c67S`W-HiDHyAxQ}6hHsyIp@HnpWIJsZ)~2E|AJ2kC>zEA1WZ6I p!^preXATh8F)#!Ly9C#MU-K)h_JQNpS$R|TZ1XPMyrC|D8vrd}BfbCt delta 88 zcmZpe!qhN@X+j6{Q^!jiyBYHZTF!sD7p`{9edB}%eenx3oHozNf5E2%lnrA50wy4q pVPs&KGY5$47#M