using Remora.Discord.API;
using Remora.Discord.API.Abstractions.Objects;
using Remora.Discord.API.Objects;
using Remora.Discord.Extensions.Embeds;
using Remora.Rest.Core;
namespace TeamOctolings.Octobot.Extensions;
public static class EmbedBuilderExtensions
{
///
/// Adds a footer representing that an action was performed by a .
///
/// The builder to add the footer to.
/// The user that performed the action whose tag and avatar to use.
/// The builder with the added footer.
public static EmbedBuilder WithActionFooter(this EmbedBuilder builder, IUser user)
{
var avatarUrlResult = CDN.GetUserAvatarUrl(user, imageSize: 256);
var avatarUrl = avatarUrlResult.IsSuccess
? avatarUrlResult.Entity.AbsoluteUri
: CDN.GetDefaultUserAvatarUrl(user, imageSize: 256).Entity.AbsoluteUri;
return builder.WithFooter(
new EmbedFooter($"{Messages.IssuedBy}:\n{user.GetTag()}", avatarUrl));
}
///
/// Adds a title using the author field, making it smaller than using the title field.
///
/// The builder to add the small title to.
/// The text of the small title.
/// The user whose avatar to use in the small title.
/// The builder with the added small title in the author field.
public static EmbedBuilder WithSmallTitle(
this EmbedBuilder builder, string text, IUser? avatarSource = null)
{
Uri? avatarUrl = null;
if (avatarSource is not null)
{
var avatarUrlResult = CDN.GetUserAvatarUrl(avatarSource, imageSize: 256);
avatarUrl = avatarUrlResult.IsSuccess
? avatarUrlResult.Entity
: CDN.GetDefaultUserAvatarUrl(avatarSource, imageSize: 256).Entity;
}
builder.Author = new EmbedAuthorBuilder(text, iconUrl: avatarUrl?.AbsoluteUri);
return builder;
}
///
/// Adds a user avatar in the thumbnail field.
///
/// The builder to add the thumbnail to.
/// The user whose avatar to use in the thumbnail field.
/// The builder with the added avatar in the thumbnail field.
public static EmbedBuilder WithLargeUserAvatar(
this EmbedBuilder builder, IUser avatarSource)
{
var avatarUrlResult = CDN.GetUserAvatarUrl(avatarSource, imageSize: 256);
var avatarUrl = avatarUrlResult.IsSuccess
? avatarUrlResult.Entity
: CDN.GetDefaultUserAvatarUrl(avatarSource, imageSize: 256).Entity;
return builder.WithThumbnailUrl(avatarUrl.AbsoluteUri);
}
///
/// Adds a guild icon in the thumbnail field.
///
/// The builder to add the thumbnail to.
/// The guild whose icon to use in the thumbnail field.
/// The builder with the added icon in the thumbnail field.
public static EmbedBuilder WithLargeGuildIcon(
this EmbedBuilder builder, IGuild iconSource)
{
var iconUrlResult = CDN.GetGuildIconUrl(iconSource, imageSize: 256);
return iconUrlResult.IsSuccess
? builder.WithThumbnailUrl(iconUrlResult.Entity.AbsoluteUri)
: builder;
}
///
/// Adds a guild banner in the image field.
///
/// The builder to add the image to.
/// The guild whose banner to use in the image field.
/// The builder with the added banner in the image field.
public static EmbedBuilder WithGuildBanner(
this EmbedBuilder builder, IGuild bannerSource)
{
return bannerSource.Banner is not null
? builder.WithImageUrl(CDN.GetGuildBannerUrl(bannerSource).Entity.AbsoluteUri)
: builder;
}
///
/// Adds a footer representing that the action was performed in the .
///
/// The builder to add the footer to.
/// The guild whose name and icon to use.
/// The builder with the added footer.
public static EmbedBuilder WithGuildFooter(this EmbedBuilder builder, IGuild guild)
{
var iconUrlResult = CDN.GetGuildIconUrl(guild, imageSize: 256);
var iconUrl = iconUrlResult.IsSuccess
? iconUrlResult.Entity.AbsoluteUri
: default(Optional);
return builder.WithFooter(new EmbedFooter(guild.Name, iconUrl));
}
///
/// Adds a title representing that the action happened in the .
///
/// The builder to add the title to.
/// The guild whose name and icon to use.
/// The builder with the added title.
public static EmbedBuilder WithGuildTitle(this EmbedBuilder builder, IGuild guild)
{
var iconUrlResult = CDN.GetGuildIconUrl(guild, imageSize: 256);
var iconUrl = iconUrlResult.IsSuccess
? iconUrlResult.Entity.AbsoluteUri
: null;
builder.Author = new EmbedAuthorBuilder(guild.Name, iconUrl: iconUrl);
return builder;
}
///
/// Adds a scheduled event's cover image.
///
/// The builder to add the image to.
/// The ID of the scheduled event whose image to use.
/// The Optional containing the image hash.
/// The builder with the added cover image.
public static EmbedBuilder WithEventCover(
this EmbedBuilder builder, Snowflake eventId, Optional imageHashOptional)
{
if (!imageHashOptional.IsDefined(out var imageHash))
{
return builder;
}
var iconUrlResult = CDN.GetGuildScheduledEventCoverUrl(eventId, imageHash, imageSize: 1024);
return iconUrlResult.IsDefined(out var iconUrl) ? builder.WithImageUrl(iconUrl.AbsoluteUri) : builder;
}
}