* Add ThreadDeleteAuditLogData * Add ThreadCreateAuditLogData * Fix ThreadCreateAuditLogData using old instead of new value * Create ThreadInfo Class * Fix Thread not being a property * Add ThreadUpdateAuditLogData * Cleanup usings * Add RateLimit to ThreadAuditLogData classese Co-authored-by: Playwo <eliaswolf2001@t-online.de>pull/1958/head
| @@ -52,6 +52,9 @@ namespace Discord.Rest | |||
| [ActionType.MessagePinned] = MessagePinAuditLogData.Create, | |||
| [ActionType.MessageUnpinned] = MessageUnpinAuditLogData.Create, | |||
| [ActionType.ThreadCreate] = ThreadCreateAuditLogData.Create, | |||
| [ActionType.ThreadUpdate] = ThreadUpdateAuditLogData.Create, | |||
| [ActionType.ThreadDelete] = ThreadDeleteAuditLogData.Create, | |||
| }; | |||
| public static IAuditLogData CreateData(BaseDiscordClient discord, Model log, EntryModel entry) | |||
| @@ -0,0 +1,115 @@ | |||
| using System.Linq; | |||
| using Model = Discord.API.AuditLog; | |||
| using EntryModel = Discord.API.AuditLogEntry; | |||
| namespace Discord.Rest | |||
| { | |||
| /// <summary> | |||
| /// Contains a piece of audit log data related to a thread creation. | |||
| /// </summary> | |||
| public class ThreadCreateAuditLogData : IAuditLogData | |||
| { | |||
| private ThreadCreateAuditLogData(IThreadChannel thread, ulong id, string name, ThreadType type, bool archived, | |||
| ThreadArchiveDuration autoArchiveDuration, bool locked, int? rateLimit) | |||
| { | |||
| Thread = thread; | |||
| ThreadId = id; | |||
| ThreadName = name; | |||
| ThreadType = type; | |||
| IsArchived = archived; | |||
| AutoArchiveDuration = autoArchiveDuration; | |||
| IsLocked = locked; | |||
| SlowModeInterval = rateLimit; | |||
| } | |||
| internal static ThreadCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) | |||
| { | |||
| var changes = entry.Changes; | |||
| var id = entry.TargetId.Value; | |||
| var nameModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name"); | |||
| var typeModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "type"); | |||
| var archivedModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "archived"); | |||
| var autoArchiveDurationModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "auto_archive_duration"); | |||
| var lockedModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "locked"); | |||
| var rateLimitPerUserModel = changes.FirstOrDefault(x => x.ChangedProperty == "rate_limit_per_user"); | |||
| var name = nameModel.NewValue.ToObject<string>(discord.ApiClient.Serializer); | |||
| var type = typeModel.NewValue.ToObject<ThreadType>(discord.ApiClient.Serializer); | |||
| var archived = archivedModel.NewValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var autoArchiveDuration = autoArchiveDurationModel.NewValue.ToObject<ThreadArchiveDuration>(discord.ApiClient.Serializer); | |||
| var locked = lockedModel.NewValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var rateLimit = rateLimitPerUserModel?.NewValue?.ToObject<int>(discord.ApiClient.Serializer); | |||
| var threadInfo = log.Threads.FirstOrDefault(x => x.Id == id); | |||
| var threadChannel = threadInfo == null ? null : RestThreadChannel.Create(discord, (IGuild)null, threadInfo); | |||
| return new ThreadCreateAuditLogData(threadChannel, id, name, type, archived, autoArchiveDuration, locked, rateLimit); | |||
| } | |||
| // Doc Note: Corresponds to the *current* data | |||
| /// <summary> | |||
| /// Gets the thread that was created if it still exists. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A thread object representing the thread that was created if it still exists, otherwise returns <c>null</c>. | |||
| /// </returns> | |||
| public IThreadChannel Thread { get; } | |||
| /// <summary> | |||
| /// Gets the snowflake ID of the thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A <see cref="ulong"/> representing the snowflake identifier for the thread. | |||
| /// </returns> | |||
| public ulong ThreadId { get; } | |||
| /// <summary> | |||
| /// Gets the name of the thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A string containing the name of the thread. | |||
| /// </returns> | |||
| public string ThreadName { get; } | |||
| /// <summary> | |||
| /// Gets the type of the thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// The type of thread. | |||
| /// </returns> | |||
| public ThreadType ThreadType { get; } | |||
| /// <summary> | |||
| /// Gets the value that indicates whether the thread is archived. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// <c>true</c> if this thread has the Archived flag enabled; otherwise <c>false</c>. | |||
| /// </returns> | |||
| public bool IsArchived { get; } | |||
| /// <summary> | |||
| /// Gets the auto archive duration of the thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// The thread auto archive duration of the thread. | |||
| /// </returns> | |||
| public ThreadArchiveDuration AutoArchiveDuration { get; } | |||
| /// <summary> | |||
| /// Gets the value that indicates whether the thread is locked. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// <c>true</c> if this thread has the Locked flag enabled; otherwise <c>false</c>. | |||
| /// </returns> | |||
| public bool IsLocked { get; } | |||
| /// <summary> | |||
| /// Gets the slow-mode delay of the thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// An <see cref="int"/> representing the time in seconds required before the user can send another | |||
| /// message; <c>0</c> if disabled. | |||
| /// <c>null</c> if this is not mentioned in this entry. | |||
| /// </returns> | |||
| public int? SlowModeInterval { get; } | |||
| } | |||
| } | |||
| @@ -0,0 +1,103 @@ | |||
| using System.Linq; | |||
| using Model = Discord.API.AuditLog; | |||
| using EntryModel = Discord.API.AuditLogEntry; | |||
| namespace Discord.Rest | |||
| { | |||
| /// <summary> | |||
| /// Contains a piece of audit log data related to a thread deletion. | |||
| /// </summary> | |||
| public class ThreadDeleteAuditLogData : IAuditLogData | |||
| { | |||
| private ThreadDeleteAuditLogData(ulong id, string name, ThreadType type, bool archived, | |||
| ThreadArchiveDuration autoArchiveDuration, bool locked, int? rateLimit) | |||
| { | |||
| ThreadId = id; | |||
| ThreadName = name; | |||
| ThreadType = type; | |||
| IsArchived = archived; | |||
| AutoArchiveDuration = autoArchiveDuration; | |||
| IsLocked = locked; | |||
| SlowModeInterval = rateLimit; | |||
| } | |||
| internal static ThreadDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) | |||
| { | |||
| var changes = entry.Changes; | |||
| var id = entry.TargetId.Value; | |||
| var thread = log.Threads.FirstOrDefault(x => x.Id == id); | |||
| var nameModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name"); | |||
| var typeModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "type"); | |||
| var archivedModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "archived"); | |||
| var autoArchiveDurationModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "auto_archive_duration"); | |||
| var lockedModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "locked"); | |||
| var rateLimitPerUserModel = changes.FirstOrDefault(x => x.ChangedProperty == "rate_limit_per_user"); | |||
| var name = nameModel.OldValue.ToObject<string>(discord.ApiClient.Serializer); | |||
| var type = typeModel.OldValue.ToObject<ThreadType>(discord.ApiClient.Serializer); | |||
| var archived = archivedModel.OldValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var autoArchiveDuration = autoArchiveDurationModel.OldValue.ToObject<ThreadArchiveDuration>(discord.ApiClient.Serializer); | |||
| var locked = lockedModel.OldValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var rateLimit = rateLimitPerUserModel?.NewValue?.ToObject<int>(discord.ApiClient.Serializer); | |||
| return new ThreadDeleteAuditLogData(id, name, type, archived, autoArchiveDuration, locked, rateLimit); | |||
| } | |||
| /// <summary> | |||
| /// Gets the snowflake ID of the deleted thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A <see cref="ulong"/> representing the snowflake identifier for the deleted thread. | |||
| /// </returns> | |||
| public ulong ThreadId { get; } | |||
| /// <summary> | |||
| /// Gets the name of the deleted thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A string containing the name of the deleted thread. | |||
| /// </returns> | |||
| public string ThreadName { get; } | |||
| /// <summary> | |||
| /// Gets the type of the deleted thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// The type of thread that was deleted. | |||
| /// </returns> | |||
| public ThreadType ThreadType { get; } | |||
| /// <summary> | |||
| /// Gets the value that indicates whether the deleted thread was archived. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// <c>true</c> if this thread had the Archived flag enabled; otherwise <c>false</c>. | |||
| /// </returns> | |||
| public bool IsArchived { get; } | |||
| /// <summary> | |||
| /// Gets the thread auto archive duration of the deleted thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// The thread auto archive duration of the thread that was deleted. | |||
| /// </returns> | |||
| public ThreadArchiveDuration AutoArchiveDuration { get; } | |||
| /// <summary> | |||
| /// Gets the value that indicates whether the deleted thread was locked. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// <c>true</c> if this thread had the Locked flag enabled; otherwise <c>false</c>. | |||
| /// </returns> | |||
| public bool IsLocked { get; } | |||
| /// <summary> | |||
| /// Gets the slow-mode delay of the deleted thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// An <see cref="int"/> representing the time in seconds required before the user can send another | |||
| /// message; <c>0</c> if disabled. | |||
| /// <c>null</c> if this is not mentioned in this entry. | |||
| /// </returns> | |||
| public int? SlowModeInterval { get; } | |||
| } | |||
| } | |||
| @@ -0,0 +1,39 @@ | |||
| namespace Discord.Rest | |||
| { | |||
| /// <summary> | |||
| /// Represents information for a thread. | |||
| /// </summary> | |||
| public class ThreadInfo | |||
| { | |||
| /// <summary> | |||
| /// Gets the name of the thread. | |||
| /// </summary> | |||
| public string Name { get; } | |||
| /// <summary> | |||
| /// Gets the value that indicates whether the thread is archived. | |||
| /// </summary> | |||
| public bool IsArchived { get; } | |||
| /// <summary> | |||
| /// Gets the auto archive duration of thread. | |||
| /// </summary> | |||
| public ThreadArchiveDuration AutoArchiveDuration { get; } | |||
| /// <summary> | |||
| /// Gets the value that indicates whether the thread is locked. | |||
| /// </summary> | |||
| public bool IsLocked { get; } | |||
| /// <summary> | |||
| /// Gets the slow-mode delay of the ´thread. | |||
| /// </summary> | |||
| public int? SlowModeInterval { get; } | |||
| internal ThreadInfo(string name, bool archived, ThreadArchiveDuration autoArchiveDuration, bool locked, int? rateLimit) | |||
| { | |||
| Name = name; | |||
| IsArchived = archived; | |||
| AutoArchiveDuration = autoArchiveDuration; | |||
| IsLocked = locked; | |||
| SlowModeInterval = rateLimit; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,88 @@ | |||
| using System.Linq; | |||
| using Model = Discord.API.AuditLog; | |||
| using EntryModel = Discord.API.AuditLogEntry; | |||
| namespace Discord.Rest | |||
| { | |||
| /// <summary> | |||
| /// Contains a piece of audit log data related to a thread update. | |||
| /// </summary> | |||
| public class ThreadUpdateAuditLogData : IAuditLogData | |||
| { | |||
| private ThreadUpdateAuditLogData(IThreadChannel thread, ThreadType type, ThreadInfo before, ThreadInfo after) | |||
| { | |||
| Thread = thread; | |||
| ThreadType = type; | |||
| Before = before; | |||
| After = After; | |||
| } | |||
| internal static ThreadUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) | |||
| { | |||
| var changes = entry.Changes; | |||
| var id = entry.TargetId.Value; | |||
| var nameModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name"); | |||
| var typeModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "type"); | |||
| var archivedModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "archived"); | |||
| var autoArchiveDurationModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "auto_archive_duration"); | |||
| var lockedModel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "locked"); | |||
| var rateLimitPerUserModel = changes.FirstOrDefault(x => x.ChangedProperty == "rate_limit_per_user"); | |||
| var type = typeModel.OldValue.ToObject<ThreadType>(discord.ApiClient.Serializer); | |||
| var oldName = nameModel.OldValue.ToObject<string>(discord.ApiClient.Serializer); | |||
| var oldArchived = archivedModel.OldValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var oldAutoArchiveDuration = autoArchiveDurationModel.OldValue.ToObject<ThreadArchiveDuration>(discord.ApiClient.Serializer); | |||
| var oldLocked = lockedModel.OldValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var oldRateLimit = rateLimitPerUserModel?.OldValue?.ToObject<int>(discord.ApiClient.Serializer); | |||
| var before = new ThreadInfo(oldName, oldArchived, oldAutoArchiveDuration, oldLocked, oldRateLimit); | |||
| var newName = nameModel.NewValue.ToObject<string>(discord.ApiClient.Serializer); | |||
| var newArchived = archivedModel.NewValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var newAutoArchiveDuration = autoArchiveDurationModel.NewValue.ToObject<ThreadArchiveDuration>(discord.ApiClient.Serializer); | |||
| var newLocked = lockedModel.NewValue.ToObject<bool>(discord.ApiClient.Serializer); | |||
| var newRateLimit = rateLimitPerUserModel?.NewValue?.ToObject<int>(discord.ApiClient.Serializer); | |||
| var after = new ThreadInfo(newName, newArchived, newAutoArchiveDuration, newLocked, newRateLimit); | |||
| var threadInfo = log.Threads.FirstOrDefault(x => x.Id == id); | |||
| var threadChannel = threadInfo == null ? null : RestThreadChannel.Create(discord, (IGuild)null, threadInfo); | |||
| return new ThreadUpdateAuditLogData(threadChannel,type, before, after); | |||
| } | |||
| // Doc Note: Corresponds to the *current* data | |||
| /// <summary> | |||
| /// Gets the thread that was created if it still exists. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A thread object representing the thread that was created if it still exists, otherwise returns <c>null</c>. | |||
| /// </returns> | |||
| public IThreadChannel Thread { get; } | |||
| /// <summary> | |||
| /// Gets the type of the thread. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// The type of thread. | |||
| /// </returns> | |||
| public ThreadType ThreadType { get; } | |||
| /// <summary> | |||
| /// Gets the thread information before the changes. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A thread information object representing the thread before the changes were made. | |||
| /// </returns> | |||
| public ThreadInfo Before { get; } | |||
| /// <summary> | |||
| /// Gets the thread information after the changes. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// A thread information object representing the thread after the changes were made. | |||
| /// </returns> | |||
| public ThreadInfo After { get; } | |||
| } | |||
| } | |||