| @@ -7,13 +7,13 @@ namespace Discord | |||
| { | |||
| 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 (member == null) throw new ArgumentNullException(nameof(member)); | |||
| if (user == null) throw new ArgumentNullException(nameof(user)); | |||
| 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) | |||
| { | |||
| @@ -51,8 +51,8 @@ namespace Discord | |||
| { | |||
| 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; | |||
| } | |||
| @@ -119,7 +119,7 @@ namespace Discord | |||
| 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> | |||
| public User GetMember(Server server, string userId) | |||
| public User GetUser(Server server, string userId) | |||
| { | |||
| if (server == null) throw new ArgumentNullException(nameof(server)); | |||
| if (userId == null) throw new ArgumentNullException(nameof(userId)); | |||
| @@ -136,13 +136,13 @@ namespace Discord | |||
| if (discriminator == null) throw new ArgumentNullException(nameof(discriminator)); | |||
| CheckReady(); | |||
| User user = FindMembers(server, username, discriminator, true).FirstOrDefault(); | |||
| User user = FindUsers(server, username, discriminator, true).FirstOrDefault(); | |||
| return _users[user?.Id, server.Id]; | |||
| } | |||
| /// <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> | |||
| 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 (name == null) throw new ArgumentNullException(nameof(name)); | |||
| @@ -165,12 +165,12 @@ namespace Discord | |||
| 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(); | |||
| 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 = "", | |||
| @@ -177,15 +177,15 @@ namespace Discord | |||
| { | |||
| if (_voiceSocket.State == WebSocketState.Connected) | |||
| { | |||
| var member = _users[e.UserId, socket.CurrentServerId]; | |||
| var user = _users[e.UserId, socket.CurrentServerId]; | |||
| bool value = e.IsSpeaking; | |||
| if (member.IsSpeaking != value) | |||
| if (user.IsSpeaking != value) | |||
| { | |||
| member.IsSpeaking = value; | |||
| user.IsSpeaking = value; | |||
| var channel = _channels[_voiceSocket.CurrentChannelId]; | |||
| RaiseUserIsSpeaking(member, channel, value); | |||
| RaiseUserIsSpeaking(user, channel, value); | |||
| if (Config.TrackActivity) | |||
| member.UpdateActivity(); | |||
| user.UpdateActivity(); | |||
| } | |||
| } | |||
| }; | |||
| @@ -359,9 +359,9 @@ namespace Discord | |||
| Channel channel; | |||
| 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 | |||
| channel = _channels.GetOrAdd(data.Id, data.GuildId, null); | |||
| @@ -393,30 +393,30 @@ namespace Discord | |||
| case "GUILD_MEMBER_ADD": | |||
| { | |||
| 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) | |||
| member.UpdateActivity(); | |||
| RaiseUserAdded(member); | |||
| user.UpdateActivity(); | |||
| RaiseUserAdded(user); | |||
| } | |||
| break; | |||
| case "GUILD_MEMBER_UPDATE": | |||
| { | |||
| 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; | |||
| case "GUILD_MEMBER_REMOVE": | |||
| { | |||
| 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; | |||
| @@ -494,9 +494,9 @@ namespace Discord | |||
| var channel = msg.Channel; | |||
| 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": | |||
| { | |||
| 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; | |||
| @@ -553,19 +553,18 @@ namespace Discord | |||
| if (channel != null) | |||
| { | |||
| var user = _users[data.UserId, channel.Server?.Id]; | |||
| if (user != null) | |||
| { | |||
| if (channel != null) | |||
| RaiseUserIsTyping(user, channel); | |||
| } | |||
| if (Config.TrackActivity) | |||
| { | |||
| 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": | |||
| { | |||
| 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; | |||
| @@ -100,10 +100,10 @@ namespace Discord | |||
| globalChannels.TryRemove(channel.Key); | |||
| channels.Clear(); | |||
| var globalMembers = _client.Users; | |||
| var globalUsers = _client.Users; | |||
| 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(); | |||
| var globalRoles = _client.Roles; | |||
| @@ -162,25 +162,24 @@ namespace Discord | |||
| var channel = channels.GetOrAdd(subModel.Id, Id); | |||
| channel.Update(subModel); | |||
| } | |||
| var usersCache = _client.GlobalUsers; | |||
| var membersCache = _client.Users; | |||
| var usersCache = _client.Users; | |||
| 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) | |||
| { | |||
| 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) | |||
| { | |||
| 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 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) | |||
| { | |||
| 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; | |||
| 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; | |||
| 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; | |||
| 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)) | |||