private bool ProcessSoundData(DataBase.ServerConfiguration configuration, UserChokeData userData, byte[] data) { if (DateTime.Now.Subtract(userData.Time).TotalMilliseconds < 30.0) { if (userData.Count >= configuration.Interval / 20) { userData.PcmData.RemoveRange(0, data.Length); } else { userData.Count++; } userData.PcmData.AddRange(data); } else { userData.PcmData.Clear(); userData.PcmData.AddRange(data); userData.Count = 1; } userData.Time = DateTime.Now; if (userData.Count >= configuration.Interval / 20) { if (Loudness(userData.PcmData.ToArray()) > configuration.MaxLoudness && DateTime.Now.Subtract(userData.LastMute).TotalMilliseconds > 500.0) { return(true); } } return(false); }
private async Task VoiceReceiveHandler(VoiceNextConnection connection, VoiceReceiveEventArgs args) { var guild = connection.TargetChannel.Guild; var user = args.User; if (guild == null || user == null) { return; } var configuration = await DataBase.GetServerConfiguration(guild.Id); UserChokeData userData = await stash[guild.Id].GetOrCreateUserData(user.Id); if (ProcessSoundData(configuration, userData, args.PcmData.ToArray())) { var member = await guild.GetMemberAsync(user.Id); await member.SetMuteAsync(true, $"Being louder than {string.Format("{0:0.##}", configuration.MaxLoudness)}% for {configuration.Interval} ms."); userData.Count = 0; userData.Time = DateTime.Now; userData.SessionChokes++; userData.LastMute = DateTime.Now; await DataBase.SetUserChokes(user.Id, ++userData.Chokes); if (configuration.MuteTime != -1) { var timer = new Timer() { AutoReset = false, Interval = configuration.MuteTime }; timer.Elapsed += async(s, e) => { await member.SetMuteAsync(false, $"{configuration.MuteTime} ms expired."); timer.Dispose(); }; timer.Start(); } } }