Esempio n. 1
0
        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);
        }