private void BeginBroadcast(SocketGuild guild) { DiscordPermission permissions = guild.GetMember(_client.User.Id).GetPermissions(); // if our role(s) don't allow connecting + speaking in vc, those permissions being explicitly marked as "allowed" in perm overwrites is necessary OverwrittenPermissionState minimumOverwriteState = permissions.HasFlag(DiscordPermission.ConnectToVC) && permissions.HasFlag(DiscordPermission.SpeakInVC) ? OverwrittenPermissionState.Inherit : OverwrittenPermissionState.Allow; do { foreach (var channel in guild.Channels.Where(c => c.Type == ChannelType.Voice)) { var ourRoles = guild.GetMember(_client.User.Id).Roles; bool connect = true; foreach (var overwrite in channel.PermissionOverwrites) { if (overwrite.Type == PermissionOverwriteType.Role && ourRoles.Contains(overwrite.AffectedId) || overwrite.Type == PermissionOverwriteType.Member && overwrite.AffectedId == _client.User.Id) { if (overwrite.GetPermissionState(DiscordPermission.ConnectToVC) < minimumOverwriteState || overwrite.GetPermissionState(DiscordPermission.SpeakInVC) < minimumOverwriteState) { connect = false; break; } } } // disabled for now because: // if a the client will move onto an available guild if it's needed // issue is we don't know if that guild has any people connected to the vc either /* * if (guild.VoiceStates.Where(v => v.Channel != null && v.Channel.Id == channel.Id && v.UserId != _client.User.Id).Count() == 0) * connect = false; */ if (connect) { Speak(channel.ToVoiceChannel()); } Thread.Sleep(1000); } }while (Program.AvailableGuilds.IsEmpty || !Program.AvailableClients.IsEmpty); Console.WriteLine($"[{_client.User}] Done processing guild."); Program.AvailableGuilds.Enqueue(_currentGuild); Program.AvailableClients.Enqueue(this); }