diff --git a/src/Extensions/ChannelApiExtensions.cs b/src/Extensions/ChannelApiExtensions.cs
new file mode 100644
index 0000000..e4948ba
--- /dev/null
+++ b/src/Extensions/ChannelApiExtensions.cs
@@ -0,0 +1,23 @@
+using OneOf;
+using Remora.Discord.API.Abstractions.Objects;
+using Remora.Discord.API.Abstractions.Rest;
+using Remora.Rest.Core;
+using Remora.Results;
+
+namespace Octobot.Extensions;
+
+public static class ChannelApiExtensions
+{
+    public static async Task<Result> CreateMessageResultAsync(this IDiscordRestChannelAPI channelApi,
+        Snowflake channelId, Optional<string> message = default, Optional<string> nonce = default,
+        Optional<bool> isTextToSpeech = default, Optional<IReadOnlyList<IEmbed>> embeds = default,
+        Optional<IAllowedMentions> allowedMentions = default, Optional<IMessageReference> messageRefenence = default,
+        Optional<IReadOnlyList<IMessageComponent>> components = default,
+        Optional<IReadOnlyList<Snowflake>> stickerIds = default,
+        Optional<IReadOnlyList<OneOf<FileData, IPartialAttachment>>> attachments = default,
+        Optional<MessageFlags> flags = default, CancellationToken ct = default)
+    {
+        return (Result)await channelApi.CreateMessageAsync(channelId, message, nonce, isTextToSpeech, embeds,
+            allowedMentions, messageRefenence, components, stickerIds, attachments, flags, ct);
+    }
+}
diff --git a/src/Responders/GuildLoadedResponder.cs b/src/Responders/GuildLoadedResponder.cs
index 5d5d68a..65d0296 100644
--- a/src/Responders/GuildLoadedResponder.cs
+++ b/src/Responders/GuildLoadedResponder.cs
@@ -97,7 +97,7 @@ public class GuildLoadedResponder : IResponder<IGuildCreate>
             return Result.FromError(embed);
         }
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: new[] { built }, ct: ct);
     }
 
@@ -121,7 +121,7 @@ public class GuildLoadedResponder : IResponder<IGuildCreate>
             return Result.FromError(channelResult);
         }
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             channel, embeds: new[] { errorBuilt }, ct: ct);
     }
 }
diff --git a/src/Responders/GuildMemberJoinedResponder.cs b/src/Responders/GuildMemberJoinedResponder.cs
index 09075bf..b0d157d 100644
--- a/src/Responders/GuildMemberJoinedResponder.cs
+++ b/src/Responders/GuildMemberJoinedResponder.cs
@@ -77,7 +77,7 @@ public class GuildMemberJoinedResponder : IResponder<IGuildMemberAdd>
             return Result.FromError(embed);
         }
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             GuildSettings.PublicFeedbackChannel.Get(cfg), embeds: new[] { built },
             allowedMentions: Octobot.NoMentions, ct: ct);
     }
diff --git a/src/Responders/MessageDeletedResponder.cs b/src/Responders/MessageDeletedResponder.cs
index 5e4870b..9ce2456 100644
--- a/src/Responders/MessageDeletedResponder.cs
+++ b/src/Responders/MessageDeletedResponder.cs
@@ -103,7 +103,7 @@ public class MessageDeletedResponder : IResponder<IMessageDelete>
             return Result.FromError(embed);
         }
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: new[] { built },
             allowedMentions: Octobot.NoMentions, ct: ct);
     }
diff --git a/src/Responders/MessageEditedResponder.cs b/src/Responders/MessageEditedResponder.cs
index 3b0a6aa..828865c 100644
--- a/src/Responders/MessageEditedResponder.cs
+++ b/src/Responders/MessageEditedResponder.cs
@@ -112,7 +112,7 @@ public class MessageEditedResponder : IResponder<IMessageUpdate>
             return Result.FromError(embed);
         }
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: new[] { built },
             allowedMentions: Octobot.NoMentions, ct: ct);
     }
diff --git a/src/Services/Update/ScheduledEventUpdateService.cs b/src/Services/Update/ScheduledEventUpdateService.cs
index 9ec9fcf..8978abe 100644
--- a/src/Services/Update/ScheduledEventUpdateService.cs
+++ b/src/Services/Update/ScheduledEventUpdateService.cs
@@ -231,7 +231,7 @@ public sealed class ScheduledEventUpdateService : BackgroundService
             URL: $"https://discord.com/events/{scheduledEvent.GuildID}/{scheduledEvent.ID}"
         );
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             GuildSettings.EventNotificationChannel.Get(settings), roleMention, embeds: new[] { built },
             components: new[] { new ActionRowComponent(new[] { button }) }, ct: ct);
     }
@@ -322,7 +322,7 @@ public sealed class ScheduledEventUpdateService : BackgroundService
             return Result.FromError(startedEmbed);
         }
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             GuildSettings.EventNotificationChannel.Get(data.Settings),
             content, embeds: new[] { startedBuilt }, ct: ct);
     }
@@ -353,7 +353,7 @@ public sealed class ScheduledEventUpdateService : BackgroundService
             return Result.FromError(completedEmbed);
         }
 
-        var createResult = (Result)await _channelApi.CreateMessageAsync(
+        var createResult = await _channelApi.CreateMessageResultAsync(
             GuildSettings.EventNotificationChannel.Get(data.Settings),
             embeds: new[] { completedBuilt }, ct: ct);
         if (createResult.IsSuccess)
@@ -385,7 +385,7 @@ public sealed class ScheduledEventUpdateService : BackgroundService
             return Result.FromError(embed);
         }
 
-        var createResult = (Result)await _channelApi.CreateMessageAsync(
+        var createResult = await _channelApi.CreateMessageResultAsync(
             GuildSettings.EventNotificationChannel.Get(data.Settings), embeds: new[] { built }, ct: ct);
         if (createResult.IsSuccess)
         {
@@ -450,7 +450,7 @@ public sealed class ScheduledEventUpdateService : BackgroundService
             return Result.FromError(earlyResult);
         }
 
-        return (Result)await _channelApi.CreateMessageAsync(
+        return await _channelApi.CreateMessageResultAsync(
             GuildSettings.EventNotificationChannel.Get(data.Settings),
             content,
             embeds: new[] { earlyBuilt }, ct: ct);