using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Model = Discord.API.ThreadMember; using System.Collections.Immutable; namespace Discord.WebSocket { /// <summary> /// Represents a thread user received over the gateway. /// </summary> public class SocketThreadUser : SocketUser, IThreadUser, IGuildUser { /// <summary> /// Gets the <see cref="SocketThreadChannel"/> this user is in. /// </summary> public SocketThreadChannel Thread { get; private set; } /// <inheritdoc/> public DateTimeOffset ThreadJoinedAt { get; private set; } /// <summary> /// Gets the guild this user is in. /// </summary> public SocketGuild Guild { get; private set; } /// <inheritdoc/> public DateTimeOffset? JoinedAt => GuildUser.JoinedAt; /// <inheritdoc/> public string Nickname => GuildUser.Nickname; /// <inheritdoc/> public DateTimeOffset? PremiumSince => GuildUser.PremiumSince; /// <inheritdoc/> public DateTimeOffset? TimedOutUntil => GuildUser.TimedOutUntil; /// <inheritdoc/> public bool? IsPending => GuildUser.IsPending; /// <inheritdoc /> public int Hierarchy => GuildUser.Hierarchy; /// <inheritdoc/> public override string AvatarId { get => GuildUser.AvatarId; internal set => GuildUser.AvatarId = value; } /// <inheritdoc/> public string GuildAvatarId => GuildUser.GuildAvatarId; /// <inheritdoc/> public override ushort DiscriminatorValue { get => GuildUser.DiscriminatorValue; internal set => GuildUser.DiscriminatorValue = value; } /// <inheritdoc/> public override bool IsBot { get => GuildUser.IsBot; internal set => GuildUser.IsBot = value; } /// <inheritdoc/> public override bool IsWebhook => GuildUser.IsWebhook; /// <inheritdoc/> public override string Username { get => GuildUser.Username; internal set => GuildUser.Username = value; } /// <inheritdoc/> public bool IsDeafened => GuildUser.IsDeafened; /// <inheritdoc/> public bool IsMuted => GuildUser.IsMuted; /// <inheritdoc/> public bool IsSelfDeafened => GuildUser.IsSelfDeafened; /// <inheritdoc/> public bool IsSelfMuted => GuildUser.IsSelfMuted; /// <inheritdoc/> public bool IsSuppressed => GuildUser.IsSuppressed; /// <inheritdoc/> public IVoiceChannel VoiceChannel => GuildUser.VoiceChannel; /// <inheritdoc/> public string VoiceSessionId => GuildUser.VoiceSessionId; /// <inheritdoc/> public bool IsStreaming => GuildUser.IsStreaming; /// <inheritdoc/> public DateTimeOffset? RequestToSpeakTimestamp => GuildUser.RequestToSpeakTimestamp; private SocketGuildUser GuildUser { get; set; } internal SocketThreadUser(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser member, ulong userId) : base(guild.Discord, userId) { Thread = thread; Guild = guild; GuildUser = member; } internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, Model model, SocketGuildUser member) { var entity = new SocketThreadUser(guild, thread, member, model.UserId.Value); entity.Update(model); return entity; } internal void Update(Model model) { ThreadJoinedAt = model.JoinTimestamp; } /// <inheritdoc/> public ChannelPermissions GetPermissions(IGuildChannel channel) => GuildUser.GetPermissions(channel); /// <inheritdoc/> public Task KickAsync(string reason = null, RequestOptions options = null) => GuildUser.KickAsync(reason, options); /// <inheritdoc/> public Task ModifyAsync(Action<GuildUserProperties> func, RequestOptions options = null) => GuildUser.ModifyAsync(func, options); /// <inheritdoc/> public Task AddRoleAsync(ulong roleId, RequestOptions options = null) => GuildUser.AddRoleAsync(roleId, options); /// <inheritdoc/> public Task AddRoleAsync(IRole role, RequestOptions options = null) => GuildUser.AddRoleAsync(role, options); /// <inheritdoc/> public Task AddRolesAsync(IEnumerable<ulong> roleIds, RequestOptions options = null) => GuildUser.AddRolesAsync(roleIds, options); /// <inheritdoc/> public Task AddRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null) => GuildUser.AddRolesAsync(roles, options); /// <inheritdoc/> public Task RemoveRoleAsync(ulong roleId, RequestOptions options = null) => GuildUser.RemoveRoleAsync(roleId, options); /// <inheritdoc/> public Task RemoveRoleAsync(IRole role, RequestOptions options = null) => GuildUser.RemoveRoleAsync(role, options); /// <inheritdoc/> public Task RemoveRolesAsync(IEnumerable<ulong> roleIds, RequestOptions options = null) => GuildUser.RemoveRolesAsync(roleIds, options); /// <inheritdoc/> public Task RemoveRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null) => GuildUser.RemoveRolesAsync(roles, options); /// <inheritdoc/> public Task SetTimeOutAsync(TimeSpan span, RequestOptions options = null) => GuildUser.SetTimeOutAsync(span, options); /// <inheritdoc/> public Task RemoveTimeOutAsync(RequestOptions options = null) => GuildUser.RemoveTimeOutAsync(options); /// <inheritdoc/> IThreadChannel IThreadUser.Thread => Thread; /// <inheritdoc/> IGuild IThreadUser.Guild => Guild; /// <inheritdoc/> IGuild IGuildUser.Guild => Guild; /// <inheritdoc/> ulong IGuildUser.GuildId => Guild.Id; /// <inheritdoc/> GuildPermissions IGuildUser.GuildPermissions => GuildUser.GuildPermissions; /// <inheritdoc/> IReadOnlyCollection<ulong> IGuildUser.RoleIds => GuildUser.Roles.Select(x => x.Id).ToImmutableArray(); string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => GuildUser.GetGuildAvatarUrl(format, size); internal override SocketGlobalUser GlobalUser => GuildUser.GlobalUser; internal override SocketPresence Presence { get => GuildUser.Presence; set => GuildUser.Presence = value; } /// <summary> /// Gets the guild user of this thread user. /// </summary> /// <param name="user"></param> public static explicit operator SocketGuildUser(SocketThreadUser user) => user.GuildUser; } }