| @@ -7,13 +7,13 @@ namespace Discord | |||||
| { | { | ||||
| public partial class DiscordClient | public partial class DiscordClient | ||||
| { | { | ||||
| public Task SetChannelUserPermissions(Channel channel, User member, ChannelPermissions allow = null, ChannelPermissions deny = null) | |||||
| public Task SetChannelUserPermissions(Channel channel, User user, ChannelPermissions allow = null, ChannelPermissions deny = null) | |||||
| { | { | ||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | if (channel == null) throw new ArgumentNullException(nameof(channel)); | ||||
| if (member == null) throw new ArgumentNullException(nameof(member)); | |||||
| if (user == null) throw new ArgumentNullException(nameof(user)); | |||||
| CheckReady(); | CheckReady(); | ||||
| return SetChannelPermissions(channel, member?.Id, PermissionTarget.User, allow, deny); | |||||
| return SetChannelPermissions(channel, user?.Id, PermissionTarget.User, allow, deny); | |||||
| } | } | ||||
| public Task SetChannelUserPermissions(Channel channel, User user, DualChannelPermissions permissions = null) | public Task SetChannelUserPermissions(Channel channel, User user, DualChannelPermissions permissions = null) | ||||
| { | { | ||||
| @@ -51,8 +51,8 @@ namespace Discord | |||||
| { | { | ||||
| public bool IsSpeaking { get; } | public bool IsSpeaking { get; } | ||||
| internal UserIsSpeakingEventArgs(User member, Channel channel, bool isSpeaking) | |||||
| : base(member, channel) | |||||
| internal UserIsSpeakingEventArgs(User user, Channel channel, bool isSpeaking) | |||||
| : base(user, channel) | |||||
| { | { | ||||
| IsSpeaking = isSpeaking; | IsSpeaking = isSpeaking; | ||||
| } | } | ||||
| @@ -119,7 +119,7 @@ namespace Discord | |||||
| private readonly Users _users; | private readonly Users _users; | ||||
| /// <summary> Returns the user with the specified id, along with their server-specific data, or null if none was found. </summary> | /// <summary> Returns the user with the specified id, along with their server-specific data, or null if none was found. </summary> | ||||
| public User GetMember(Server server, string userId) | |||||
| public User GetUser(Server server, string userId) | |||||
| { | { | ||||
| if (server == null) throw new ArgumentNullException(nameof(server)); | if (server == null) throw new ArgumentNullException(nameof(server)); | ||||
| if (userId == null) throw new ArgumentNullException(nameof(userId)); | if (userId == null) throw new ArgumentNullException(nameof(userId)); | ||||
| @@ -136,13 +136,13 @@ namespace Discord | |||||
| if (discriminator == null) throw new ArgumentNullException(nameof(discriminator)); | if (discriminator == null) throw new ArgumentNullException(nameof(discriminator)); | ||||
| CheckReady(); | CheckReady(); | ||||
| User user = FindMembers(server, username, discriminator, true).FirstOrDefault(); | |||||
| User user = FindUsers(server, username, discriminator, true).FirstOrDefault(); | |||||
| return _users[user?.Id, server.Id]; | return _users[user?.Id, server.Id]; | ||||
| } | } | ||||
| /// <summary> Returns all users in with the specified server and name, along with their server-specific data. </summary> | /// <summary> Returns all users in with the specified server and name, along with their server-specific data. </summary> | ||||
| /// <remarks> Name formats supported: Name and @Name. Search is case-insensitive.</remarks> | /// <remarks> Name formats supported: Name and @Name. Search is case-insensitive.</remarks> | ||||
| public IEnumerable<User> FindMembers(Server server, string name, string discriminator = null, bool exactMatch = false) | |||||
| public IEnumerable<User> FindUsers(Server server, string name, string discriminator = null, bool exactMatch = false) | |||||
| { | { | ||||
| if (server == null) throw new ArgumentNullException(nameof(server)); | if (server == null) throw new ArgumentNullException(nameof(server)); | ||||
| if (name == null) throw new ArgumentNullException(nameof(name)); | if (name == null) throw new ArgumentNullException(nameof(name)); | ||||
| @@ -165,12 +165,12 @@ namespace Discord | |||||
| return query; | return query; | ||||
| } | } | ||||
| public Task EditMember(User member, bool? mute = null, bool? deaf = null, IEnumerable<Role> roles = null) | |||||
| public Task EditUser(User user, bool? mute = null, bool? deaf = null, IEnumerable<Role> roles = null) | |||||
| { | { | ||||
| if (member == null) throw new ArgumentNullException(nameof(member)); | |||||
| if (user == null) throw new ArgumentNullException(nameof(user)); | |||||
| CheckReady(); | CheckReady(); | ||||
| return _api.EditUser(member.Server?.Id, member.Id, mute: mute, deaf: deaf, roles: roles.Select(x => x.Id)); | |||||
| return _api.EditUser(user.Server?.Id, user.Id, mute: mute, deaf: deaf, roles: roles.Select(x => x.Id)); | |||||
| } | } | ||||
| public Task<EditUserResponse> EditProfile(string currentPassword = "", | public Task<EditUserResponse> EditProfile(string currentPassword = "", | ||||
| @@ -177,15 +177,15 @@ namespace Discord | |||||
| { | { | ||||
| if (_voiceSocket.State == WebSocketState.Connected) | if (_voiceSocket.State == WebSocketState.Connected) | ||||
| { | { | ||||
| var member = _users[e.UserId, socket.CurrentServerId]; | |||||
| var user = _users[e.UserId, socket.CurrentServerId]; | |||||
| bool value = e.IsSpeaking; | bool value = e.IsSpeaking; | ||||
| if (member.IsSpeaking != value) | |||||
| if (user.IsSpeaking != value) | |||||
| { | { | ||||
| member.IsSpeaking = value; | |||||
| user.IsSpeaking = value; | |||||
| var channel = _channels[_voiceSocket.CurrentChannelId]; | var channel = _channels[_voiceSocket.CurrentChannelId]; | ||||
| RaiseUserIsSpeaking(member, channel, value); | |||||
| RaiseUserIsSpeaking(user, channel, value); | |||||
| if (Config.TrackActivity) | if (Config.TrackActivity) | ||||
| member.UpdateActivity(); | |||||
| user.UpdateActivity(); | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| @@ -359,9 +359,9 @@ namespace Discord | |||||
| Channel channel; | Channel channel; | ||||
| if (data.IsPrivate) | if (data.IsPrivate) | ||||
| { | { | ||||
| var member = _users.GetOrAdd(data.Recipient.Id, null); | |||||
| member.Update(data.Recipient); | |||||
| channel = _channels.GetOrAdd(data.Id, null, member.Id); | |||||
| var user = _users.GetOrAdd(data.Recipient.Id, null); | |||||
| user.Update(data.Recipient); | |||||
| channel = _channels.GetOrAdd(data.Id, null, user.Id); | |||||
| } | } | ||||
| else | else | ||||
| channel = _channels.GetOrAdd(data.Id, data.GuildId, null); | channel = _channels.GetOrAdd(data.Id, data.GuildId, null); | ||||
| @@ -393,30 +393,30 @@ namespace Discord | |||||
| case "GUILD_MEMBER_ADD": | case "GUILD_MEMBER_ADD": | ||||
| { | { | ||||
| var data = e.Payload.ToObject<MemberAddEvent>(_serializer); | var data = e.Payload.ToObject<MemberAddEvent>(_serializer); | ||||
| var member = _users.GetOrAdd(data.User.Id, data.GuildId); | |||||
| member.Update(data); | |||||
| var user = _users.GetOrAdd(data.User.Id, data.GuildId); | |||||
| user.Update(data); | |||||
| if (Config.TrackActivity) | if (Config.TrackActivity) | ||||
| member.UpdateActivity(); | |||||
| RaiseUserAdded(member); | |||||
| user.UpdateActivity(); | |||||
| RaiseUserAdded(user); | |||||
| } | } | ||||
| break; | break; | ||||
| case "GUILD_MEMBER_UPDATE": | case "GUILD_MEMBER_UPDATE": | ||||
| { | { | ||||
| var data = e.Payload.ToObject<MemberUpdateEvent>(_serializer); | var data = e.Payload.ToObject<MemberUpdateEvent>(_serializer); | ||||
| var member = _users[data.User.Id, data.GuildId]; | |||||
| if (member != null) | |||||
| var user = _users[data.User.Id, data.GuildId]; | |||||
| if (user != null) | |||||
| { | { | ||||
| member.Update(data); | |||||
| RaiseMemberUpdated(member); | |||||
| user.Update(data); | |||||
| RaiseMemberUpdated(user); | |||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| case "GUILD_MEMBER_REMOVE": | case "GUILD_MEMBER_REMOVE": | ||||
| { | { | ||||
| var data = e.Payload.ToObject<MemberRemoveEvent>(_serializer); | var data = e.Payload.ToObject<MemberRemoveEvent>(_serializer); | ||||
| var member = _users.TryRemove(data.UserId, data.GuildId); | |||||
| if (member != null) | |||||
| RaiseUserRemoved(member); | |||||
| var user = _users.TryRemove(data.UserId, data.GuildId); | |||||
| if (user != null) | |||||
| RaiseUserRemoved(user); | |||||
| } | } | ||||
| break; | break; | ||||
| @@ -494,9 +494,9 @@ namespace Discord | |||||
| var channel = msg.Channel; | var channel = msg.Channel; | ||||
| if (channel?.IsPrivate == false) | if (channel?.IsPrivate == false) | ||||
| { | { | ||||
| var member = msg.User; | |||||
| if (member != null) | |||||
| member.UpdateActivity(data.Timestamp); | |||||
| var user = msg.User; | |||||
| if (user != null) | |||||
| user.UpdateActivity(data.Timestamp); | |||||
| } | } | ||||
| } | } | ||||
| @@ -538,11 +538,11 @@ namespace Discord | |||||
| case "PRESENCE_UPDATE": | case "PRESENCE_UPDATE": | ||||
| { | { | ||||
| var data = e.Payload.ToObject<PresenceUpdateEvent>(_serializer); | var data = e.Payload.ToObject<PresenceUpdateEvent>(_serializer); | ||||
| var member = _users.GetOrAdd(data.User.Id, data.GuildId); | |||||
| if (member != null) | |||||
| var user = _users.GetOrAdd(data.User.Id, data.GuildId); | |||||
| if (user != null) | |||||
| { | { | ||||
| member.Update(data); | |||||
| RaiseUserPresenceUpdated(member); | |||||
| user.Update(data); | |||||
| RaiseUserPresenceUpdated(user); | |||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -553,19 +553,18 @@ namespace Discord | |||||
| if (channel != null) | if (channel != null) | ||||
| { | { | ||||
| var user = _users[data.UserId, channel.Server?.Id]; | var user = _users[data.UserId, channel.Server?.Id]; | ||||
| if (user != null) | if (user != null) | ||||
| { | { | ||||
| if (channel != null) | if (channel != null) | ||||
| RaiseUserIsTyping(user, channel); | RaiseUserIsTyping(user, channel); | ||||
| } | } | ||||
| if (Config.TrackActivity) | if (Config.TrackActivity) | ||||
| { | { | ||||
| if (!channel.IsPrivate) | if (!channel.IsPrivate) | ||||
| { | { | ||||
| var member = _users[data.UserId, channel.Server.Id]; | |||||
| if (member != null) | |||||
| member.UpdateActivity(); | |||||
| if (user != null) | |||||
| user.UpdateActivity(); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -576,17 +575,17 @@ namespace Discord | |||||
| case "VOICE_STATE_UPDATE": | case "VOICE_STATE_UPDATE": | ||||
| { | { | ||||
| var data = e.Payload.ToObject<MemberVoiceStateUpdateEvent>(_serializer); | var data = e.Payload.ToObject<MemberVoiceStateUpdateEvent>(_serializer); | ||||
| var member = _users[data.UserId, data.GuildId]; | |||||
| if (member != null) | |||||
| var user = _users[data.UserId, data.GuildId]; | |||||
| if (user != null) | |||||
| { | { | ||||
| var voiceChannel = member.VoiceChannel; | |||||
| if (voiceChannel != null && data.ChannelId != voiceChannel.Id && member.IsSpeaking) | |||||
| var voiceChannel = user.VoiceChannel; | |||||
| if (voiceChannel != null && data.ChannelId != voiceChannel.Id && user.IsSpeaking) | |||||
| { | { | ||||
| member.IsSpeaking = false; | |||||
| RaiseUserIsSpeaking(member, _channels[voiceChannel.Id], false); | |||||
| user.IsSpeaking = false; | |||||
| RaiseUserIsSpeaking(user, _channels[voiceChannel.Id], false); | |||||
| } | } | ||||
| member.Update(data); | |||||
| RaiseUserVoiceStateUpdated(member); | |||||
| user.Update(data); | |||||
| RaiseUserVoiceStateUpdated(user); | |||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -100,10 +100,10 @@ namespace Discord | |||||
| globalChannels.TryRemove(channel.Key); | globalChannels.TryRemove(channel.Key); | ||||
| channels.Clear(); | channels.Clear(); | ||||
| var globalMembers = _client.Users; | |||||
| var globalUsers = _client.Users; | |||||
| var members = _members; | var members = _members; | ||||
| foreach (var user in members) | |||||
| globalMembers.TryRemove(user.Key, Id); | |||||
| foreach (var member in members) | |||||
| globalUsers.TryRemove(member.Key, Id); | |||||
| members.Clear(); | members.Clear(); | ||||
| var globalRoles = _client.Roles; | var globalRoles = _client.Roles; | ||||
| @@ -162,25 +162,24 @@ namespace Discord | |||||
| var channel = channels.GetOrAdd(subModel.Id, Id); | var channel = channels.GetOrAdd(subModel.Id, Id); | ||||
| channel.Update(subModel); | channel.Update(subModel); | ||||
| } | } | ||||
| var usersCache = _client.GlobalUsers; | |||||
| var membersCache = _client.Users; | |||||
| var usersCache = _client.Users; | |||||
| foreach (var subModel in model.Members) | foreach (var subModel in model.Members) | ||||
| { | { | ||||
| var member = membersCache.GetOrAdd(subModel.User.Id, Id); | |||||
| member.Update(subModel); | |||||
| var user = usersCache.GetOrAdd(subModel.User.Id, Id); | |||||
| user.Update(subModel); | |||||
| } | } | ||||
| foreach (var subModel in model.VoiceStates) | foreach (var subModel in model.VoiceStates) | ||||
| { | { | ||||
| var member = membersCache[subModel.UserId, Id]; | |||||
| if (member != null) | |||||
| member.Update(subModel); | |||||
| var user = usersCache[subModel.UserId, Id]; | |||||
| if (user != null) | |||||
| user.Update(subModel); | |||||
| } | } | ||||
| foreach (var subModel in model.Presences) | foreach (var subModel in model.Presences) | ||||
| { | { | ||||
| var member = membersCache[subModel.User.Id, Id]; | |||||
| if (member != null) | |||||
| member.Update(subModel); | |||||
| var user = usersCache[subModel.User.Id, Id]; | |||||
| if (user != null) | |||||
| user.Update(subModel); | |||||
| } | } | ||||
| } | } | ||||
| @@ -216,31 +215,31 @@ namespace Discord | |||||
| internal void AddInvite(Invite invite) => _invites.TryAdd(invite.Id, invite); | internal void AddInvite(Invite invite) => _invites.TryAdd(invite.Id, invite); | ||||
| internal void RemoveInvite(Invite invite) => _invites.TryRemove(invite.Id, out invite); | internal void RemoveInvite(Invite invite) => _invites.TryRemove(invite.Id, out invite); | ||||
| internal void AddMember(User member) | |||||
| internal void AddMember(User user) | |||||
| { | { | ||||
| if (_members.TryAdd(member.Id, member)) | |||||
| if (_members.TryAdd(user.Id, user)) | |||||
| { | { | ||||
| if (member.Id == _ownerId) | |||||
| Owner = member; | |||||
| if (user.Id == _ownerId) | |||||
| Owner = user; | |||||
| foreach (var channel in Channels) | foreach (var channel in Channels) | ||||
| { | { | ||||
| member.AddChannel(channel); | |||||
| channel.InvalidatePermissionsCache(member); | |||||
| user.AddChannel(channel); | |||||
| channel.InvalidatePermissionsCache(user); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| internal void RemoveMember(User member) | |||||
| internal void RemoveMember(User user) | |||||
| { | { | ||||
| if (_members.TryRemove(member.Id, out member)) | |||||
| if (_members.TryRemove(user.Id, out user)) | |||||
| { | { | ||||
| if (member.Id == _ownerId) | |||||
| if (user.Id == _ownerId) | |||||
| Owner = null; | Owner = null; | ||||
| foreach (var channel in Channels) | foreach (var channel in Channels) | ||||
| { | { | ||||
| member.RemoveChannel(channel); | |||||
| channel.InvalidatePermissionsCache(member); | |||||
| user.RemoveChannel(channel); | |||||
| channel.InvalidatePermissionsCache(user); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -299,10 +299,10 @@ namespace Discord | |||||
| newPermissions &= ~denyRole.Deny.RawValue; | newPermissions &= ~denyRole.Deny.RawValue; | ||||
| foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Allow.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) | foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Allow.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) | ||||
| newPermissions |= allowRole.Allow.RawValue; | newPermissions |= allowRole.Allow.RawValue; | ||||
| foreach (var denyMembers in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Deny.RawValue != 0)) | |||||
| newPermissions &= ~denyMembers.Deny.RawValue; | |||||
| foreach (var allowMembers in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Allow.RawValue != 0)) | |||||
| newPermissions |= allowMembers.Allow.RawValue; | |||||
| foreach (var denyUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Deny.RawValue != 0)) | |||||
| newPermissions &= ~denyUser.Deny.RawValue; | |||||
| foreach (var allowUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Allow.RawValue != 0)) | |||||
| newPermissions |= allowUser.Allow.RawValue; | |||||
| } | } | ||||
| if (BitHelper.GetBit(newPermissions, (int)PermissionsBits.ManageRolesOrPermissions)) | if (BitHelper.GetBit(newPermissions, (int)PermissionsBits.ManageRolesOrPermissions)) | ||||