@@ -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<ActionType, Func<BaseDiscordClient, Model, EntryModel, IAuditLogData>> CreateMapping | |||
= new Dictionary<ActionType, Func<BaseDiscordClient, Model, EntryModel, IAuditLogData>>() | |||
{ | |||
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."); | |||
} | |||
} | |||
} |
@@ -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<int>(); | |||
newAfkTimeout = change.NewValue?.ToObject<int>(); | |||
break; | |||
case "default_message_notifications": | |||
oldDefaultMessageNotifications = change.OldValue?.ToObject<DefaultMessageNotifications>(); | |||
newDefaultMessageNotifications = change.OldValue?.ToObject<DefaultMessageNotifications>(); | |||
break; | |||
case "afk_channel_id": | |||
oldAfkChannelId = change.OldValue?.ToObject<ulong>(); | |||
newAfkChannelId = change.NewValue?.ToObject<ulong>(); | |||
break; | |||
case "name": | |||
oldName = change.OldValue?.ToObject<string>(); | |||
newName = change.NewValue?.ToObject<string>(); | |||
break; | |||
case "region": | |||
oldRegionId = change.OldValue?.ToObject<string>(); | |||
newRegionId = change.NewValue?.ToObject<string>(); | |||
break; | |||
case "icon_hash": | |||
oldIconHash = change.OldValue?.ToObject<string>(); | |||
newIconHash = change.NewValue?.ToObject<string>(); | |||
break; | |||
case "verification_level": | |||
oldVerificationLevel = change.OldValue?.ToObject<VerificationLevel>(); | |||
newVerificationLevel = change.NewValue?.ToObject<VerificationLevel>(); | |||
break; | |||
case "owner": | |||
oldOwnerId = change.OldValue?.ToObject<ulong>(); | |||
newOwnerId = change.NewValue?.ToObject<ulong>(); | |||
break; | |||
case "mfa_level": | |||
oldMfaLevel = change.OldValue?.ToObject<MfaLevel>(); | |||
newMfaLevel = change.OldValue?.ToObject<MfaLevel>(); | |||
break; | |||
case "explicit_content_filter": | |||
oldContentFilter = change.OldValue?.ToObject<int>(); | |||
newContentFilter = change.NewValue?.ToObject<int>(); | |||
break; | |||
} | |||
} | |||
int? oldAfkTimeout = afkTimeoutModel?.OldValue?.ToObject<int>(), | |||
newAfkTimeout = afkTimeoutModel?.NewValue?.ToObject<int>(); | |||
DefaultMessageNotifications? oldDefaultMessageNotifications = defaultMessageNotificationsModel?.OldValue?.ToObject<DefaultMessageNotifications>(), | |||
newDefaultMessageNotifications = defaultMessageNotificationsModel?.NewValue?.ToObject<DefaultMessageNotifications>(); | |||
ulong? oldAfkChannelId = afkChannelModel?.OldValue?.ToObject<ulong>(), | |||
newAfkChannelId = afkChannelModel?.NewValue?.ToObject<ulong>(); | |||
string oldName = nameModel?.OldValue?.ToObject<string>(), | |||
newName = nameModel?.NewValue?.ToObject<string>(); | |||
string oldRegionId = regionIdModel?.OldValue?.ToObject<string>(), | |||
newRegionId = regionIdModel?.NewValue?.ToObject<string>(); | |||
string oldIconHash = iconHashModel?.OldValue?.ToObject<string>(), | |||
newIconHash = iconHashModel?.NewValue?.ToObject<string>(); | |||
VerificationLevel? oldVerificationLevel = verificationLevelModel?.OldValue?.ToObject<VerificationLevel>(), | |||
newVerificationLevel = verificationLevelModel?.NewValue?.ToObject<VerificationLevel>(); | |||
ulong? oldOwnerId = ownerIdModel?.OldValue?.ToObject<ulong>(), | |||
newOwnerId = ownerIdModel?.NewValue?.ToObject<ulong>(); | |||
MfaLevel? oldMfaLevel = mfaLevelModel?.OldValue?.ToObject<MfaLevel>(), | |||
newMfaLevel = mfaLevelModel?.NewValue?.ToObject<MfaLevel>(); | |||
int? oldContentFilter = contentFilterModel?.OldValue?.ToObject<int>(), | |||
newContentFilter = contentFilterModel?.NewValue?.ToObject<int>(); | |||
IUser oldOwner = null; | |||
if (oldOwnerId != null) | |||
@@ -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; } | |||
} | |||
} |
@@ -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<int>(), | |||
newMaxAge = maxAgeModel?.NewValue?.ToObject<int>(); | |||
string oldCode = codeModel?.OldValue?.ToObject<string>(), | |||
newCode = codeModel?.NewValue?.ToObject<string>(); | |||
bool? oldTemporary = temporaryModel?.OldValue?.ToObject<bool>(), | |||
newTemporary = temporaryModel?.NewValue?.ToObject<bool>(); | |||
ulong? oldChannelId = channelIdModel?.OldValue?.ToObject<ulong>(), | |||
newChannelId = channelIdModel?.NewValue?.ToObject<ulong>(); | |||
int? oldMaxUses = maxUsesModel?.OldValue?.ToObject<int>(), | |||
newMaxUses = maxUsesModel?.NewValue?.ToObject<int>(); | |||
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; } | |||
} | |||
} |
@@ -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<uint>(); | |||
bool? mentionable = mentionableModel?.NewValue?.ToObject<bool>(); | |||
bool? hoist = hoistModel?.NewValue?.ToObject<bool>(); | |||
string name = nameModel?.NewValue?.ToObject<string>(); | |||
ulong? permissionsRaw = permissionsModel?.NewValue?.ToObject<ulong>(); | |||
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<uint>()); | |||
break; | |||
case "mentionable": | |||
if (model.NewValue != null) | |||
mentionable = model.NewValue.ToObject<bool>(); | |||
break; | |||
case "hoist": | |||
if (model.NewValue != null) | |||
hoist = model.NewValue.ToObject<bool>(); | |||
break; | |||
case "name": | |||
if (model.NewValue != null) | |||
name = model.NewValue.ToObject<string>(); | |||
break; | |||
case "permissions": | |||
if (model.NewValue != null) | |||
permissions = new GuildPermissions(model.NewValue.ToObject<ulong>()); | |||
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)); | |||
@@ -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<uint>(); | |||
bool? mentionable = mentionableModel?.OldValue?.ToObject<bool>(); | |||
bool? hoist = hoistModel?.OldValue?.ToObject<bool>(); | |||
string name = nameModel?.OldValue?.ToObject<string>(); | |||
ulong? permissionsRaw = permissionsModel?.OldValue?.ToObject<ulong>(); | |||
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<uint>()); | |||
break; | |||
case "mentionable": | |||
if (model.OldValue != null) | |||
mentionable = model.OldValue.ToObject<bool>(); | |||
break; | |||
case "hoist": | |||
if (model.OldValue != null) | |||
hoist = model.OldValue.ToObject<bool>(); | |||
break; | |||
case "name": | |||
if (model.OldValue != null) | |||
name = model.OldValue.ToObject<string>(); | |||
break; | |||
case "permissions": | |||
if (model.OldValue != null) | |||
permissions = new GuildPermissions(model.OldValue.ToObject<ulong>()); | |||
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)); | |||
@@ -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<uint>(), | |||
newColorRaw = colorModel?.NewValue?.ToObject<uint>(); | |||
bool? oldMentionable = mentionableModel?.OldValue?.ToObject<bool>(), | |||
newMentionable = mentionableModel?.NewValue?.ToObject<bool>(); | |||
bool? oldHoist = hoistModel?.OldValue?.ToObject<bool>(), | |||
newHoist = hoistModel?.NewValue?.ToObject<bool>(); | |||
string oldName = nameModel?.OldValue?.ToObject<string>(), | |||
newName = nameModel?.NewValue?.ToObject<string>(); | |||
ulong? oldPermissionsRaw = permissionsModel?.OldValue?.ToObject<ulong>(), | |||
newPermissionsRaw = permissionsModel?.OldValue?.ToObject<ulong>(); | |||
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<uint>()); | |||
if (model.OldValue != null) | |||
oldColor = new Color(model.OldValue.ToObject<uint>()); | |||
break; | |||
case "mentionable": | |||
if (model.NewValue != null) | |||
newMentionable = model.NewValue.ToObject<bool>(); | |||
if (model.OldValue != null) | |||
oldMentionable = model.OldValue.ToObject<bool>(); | |||
break; | |||
case "hoist": | |||
if (model.NewValue != null) | |||
newHoist = model.NewValue.ToObject<bool>(); | |||
if (model.OldValue != null) | |||
oldHoist = model.OldValue.ToObject<bool>(); | |||
break; | |||
case "name": | |||
if (model.NewValue != null) | |||
newName = model.NewValue.ToObject<string>(); | |||
if (model.OldValue != null) | |||
oldName = model.OldValue.ToObject<string>(); | |||
break; | |||
case "permissions": | |||
if (model.NewValue != null) | |||
newPermissions = new GuildPermissions(model.NewValue.ToObject<ulong>()); | |||
if (model.OldValue != null) | |||
oldPermissions = new GuildPermissions(model.OldValue.ToObject<ulong>()); | |||
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); | |||