* 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) | public static string GetStickerUrl(ulong stickerId, StickerFormatType format = StickerFormatType.Png) | ||||
| => $"{DiscordConfig.CDNUrl}stickers/{stickerId}.{FormatToExtension(format)}"; | => $"{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) | private static string FormatToExtension(StickerFormatType format) | ||||
| { | { | ||||
| return format switch | return format switch | ||||
| @@ -54,5 +54,10 @@ namespace Discord | |||||
| /// Gets or sets the status of the event. | /// Gets or sets the status of the event. | ||||
| /// </summary> | /// </summary> | ||||
| public Optional<GuildScheduledEventStatus> Status { get; set; } | 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> | ||||
| /// <param name="speakers">A collection of speakers for the event.</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="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> | /// <param name="options">The options to be used when sending the request.</param> | ||||
| /// <returns> | /// <returns> | ||||
| /// A task that represents the asynchronous create operation. | /// A task that represents the asynchronous create operation. | ||||
| @@ -1118,6 +1119,7 @@ namespace Discord | |||||
| DateTimeOffset? endTime = null, | DateTimeOffset? endTime = null, | ||||
| ulong? channelId = null, | ulong? channelId = null, | ||||
| string location = null, | string location = null, | ||||
| Image? coverImage = null, | |||||
| RequestOptions options = null); | RequestOptions options = null); | ||||
| /// <summary> | /// <summary> | ||||
| @@ -39,6 +39,11 @@ namespace Discord | |||||
| /// </remarks> | /// </remarks> | ||||
| string Description { get; } | string Description { get; } | ||||
| /// <summary> | |||||
| /// Gets the banner asset id of the event. | |||||
| /// </summary> | |||||
| string CoverImageId { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets the start time of the event. | /// Gets the start time of the event. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -80,6 +85,14 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| int? UserCount { get; } | 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> | /// <summary> | ||||
| /// Starts the event. | /// Starts the event. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -39,5 +39,7 @@ namespace Discord.API | |||||
| public Optional<User> Creator { get; set; } | public Optional<User> Creator { get; set; } | ||||
| [JsonProperty("user_count")] | [JsonProperty("user_count")] | ||||
| public Optional<int> UserCount { get; set; } | 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; } | public Optional<string> Description { get; set; } | ||||
| [JsonProperty("entity_type")] | [JsonProperty("entity_type")] | ||||
| public GuildScheduledEventType Type { get; set; } | 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; } | public Optional<GuildScheduledEventType> Type { get; set; } | ||||
| [JsonProperty("status")] | [JsonProperty("status")] | ||||
| public Optional<GuildScheduledEventStatus> Status { get; set; } | public Optional<GuildScheduledEventStatus> Status { get; set; } | ||||
| [JsonProperty("image")] | |||||
| public Optional<Image?> Image { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -799,7 +799,12 @@ namespace Discord.Rest | |||||
| PrivacyLevel = args.PrivacyLevel, | PrivacyLevel = args.PrivacyLevel, | ||||
| StartTime = args.StartTime, | StartTime = args.StartTime, | ||||
| Status = args.Status, | 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) | if(args.Location.IsSpecified) | ||||
| @@ -839,6 +844,7 @@ namespace Discord.Rest | |||||
| DateTimeOffset? endTime = null, | DateTimeOffset? endTime = null, | ||||
| ulong? channelId = null, | ulong? channelId = null, | ||||
| string location = null, | string location = null, | ||||
| Image? bannerImage = null, | |||||
| RequestOptions options = null) | RequestOptions options = null) | ||||
| { | { | ||||
| if(location != null) | if(location != null) | ||||
| @@ -864,6 +870,7 @@ namespace Discord.Rest | |||||
| if (endTime != null && endTime <= startTime) | if (endTime != null && endTime <= startTime) | ||||
| throw new ArgumentOutOfRangeException(nameof(endTime), $"{nameof(endTime)} cannot be before the start time"); | throw new ArgumentOutOfRangeException(nameof(endTime), $"{nameof(endTime)} cannot be before the start time"); | ||||
| var apiArgs = new CreateGuildScheduledEventParams() | var apiArgs = new CreateGuildScheduledEventParams() | ||||
| { | { | ||||
| ChannelId = channelId ?? Optional<ulong>.Unspecified, | ChannelId = channelId ?? Optional<ulong>.Unspecified, | ||||
| @@ -872,7 +879,8 @@ namespace Discord.Rest | |||||
| Name = name, | Name = name, | ||||
| PrivacyLevel = privacyLevel, | PrivacyLevel = privacyLevel, | ||||
| StartTime = startTime, | StartTime = startTime, | ||||
| Type = type | |||||
| Type = type, | |||||
| Image = bannerImage.HasValue ? bannerImage.Value.ToModel() : Optional<ImageModel>.Unspecified | |||||
| }; | }; | ||||
| if(location != null) | if(location != null) | ||||
| @@ -1167,6 +1167,7 @@ namespace Discord.Rest | |||||
| /// </param> | /// </param> | ||||
| /// <param name="speakers">A collection of speakers for the event.</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="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> | /// <param name="options">The options to be used when sending the request.</param> | ||||
| /// <returns> | /// <returns> | ||||
| /// A task that represents the asynchronous create operation. | /// A task that represents the asynchronous create operation. | ||||
| @@ -1180,8 +1181,9 @@ namespace Discord.Rest | |||||
| DateTimeOffset? endTime = null, | DateTimeOffset? endTime = null, | ||||
| ulong? channelId = null, | ulong? channelId = null, | ||||
| string location = null, | string location = null, | ||||
| Image? coverImage = null, | |||||
| RequestOptions options = 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 | #endregion | ||||
| @@ -1198,8 +1200,8 @@ namespace Discord.Rest | |||||
| IReadOnlyCollection<ICustomSticker> IGuild.Stickers => Stickers; | IReadOnlyCollection<ICustomSticker> IGuild.Stickers => Stickers; | ||||
| /// <inheritdoc /> | /// <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 /> | /// <inheritdoc /> | ||||
| async Task<IGuildScheduledEvent> IGuild.GetEventAsync(ulong id, RequestOptions options) | async Task<IGuildScheduledEvent> IGuild.GetEventAsync(ulong id, RequestOptions options) | ||||
| @@ -28,6 +28,9 @@ namespace Discord.Rest | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public string Description { get; private set; } | public string Description { get; private set; } | ||||
| /// <inheritdoc/> | |||||
| public string CoverImageId { get; private set; } | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public DateTimeOffset StartTime { get; private set; } | public DateTimeOffset StartTime { get; private set; } | ||||
| @@ -98,8 +101,13 @@ namespace Discord.Rest | |||||
| EntityId = model.EntityId; | EntityId = model.EntityId; | ||||
| Location = model.EntityMetadata?.Location.GetValueOrDefault(); | Location = model.EntityMetadata?.Location.GetValueOrDefault(); | ||||
| UserCount = model.UserCount.ToNullable(); | 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/> | /// <inheritdoc/> | ||||
| public Task StartAsync(RequestOptions options = null) | public Task StartAsync(RequestOptions options = null) | ||||
| => ModifyAsync(x => x.Status = GuildScheduledEventStatus.Active); | => ModifyAsync(x => x.Status = GuildScheduledEventStatus.Active); | ||||
| @@ -1295,6 +1295,7 @@ namespace Discord.WebSocket | |||||
| /// </param> | /// </param> | ||||
| /// <param name="speakers">A collection of speakers for the event.</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="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> | /// <param name="options">The options to be used when sending the request.</param> | ||||
| /// <returns> | /// <returns> | ||||
| /// A task that represents the asynchronous create operation. | /// A task that represents the asynchronous create operation. | ||||
| @@ -1308,6 +1309,7 @@ namespace Discord.WebSocket | |||||
| DateTimeOffset? endTime = null, | DateTimeOffset? endTime = null, | ||||
| ulong? channelId = null, | ulong? channelId = null, | ||||
| string location = null, | string location = null, | ||||
| Image? coverImage = null, | |||||
| RequestOptions options = null) | RequestOptions options = null) | ||||
| { | { | ||||
| // requirements taken from https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-permissions-requirements | // 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; | 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 /> | /// <inheritdoc /> | ||||
| IReadOnlyCollection<ICustomSticker> IGuild.Stickers => Stickers; | IReadOnlyCollection<ICustomSticker> IGuild.Stickers => Stickers; | ||||
| /// <inheritdoc /> | /// <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 /> | /// <inheritdoc /> | ||||
| async Task<IGuildScheduledEvent> IGuild.GetEventAsync(ulong id, RequestOptions options) | async Task<IGuildScheduledEvent> IGuild.GetEventAsync(ulong id, RequestOptions options) | ||||
| => await GetEventAsync(id, options).ConfigureAwait(false); | => await GetEventAsync(id, options).ConfigureAwait(false); | ||||
| @@ -35,6 +35,9 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public string Description { get; private set; } | public string Description { get; private set; } | ||||
| /// <inheritdoc/> | |||||
| public string CoverImageId { get; private set; } | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public DateTimeOffset StartTime { get; private set; } | public DateTimeOffset StartTime { get; private set; } | ||||
| @@ -109,8 +112,13 @@ namespace Discord.WebSocket | |||||
| StartTime = model.ScheduledStartTime; | StartTime = model.ScheduledStartTime; | ||||
| Status = model.Status; | Status = model.Status; | ||||
| UserCount = model.UserCount.ToNullable(); | 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/> | /// <inheritdoc/> | ||||
| public Task DeleteAsync(RequestOptions options = null) | public Task DeleteAsync(RequestOptions options = null) | ||||
| => GuildHelper.DeleteEventAsync(Discord, this, options); | => GuildHelper.DeleteEventAsync(Discord, this, options); | ||||