Add Image property to Guild Scheduled Events (#2151)
* Add Image property to create and modify events * Add CDN routes to get cover image * Update banner names * Update CDN.cs * Update IGuildScheduledEvent.cs
This commit is contained in:
@@ -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)
|
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, options).ConfigureAwait(false);
|
=> 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)
|
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, options).ConfigureAwait(false);
|
=> 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);
|
||||||
|
|||||||
Reference in New Issue
Block a user