using Discord.Rest; using System; using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.ICurrentUserModel; using UserModel = Discord.IUserModel; namespace Discord.WebSocket { /// /// Represents the logged-in WebSocket-based user. /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketSelfUser : SocketUser, ISelfUser, ICached { /// public string Email { get; private set; } /// public bool IsVerified { get; private set; } /// public bool IsMfaEnabled { get; private set; } /// public UserProperties Flags { get; internal set; } /// public PremiumType PremiumType { get; internal set; } /// public string Locale { get; internal set; } /// public override bool IsWebhook => false; internal SocketSelfUser(DiscordSocketClient discord, ulong userId) : base(discord, userId) { } internal static SocketSelfUser Create(DiscordSocketClient discord, Model model) { var entity = new SocketSelfUser(discord, model.Id); entity.Update(model); return entity; } internal override bool Update(UserModel model) { bool hasGlobalChanges = base.Update(model); if (model is not Model currentUserModel) throw new ArgumentException($"Got unexpected model type \"{model?.GetType()}\""); if(currentUserModel.Email != Email) { Email = currentUserModel.Email; hasGlobalChanges = true; } if (currentUserModel.IsVerified.HasValue) { IsVerified = currentUserModel.IsVerified.Value; hasGlobalChanges = true; } if (currentUserModel.IsMfaEnabled.HasValue) { IsMfaEnabled = currentUserModel.IsMfaEnabled.Value; hasGlobalChanges = true; } if (currentUserModel.Flags != Flags) { Flags = currentUserModel.Flags; hasGlobalChanges = true; } if (currentUserModel.PremiumType != PremiumType) { PremiumType = currentUserModel.PremiumType; hasGlobalChanges = true; } if (currentUserModel.Locale != Locale) { Locale = currentUserModel.Locale; hasGlobalChanges = true; } return hasGlobalChanges; } /// public Task ModifyAsync(Action func, RequestOptions options = null) => UserHelper.ModifyAsync(this, Discord, func, options); private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Self)"; internal new SocketSelfUser Clone() => MemberwiseClone() as SocketSelfUser; public override void Dispose() { if (IsFreed) return; GC.SuppressFinalize(this); Discord.StateManager.UserStore.RemoveReference(Id); IsFreed = true; } #region Cache private struct CacheModel : Model { public bool? IsVerified { get; set; } public string Email { get; set; } public bool? IsMfaEnabled { get; set; } public UserProperties Flags { get; set; } public PremiumType PremiumType { get; set; } public string Locale { get; set; } public UserProperties PublicFlags { get; set; } public string Username { get; set; } public string Discriminator { get; set; } public bool? IsBot { get; set; } public string Avatar { get; set; } public ulong Id { get; set; } } internal new Model ToModel() => ToModel(); internal new TModel ToModel() where TModel : Model, new() { return new TModel { Avatar = AvatarId, Discriminator = Discriminator, Email = Email, Flags = Flags, Id = Id, IsBot = IsBot, IsMfaEnabled = IsMfaEnabled, IsVerified = IsVerified, Locale = Locale, PremiumType = this.PremiumType, PublicFlags = PublicFlags ?? UserProperties.None, Username = Username }; } Model ICached.ToModel() => ToModel(); TResult ICached.ToModel() => ToModel(); void ICached.Update(Model model) => Update(model); #endregion } }