diff --git a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs
index b016a4c50..5092b4e7f 100644
--- a/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs
+++ b/src/Discord.Net.Core/Entities/AuditLogs/ActionType.cs
@@ -180,5 +180,17 @@ namespace Discord
/// A sticker was deleted.
///
StickerDeleted = 92,
+ ///
+ /// A thread was created.
+ ///
+ ThreadCreate = 110,
+ ///
+ /// A thread was updated.
+ ///
+ ThreadUpdate = 111,
+ ///
+ /// A thread was deleted.
+ ///
+ ThreadDelete = 112
}
}
diff --git a/src/Discord.Net.Rest/API/Common/AuditLog.cs b/src/Discord.Net.Rest/API/Common/AuditLog.cs
index cd8ad147d..c8bd6d3e2 100644
--- a/src/Discord.Net.Rest/API/Common/AuditLog.cs
+++ b/src/Discord.Net.Rest/API/Common/AuditLog.cs
@@ -1,4 +1,4 @@
-using Newtonsoft.Json;
+using Newtonsoft.Json;
namespace Discord.API
{
@@ -7,6 +7,12 @@ namespace Discord.API
[JsonProperty("webhooks")]
public Webhook[] Webhooks { get; set; }
+ [JsonProperty("threads")]
+ public Channel[] Threads { get; set; }
+
+ [JsonProperty("integrations")]
+ public Integration[] Integrations { get; set; }
+
[JsonProperty("users")]
public User[] Users { get; set; }
diff --git a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs
index 7458a19cb..9626ad67e 100644
--- a/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs
+++ b/src/Discord.Net.Rest/API/Common/AuditLogEntry.cs
@@ -1,4 +1,4 @@
-using Newtonsoft.Json;
+using Newtonsoft.Json;
namespace Discord.API
{
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs
index 696917203..b3aaf582c 100644
--- a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using Model = Discord.API.AuditLog;
@@ -51,6 +51,7 @@ namespace Discord.Rest
[ActionType.MessageBulkDeleted] = MessageBulkDeleteAuditLogData.Create,
[ActionType.MessagePinned] = MessagePinAuditLogData.Create,
[ActionType.MessageUnpinned] = MessageUnpinAuditLogData.Create,
+
};
public static IAuditLogData CreateData(BaseDiscordClient discord, Model log, EntryModel entry)
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs
new file mode 100644
index 000000000..00571c65c
--- /dev/null
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Discord.Rest
+{
+ ///
+ /// Represents information for a stage.
+ ///
+ public class StageInfo
+ {
+ ///
+ /// Gets the topic of the stage channel.
+ ///
+ public string Topic { get; }
+
+ ///
+ /// Gets the privacy level of the stage channel.
+ ///
+ public StagePrivacyLevel? PrivacyLevel { get; }
+
+ ///
+ /// Gets the user who started the stage channel.
+ ///
+ public IUser User { get; }
+
+ internal StageInfo(IUser user, StagePrivacyLevel? level, string topic)
+ {
+ this.Topic = topic;
+ this.PrivacyLevel = level;
+ this.User = user;
+ }
+ }
+}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs
new file mode 100644
index 000000000..d2e2ffdc8
--- /dev/null
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Model = Discord.API.AuditLog;
+using EntryModel = Discord.API.AuditLogEntry;
+
+namespace Discord.Rest
+{
+ ///
+ /// Contains a piece of audit log data related to a stage going live.
+ ///
+ public class StageInstanceCreateAuditLogData : IAuditLogData
+ {
+ ///
+ /// Gets the topic of the stage channel.
+ ///
+ public string Topic { get; }
+
+ ///
+ /// Gets the privacy level of the stage channel.
+ ///
+ public StagePrivacyLevel PrivacyLevel { get; }
+
+ ///
+ /// Gets the user who started the stage channel.
+ ///
+ public IUser User { get; }
+
+ ///
+ /// Gets the Id of the stage channel.
+ ///
+ public ulong StageChannelId { get; }
+
+ internal StageInstanceCreateAuditLogData(string topic, StagePrivacyLevel privacyLevel, IUser user, ulong channelId)
+ {
+ Topic = topic;
+ PrivacyLevel = privacyLevel;
+ User = user;
+ StageChannelId = channelId;
+ }
+
+ internal static StageInstanceCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry)
+ {
+ var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic").NewValue.ToObject(discord.ApiClient.Serializer);
+ var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level").NewValue.ToObject(discord.ApiClient.Serializer);
+ var user = log.Users.FirstOrDefault(x => x.Id == entry.UserId);
+ var channelId = entry.Options.ChannelId;
+
+ return new StageInstanceCreateAuditLogData(topic, privacyLevel, RestUser.Create(discord, user), channelId ?? 0);
+ }
+ }
+}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs
new file mode 100644
index 000000000..0681628b4
--- /dev/null
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Model = Discord.API.AuditLog;
+using EntryModel = Discord.API.AuditLogEntry;
+
+namespace Discord.Rest
+{
+ ///
+ /// Contains a piece of audit log data related to a stage instance deleted.
+ ///
+ public class StageInstanceDeleteAuditLogData
+ {
+ ///
+ /// Gets the topic of the stage channel.
+ ///
+ public string Topic { get; }
+
+ ///
+ /// Gets the privacy level of the stage channel.
+ ///
+ public StagePrivacyLevel PrivacyLevel { get; }
+
+ ///
+ /// Gets the user who started the stage channel.
+ ///
+ public IUser User { get; }
+
+ ///
+ /// Gets the Id of the stage channel.
+ ///
+ public ulong StageChannelId { get; }
+
+ internal StageInstanceDeleteAuditLogData(string topic, StagePrivacyLevel privacyLevel, IUser user, ulong channelId)
+ {
+ Topic = topic;
+ PrivacyLevel = privacyLevel;
+ User = user;
+ StageChannelId = channelId;
+ }
+
+ internal static StageInstanceDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry)
+ {
+ var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic").OldValue.ToObject(discord.ApiClient.Serializer);
+ var privacyLevel = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy_level").OldValue.ToObject(discord.ApiClient.Serializer);
+ var user = log.Users.FirstOrDefault(x => x.Id == entry.UserId);
+ var channelId = entry.Options.ChannelId;
+
+ return new StageInstanceDeleteAuditLogData(topic, privacyLevel, RestUser.Create(discord, user), channelId ?? 0);
+ }
+ }
+}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs
new file mode 100644
index 000000000..0e26a829f
--- /dev/null
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Model = Discord.API.AuditLog;
+using EntryModel = Discord.API.AuditLogEntry;
+
+namespace Discord.Rest
+{
+ ///
+ /// Contains a piece of audit log data related to a stage instance update.
+ ///
+ public class StageInstanceUpdatedAuditLogData
+ {
+ ///
+ /// Gets the Id of the stage channel.
+ ///
+ public ulong StageChannelId { get; }
+
+ ///
+ /// Gets the stage information before the changes.
+ ///
+ public StageInfo Before { get; }
+
+ ///
+ /// Gets the stage information after the changes.
+ ///
+ public StageInfo After { get; }
+
+ internal StageInstanceUpdatedAuditLogData(ulong channelId, StageInfo before, StageInfo after)
+ {
+ StageChannelId = channelId;
+ Before = before;
+ After = after;
+ }
+
+ internal static StageInstanceUpdatedAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry)
+ {
+ var channelId = entry.Options.ChannelId.Value;
+
+ var topic = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "topic");
+ var privacy = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "privacy");
+
+ var user = RestUser.Create(discord, log.Users.FirstOrDefault(x => x.Id == entry.UserId));
+
+ var oldTopic = topic?.OldValue.ToObject();
+ var newTopic = topic?.NewValue.ToObject();
+ var oldPrivacy = privacy?.OldValue.ToObject();
+ var newPrivacy = privacy?.NewValue.ToObject();
+
+ return new StageInstanceUpdatedAuditLogData(channelId, new StageInfo(user, oldPrivacy, oldTopic), new StageInfo(user, newPrivacy, newTopic));
+ }
+ }
+}