* Add Image property to create and modify events * Add CDN routes to get cover image * Update banner names * Update CDN.cs * Update IGuildScheduledEvent.cstags/3.4.0
@@ -208,6 +208,18 @@ namespace Discord | |||
public static string GetStickerUrl(ulong stickerId, StickerFormatType format = StickerFormatType.Png) | |||
=> $"{DiscordConfig.CDNUrl}stickers/{stickerId}.{FormatToExtension(format)}"; | |||
/// <summary> | |||
/// Returns an events cover image url. | |||
/// </summary> | |||
/// <param name="guildId">The guild id that the event is in.</param> | |||
/// <param name="eventId">The id of the event.</param> | |||
/// <param name="assetId">The id of the cover image asset.</param> | |||
/// <param name="format">The format of the image.</param> | |||
/// <param name="size">The size of the image.</param> | |||
/// <returns></returns> | |||
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 | |||
@@ -54,5 +54,10 @@ namespace Discord | |||
/// Gets or sets the status of the event. | |||
/// </summary> | |||
public Optional<GuildScheduledEventStatus> Status { get; set; } | |||
/// <summary> | |||
/// Gets or sets the banner image of the event. | |||
/// </summary> | |||
public Optional<Image?> CoverImage { get; set; } | |||
} | |||
} |
@@ -1105,6 +1105,7 @@ namespace Discord | |||
/// </param> | |||
/// <param name="speakers">A collection of speakers for the event.</param> | |||
/// <param name="location">The location of the event; links are supported</param> | |||
/// <param name="coverImage">The optional banner image for the event.</param> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// 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); | |||
/// <summary> | |||
@@ -40,6 +40,11 @@ namespace Discord | |||
string Description { get; } | |||
/// <summary> | |||
/// Gets the banner asset id of the event. | |||
/// </summary> | |||
string CoverImageId { get; } | |||
/// <summary> | |||
/// Gets the start time of the event. | |||
/// </summary> | |||
DateTimeOffset StartTime { get; } | |||
@@ -81,6 +86,14 @@ namespace Discord | |||
int? UserCount { get; } | |||
/// <summary> | |||
/// Gets this events banner image url. | |||
/// </summary> | |||
/// <param name="format">The format to return.</param> | |||
/// <param name="size">The size of the image to return in. This can be any power of two between 16 and 2048. | |||
/// <returns>The cover images url.</returns> | |||
string GetCoverImageUrl(ImageFormat format = ImageFormat.Auto, ushort size = 1024); | |||
/// <summary> | |||
/// Starts the event. | |||
/// </summary> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
@@ -39,5 +39,7 @@ namespace Discord.API | |||
public Optional<User> Creator { get; set; } | |||
[JsonProperty("user_count")] | |||
public Optional<int> UserCount { get; set; } | |||
[JsonProperty("image")] | |||
public string Image { get; set; } | |||
} | |||
} |
@@ -25,5 +25,7 @@ namespace Discord.API.Rest | |||
public Optional<string> Description { get; set; } | |||
[JsonProperty("entity_type")] | |||
public GuildScheduledEventType Type { get; set; } | |||
[JsonProperty("image")] | |||
public Optional<Image> Image { get; set; } | |||
} | |||
} |
@@ -27,5 +27,7 @@ namespace Discord.API.Rest | |||
public Optional<GuildScheduledEventType> Type { get; set; } | |||
[JsonProperty("status")] | |||
public Optional<GuildScheduledEventStatus> Status { get; set; } | |||
[JsonProperty("image")] | |||
public Optional<Image?> Image { get; set; } | |||
} | |||
} |
@@ -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<ImageModel?>.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<ulong>.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<ImageModel>.Unspecified | |||
}; | |||
if(location != null) | |||
@@ -1167,6 +1167,7 @@ namespace Discord.Rest | |||
/// </param> | |||
/// <param name="speakers">A collection of speakers for the event.</param> | |||
/// <param name="location">The location of the event; links are supported</param> | |||
/// <param name="coverImage">The optional banner image for the event.</param> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// 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<ICustomSticker> IGuild.Stickers => Stickers; | |||
/// <inheritdoc /> | |||
async Task<IGuildScheduledEvent> 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<IGuildScheduledEvent> 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); | |||
/// <inheritdoc /> | |||
async Task<IGuildScheduledEvent> IGuild.GetEventAsync(ulong id, RequestOptions options) | |||
@@ -29,6 +29,9 @@ namespace Discord.Rest | |||
public string Description { get; private set; } | |||
/// <inheritdoc/> | |||
public string CoverImageId { get; private set; } | |||
/// <inheritdoc/> | |||
public DateTimeOffset StartTime { get; private set; } | |||
/// <inheritdoc/> | |||
@@ -98,9 +101,14 @@ namespace Discord.Rest | |||
EntityId = model.EntityId; | |||
Location = model.EntityMetadata?.Location.GetValueOrDefault(); | |||
UserCount = model.UserCount.ToNullable(); | |||
CoverImageId = model.Image; | |||
} | |||
/// <inheritdoc/> | |||
public string GetCoverImageUrl(ImageFormat format = ImageFormat.Auto, ushort size = 1024) | |||
=> CDN.GetEventCoverImageUrl(Guild.Id, Id, CoverImageId, format, size); | |||
/// <inheritdoc/> | |||
public Task StartAsync(RequestOptions options = null) | |||
=> ModifyAsync(x => x.Status = GuildScheduledEventStatus.Active); | |||
@@ -1295,6 +1295,7 @@ namespace Discord.WebSocket | |||
/// </param> | |||
/// <param name="speakers">A collection of speakers for the event.</param> | |||
/// <param name="location">The location of the event; links are supported</param> | |||
/// <param name="coverImage">The optional banner image for the event.</param> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// 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 | |||
/// <inheritdoc /> | |||
IReadOnlyCollection<ICustomSticker> IGuild.Stickers => Stickers; | |||
/// <inheritdoc /> | |||
async Task<IGuildScheduledEvent> 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<IGuildScheduledEvent> 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); | |||
/// <inheritdoc /> | |||
async Task<IGuildScheduledEvent> IGuild.GetEventAsync(ulong id, RequestOptions options) | |||
=> await GetEventAsync(id, options).ConfigureAwait(false); | |||
@@ -36,6 +36,9 @@ namespace Discord.WebSocket | |||
public string Description { get; private set; } | |||
/// <inheritdoc/> | |||
public string CoverImageId { get; private set; } | |||
/// <inheritdoc/> | |||
public DateTimeOffset StartTime { get; private set; } | |||
/// <inheritdoc/> | |||
@@ -109,9 +112,14 @@ namespace Discord.WebSocket | |||
StartTime = model.ScheduledStartTime; | |||
Status = model.Status; | |||
UserCount = model.UserCount.ToNullable(); | |||
CoverImageId = model.Image; | |||
} | |||
/// <inheritdoc/> | |||
public string GetCoverImageUrl(ImageFormat format = ImageFormat.Auto, ushort size = 1024) | |||
=> CDN.GetEventCoverImageUrl(Guild.Id, Id, CoverImageId, format, size); | |||
/// <inheritdoc/> | |||
public Task DeleteAsync(RequestOptions options = null) | |||
=> GuildHelper.DeleteEventAsync(Discord, this, options); | |||