public async Task AddBinding(CommandContext ctx, [Description("URL of the message.")] string url, [Description("Emoji to react with.")] DiscordEmoji emoji, [Description("Roles which will be toggled after reaction.")] params DiscordRole[] roles) { DiscordMessage?message = await DiscordHelper.FindMessageFromLink(ctx.Guild, url); if (message == null) { throw new ArgumentOutOfRangeException($"Couldn't find message with link: {url}"); } ulong channelId = message.ChannelId; ulong messageId = message.Id; await _roleBindingsService.AddBindingsAsync(channelId, messageId, emoji.Name, roles.Select(r => r.Id).ToHashSet()); try { await message.CreateReactionAsync(emoji); DiscordEmoji thumbsUp = DiscordEmoji.FromName(ctx.Client, ":+1:"); await ctx.Message.CreateReactionAsync(thumbsUp); } catch (Exception e) { _logger.LogError(e, "Couldn't add reaction for emoji: {EmojiName} on {Url}", emoji.Name, url); DiscordEmoji thumbsUp = DiscordEmoji.FromName(ctx.Client, ":-1:"); await ctx.Message.CreateReactionAsync(thumbsUp); } }