private DiscordOverwrite ConstructDiscordOverwriteFromList(
            List <UIElement> list,
            DiscordChannel channel,
            DiscordNamedObject overwriteName,
            bool isRole
            )
        {
            var overwrite = new DiscordOverwrite(
                overwriteName.Id,
                isRole,
                channel.Type);

            var index = 2;

            foreach (DiscordPermission perm in Enum.GetValues(typeof(DiscordPermission)))
            {
                if (overwrite.Permission.ContainsKey(perm))
                {
                    var border = (Border)list.Find(e => Grid.GetColumn(e) == index);
                    overwrite.Permission[perm] = ((ToggleButton)border?.Child).IsChecked;
                }

                index++;
            }

            return(overwrite);
        }
        private void CreateOverwriteGridExistsToggle(
            DiscordChannel channel,
            DiscordNamedObject overwriteName,
            int rowIndex)
        {
            var border = new Border
            {
                BorderThickness = new Thickness(0, 0, 1, 1),
                BorderBrush     = new SolidColorBrush(Colors.Black)
            };

            var button = new ToggleButton()
            {
                Height = 20,
                Width  = 20,
                HorizontalContentAlignment = HorizontalAlignment.Center,
                VerticalContentAlignment   = VerticalAlignment.Center,
                Style = (Style)this.FindResource("AddRemoveToggleButton")
            };

            button.IsChecked = channel.Overwrites.Exists(o => o.Id == overwriteName.Id);
            button.Click    += this.OverwriteExistsButton_Click;

            border.Child = button;

            Grid.SetColumn(border, 1);
            Grid.SetRow(border, rowIndex);

            OverwriteGrid.Children.Add(border);
        }
        private void CreateOverwriteGridRow(
            DiscordGuild guild,
            DiscordNamedObject overwriteName,
            DiscordChannel channel,
            int row)
        {
            OverwriteGrid.RowDefinitions.Add(
                new RowDefinition {
                Height = new GridLength(30)
            });

            CreateOverwriteGridChannelLabel(channel, row);

            CreateOverwriteGridExistsToggle(channel, overwriteName, row);

            var permissions = Enum.GetValues(typeof(DiscordPermission));

            for (int i = 0; i < permissions.Length; i++)
            {
                CreateOverwriteGridPermissionToggle(
                    overwriteName,
                    channel,
                    (DiscordPermission)permissions.GetValue(i),
                    row,
                    i + 2,
                    guild.IsAdmin);
            }
        }
        public async Task RemoveOverwrite(
            ulong guildId,
            DiscordChannel channel,
            DiscordNamedObject overwriteName)
        {
            await DSharpPlusConnection.DeleteExistingOverwrite(channel.Id, overwriteName.Id);

            Guilds.First(g => g.Id == guildId)
            .Channels.First(c => c.Id == channel.Id)
            .Overwrites.RemoveAll(o => o.Id == overwriteName.Id);
        }
        public async Task AddOverwrite(
            ulong guildId,
            DiscordChannel channel,
            DiscordNamedObject overwriteName,
            bool isRole)
        {
            await DSharpPlusConnection.AddNewOverwrite(guildId, channel.Id, overwriteName.Id, isRole);

            Guilds.First(g => g.Id == guildId)
            .Channels.First(c => c.Id == channel.Id)
            .Overwrites.Add(new DiscordOverwrite(overwriteName.Id, isRole, channel.Type));
        }
        private void CreateOverwriteGridPermissionToggle(
            DiscordNamedObject overwriteName,
            DiscordChannel channel,
            DiscordPermission permission,
            int row,
            int col,
            bool canManage = false)
        {
            var rightBorderThickness =
                permission == DiscordPermission.CreateInvite ||
                permission == DiscordPermission.AddReactions ||
                permission == DiscordPermission.PrioritySpeaker
                ? 1 : 0;

            var border = new Border
            {
                BorderThickness = new Thickness(0, 0, rightBorderThickness, 1),
                BorderBrush     = new SolidColorBrush(Colors.Black)
            };

            border.IsEnabled = canManage;
            if (!border.IsEnabled)
            {
                border.Background = new SolidColorBrush(Colors.LightGray);
            }

            var channelOverwrite = channel.Overwrites.FirstOrDefault(o => o.Id == overwriteName.Id);

            if (channelOverwrite is not null &&
                channelOverwrite.Permission.TryGetValue(permission, out bool?permissionValue))
            {
                var btn = new ToggleButton
                {
                    IsChecked    = permissionValue,
                    Height       = 25,
                    Width        = 25,
                    Style        = (Style)this.FindResource("PermissionToggleButton"),
                    IsThreeState = true
                };

                btn.Click += this.PermissionToggleButton_Click;

                border.Child = btn;
            }

            Grid.SetColumn(border, col);
            Grid.SetRow(border, row);

            OverwriteGrid.Children.Add(border);
        }