You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

SocketUser.cs 2.9 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Discord.Rest;
  2. using System;
  3. using System.Threading.Tasks;
  4. using Model = Discord.API.User;
  5. namespace Discord.WebSocket
  6. {
  7. public abstract class SocketUser : SocketEntity<ulong>, IUser
  8. {
  9. public abstract bool IsBot { get; internal set; }
  10. public abstract string Username { get; internal set; }
  11. public abstract ushort DiscriminatorValue { get; internal set; }
  12. public abstract string AvatarId { get; internal set; }
  13. public abstract bool IsWebhook { get; }
  14. internal abstract SocketGlobalUser GlobalUser { get; }
  15. internal abstract SocketPresence Presence { get; set; }
  16. public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id);
  17. public string Discriminator => DiscriminatorValue.ToString("D4");
  18. public string Mention => MentionUtils.MentionUser(Id);
  19. public IActivity Activity => Presence.Activity;
  20. public UserStatus Status => Presence.Status;
  21. internal SocketUser(DiscordSocketClient discord, ulong id)
  22. : base(discord, id)
  23. {
  24. }
  25. internal virtual bool Update(ClientState state, Model model)
  26. {
  27. bool hasChanges = false;
  28. if (model.Avatar.IsSpecified && model.Avatar.Value != AvatarId)
  29. {
  30. AvatarId = model.Avatar.Value;
  31. hasChanges = true;
  32. }
  33. if (model.Discriminator.IsSpecified)
  34. {
  35. var newVal = ushort.Parse(model.Discriminator.Value);
  36. if (newVal != DiscriminatorValue)
  37. {
  38. DiscriminatorValue = ushort.Parse(model.Discriminator.Value);
  39. hasChanges = true;
  40. }
  41. }
  42. if (model.Bot.IsSpecified && model.Bot.Value != IsBot)
  43. {
  44. IsBot = model.Bot.Value;
  45. hasChanges = true;
  46. }
  47. if (model.Username.IsSpecified && model.Username.Value != Username)
  48. {
  49. Username = model.Username.Value;
  50. hasChanges = true;
  51. }
  52. return hasChanges;
  53. }
  54. public async Task<IDMChannel> GetOrCreateDMChannelAsync(RequestOptions options = null)
  55. => GlobalUser.DMChannel ?? await UserHelper.CreateDMChannelAsync(this, Discord, options) as IDMChannel;
  56. public string GetAvatarUrl(ImageFormat format = ImageFormat.Auto, ushort size = 128)
  57. => CDN.GetUserAvatarUrl(Id, AvatarId, size, format);
  58. public string GetDefaultAvatarUrl()
  59. => CDN.GetDefaultUserAvatarUrl(DiscriminatorValue);
  60. public override string ToString() => $"{Username}#{Discriminator}";
  61. private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")})";
  62. internal SocketUser Clone() => MemberwiseClone() as SocketUser;
  63. }
  64. }