diff --git a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs index 5092b4e7f..ad2d659ee 100644 --- a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs +++ b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs @@ -180,6 +180,20 @@ namespace Discord /// A sticker was deleted. /// StickerDeleted = 92, + + /// + /// A scheduled event was created. + /// + EventCreate = 100, + /// + /// A scheduled event was created. + /// + EventUpdate = 101, + /// + /// A scheduled event was created. + /// + EventDelete = 102, + /// /// A thread was created. /// diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs index edbb2bea8..f071fc1f9 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs @@ -52,6 +52,10 @@ namespace Discord.Rest [ActionType.MessagePinned] = MessagePinAuditLogData.Create, [ActionType.MessageUnpinned] = MessageUnpinAuditLogData.Create, + [ActionType.EventCreate] = ScheduledEventCreateAuditLogData.Create, + [ActionType.EventUpdate] = ScheduledEventUpdateAuditLogData.Create, + [ActionType.EventDelete] = ScheduledEventDeleteAuditLogData.Create, + [ActionType.ThreadCreate] = ThreadCreateAuditLogData.Create, [ActionType.ThreadUpdate] = ThreadUpdateAuditLogData.Create, [ActionType.ThreadDelete] = ThreadDeleteAuditLogData.Create, diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventCreateAuditLogData.cs new file mode 100644 index 000000000..11faa3371 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventCreateAuditLogData.cs @@ -0,0 +1,149 @@ +using System; +using System.Linq; +using Discord.API; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a scheduled event creation. + /// + public class ScheduledEventCreateAuditLogData : IAuditLogData + { + private ScheduledEventCreateAuditLogData(ulong id, ulong guildId, ulong? channelId, ulong? creatorId, string name, string description, DateTimeOffset scheduledStartTime, DateTimeOffset? scheduledEndTime, GuildScheduledEventPrivacyLevel privacyLevel, GuildScheduledEventStatus status, GuildScheduledEventType entityType, ulong? entityId, string location, RestUser creator, int userCount, string image) + { + Id = id ; + GuildId = guildId ; + ChannelId = channelId ; + CreatorId = creatorId ; + Name = name ; + Description = description ; + ScheduledStartTime = scheduledStartTime; + ScheduledEndTime = scheduledEndTime ; + PrivacyLevel = privacyLevel ; + Status = status ; + EntityType = entityType ; + EntityId = entityId ; + Location = location ; + Creator = creator ; + UserCount = userCount ; + Image = image ; + } + + internal static ScheduledEventCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var id = entry.TargetId.Value; + + var guildId = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "guild_id") + .NewValue.ToObject(discord.ApiClient.Serializer); + var channelId = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "channel_id") + .NewValue.ToObject(discord.ApiClient.Serializer); + var creatorId = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "channel_id") + .NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(); + var name = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name") + .NewValue.ToObject(discord.ApiClient.Serializer); + var description = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "description") + .NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(); + var scheduledStartTime = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "scheduled_start_time") + .NewValue.ToObject(discord.ApiClient.Serializer); + var scheduledEndTime = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "scheduled_end_time") + .NewValue.ToObject(discord.ApiClient.Serializer); + var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level") + .NewValue.ToObject(discord.ApiClient.Serializer); + var status = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "status") + .NewValue.ToObject(discord.ApiClient.Serializer); + var entityType = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "entity_type") + .NewValue.ToObject(discord.ApiClient.Serializer); + var entityId = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "entity_id") + .NewValue.ToObject(discord.ApiClient.Serializer); + var entityMetadata = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "entity_metadata") + .NewValue.ToObject(discord.ApiClient.Serializer); + var creator = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "creator") + .NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(); + var userCount = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "user_count") + .NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(); + var image = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "image") + .NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(); + + var creatorUser = creator == null ? null : RestUser.Create(discord, creator); + + return new ScheduledEventCreateAuditLogData(id, guildId, channelId, creatorId, name, description, scheduledStartTime, scheduledEndTime, privacyLevel, status, entityType, entityId, entityMetadata.Location.GetValueOrDefault(), creatorUser, userCount, image); + } + + // Doc Note: Corresponds to the *current* data + + /// + /// Gets the snowflake id of the event. + /// + public ulong Id { get; } + /// + /// Gets the snowflake id of the guild the event is associated with. + /// + public ulong GuildId { get; } + /// + /// Gets the snowflake id of the channel the event is associated with. + /// + public ulong? ChannelId { get; } + /// + /// Gets the snowflake id of the original creator of the event. + /// + public ulong? CreatorId { get; } + /// + /// Gets name of the event. + /// + public string Name { get; } + /// + /// Gets the description of the event. null if none is set. + /// + public string Description { get; } + /// + /// Gets the time the event was scheduled for. + /// + public DateTimeOffset ScheduledStartTime { get; } + /// + /// Gets the time the event was scheduled to end. + /// + public DateTimeOffset? ScheduledEndTime { get; } + /// + /// Gets the privacy level of the event. + /// + public GuildScheduledEventPrivacyLevel PrivacyLevel { get; } + /// + /// Gets the status of the event. + /// + public GuildScheduledEventStatus Status { get; } + /// + /// Gets the type of the entity associated with the event (stage / void / external). + /// + public GuildScheduledEventType EntityType { get; } + /// + /// Gets the snowflake id of the entity associated with the event (stage / void / external). + /// + public ulong? EntityId { get; } + /// + /// Gets the metadata for the entity associated with the event. + /// + public string Location { get; } + /// + /// Gets the user that originally created the event. + /// + public RestUser Creator { get; } + /// + /// Gets the count of users interested in this event. + /// + public int UserCount { get; } + /// + /// Gets the image hash of the image that was attached to the event. Null if not set. + /// + public string Image { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventDeleteAuditLogData.cs new file mode 100644 index 000000000..34fa96225 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventDeleteAuditLogData.cs @@ -0,0 +1,34 @@ +using System; +using System.Linq; +using Discord.API; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a scheduled event deleteion. + /// + public class ScheduledEventDeleteAuditLogData : IAuditLogData + { + private ScheduledEventDeleteAuditLogData(ulong id) + { + Id = id; + } + + internal static ScheduledEventDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var id = entry.TargetId.Value; + + return new ScheduledEventDeleteAuditLogData(id); + } + + // Doc Note: Corresponds to the *current* data + + /// + /// Gets the snowflake id of the event. + /// + public ulong Id { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventInfo.cs new file mode 100644 index 000000000..a45956546 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventInfo.cs @@ -0,0 +1,80 @@ +using System; + +namespace Discord.Rest +{ + /// + /// Represents information for a scheduled event. + /// + public class ScheduledEventInfo + { + /// + /// Gets the snowflake id of the guild the event is associated with. + /// + public ulong? GuildId { get; } + /// + /// Gets the snowflake id of the channel the event is associated with. + /// + public ulong? ChannelId { get; } + /// + /// Gets name of the event. + /// + public string Name { get; } + /// + /// Gets the description of the event. null if none is set. + /// + public string Description { get; } + /// + /// Gets the time the event was scheduled for. + /// + public DateTimeOffset? ScheduledStartTime { get; } + /// + /// Gets the time the event was scheduled to end. + /// + public DateTimeOffset? ScheduledEndTime { get; } + /// + /// Gets the privacy level of the event. + /// + public GuildScheduledEventPrivacyLevel? PrivacyLevel { get; } + /// + /// Gets the status of the event. + /// + public GuildScheduledEventStatus? Status { get; } + /// + /// Gets the type of the entity associated with the event (stage / void / external). + /// + public GuildScheduledEventType? EntityType { get; } + /// + /// Gets the snowflake id of the entity associated with the event (stage / void / external). + /// + public ulong? EntityId { get; } + /// + /// Gets the metadata for the entity associated with the event. + /// + public string Location { get; } + /// + /// Gets the count of users interested in this event. + /// + public int? UserCount { get; } + /// + /// Gets the image hash of the image that was attached to the event. Null if not set. + /// + public string Image { get; } + + internal ScheduledEventInfo(ulong? guildId, ulong? channelId, string name, string description, DateTimeOffset? scheduledStartTime, DateTimeOffset? scheduledEndTime, GuildScheduledEventPrivacyLevel? privacyLevel, GuildScheduledEventStatus? status, GuildScheduledEventType? entityType, ulong? entityId, string location, int? userCount, string image) + { + GuildId = guildId ; + ChannelId = channelId ; + Name = name ; + Description = description ; + ScheduledStartTime = scheduledStartTime; + ScheduledEndTime = scheduledEndTime ; + PrivacyLevel = privacyLevel ; + Status = status ; + EntityType = entityType ; + EntityId = entityId ; + Location = location ; + UserCount = userCount ; + Image = image ; + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventUpdateAuditLogData.cs new file mode 100644 index 000000000..2ef2ccff8 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ScheduledEventUpdateAuditLogData.cs @@ -0,0 +1,99 @@ +using System; +using System.Linq; +using Discord.API; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + /// + /// Contains a piece of audit log data related to a scheduled event updates. + /// + public class ScheduledEventUpdateAuditLogData : IAuditLogData + { + private ScheduledEventUpdateAuditLogData(ulong id, ScheduledEventInfo before, ScheduledEventInfo after) + { + Id = id; + Before = before; + After = after; + } + + internal static ScheduledEventUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var id = entry.TargetId.Value; + + var guildId = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "guild_id"); + var channelId = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "channel_id"); + var name = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name"); + var description = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "description"); + var scheduledStartTime = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "scheduled_start_time"); + var scheduledEndTime = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "scheduled_end_time"); + var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level"); + var status = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "status"); + var entityType = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "entity_type"); + var entityId = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "entity_id"); + var entityMetadata = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "entity_metadata"); + var userCount = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "user_count"); + var image = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "image"); + + var before = new ScheduledEventInfo( + guildId?.OldValue.ToObject(discord.ApiClient.Serializer), + channelId?.OldValue.ToObject(discord.ApiClient.Serializer), + name?.OldValue.ToObject(discord.ApiClient.Serializer), + description?.OldValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(), + scheduledStartTime?.OldValue.ToObject(discord.ApiClient.Serializer), + scheduledEndTime?.OldValue.ToObject(discord.ApiClient.Serializer), + privacyLevel?.OldValue.ToObject(discord.ApiClient.Serializer), + status?.OldValue.ToObject(discord.ApiClient.Serializer), + entityType?.OldValue.ToObject(discord.ApiClient.Serializer), + entityId?.OldValue.ToObject(discord.ApiClient.Serializer), + entityMetadata?.OldValue.ToObject(discord.ApiClient.Serializer) + ?.Location.GetValueOrDefault(), + userCount?.OldValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(), + image?.OldValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault() + ); + var after = new ScheduledEventInfo( + guildId?.NewValue.ToObject(discord.ApiClient.Serializer), + channelId?.NewValue.ToObject(discord.ApiClient.Serializer), + name?.NewValue.ToObject(discord.ApiClient.Serializer), + description?.NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(), + scheduledStartTime?.NewValue.ToObject(discord.ApiClient.Serializer), + scheduledEndTime?.NewValue.ToObject(discord.ApiClient.Serializer), + privacyLevel?.NewValue.ToObject(discord.ApiClient.Serializer), + status?.NewValue.ToObject(discord.ApiClient.Serializer), + entityType?.NewValue.ToObject(discord.ApiClient.Serializer), + entityId?.NewValue.ToObject(discord.ApiClient.Serializer), + entityMetadata?.NewValue.ToObject(discord.ApiClient.Serializer) + ?.Location.GetValueOrDefault(), + userCount?.NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault(), + image?.NewValue.ToObject>(discord.ApiClient.Serializer) + .GetValueOrDefault() + ); + + return new ScheduledEventUpdateAuditLogData(id, before, after); + } + + // Doc Note: Corresponds to the *current* data + + /// + /// Gets the snowflake id of the event. + /// + public ulong Id { get; } + /// + /// Gets the state before the change. + /// + public ScheduledEventInfo Before { get; } + /// + /// Gets the state after the change. + /// + public ScheduledEventInfo After { get; } + } +}