public async Task <bool> Fix(bool silent = false) { if (!Permissions.IsBotOwner(Context)) { if (!silent) { await Context.ApplyResultReaction(CommandResult.FailedUserPermission).ConfigureAwait(false); } return(false); } int fixedCount = 0; foreach (var link in _links) { if (link.Links.Count > 0 && ulong.TryParse(link.Value, out ulong messageId)) { var channelPermissions = (await link.Guild.GetCurrentUserAsync().ConfigureAwait(false))?.GetPermissions(link.Channel); if (channelPermissions?.AddReactions == true) { var message = await GetMessageAsync(link.Guild, messageId, link.Channel).ConfigureAwait(false); if (message != null) { foreach (var messageLink in link.Links) { var emoteValue = messageLink.Identity.Split('=', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); if (message != null) { var emote = ulong.TryParse(emoteValue, out ulong emoteId) ? EmotesHelper.GetGuildEmoteById(link.Guild, emoteId) : EmotesHelper.GetEmojiFromString(emoteValue); if (emote != null) { if (!message.Reactions.Any(r => r.Value.IsMe && string.Equals(r.Key.Name, emote.Name, StringComparison.CurrentCultureIgnoreCase))) { // Check if an identical emote exists but in a different capital casing. var emoteCaseInsensitive = message.Reactions.FirstOrDefault(r => string.Equals(r.Key.Name, emote.Name, StringComparison.CurrentCultureIgnoreCase)).Key; await message.AddReactionAsync(emoteCaseInsensitive ?? emote).ConfigureAwait(false); fixedCount++; } } } } } } } } if (!silent) { await Context.ApplyResultReaction(fixedCount == 0?CommandResult.SuccessAlt1 : CommandResult.Success).ConfigureAwait(false); } return(true); }