private async Task UpdateAutoVoiceChannels(DiscordGuild guild, AutoVoiceSettings settings)
        {
            var voiceChannelIds = settings.VoiceChannels
                                  .Select(v => v.VoiceChannelId)
                                  .ToList();

            foreach (var voiceChannelId in voiceChannelIds)
            {
                var voiceChannel = guild.GetChannel(voiceChannelId);

                if (voiceChannel is null)
                {
                    settings.RemoveChannel(voiceChannelId);
                }
                else if (!voiceChannel.Users.Any())
                {
                    settings.RemoveChannel(voiceChannelId);
                    await voiceChannel.DeleteAsync();
                }
                else
                {
                    await _autoVoiceService.UpdateNameAsync(voiceChannel);
                }
            }
        }
        private async Task OnUserLeft(DiscordChannel?voiceChannel, AutoVoiceSettings settings)
        {
            if (voiceChannel is null)
            {
                return;
            }

            if (!settings.ContainsChannel(voiceChannel))
            {
                return;
            }

            if (voiceChannel.Users.Any())
            {
                await _autoVoiceService.UpdateNameAsync(voiceChannel);

                return;
            }

            // All users left, now we can delete the channel
            if (settings.RemoveChannel(voiceChannel))
            {
                await voiceChannel.DeleteAsync();
            }
        }
        public async ValueTask <AutoVoiceSettings> GetOrCreateAsync(DiscordGuild guild)
        {
            var result = await GetAsync(guild);

            if (result is null)
            {
                result = new AutoVoiceSettings(guild.Id);
                await _context.AutoVoiceSettings.AddAsync(result);
            }

            return(result);
        }
        private async Task DisableModuleAsync(DiscordGuild guild, AutoVoiceSettings settings)
        {
            foreach (var voiceChannelId in settings.VoiceChannels.Select(v => v.VoiceChannelId))
            {
                var voiceChannel = guild.GetChannel(voiceChannelId);
                if (voiceChannel is not null)
                {
                    await voiceChannel.DeleteAsync();
                }
            }

            settings.ChannelCreatorId = null;
            settings.RemoveAllChannels();
        }
        private async Task OnUserJoin(DiscordChannel?voiceChannel, AutoVoiceSettings settings)
        {
            if (voiceChannel is null)
            {
                return;
            }

            if (settings.ContainsChannel(voiceChannel))
            {
                await _autoVoiceService.UpdateNameAsync(voiceChannel);
            }
            else if (settings.ChannelCreatorId == voiceChannel.Id)
            {
                await _autoVoiceService.UpdateNameAsync(voiceChannel);

                var newVoiceChannel = await _autoVoiceService.CreateAsync(voiceChannel.Guild, voiceChannel.Parent, settings.Bitrate);

                settings.AddChannel(newVoiceChannel);
            }
        }
 public async Task AddAsync(AutoVoiceSettings settings)
 {
     await _context.AutoVoiceSettings.AddAsync(settings);
 }