diff --git a/src/Discord.Net.Core/CDN.cs b/src/Discord.Net.Core/CDN.cs
index d6535a4f1..1a8795101 100644
--- a/src/Discord.Net.Core/CDN.cs
+++ b/src/Discord.Net.Core/CDN.cs
@@ -208,6 +208,18 @@ namespace Discord
public static string GetStickerUrl(ulong stickerId, StickerFormatType format = StickerFormatType.Png)
=> $"{DiscordConfig.CDNUrl}stickers/{stickerId}.{FormatToExtension(format)}";
+ ///
+ /// Returns an events cover image url.
+ ///
+ /// The guild id that the event is in.
+ /// The id of the event.
+ /// The id of the cover image asset.
+ /// The format of the image.
+ /// The size of the image.
+ ///
+ public static string GetEventCoverImageUrl(ulong guildId, ulong eventId, string assetId, ImageFormat format = ImageFormat.Auto, ushort size = 1024)
+ => $"{DiscordConfig.CDNUrl}guild-events/{guildId}/{eventId}/{assetId}.{FormatToExtension(format, assetId)}?size={size}";
+
private static string FormatToExtension(StickerFormatType format)
{
return format switch
diff --git a/src/Discord.Net.Core/Entities/Guilds/GuildScheduledEventsProperties.cs b/src/Discord.Net.Core/Entities/Guilds/GuildScheduledEventsProperties.cs
index a3fd729e5..d3be8b784 100644
--- a/src/Discord.Net.Core/Entities/Guilds/GuildScheduledEventsProperties.cs
+++ b/src/Discord.Net.Core/Entities/Guilds/GuildScheduledEventsProperties.cs
@@ -54,5 +54,10 @@ namespace Discord
/// Gets or sets the status of the event.
///
public Optional Status { get; set; }
+
+ ///
+ /// Gets or sets the banner image of the event.
+ ///
+ public Optional CoverImage { get; set; }
}
}
diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs
index ae1b2d67d..3111ff495 100644
--- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs
+++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs
@@ -1105,6 +1105,7 @@ namespace Discord
///
/// A collection of speakers for the event.
/// The location of the event; links are supported
+ /// The optional banner image for the event.
/// The options to be used when sending the request.
///
/// A task that represents the asynchronous create operation.
@@ -1118,6 +1119,7 @@ namespace Discord
DateTimeOffset? endTime = null,
ulong? channelId = null,
string location = null,
+ Image? coverImage = null,
RequestOptions options = null);
///
diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuildScheduledEvent.cs b/src/Discord.Net.Core/Entities/Guilds/IGuildScheduledEvent.cs
index e50f4cc2b..4b2fa3bee 100644
--- a/src/Discord.Net.Core/Entities/Guilds/IGuildScheduledEvent.cs
+++ b/src/Discord.Net.Core/Entities/Guilds/IGuildScheduledEvent.cs
@@ -39,6 +39,11 @@ namespace Discord
///
string Description { get; }
+ ///
+ /// Gets the banner asset id of the event.
+ ///
+ string CoverImageId { get; }
+
///
/// Gets the start time of the event.
///
@@ -80,6 +85,14 @@ namespace Discord
///
int? UserCount { get; }
+ ///
+ /// Gets this events banner image url.
+ ///
+ /// The format to return.
+ /// The size of the image to return in. This can be any power of two between 16 and 2048.
+ /// The cover images url.
+ string GetCoverImageUrl(ImageFormat format = ImageFormat.Auto, ushort size = 1024);
+
///
/// Starts the event.
///
diff --git a/src/Discord.Net.Rest/API/Common/GuildScheduledEvent.cs b/src/Discord.Net.Rest/API/Common/GuildScheduledEvent.cs
index 338c24dc9..94c53e779 100644
--- a/src/Discord.Net.Rest/API/Common/GuildScheduledEvent.cs
+++ b/src/Discord.Net.Rest/API/Common/GuildScheduledEvent.cs
@@ -39,5 +39,7 @@ namespace Discord.API
public Optional Creator { get; set; }
[JsonProperty("user_count")]
public Optional UserCount { get; set; }
+ [JsonProperty("image")]
+ public string Image { get; set; }
}
}
diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildScheduledEventParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildScheduledEventParams.cs
index a207d3374..2ccd06fe6 100644
--- a/src/Discord.Net.Rest/API/Rest/CreateGuildScheduledEventParams.cs
+++ b/src/Discord.Net.Rest/API/Rest/CreateGuildScheduledEventParams.cs
@@ -25,5 +25,7 @@ namespace Discord.API.Rest
public Optional Description { get; set; }
[JsonProperty("entity_type")]
public GuildScheduledEventType Type { get; set; }
+ [JsonProperty("image")]
+ public Optional Image { get; set; }
}
}
diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildScheduledEventParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildScheduledEventParams.cs
index 3d191a0b3..1179ddcbe 100644
--- a/src/Discord.Net.Rest/API/Rest/ModifyGuildScheduledEventParams.cs
+++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildScheduledEventParams.cs
@@ -27,5 +27,7 @@ namespace Discord.API.Rest
public Optional Type { get; set; }
[JsonProperty("status")]
public Optional Status { get; set; }
+ [JsonProperty("image")]
+ public Optional Image { get; set; }
}
}
diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
index 874d3c2cd..25f474dcc 100644
--- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
+++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
@@ -799,7 +799,12 @@ namespace Discord.Rest
PrivacyLevel = args.PrivacyLevel,
StartTime = args.StartTime,
Status = args.Status,
- Type = args.Type
+ Type = args.Type,
+ Image = args.CoverImage.IsSpecified
+ ? args.CoverImage.Value.HasValue
+ ? args.CoverImage.Value.Value.ToModel()
+ : null
+ : Optional.Unspecified
};
if(args.Location.IsSpecified)
@@ -839,6 +844,7 @@ namespace Discord.Rest
DateTimeOffset? endTime = null,
ulong? channelId = null,
string location = null,
+ Image? bannerImage = null,
RequestOptions options = null)
{
if(location != null)
@@ -864,6 +870,7 @@ namespace Discord.Rest
if (endTime != null && endTime <= startTime)
throw new ArgumentOutOfRangeException(nameof(endTime), $"{nameof(endTime)} cannot be before the start time");
+
var apiArgs = new CreateGuildScheduledEventParams()
{
ChannelId = channelId ?? Optional.Unspecified,
@@ -872,7 +879,8 @@ namespace Discord.Rest
Name = name,
PrivacyLevel = privacyLevel,
StartTime = startTime,
- Type = type
+ Type = type,
+ Image = bannerImage.HasValue ? bannerImage.Value.ToModel() : Optional.Unspecified
};
if(location != null)
diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
index d90372636..2c37bb2da 100644
--- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
+++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
@@ -1167,6 +1167,7 @@ namespace Discord.Rest
///
/// A collection of speakers for the event.
/// The location of the event; links are supported
+ /// The optional banner image for the event.
/// The options to be used when sending the request.
///
/// A task that represents the asynchronous create operation.
@@ -1180,8 +1181,9 @@ namespace Discord.Rest
DateTimeOffset? endTime = null,
ulong? channelId = null,
string location = null,
+ Image? coverImage = null,
RequestOptions options = null)
- => GuildHelper.CreateGuildEventAsync(Discord, this, name, privacyLevel, startTime, type, description, endTime, channelId, location, options);
+ => GuildHelper.CreateGuildEventAsync(Discord, this, name, privacyLevel, startTime, type, description, endTime, channelId, location, coverImage, options);
#endregion
@@ -1198,8 +1200,8 @@ namespace Discord.Rest
IReadOnlyCollection IGuild.Stickers => Stickers;
///
- async Task IGuild.CreateEventAsync(string name, DateTimeOffset startTime, GuildScheduledEventType type, GuildScheduledEventPrivacyLevel privacyLevel, string description, DateTimeOffset? endTime, ulong? channelId, string location, RequestOptions options)
- => await CreateEventAsync(name, startTime, type, privacyLevel, description, endTime, channelId, location, options).ConfigureAwait(false);
+ async Task IGuild.CreateEventAsync(string name, DateTimeOffset startTime, GuildScheduledEventType type, GuildScheduledEventPrivacyLevel privacyLevel, string description, DateTimeOffset? endTime, ulong? channelId, string location, Image? coverImage, RequestOptions options)
+ => await CreateEventAsync(name, startTime, type, privacyLevel, description, endTime, channelId, location, coverImage, options).ConfigureAwait(false);
///
async Task IGuild.GetEventAsync(ulong id, RequestOptions options)
diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuildEvent.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuildEvent.cs
index d3ec11fc6..0b02e60ba 100644
--- a/src/Discord.Net.Rest/Entities/Guilds/RestGuildEvent.cs
+++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuildEvent.cs
@@ -28,6 +28,9 @@ namespace Discord.Rest
///
public string Description { get; private set; }
+ ///
+ public string CoverImageId { get; private set; }
+
///
public DateTimeOffset StartTime { get; private set; }
@@ -98,8 +101,13 @@ namespace Discord.Rest
EntityId = model.EntityId;
Location = model.EntityMetadata?.Location.GetValueOrDefault();
UserCount = model.UserCount.ToNullable();
+ CoverImageId = model.Image;
}
+ ///
+ public string GetCoverImageUrl(ImageFormat format = ImageFormat.Auto, ushort size = 1024)
+ => CDN.GetEventCoverImageUrl(Guild.Id, Id, CoverImageId, format, size);
+
///
public Task StartAsync(RequestOptions options = null)
=> ModifyAsync(x => x.Status = GuildScheduledEventStatus.Active);
diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
index 4a7d4fafb..b38dfcd74 100644
--- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
+++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
@@ -1295,6 +1295,7 @@ namespace Discord.WebSocket
///
/// A collection of speakers for the event.
/// The location of the event; links are supported
+ /// The optional banner image for the event.
/// The options to be used when sending the request.
///
/// A task that represents the asynchronous create operation.
@@ -1308,6 +1309,7 @@ namespace Discord.WebSocket
DateTimeOffset? endTime = null,
ulong? channelId = null,
string location = null,
+ Image? coverImage = null,
RequestOptions options = null)
{
// requirements taken from https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-permissions-requirements
@@ -1324,7 +1326,7 @@ namespace Discord.WebSocket
break;
}
- return GuildHelper.CreateGuildEventAsync(Discord, this, name, privacyLevel, startTime, type, description, endTime, channelId, location, options);
+ return GuildHelper.CreateGuildEventAsync(Discord, this, name, privacyLevel, startTime, type, description, endTime, channelId, location, coverImage, options);
}
@@ -1803,8 +1805,8 @@ namespace Discord.WebSocket
///
IReadOnlyCollection IGuild.Stickers => Stickers;
///
- async Task IGuild.CreateEventAsync(string name, DateTimeOffset startTime, GuildScheduledEventType type, GuildScheduledEventPrivacyLevel privacyLevel, string description, DateTimeOffset? endTime, ulong? channelId, string location, RequestOptions options)
- => await CreateEventAsync(name, startTime, type, privacyLevel, description, endTime, channelId, location, options).ConfigureAwait(false);
+ async Task IGuild.CreateEventAsync(string name, DateTimeOffset startTime, GuildScheduledEventType type, GuildScheduledEventPrivacyLevel privacyLevel, string description, DateTimeOffset? endTime, ulong? channelId, string location, Image? coverImage, RequestOptions options)
+ => await CreateEventAsync(name, startTime, type, privacyLevel, description, endTime, channelId, location, coverImage, options).ConfigureAwait(false);
///
async Task IGuild.GetEventAsync(ulong id, RequestOptions options)
=> await GetEventAsync(id, options).ConfigureAwait(false);
diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuildEvent.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuildEvent.cs
index df619e4ca..a86aafadf 100644
--- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuildEvent.cs
+++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuildEvent.cs
@@ -35,6 +35,9 @@ namespace Discord.WebSocket
///
public string Description { get; private set; }
+ ///
+ public string CoverImageId { get; private set; }
+
///
public DateTimeOffset StartTime { get; private set; }
@@ -109,8 +112,13 @@ namespace Discord.WebSocket
StartTime = model.ScheduledStartTime;
Status = model.Status;
UserCount = model.UserCount.ToNullable();
+ CoverImageId = model.Image;
}
+ ///
+ public string GetCoverImageUrl(ImageFormat format = ImageFormat.Auto, ushort size = 1024)
+ => CDN.GetEventCoverImageUrl(Guild.Id, Id, CoverImageId, format, size);
+
///
public Task DeleteAsync(RequestOptions options = null)
=> GuildHelper.DeleteEventAsync(Discord, this, options);