@@ -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)) | ||||