Exemple #1
0
        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);
        }
Exemple #2
0
        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();
                }
            }
        }