diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs index 541f008b0..7936343f3 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/AuditLogHelper.cs @@ -1,79 +1,58 @@ -using Model = Discord.API.AuditLog; +using System; +using System.Collections.Generic; + +using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; namespace Discord.Rest { internal static class AuditLogHelper { - public static IAuditLogData CreateData(BaseDiscordClient discord, Model log, EntryModel entry) + private static readonly Dictionary> CreateMapping + = new Dictionary>() { - switch (entry.Action) - { - case ActionType.GuildUpdated: //1 - return GuildUpdateAuditLogData.Create(discord, log, entry); + [ActionType.GuildUpdated] = GuildUpdateAuditLogData.Create, + + [ActionType.ChannelCreated] = ChannelCreateAuditLogData.Create, + [ActionType.ChannelUpdated] = ChannelUpdateAuditLogData.Create, + [ActionType.ChannelDeleted] = ChannelDeleteAuditLogData.Create, - case ActionType.ChannelCreated: //10 - return ChannelCreateAuditLogData.Create(discord, log, entry); - case ActionType.ChannelUpdated: - return ChannelUpdateAuditLogData.Create(discord, log, entry); - case ActionType.ChannelDeleted: - return ChannelDeleteAuditLogData.Create(discord, log, entry); - case ActionType.OverwriteCreated: - return OverwriteCreateAuditLogData.Create(discord, log, entry); - case ActionType.OverwriteUpdated: - return OverwriteUpdateAuditLogData.Create(discord, log, entry); - case ActionType.OverwriteDeleted: - return OverwriteDeleteAuditLogData.Create(discord, log, entry); + [ActionType.OverwriteCreated] = OverwriteCreateAuditLogData.Create, + [ActionType.OverwriteUpdated] = OverwriteUpdateAuditLogData.Create, + [ActionType.OverwriteDeleted] = OverwriteDeleteAuditLogData.Create, - case ActionType.Kick: //20 - return KickAuditLogData.Create(discord, log, entry); - case ActionType.Prune: - return PruneAuditLogData.Create(discord, log, entry); - case ActionType.Ban: - return BanAuditLogData.Create(discord, log, entry); - case ActionType.Unban: - return UnbanAuditLogData.Create(discord, log, entry); - case ActionType.MemberUpdated: - return MemberUpdateAuditLogData.Create(discord, log, entry); - case ActionType.MemberRoleUpdated: - return MemberRoleAuditLogData.Create(discord, log, entry); + [ActionType.Kick] = KickAuditLogData.Create, + [ActionType.Prune] = PruneAuditLogData.Create, + [ActionType.Ban] = BanAuditLogData.Create, + [ActionType.Unban] = UnbanAuditLogData.Create, + [ActionType.MemberUpdated] = MemberUpdateAuditLogData.Create, + [ActionType.MemberRoleUpdated] = MemberRoleAuditLogData.Create, - case ActionType.RoleCreated: //30 - return RoleCreateAuditLogData.Create(discord, log, entry); - case ActionType.RoleUpdated: - return RoleUpdateAuditLogData.Create(discord, log, entry); - case ActionType.RoleDeleted: - return RoleDeleteAuditLogData.Create(discord, log, entry); + [ActionType.RoleCreated] = RoleCreateAuditLogData.Create, + [ActionType.RoleUpdated] = RoleUpdateAuditLogData.Create, + [ActionType.RoleDeleted] = RoleDeleteAuditLogData.Create, - case ActionType.InviteCreated: //40 - return InviteCreateAuditLogData.Create(discord, log, entry); - case ActionType.InviteUpdated: - break; - case ActionType.InviteDeleted: - return InviteDeleteAuditLogData.Create(discord, log, entry); + [ActionType.InviteCreated] = InviteCreateAuditLogData.Create, + [ActionType.InviteUpdated] = InviteUpdateAuditLogData.Create, + [ActionType.InviteDeleted] = InviteDeleteAuditLogData.Create, - case ActionType.WebhookCreated: //50 - return WebhookCreateAuditLogData.Create(discord, log, entry); - case ActionType.WebhookUpdated: - return WebhookUpdateAuditLogData.Create(discord, log, entry); - case ActionType.WebhookDeleted: - return WebhookDeleteAuditLogData.Create(discord, log, entry); + [ActionType.WebhookCreated] = WebhookCreateAuditLogData.Create, + [ActionType.WebhookUpdated] = WebhookUpdateAuditLogData.Create, + [ActionType.WebhookDeleted] = WebhookDeleteAuditLogData.Create, - case ActionType.EmojiCreated: //60 - return EmoteCreateAuditLogData.Create(discord, log, entry); - case ActionType.EmojiUpdated: - return EmoteUpdateAuditLogData.Create(discord, log, entry); - case ActionType.EmojiDeleted: - return EmoteDeleteAuditLogData.Create(discord, log, entry); + [ActionType.EmojiCreated] = EmoteCreateAuditLogData.Create, + [ActionType.EmojiUpdated] = EmoteUpdateAuditLogData.Create, + [ActionType.EmojiDeleted] = EmoteDeleteAuditLogData.Create, - case ActionType.MessageDeleted: //72 - return MessageDeleteAuditLogData.Create(discord, log, entry); + [ActionType.MessageDeleted] = MessageDeleteAuditLogData.Create, + }; + + public static IAuditLogData CreateData(BaseDiscordClient discord, Model log, EntryModel entry) + { + if (CreateMapping.TryGetValue(entry.Action, out var func)) + return func(discord, log, entry); - default: //Unknown - return null; - } 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/DataTypes/GuildUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/GuildUpdateAuditLogData.cs index 46e870de7..08550ed7a 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/GuildUpdateAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/GuildUpdateAuditLogData.cs @@ -17,73 +17,37 @@ namespace Discord.Rest { var changes = entry.Changes; - int? oldAfkTimeout = null, - newAfkTimeout = null; - DefaultMessageNotifications? oldDefaultMessageNotifications = null, - newDefaultMessageNotifications = null; - ulong? oldAfkChannelId = null, - newAfkChannelId = null; - string oldName = null, - newName = null; - string oldRegionId = null, - newRegionId = null; - string oldIconHash = null, - newIconHash = null; - VerificationLevel? oldVerificationLevel = null, - newVerificationLevel = null; - ulong? oldOwnerId = null, - newOwnerId = null; - MfaLevel? oldMfaLevel = null, - newMfaLevel = null; - int? oldContentFilter = null, - newContentFilter = null; + var afkTimeoutModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var defaultMessageNotificationsModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var afkChannelModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var nameModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var regionIdModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var iconHashModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var verificationLevelModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var ownerIdModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var mfaLevelModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); + var contentFilterModel = changes.FirstOrDefault(x => x.ChangedProperty == "afk_timeout"); - 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; - case "verification_level": - oldVerificationLevel = change.OldValue?.ToObject(); - newVerificationLevel = change.NewValue?.ToObject(); - break; - case "owner": - oldOwnerId = change.OldValue?.ToObject(); - newOwnerId = change.NewValue?.ToObject(); - break; - case "mfa_level": - oldMfaLevel = change.OldValue?.ToObject(); - newMfaLevel = change.OldValue?.ToObject(); - break; - case "explicit_content_filter": - oldContentFilter = change.OldValue?.ToObject(); - newContentFilter = change.NewValue?.ToObject(); - break; - } - } + int? oldAfkTimeout = afkTimeoutModel?.OldValue?.ToObject(), + newAfkTimeout = afkTimeoutModel?.NewValue?.ToObject(); + DefaultMessageNotifications? oldDefaultMessageNotifications = defaultMessageNotificationsModel?.OldValue?.ToObject(), + newDefaultMessageNotifications = defaultMessageNotificationsModel?.NewValue?.ToObject(); + ulong? oldAfkChannelId = afkChannelModel?.OldValue?.ToObject(), + newAfkChannelId = afkChannelModel?.NewValue?.ToObject(); + string oldName = nameModel?.OldValue?.ToObject(), + newName = nameModel?.NewValue?.ToObject(); + string oldRegionId = regionIdModel?.OldValue?.ToObject(), + newRegionId = regionIdModel?.NewValue?.ToObject(); + string oldIconHash = iconHashModel?.OldValue?.ToObject(), + newIconHash = iconHashModel?.NewValue?.ToObject(); + VerificationLevel? oldVerificationLevel = verificationLevelModel?.OldValue?.ToObject(), + newVerificationLevel = verificationLevelModel?.NewValue?.ToObject(); + ulong? oldOwnerId = ownerIdModel?.OldValue?.ToObject(), + newOwnerId = ownerIdModel?.NewValue?.ToObject(); + MfaLevel? oldMfaLevel = mfaLevelModel?.OldValue?.ToObject(), + newMfaLevel = mfaLevelModel?.NewValue?.ToObject(); + int? oldContentFilter = contentFilterModel?.OldValue?.ToObject(), + newContentFilter = contentFilterModel?.NewValue?.ToObject(); IUser oldOwner = null; if (oldOwnerId != null) diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteInfo.cs new file mode 100644 index 000000000..c9840f6cc --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteInfo.cs @@ -0,0 +1,20 @@ +namespace Discord.Rest +{ + public struct InviteInfo + { + internal InviteInfo(int? maxAge, string code, bool? temporary, ulong? channelId, int? maxUses) + { + MaxAge = maxAge; + Code = code; + Temporary = temporary; + ChannelId = channelId; + MaxUses = maxUses; + } + + public int? MaxAge { get; } + public string Code { get; } + public bool? Temporary { get; } + public ulong? ChannelId { get; } + public int? MaxUses { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteUpdateAuditLogData.cs new file mode 100644 index 000000000..b932cfbfc --- /dev/null +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/InviteUpdateAuditLogData.cs @@ -0,0 +1,46 @@ +using System.Linq; + +using Model = Discord.API.AuditLog; +using EntryModel = Discord.API.AuditLogEntry; + +namespace Discord.Rest +{ + public class InviteUpdateAuditLogData : IAuditLogData + { + private InviteUpdateAuditLogData(InviteInfo before, InviteInfo after) + { + Before = before; + After = after; + } + + internal static InviteUpdateAuditLogData Create(BaseDiscordClient discord, Model log, EntryModel entry) + { + 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 channelIdModel = changes.FirstOrDefault(x => x.ChangedProperty == "channel_id"); + var maxUsesModel = changes.FirstOrDefault(x => x.ChangedProperty == "max_uses"); + + int? oldMaxAge = maxAgeModel?.OldValue?.ToObject(), + newMaxAge = maxAgeModel?.NewValue?.ToObject(); + string oldCode = codeModel?.OldValue?.ToObject(), + newCode = codeModel?.NewValue?.ToObject(); + bool? oldTemporary = temporaryModel?.OldValue?.ToObject(), + newTemporary = temporaryModel?.NewValue?.ToObject(); + ulong? oldChannelId = channelIdModel?.OldValue?.ToObject(), + newChannelId = channelIdModel?.NewValue?.ToObject(); + int? oldMaxUses = maxUsesModel?.OldValue?.ToObject(), + newMaxUses = maxUsesModel?.NewValue?.ToObject(); + + var before = new InviteInfo(oldMaxAge, oldCode, oldTemporary, oldChannelId, oldMaxUses); + var after = new InviteInfo(newMaxAge, newCode, newTemporary, newChannelId, newMaxUses); + + return new InviteUpdateAuditLogData(before, after); + } + + public InviteInfo Before { get; } + public InviteInfo After { get; } + } +} diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs index 9de6f8b48..aa951d6e7 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs @@ -1,4 +1,6 @@ -using Model = Discord.API.AuditLog; +using System.Linq; + +using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; namespace Discord.Rest @@ -15,38 +17,25 @@ namespace Discord.Rest { var changes = entry.Changes; + var colorModel = changes.FirstOrDefault(x => x.ChangedProperty == "color"); + var mentionableModel = changes.FirstOrDefault(x => x.ChangedProperty == "mentionable"); + var hoistModel = changes.FirstOrDefault(x => x.ChangedProperty == "hoist"); + var nameModel = changes.FirstOrDefault(x => x.ChangedProperty == "name"); + var permissionsModel = changes.FirstOrDefault(x => x.ChangedProperty == "permissions"); + + uint? colorRaw = colorModel?.NewValue?.ToObject(); + bool? mentionable = mentionableModel?.NewValue?.ToObject(); + bool? hoist = hoistModel?.NewValue?.ToObject(); + string name = nameModel?.NewValue?.ToObject(); + ulong? permissionsRaw = permissionsModel?.NewValue?.ToObject(); + Color? color = null; - bool? mentionable = null, - hoist = null; - string name = null; GuildPermissions? permissions = null; - foreach (var model in changes) - { - switch (model.ChangedProperty) - { - case "color": - if (model.NewValue != null) - color = new Color(model.NewValue.ToObject()); - break; - case "mentionable": - if (model.NewValue != null) - mentionable = model.NewValue.ToObject(); - break; - case "hoist": - if (model.NewValue != null) - hoist = model.NewValue.ToObject(); - break; - case "name": - if (model.NewValue != null) - name = model.NewValue.ToObject(); - break; - case "permissions": - if (model.NewValue != null) - permissions = new GuildPermissions(model.NewValue.ToObject()); - break; - } - } + if (colorRaw.HasValue) + color = new Color(colorRaw.Value); + if (permissionsRaw.HasValue) + permissions = new GuildPermissions(permissionsRaw.Value); return new RoleCreateAuditLogData(entry.TargetId.Value, new RoleInfo(color, mentionable, hoist, name, permissions)); diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs index c072dee35..e90d70d4d 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs @@ -1,4 +1,6 @@ -using Model = Discord.API.AuditLog; +using System.Linq; + +using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; namespace Discord.Rest @@ -15,38 +17,25 @@ namespace Discord.Rest { var changes = entry.Changes; + var colorModel = changes.FirstOrDefault(x => x.ChangedProperty == "color"); + var mentionableModel = changes.FirstOrDefault(x => x.ChangedProperty == "mentionable"); + var hoistModel = changes.FirstOrDefault(x => x.ChangedProperty == "hoist"); + var nameModel = changes.FirstOrDefault(x => x.ChangedProperty == "name"); + var permissionsModel = changes.FirstOrDefault(x => x.ChangedProperty == "permissions"); + + uint? colorRaw = colorModel?.OldValue?.ToObject(); + bool? mentionable = mentionableModel?.OldValue?.ToObject(); + bool? hoist = hoistModel?.OldValue?.ToObject(); + string name = nameModel?.OldValue?.ToObject(); + ulong? permissionsRaw = permissionsModel?.OldValue?.ToObject(); + Color? color = null; - bool? mentionable = null, - hoist = null; - string name = null; GuildPermissions? permissions = null; - foreach (var model in changes) - { - switch (model.ChangedProperty) - { - case "color": - if (model.OldValue != null) - color = new Color(model.OldValue.ToObject()); - break; - case "mentionable": - if (model.OldValue != null) - mentionable = model.OldValue.ToObject(); - break; - case "hoist": - if (model.OldValue != null) - hoist = model.OldValue.ToObject(); - break; - case "name": - if (model.OldValue != null) - name = model.OldValue.ToObject(); - break; - case "permissions": - if (model.OldValue != null) - permissions = new GuildPermissions(model.OldValue.ToObject()); - break; - } - } + if (colorRaw.HasValue) + color = new Color(colorRaw.Value); + if (permissionsRaw.HasValue) + permissions = new GuildPermissions(permissionsRaw.Value); return new RoleDeleteAuditLogData(entry.TargetId.Value, new RoleInfo(color, mentionable, hoist, name, permissions)); diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs index 7c86ad73c..be484e2d5 100644 --- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs +++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs @@ -1,4 +1,6 @@ -using Model = Discord.API.AuditLog; +using System.Linq; + +using Model = Discord.API.AuditLog; using EntryModel = Discord.API.AuditLogEntry; namespace Discord.Rest @@ -16,53 +18,36 @@ namespace Discord.Rest { var changes = entry.Changes; + var colorModel = changes.FirstOrDefault(x => x.ChangedProperty == "color"); + var mentionableModel = changes.FirstOrDefault(x => x.ChangedProperty == "mentionable"); + var hoistModel = changes.FirstOrDefault(x => x.ChangedProperty == "hoist"); + var nameModel = changes.FirstOrDefault(x => x.ChangedProperty == "name"); + var permissionsModel = changes.FirstOrDefault(x => x.ChangedProperty == "permissions"); + + uint? oldColorRaw = colorModel?.OldValue?.ToObject(), + newColorRaw = colorModel?.NewValue?.ToObject(); + bool? oldMentionable = mentionableModel?.OldValue?.ToObject(), + newMentionable = mentionableModel?.NewValue?.ToObject(); + bool? oldHoist = hoistModel?.OldValue?.ToObject(), + newHoist = hoistModel?.NewValue?.ToObject(); + string oldName = nameModel?.OldValue?.ToObject(), + newName = nameModel?.NewValue?.ToObject(); + ulong? oldPermissionsRaw = permissionsModel?.OldValue?.ToObject(), + newPermissionsRaw = permissionsModel?.OldValue?.ToObject(); + Color? oldColor = null, newColor = null; - bool? oldMentionable = null, - newMentionable = null; - bool? oldHoist = null, - newHoist = null; - string oldName = null, - newName = null; GuildPermissions? oldPermissions = null, newPermissions = null; - foreach (var model in changes) - { - switch (model.ChangedProperty) - { - case "color": - if (model.NewValue != null) - newColor = new Color(model.NewValue.ToObject()); - if (model.OldValue != null) - oldColor = new Color(model.OldValue.ToObject()); - break; - case "mentionable": - if (model.NewValue != null) - newMentionable = model.NewValue.ToObject(); - if (model.OldValue != null) - oldMentionable = model.OldValue.ToObject(); - break; - case "hoist": - if (model.NewValue != null) - newHoist = model.NewValue.ToObject(); - if (model.OldValue != null) - oldHoist = model.OldValue.ToObject(); - break; - case "name": - if (model.NewValue != null) - newName = model.NewValue.ToObject(); - if (model.OldValue != null) - oldName = model.OldValue.ToObject(); - break; - case "permissions": - if (model.NewValue != null) - newPermissions = new GuildPermissions(model.NewValue.ToObject()); - if (model.OldValue != null) - oldPermissions = new GuildPermissions(model.OldValue.ToObject()); - break; - } - } + if (oldColorRaw.HasValue) + oldColor = new Color(oldColorRaw.Value); + if (newColorRaw.HasValue) + newColor = new Color(newColorRaw.Value); + if (oldPermissionsRaw.HasValue) + oldPermissions = new GuildPermissions(oldPermissionsRaw.Value); + if (newPermissionsRaw.HasValue) + newPermissions = new GuildPermissions(newPermissionsRaw.Value); var oldProps = new RoleInfo(oldColor, oldMentionable, oldHoist, oldName, oldPermissions); var newProps = new RoleInfo(newColor, newMentionable, newHoist, newName, newPermissions);