From 94ea9c3189508d89b7036c3a1597a95b8f7b044b Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Thu, 22 Jun 2017 16:45:12 +0100 Subject: [PATCH] Implement most audit log action types Missing at the moment: - GuildUpdateAuditLogData - UnbanAuditLogData - InviteUpdateAuditLogData - InviteDeleteAuditLogData - WebhookCreateAuditLogData - WebhookUpdateAuditLogData - WebhookDeleteAuditLogData --- .../{IAuditLogChanges.cs => IAuditLogData.cs} | 4 +- .../Entities/AuditLogs/IAuditLogEntry.cs | 14 +--- .../Entities/AuditLogs/IAuditLogOptions.cs | 16 ---- .../API/Common/AuditLogOptions.cs | 22 +++++- .../Entities/AuditLogs/AuditLogHelper.cs | 79 +++++++++---------- .../AuditLogs/Changes/ChannelDeleteChanges.cs | 40 ---------- .../AuditLogs/Changes/EmoteCreateChanges.cs | 29 ------- .../AuditLogs/Changes/EmoteDeleteChanges.cs | 23 ------ .../AuditLogs/Changes/EmoteUpdateChanges.cs | 33 -------- .../AuditLogs/DataTypes/BanAuditLogData.cs | 23 ++++++ .../DataTypes/ChannelCreateAuditLogData.cs | 56 +++++++++++++ .../DataTypes/ChannelDeleteAuditLogData.cs | 45 +++++++++++ .../DataTypes/ChannelUpdateAuditLogData.cs | 67 ++++++++++++++++ .../DataTypes/EmoteCreateAuditLogData.cs | 31 ++++++++ .../DataTypes/EmoteDeleteAuditLogData.cs | 27 +++++++ .../DataTypes/EmoteUpdateAuditLogData.cs | 31 ++++++++ .../DataTypes/GuildUpdateAuditLogData.cs | 58 ++++++++++++++ .../InviteCreateAuditLogData.cs} | 27 ++++--- .../AuditLogs/DataTypes/KickAuditLogData.cs | 23 ++++++ .../MemberRoleAuditLogData.cs} | 15 ++-- .../MemberUpdateAuditLogData.cs} | 14 ++-- .../DataTypes/MessageDeleteAuditLogData.cs | 22 ++++++ .../DataTypes/OverwriteCreateAuditLogData.cs | 41 ++++++++++ .../OverwriteDeleteAuditLogData.cs} | 18 +++-- .../DataTypes/OverwriteUpdateAuditLogData.cs | 50 ++++++++++++ .../AuditLogs/DataTypes/PruneAuditLogData.cs | 22 ++++++ .../DataTypes/RoleCreateAuditLogData.cs | 52 ++++++++++++ .../DataTypes/RoleDeleteAuditLogData.cs | 52 ++++++++++++ .../DataTypes/RoleUpdateAuditLogData.cs | 65 +++++++++++++++ .../Options/MessageDeleteAuditLogOptions.cs | 23 ------ .../Entities/AuditLogs/RestAuditLogEntry.cs | 16 ++-- 31 files changed, 769 insertions(+), 269 deletions(-) rename src/Discord.Net.Core/Entities/AuditLogs/{IAuditLogChanges.cs => IAuditLogData.cs} (61%) delete mode 100644 src/Discord.Net.Core/Entities/AuditLogs/IAuditLogOptions.cs delete mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/Changes/ChannelDeleteChanges.cs delete mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteCreateChanges.cs delete mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteDeleteChanges.cs delete mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteUpdateChanges.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/BanAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelCreateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelDeleteAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteCreateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteDeleteAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteUpdateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/GuildUpdateAuditLogData.cs rename src/Discord.Net.Rest/Entities/AuditLogs/{Changes/InviteCreateChanges.cs => DataTypes/InviteCreateAuditLogData.cs} (51%) create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/KickAuditLogData.cs rename src/Discord.Net.Rest/Entities/AuditLogs/{Changes/MemberRoleChanges.cs => DataTypes/MemberRoleAuditLogData.cs} (67%) rename src/Discord.Net.Rest/Entities/AuditLogs/{Changes/MemberUpdateChanges.cs => DataTypes/MemberUpdateAuditLogData.cs} (50%) create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageDeleteAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteCreateAuditLogData.cs rename src/Discord.Net.Rest/Entities/AuditLogs/{Changes/OverwriteDeleteChanges.cs => DataTypes/OverwriteDeleteAuditLogData.cs} (55%) create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteUpdateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/PruneAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs create mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs delete mode 100644 src/Discord.Net.Rest/Entities/AuditLogs/Options/MessageDeleteAuditLogOptions.cs diff --git a/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogChanges.cs b/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogData.cs similarity index 61% rename from src/Discord.Net.Core/Entities/AuditLogs/IAuditLogChanges.cs rename to src/Discord.Net.Core/Entities/AuditLogs/IAuditLogData.cs index 2be25a13e..47aaffb26 100644 --- a/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogChanges.cs +++ b/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogData.cs @@ -7,8 +7,8 @@ using System.Threading.Tasks; namespace Discord { /// - /// Represents changes which may occur within a + /// Represents data applied to an /// - public interface IAuditLogChanges + public interface IAuditLogData { } } diff --git a/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogEntry.cs b/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogEntry.cs index b3cf6d4af..b85730a1d 100644 --- a/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogEntry.cs +++ b/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogEntry.cs @@ -17,19 +17,9 @@ namespace Discord ActionType Action { get; } /// - /// The changes which occured within this entry. May be empty if no changes occured. + /// The data for this entry. May be if no data was available. /// - IAuditLogChanges Changes { get; } - - /// - /// Any options which apply to this entry. If no options were provided, this may be . - /// - IAuditLogOptions Options { get; } - - /// - /// The id which the target applies to, or null if it does not apply to anything specific. - /// - ulong? TargetId { get; } + IAuditLogData Data { get; } /// /// The user responsible for causing the changes diff --git a/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogOptions.cs b/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogOptions.cs deleted file mode 100644 index 1ca12255e..000000000 --- a/src/Discord.Net.Core/Entities/AuditLogs/IAuditLogOptions.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord -{ - /// - /// Represents options which may be applied to an - /// - public interface IAuditLogOptions - { - - } -} diff --git a/src/Discord.Net.Rest/API/Common/AuditLogOptions.cs b/src/Discord.Net.Rest/API/Common/AuditLogOptions.cs index bbda95405..c5b229337 100644 --- a/src/Discord.Net.Rest/API/Common/AuditLogOptions.cs +++ b/src/Discord.Net.Rest/API/Common/AuditLogOptions.cs @@ -2,13 +2,27 @@ namespace Discord.API { - // TODO: Complete this with all possible values for options + //TODO: Complete this with all possible values for options internal class AuditLogOptions { + //Message delete [JsonProperty("count")] - public int Count { get; set; } - + public int? MessageDeleteCount { get; set; } //TODO: what type of int? (returned as string) [JsonProperty("channel_id")] - public ulong ChannelId { get; set; } + public ulong? MessageDeleteChannelId { get; set; } + + //Prune + [JsonProperty("delete_member_days")] + public int? PruneDeleteMemberDays { get; set; } //TODO: what type of int? (returned as string) + [JsonProperty("members_removed")] + public int? PruneMembersRemoved { get; set; } //TODO: what type of int? (returned as string) + + //Overwrite Update + [JsonProperty("role_name")] + public string OverwriteRoleName { get; set; } + [JsonProperty("type")] + public string OverwriteType { get; set; } + [JsonProperty("id")] + public ulong? OverwriteTargetId { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs index 01855267a..71c806a0d 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs @@ -3,84 +3,79 @@ using System.Linq; using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; -using ChangeModel = Discord.API.AuditLogChange; -using OptionModel = Discord.API.AuditLogOptions; namespace Discord.Rest { internal static class AuditLogHelper { - public static IAuditLogChanges CreateChange(BaseDiscordClient discord, Model log, EntryModel entry, ChangeModel[] models) + public static IAuditLogData CreateData(BaseDiscordClient discord, Model log, EntryModel entry) { switch (entry.Action) { - case ActionType.GuildUpdated: - break; - case ActionType.ChannelCreated: - break; + case ActionType.GuildUpdated: //1 + return GuildUpdateAuditLogData.Create(discord, log, entry); + + case ActionType.ChannelCreated: //10 + return ChannelCreateAuditLogData.Create(discord, log, entry); case ActionType.ChannelUpdated: - break; + return ChannelUpdateAuditLogData.Create(discord, log, entry); case ActionType.ChannelDeleted: - return ChannelDeleteChanges.Create(discord, models); + return ChannelDeleteAuditLogData.Create(discord, log, entry); case ActionType.OverwriteCreated: - break; + return OverwriteCreateAuditLogData.Create(discord, log, entry); case ActionType.OverwriteUpdated: - break; + return OverwriteUpdateAuditLogData.Create(discord, log, entry); case ActionType.OverwriteDeleted: - return OverwriteDeleteChanges.Create(discord, log, entry, models); + return OverwriteDeleteAuditLogData.Create(discord, log, entry); + + case ActionType.Kick: //20 + return KickAuditLogData.Create(discord, log, entry); case ActionType.Prune: - break; + return PruneAuditLogData.Create(discord, log, entry); case ActionType.Ban: - break; + return BanAuditLogData.Create(discord, log, entry); case ActionType.Unban: break; case ActionType.MemberUpdated: - return MemberUpdateChanges.Create(discord, log, entry, models.FirstOrDefault()); + return MemberUpdateAuditLogData.Create(discord, log, entry); case ActionType.MemberRoleUpdated: - return MemberRoleChanges.Create(discord, log, entry, models); - case ActionType.RoleCreated: - break; + return MemberRoleAuditLogData.Create(discord, log, entry); + + case ActionType.RoleCreated: //30 + return RoleCreateAuditLogData.Create(discord, log, entry); case ActionType.RoleUpdated: - break; + return RoleUpdateAuditLogData.Create(discord, log, entry); case ActionType.RoleDeleted: - break; - case ActionType.InviteCreated: - return InviteCreateChanges.Create(discord, log, models); + return RoleDeleteAuditLogData.Create(discord, log, entry); + + case ActionType.InviteCreated: //40 + return InviteCreateAuditLogData.Create(discord, log, entry); case ActionType.InviteUpdated: break; case ActionType.InviteDeleted: break; - case ActionType.WebhookCreated: + + case ActionType.WebhookCreated: //50 break; case ActionType.WebhookUpdated: break; case ActionType.WebhookDeleted: break; - case ActionType.EmojiCreated: - return EmoteCreateChanges.Create(discord, entry, models.FirstOrDefault()); + + case ActionType.EmojiCreated: //60 + return EmoteCreateAuditLogData.Create(discord, log, entry); case ActionType.EmojiUpdated: - return EmoteUpdateChanges.Create(discord, entry, models.FirstOrDefault()); + return EmoteUpdateAuditLogData.Create(discord, log, entry); case ActionType.EmojiDeleted: - return EmoteDeleteChanges.Create(discord, entry, models.FirstOrDefault()); - case ActionType.MessageDeleted: - case ActionType.Kick: - default: - return null; - } - return null; - //throw new NotImplementedException($"{nameof(AuditLogHelper)} does not implement the {entry.Action} audit log changeset."); - } + return EmoteDeleteAuditLogData.Create(discord, log, entry); - public static IAuditLogOptions CreateOptions(BaseDiscordClient discord, Model fullModel, EntryModel entryModel, OptionModel model) - { - switch (entryModel.Action) - { - case ActionType.MessageDeleted: - return new MessageDeleteAuditLogOptions(discord, model); + case ActionType.MessageDeleted: //72 + return MessageDeleteAuditLogData.Create(discord, log, entry); default: return null; - //throw new NotImplementedException($"{nameof(AuditLogHelper)} does not implement the {entryModel.Action} audit log action."); } + return null; + //throw new NotImplementedException($"{nameof(AuditLogHelper)} does not implement the {entry.Action} audit log event."); } } } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/ChannelDeleteChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/Changes/ChannelDeleteChanges.cs deleted file mode 100644 index ad2a2cd67..000000000 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/ChannelDeleteChanges.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using ChangeModel = Discord.API.AuditLogChange; - -namespace Discord.Rest -{ - public class ChannelDeleteChanges : IAuditLogChanges - { - private ChannelDeleteChanges(string name, ChannelType type, IReadOnlyCollection overwrites) - { - ChannelName = name; - ChannelType = type; - Overwrites = overwrites; - } - - internal static ChannelDeleteChanges Create(BaseDiscordClient discord, ChangeModel[] models) - { - //Use FirstOrDefault here in case the order ever changes - var overwritesModel = models.FirstOrDefault(x => x.ChangedProperty == "permission_overwrites"); - var typeModel = models.FirstOrDefault(x => x.ChangedProperty == "type"); - var nameModel = models.FirstOrDefault(x => x.ChangedProperty == "name"); - - var overwrites = overwritesModel.OldValue.ToObject() - .Select(x => new Overwrite(x.TargetId, x.TargetType, new OverwritePermissions(x.Allow, x.Deny))) - .ToList(); - var type = typeModel.OldValue.ToObject(); - var name = nameModel.OldValue.ToObject(); - - return new ChannelDeleteChanges(name, type, overwrites.ToReadOnlyCollection()); - } - - public string ChannelName { get; } - public ChannelType ChannelType { get; } - public IReadOnlyCollection Overwrites { get; } - } -} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteCreateChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteCreateChanges.cs deleted file mode 100644 index e6e7e3b64..000000000 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteCreateChanges.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using EntryModel = Discord.API.AuditLogEntry; -using ChangeModel = Discord.API.AuditLogChange; - -namespace Discord.Rest -{ - public class EmoteCreateChanges : IAuditLogChanges - { - private EmoteCreateChanges(Emote emote) - { - Emote = emote; - } - - internal static EmoteCreateChanges Create(BaseDiscordClient discord, EntryModel entry, ChangeModel model) - { - var emoteName = model.NewValue.ToObject(); - var emote = new Emote(entry.TargetId.Value, emoteName); - - return new EmoteCreateChanges(emote); - } - - public Emote Emote { get; } - } -} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteDeleteChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteDeleteChanges.cs deleted file mode 100644 index 7e876eff7..000000000 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteDeleteChanges.cs +++ /dev/null @@ -1,23 +0,0 @@ -using EntryModel = Discord.API.AuditLogEntry; -using ChangeModel = Discord.API.AuditLogChange; - -namespace Discord.Rest -{ - public class EmoteDeleteChanges : IAuditLogChanges - { - private EmoteDeleteChanges(Emote emote) - { - Emote = emote; - } - - internal static EmoteDeleteChanges Create(BaseDiscordClient discord, EntryModel entry, ChangeModel model) - { - var emoteName = model.OldValue.ToObject(); - var emote = new Emote(entry.TargetId.Value, emoteName); - - return new EmoteDeleteChanges(emote); - } - - public Emote Emote { get; } - } -} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteUpdateChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteUpdateChanges.cs deleted file mode 100644 index 73b174f8b..000000000 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/EmoteUpdateChanges.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using EntryModel = Discord.API.AuditLogEntry; -using ChangeModel = Discord.API.AuditLogChange; - -namespace Discord.Rest -{ - public class EmoteUpdateChanges : IAuditLogChanges - { - private EmoteUpdateChanges(Emote emote, string oldName) - { - Emote = emote; - PreviousName = oldName; - } - - internal static EmoteUpdateChanges Create(BaseDiscordClient discord, EntryModel entry, ChangeModel model) - { - var emoteName = model.NewValue.ToObject(); - var emote = new Emote(entry.TargetId.Value, emoteName); - - var oldName = model.OldValue.ToObject(); - - return new EmoteUpdateChanges(emote, oldName); - } - - public Emote Emote { get; } - public string PreviousName { get; } - } -} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/BanAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/BanAuditLogData.cs new file mode 100644 index 000000000..4b9d5875f --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/BanAuditLogData.cs @@ -0,0 +1,23 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class BanAuditLogData : IAuditLogData + { + private BanAuditLogData(IUser user) + { + Target = user; + } + + internal static BanAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); + return new BanAuditLogData(RestUser.Create(discord, userInfo)); + } + + public IUser Target { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelCreateAuditLogData.cs new file mode 100644 index 000000000..e0448a502 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelCreateAuditLogData.cs @@ -0,0 +1,56 @@ +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class ChannelCreateAuditLogData : IAuditLogData + { + private ChannelCreateAuditLogData(ulong id, string name, ChannelType type, IReadOnlyCollection overwrites) + { + ChannelId = id; + ChannelName = name; + ChannelType = type; + Overwrites = overwrites; + } + + internal static ChannelCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + var overwrites = new List(); + + var overwritesModel = changes.FirstOrDefault(x => x.ChangedProperty == "permission_overwrites"); + var typeModel = changes.FirstOrDefault(x => x.ChangedProperty == "type"); + var nameModel = changes.FirstOrDefault(x => x.ChangedProperty == "name"); + + var type = typeModel.NewValue.ToObject(); + var name = nameModel.NewValue.ToObject(); + + foreach (var overwrite in overwritesModel.NewValue) + { + var deny = overwrite.Value("deny"); + var _type = overwrite.Value("type"); + var id = overwrite.Value("id"); + var allow = overwrite.Value("allow"); + + PermissionTarget permType; + if (_type == "member") + permType = PermissionTarget.User; + else + permType = PermissionTarget.Role; + + overwrites.Add(new Overwrite(id, permType, new OverwritePermissions(allow, deny))); + } + + return new ChannelCreateAuditLogData(entry.TargetId.Value, name, type, overwrites.ToReadOnlyCollection()); + } + + public ulong ChannelId { get; } //TODO: IChannel + public string ChannelName { get; } + public ChannelType ChannelType { get; } + public IReadOnlyCollection Overwrites { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelDeleteAuditLogData.cs new file mode 100644 index 000000000..b29205714 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelDeleteAuditLogData.cs @@ -0,0 +1,45 @@ +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 +{ + public class ChannelDeleteAuditLogData : IAuditLogData + { + private ChannelDeleteAuditLogData(ulong id, string name, ChannelType type, IReadOnlyCollection overwrites) + { + ChannelId = id; + ChannelName = name; + ChannelType = type; + Overwrites = overwrites; + } + + internal static ChannelDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var overwritesModel = changes.FirstOrDefault(x => x.ChangedProperty == "permission_overwrites"); + var typeModel = changes.FirstOrDefault(x => x.ChangedProperty == "type"); + var nameModel = changes.FirstOrDefault(x => x.ChangedProperty == "name"); + + var overwrites = overwritesModel.OldValue.ToObject() + .Select(x => new Overwrite(x.TargetId, x.TargetType, new OverwritePermissions(x.Allow, x.Deny))) + .ToList(); + var type = typeModel.OldValue.ToObject(); + var name = nameModel.OldValue.ToObject(); + var id = entry.TargetId.Value; //NOTE: assuming this is the channel id here + + return new ChannelDeleteAuditLogData(id, name, type, overwrites.ToReadOnlyCollection()); + } + + public ulong ChannelId { get; } //TODO: IChannel + public string ChannelName { get; } + public ChannelType ChannelType { get; } + public IReadOnlyCollection Overwrites { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs new file mode 100644 index 000000000..ca7a9ce58 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs @@ -0,0 +1,67 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class ChannelUpdateAuditLogData : IAuditLogData + { + private ChannelUpdateAuditLogData(GuildChannelProperties before, GuildChannelProperties after) + { + Before = before; + After = after; + } + + internal static ChannelUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var nameModel = changes.FirstOrDefault(x => x.ChangedProperty == "name"); + var topicModel = changes.FirstOrDefault(x => x.ChangedProperty == "topic"); + var bitrateModel = changes.FirstOrDefault(x => x.ChangedProperty == "bitrate"); + var userLimitModel = changes.FirstOrDefault(x => x.ChangedProperty == "user_limit"); + + if (topicModel != null) //If topic is supplied, we must be a text channel + { + var before = new TextChannelProperties + { + Name = nameModel?.OldValue?.ToObject(), + Topic = topicModel.OldValue?.ToObject() + }; + var after = new TextChannelProperties + { + Name = nameModel?.NewValue?.ToObject(), + Topic = topicModel.NewValue?.ToObject() + }; + + return new ChannelUpdateAuditLogData(before, after); + } + else //By process of elimination, we must be a voice channel + { + var beforeBitrate = bitrateModel?.OldValue?.ToObject(); + var afterBitrate = bitrateModel?.NewValue?.ToObject(); + var beforeUserLimit = userLimitModel?.OldValue?.ToObject(); + var afterUserLimit = userLimitModel?.NewValue?.ToObject(); + + var before = new VoiceChannelProperties + { + Name = nameModel?.OldValue?.ToObject(), + Bitrate = beforeBitrate ?? Optional.Unspecified, + UserLimit = beforeUserLimit + }; + var after = new VoiceChannelProperties + { + Name = nameModel?.NewValue?.ToObject(), + Bitrate = afterBitrate ?? Optional.Unspecified, + UserLimit = afterUserLimit + }; + + return new ChannelUpdateAuditLogData(before, after); + } + } + + public GuildChannelProperties Before { get; set; } + public GuildChannelProperties After { get; set; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteCreateAuditLogData.cs new file mode 100644 index 000000000..30b85d4e4 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteCreateAuditLogData.cs @@ -0,0 +1,31 @@ +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 +{ + public class EmoteCreateAuditLogData : IAuditLogData + { + private EmoteCreateAuditLogData(Emote emote) + { + Emote = emote; + } + + internal static EmoteCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var change = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name"); //TODO: only change? + + var emoteName = change.NewValue?.ToObject(); + var emote = new Emote(entry.TargetId.Value, emoteName); + + return new EmoteCreateAuditLogData(emote); + } + + public Emote Emote { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteDeleteAuditLogData.cs new file mode 100644 index 000000000..21f7b4076 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteDeleteAuditLogData.cs @@ -0,0 +1,27 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class EmoteDeleteAuditLogData : IAuditLogData + { + private EmoteDeleteAuditLogData(Emote emote) + { + Emote = emote; + } + + internal static EmoteDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var change = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name"); //TODO: only change? + + var emoteName = change.OldValue?.ToObject(); + var emote = new Emote(entry.TargetId.Value, emoteName); + + return new EmoteDeleteAuditLogData(emote); + } + + public Emote Emote { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteUpdateAuditLogData.cs new file mode 100644 index 000000000..980c02195 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/EmoteUpdateAuditLogData.cs @@ -0,0 +1,31 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class EmoteUpdateAuditLogData : IAuditLogData + { + private EmoteUpdateAuditLogData(Emote emote, string oldName) + { + Emote = emote; + PreviousName = oldName; + } + + internal static EmoteUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var change = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "name"); //TODO: only change? + + var emoteName = change.NewValue?.ToObject(); + var emote = new Emote(entry.TargetId.Value, emoteName); + + var oldName = change.OldValue?.ToObject(); + + return new EmoteUpdateAuditLogData(emote, oldName); + } + + public Emote Emote { get; } + public string PreviousName { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/GuildUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/GuildUpdateAuditLogData.cs new file mode 100644 index 000000000..cd7603f78 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/GuildUpdateAuditLogData.cs @@ -0,0 +1,58 @@ +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class GuildUpdateAuditLogData : IAuditLogData + { + private GuildUpdateAuditLogData() + { } + + internal static GuildUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + int? oldAfkTimeout, newAfkTimeout; + DefaultMessageNotifications? oldDefaultMessageNotifications, newDefaultMessageNotifications; + ulong? oldAfkChannelId, newAfkChannelId; + string oldName, newName; + string oldRegionId, newRegionId; + string oldIconHash, newIconHash; + + foreach (var change in changes) + { + switch (change.ChangedProperty) + { + case "afk_timeout": + oldAfkTimeout = change.OldValue?.ToObject(); + newAfkTimeout = change.NewValue?.ToObject(); + break; + case "default_message_notifications": + oldDefaultMessageNotifications = change.OldValue?.ToObject(); + newDefaultMessageNotifications = change.OldValue?.ToObject(); + break; + case "afk_channel_id": + oldAfkChannelId = change.OldValue?.ToObject(); + newAfkChannelId = change.NewValue?.ToObject(); + break; + case "name": + oldName = change.OldValue?.ToObject(); + newName = change.NewValue?.ToObject(); + break; + case "region": + oldRegionId = change.OldValue?.ToObject(); + newRegionId = change.NewValue?.ToObject(); + break; + case "icon_hash": + oldIconHash = change.OldValue?.ToObject(); + newIconHash = change.NewValue?.ToObject(); + break; + //TODO: owner, verification level + } + } + + //TODO: implement this + return null; + } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/InviteCreateChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteCreateAuditLogData.cs similarity index 51% rename from src/Discord.Net.Rest/Entities/AuditLogs/Changes/InviteCreateChanges.cs rename to src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteCreateAuditLogData.cs index 9d0e4419d..85e2b0b9b 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/InviteCreateChanges.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteCreateAuditLogData.cs @@ -1,13 +1,13 @@ using System.Linq; using Model = Discord.API.AuditLog; -using ChangeModel = Discord.API.AuditLogChange; +using EntryModel = Discord.API.AuditLogEntry; namespace Discord.Rest { - public class InviteCreateChanges : IAuditLogChanges + public class InviteCreateAuditLogData : IAuditLogData { - private InviteCreateChanges(int maxAge, string code, bool temporary, IUser inviter, ulong channelId, int uses, int maxUses) + private InviteCreateAuditLogData(int maxAge, string code, bool temporary, IUser inviter, ulong channelId, int uses, int maxUses) { MaxAge = maxAge; Code = code; @@ -18,16 +18,17 @@ namespace Discord.Rest MaxUses = maxUses; } - internal static InviteCreateChanges Create(BaseDiscordClient discord, Model log, ChangeModel[] models) + internal static InviteCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) { - //Again, FirstOrDefault to protect against ordering changes - var maxAgeModel = models.FirstOrDefault(x => x.ChangedProperty == "max_age"); - var codeModel = models.FirstOrDefault(x => x.ChangedProperty == "code"); - var temporaryModel = models.FirstOrDefault(x => x.ChangedProperty == "temporary"); - var inviterIdModel = models.FirstOrDefault(x => x.ChangedProperty == "inviter_id"); - var channelIdModel = models.FirstOrDefault(x => x.ChangedProperty == "channel_id"); - var usesModel = models.FirstOrDefault(x => x.ChangedProperty == "uses"); - var maxUsesModel = models.FirstOrDefault(x => x.ChangedProperty == "max_uses"); + var changes = entry.Changes; + + var maxAgeModel = changes.FirstOrDefault(x => x.ChangedProperty == "max_age"); + var codeModel = changes.FirstOrDefault(x => x.ChangedProperty == "code"); + var temporaryModel = changes.FirstOrDefault(x => x.ChangedProperty == "temporary"); + var inviterIdModel = changes.FirstOrDefault(x => x.ChangedProperty == "inviter_id"); + var channelIdModel = changes.FirstOrDefault(x => x.ChangedProperty == "channel_id"); + var usesModel = changes.FirstOrDefault(x => x.ChangedProperty == "uses"); + var maxUsesModel = changes.FirstOrDefault(x => x.ChangedProperty == "max_uses"); var maxAge = maxAgeModel.NewValue.ToObject(); var code = codeModel.NewValue.ToObject(); @@ -40,7 +41,7 @@ namespace Discord.Rest var inviterInfo = log.Users.FirstOrDefault(x => x.Id == inviterId); var inviter = RestUser.Create(discord, inviterInfo); - return new InviteCreateChanges(maxAge, code, temporary, inviter, channelId, uses, maxUses); + return new InviteCreateAuditLogData(maxAge, code, temporary, inviter, channelId, uses, maxUses); } public int MaxAge { get; } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/KickAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/KickAuditLogData.cs new file mode 100644 index 000000000..41b5526b8 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/KickAuditLogData.cs @@ -0,0 +1,23 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class KickAuditLogData : IAuditLogData + { + private KickAuditLogData(RestUser user) + { + Target = user; + } + + internal static KickAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); + return new KickAuditLogData(RestUser.Create(discord, userInfo)); + } + + public IUser Target { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/MemberRoleChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleAuditLogData.cs similarity index 67% rename from src/Discord.Net.Rest/Entities/AuditLogs/Changes/MemberRoleChanges.cs rename to src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleAuditLogData.cs index 9abf5be79..43d97ecf3 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/MemberRoleChanges.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleAuditLogData.cs @@ -1,26 +1,25 @@ 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; -using ChangeModel = Discord.API.AuditLogChange; namespace Discord.Rest { - public class MemberRoleChanges : IAuditLogChanges + public class MemberRoleAuditLogData : IAuditLogData { - private MemberRoleChanges(IReadOnlyCollection roles, IUser target) + private MemberRoleAuditLogData(IReadOnlyCollection roles, IUser target) { Roles = roles; TargetUser = target; } - internal static MemberRoleChanges Create(BaseDiscordClient discord, Model log, EntryModel entry, ChangeModel[] models) + internal static MemberRoleAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) { - var roleInfos = models.SelectMany(x => x.NewValue.ToObject(), + var changes = entry.Changes; + + var roleInfos = changes.SelectMany(x => x.NewValue.ToObject(), (model, role) => new { model.ChangedProperty, Role = role }) .Select(x => new RoleInfo(x.Role.Name, x.Role.Id, x.ChangedProperty == "$add")) .ToList(); @@ -28,7 +27,7 @@ namespace Discord.Rest var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); var user = RestUser.Create(discord, userInfo); - return new MemberRoleChanges(roleInfos.ToReadOnlyCollection(), user); + return new MemberRoleAuditLogData(roleInfos.ToReadOnlyCollection(), user); } public IReadOnlyCollection Roles { get; } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/MemberUpdateChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberUpdateAuditLogData.cs similarity index 50% rename from src/Discord.Net.Rest/Entities/AuditLogs/Changes/MemberUpdateChanges.cs rename to src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberUpdateAuditLogData.cs index 4097a6d9b..7bbcdc69a 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/MemberUpdateChanges.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberUpdateAuditLogData.cs @@ -6,24 +6,26 @@ using ChangeModel = Discord.API.AuditLogChange; namespace Discord.Rest { - public class MemberUpdateChanges : IAuditLogChanges + public class MemberUpdateAuditLogData : IAuditLogData { - private MemberUpdateChanges(IUser user, string newNick, string oldNick) + private MemberUpdateAuditLogData(IUser user, string newNick, string oldNick) { User = user; NewNick = newNick; OldNick = oldNick; } - internal static MemberUpdateChanges Create(BaseDiscordClient discord, Model log, EntryModel entry, ChangeModel model) + internal static MemberUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) { - var newNick = model.NewValue?.ToObject(); - var oldNick = model.OldValue?.ToObject(); + var changes = entry.Changes.FirstOrDefault(x => x.ChangedProperty == "nick"); //TODO: only change? + + var newNick = changes.NewValue?.ToObject(); + var oldNick = changes.OldValue?.ToObject(); var targetInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId); var user = RestUser.Create(discord, targetInfo); - return new MemberUpdateChanges(user, newNick, oldNick); + return new MemberUpdateAuditLogData(user, newNick, oldNick); } public IUser User { get; } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageDeleteAuditLogData.cs new file mode 100644 index 000000000..73af24209 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MessageDeleteAuditLogData.cs @@ -0,0 +1,22 @@ +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class MessageDeleteAuditLogData : IAuditLogData + { + private MessageDeleteAuditLogData(ulong channelId, int count) + { + ChannelId = channelId; + MessageCount = count; + } + + internal static MessageDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + return new MessageDeleteAuditLogData(entry.Options.MessageDeleteChannelId.Value, entry.Options.MessageDeleteCount.Value); + } + + public int MessageCount { get; } + public ulong ChannelId { get; } //TODO: IChannel + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteCreateAuditLogData.cs new file mode 100644 index 000000000..6e5658f66 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteCreateAuditLogData.cs @@ -0,0 +1,41 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class OverwriteCreateAuditLogData : IAuditLogData + { + private OverwriteCreateAuditLogData(Overwrite overwrite) + { + Overwrite = overwrite; + } + + internal static OverwriteCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var denyModel = changes.FirstOrDefault(x => x.ChangedProperty == "deny"); + var allowModel = changes.FirstOrDefault(x => x.ChangedProperty == "allow"); + + var deny = denyModel.NewValue.ToObject(); + var allow = allowModel.NewValue.ToObject(); + + var permissions = new OverwritePermissions(allow, deny); + + var id = entry.Options.OverwriteTargetId.Value; + var type = entry.Options.OverwriteType; + + PermissionTarget target; + if (type == "member") + target = PermissionTarget.User; + else + target = PermissionTarget.Role; + + return new OverwriteCreateAuditLogData(new Overwrite(id, target, permissions)); + } + + public Overwrite Overwrite { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/OverwriteDeleteChanges.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteDeleteAuditLogData.cs similarity index 55% rename from src/Discord.Net.Rest/Entities/AuditLogs/Changes/OverwriteDeleteChanges.cs rename to src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteDeleteAuditLogData.cs index 7fe4ca475..b1f2195b5 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Changes/OverwriteDeleteChanges.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteDeleteAuditLogData.cs @@ -11,19 +11,21 @@ using OptionModel = Discord.API.AuditLogOptions; namespace Discord.Rest { - public class OverwriteDeleteChanges : IAuditLogChanges + public class OverwriteDeleteAuditLogData : IAuditLogData { - private OverwriteDeleteChanges(Overwrite deletedOverwrite) + private OverwriteDeleteAuditLogData(Overwrite deletedOverwrite) { Overwrite = deletedOverwrite; } - internal static OverwriteDeleteChanges Create(BaseDiscordClient discord, Model log, EntryModel entry, ChangeModel[] models) + internal static OverwriteDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) { - var denyModel = models.FirstOrDefault(x => x.ChangedProperty == "deny"); - var typeModel = models.FirstOrDefault(x => x.ChangedProperty == "type"); - var idModel = models.FirstOrDefault(x => x.ChangedProperty == "id"); - var allowModel = models.FirstOrDefault(x => x.ChangedProperty == "allow"); + var changes = entry.Changes; + + var denyModel = changes.FirstOrDefault(x => x.ChangedProperty == "deny"); + var typeModel = changes.FirstOrDefault(x => x.ChangedProperty == "type"); + var idModel = changes.FirstOrDefault(x => x.ChangedProperty == "id"); + var allowModel = changes.FirstOrDefault(x => x.ChangedProperty == "allow"); var deny = denyModel.OldValue.ToObject(); var type = typeModel.OldValue.ToObject(); //'role' or 'member', can't use PermissionsTarget :( @@ -37,7 +39,7 @@ namespace Discord.Rest else target = PermissionTarget.Role; - return new OverwriteDeleteChanges(new Overwrite(id, target, new OverwritePermissions(allow, deny))); + return new OverwriteDeleteAuditLogData(new Overwrite(id, target, new OverwritePermissions(allow, deny))); } public Overwrite Overwrite { get; } diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteUpdateAuditLogData.cs new file mode 100644 index 000000000..923cce28f --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/OverwriteUpdateAuditLogData.cs @@ -0,0 +1,50 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class OverwriteUpdateAuditLogData : IAuditLogData + { + private OverwriteUpdateAuditLogData(OverwritePermissions before, OverwritePermissions after, ulong targetId, PermissionTarget targetType) + { + Before = before; + After = after; + OverwriteTargetId = targetId; + OverwriteType = targetType; + } + + internal static OverwriteUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var denyModel = changes.FirstOrDefault(x => x.ChangedProperty == "deny"); + var allowModel = changes.FirstOrDefault(x => x.ChangedProperty == "allow"); + + var beforeAllow = allowModel?.OldValue?.ToObject(); + var afterAllow = allowModel?.NewValue?.ToObject(); + var beforeDeny = denyModel?.OldValue?.ToObject(); + var afterDeny = denyModel?.OldValue?.ToObject(); + + var beforePermissions = new OverwritePermissions(beforeAllow ?? 0, beforeDeny ?? 0); + var afterPermissions = new OverwritePermissions(afterAllow ?? 0, afterDeny ?? 0); + + PermissionTarget target; + if (entry.Options.OverwriteType == "member") + target = PermissionTarget.User; + else + target = PermissionTarget.Role; + + return new OverwriteUpdateAuditLogData(beforePermissions, afterPermissions, entry.Options.OverwriteTargetId.Value, target); + } + + //TODO: this is kind of janky. Should I leave it, create a custom type, or what? + public OverwritePermissions Before { get; } + public OverwritePermissions After { get; } + + public ulong OverwriteTargetId { get; } + public PermissionTarget OverwriteType { get; } + //TODO: should we also include the role name if it is given? + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/PruneAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/PruneAuditLogData.cs new file mode 100644 index 000000000..0005e304d --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/PruneAuditLogData.cs @@ -0,0 +1,22 @@ +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class PruneAuditLogData : IAuditLogData + { + private PruneAuditLogData(int pruneDays, int membersRemoved) + { + PruneDays = pruneDays; + MembersRemoved = membersRemoved; + } + + internal static PruneAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + return new PruneAuditLogData(entry.Options.PruneDeleteMemberDays.Value, entry.Options.PruneMembersRemoved.Value); + } + + public int PruneDays { get; } + public int MembersRemoved { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs new file mode 100644 index 000000000..30457f38c --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs @@ -0,0 +1,52 @@ +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class RoleCreateAuditLogData : IAuditLogData + { + private RoleCreateAuditLogData(RoleProperties newProps) + { + Properties = newProps; + } + + internal static RoleCreateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var newProps = new RoleProperties(); + + foreach (var model in changes) + { + switch (model.ChangedProperty) + { + case "color": + if (model.NewValue != null) + newProps.Color = new Color(model.NewValue.ToObject()); + break; + case "mentionable": + if (model.NewValue != null) + newProps.Mentionable = model.NewValue.ToObject(); + break; + case "hoist": + if (model.NewValue != null) + newProps.Hoist = model.NewValue.ToObject(); + break; + case "name": + if (model.NewValue != null) + newProps.Name = model.NewValue.ToObject(); + break; + case "permissions": + if (model.NewValue != null) + newProps.Permissions = new GuildPermissions(model.NewValue.ToObject()); + break; + } + } + + return new RoleCreateAuditLogData(newProps); + } + + //TODO: replace this with something read-only + public RoleProperties Properties { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs new file mode 100644 index 000000000..baeb27cc2 --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs @@ -0,0 +1,52 @@ +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class RoleDeleteAuditLogData : IAuditLogData + { + private RoleDeleteAuditLogData(RoleProperties properties) + { + Properties = properties; + } + + internal static RoleDeleteAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var oldProps = new RoleProperties(); + + foreach (var model in changes) + { + switch (model.ChangedProperty) + { + case "color": + if (model.OldValue != null) + oldProps.Color = new Color(model.OldValue.ToObject()); + break; + case "mentionable": + if (model.OldValue != null) + oldProps.Mentionable = model.OldValue.ToObject(); + break; + case "hoist": + if (model.OldValue != null) + oldProps.Hoist = model.OldValue.ToObject(); + break; + case "name": + if (model.OldValue != null) + oldProps.Name = model.OldValue.ToObject(); + break; + case "permissions": + if (model.OldValue != null) + oldProps.Permissions = new GuildPermissions(model.OldValue.ToObject()); + break; + } + } + + return new RoleDeleteAuditLogData(oldProps); + } + + //TODO: replace this with something read-only + public RoleProperties Properties { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs new file mode 100644 index 000000000..4c8d2cf9b --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs @@ -0,0 +1,65 @@ +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class RoleUpdateAuditLogData : IAuditLogData + { + private RoleUpdateAuditLogData(RoleProperties oldProps, RoleProperties newProps) + { + Before = oldProps; + After = newProps; + } + + internal static RoleUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + var changes = entry.Changes; + + var newProps = new RoleProperties(); + var oldProps = new RoleProperties(); + + foreach (var model in changes) + { + switch (model.ChangedProperty) + { + case "color": + if (model.NewValue != null) + newProps.Color = new Color(model.NewValue.ToObject()); + if (model.OldValue != null) + oldProps.Color = new Color(model.OldValue.ToObject()); + break; + case "mentionable": + if (model.NewValue != null) + newProps.Mentionable = model.NewValue.ToObject(); + if (model.OldValue != null) + oldProps.Mentionable = model.OldValue.ToObject(); + break; + case "hoist": + if (model.NewValue != null) + newProps.Hoist = model.NewValue.ToObject(); + if (model.OldValue != null) + oldProps.Hoist = model.OldValue.ToObject(); + break; + case "name": + if (model.NewValue != null) + newProps.Name = model.NewValue.ToObject(); + if (model.OldValue != null) + oldProps.Name = model.OldValue.ToObject(); + break; + case "permissions": + if (model.NewValue != null) + newProps.Permissions = new GuildPermissions(model.NewValue.ToObject()); + if (model.OldValue != null) + oldProps.Permissions = new GuildPermissions(model.OldValue.ToObject()); + break; + } + } + + return new RoleUpdateAuditLogData(oldProps, newProps); + } + + //TODO: replace these with something read-only + public RoleProperties Before { get; } + public RoleProperties After { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/Options/MessageDeleteAuditLogOptions.cs b/src/Discord.Net.Rest/Entities/AuditLogs/Options/MessageDeleteAuditLogOptions.cs deleted file mode 100644 index 3d53ed790..000000000 --- a/src/Discord.Net.Rest/Entities/AuditLogs/Options/MessageDeleteAuditLogOptions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Model = Discord.API.AuditLogOptions; - -namespace Discord.Rest -{ - public class MessageDeleteAuditLogOptions : IAuditLogOptions - { - internal MessageDeleteAuditLogOptions(BaseDiscordClient discord, Model model) - { - MessageCount = model.Count; - SourceChannelId = model.ChannelId; - } - - //TODO: turn this into an IChannel - public ulong SourceChannelId { get; } - public int MessageCount { get; } - } -} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs b/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs index 6f4de2e82..e30972913 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/RestAuditLogEntry.cs @@ -13,11 +13,8 @@ namespace Discord.Rest Action = model.Action; if (model.Changes != null) - Changes = AuditLogHelper.CreateChange(discord, fullLog, model, model.Changes); - if (model.Options != null) - Options = AuditLogHelper.CreateOptions(discord, fullLog, model, model.Options); + Data = AuditLogHelper.CreateData(discord, fullLog, model); - TargetId = model.TargetId; User = user; Reason = model.Reason; @@ -33,14 +30,13 @@ namespace Discord.Rest return new RestAuditLogEntry(discord, fullLog, model, user); } + /// public ActionType Action { get; } - - public IAuditLogChanges Changes { get; } - public IAuditLogOptions Options { get; } - - public ulong? TargetId { get; } //TODO: if we're exposing this on the changes instead, do we need this? + /// + public IAuditLogData Data { get; } + /// public IUser User { get; } - + /// public string Reason { get; } } }