From 6b547449b86c59fef783f66e94b6a755b617fb29 Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Fri, 21 Aug 2015 21:48:12 -0300 Subject: [PATCH] Added better voice state parsing --- src/Discord.Net/DiscordClient.Events.cs | 6 ++-- src/Discord.Net/DiscordClient.cs | 40 ++++++++++++++++++++----- src/Discord.Net/Membership.cs | 32 ++++++++++++++++++-- src/Discord.Net/Server.cs | 4 +-- 4 files changed, 66 insertions(+), 16 deletions(-) diff --git a/src/Discord.Net/DiscordClient.Events.cs b/src/Discord.Net/DiscordClient.Events.cs index 1428afa3c..c3bf1841a 100644 --- a/src/Discord.Net/DiscordClient.Events.cs +++ b/src/Discord.Net/DiscordClient.Events.cs @@ -223,11 +223,11 @@ namespace Discord if (PresenceUpdated != null) PresenceUpdated(this, new UserEventArgs(user)); } - public event EventHandler VoiceStateUpdated; - private void RaiseVoiceStateUpdated(User user) + public event EventHandler VoiceStateUpdated; + private void RaiseVoiceStateUpdated(Membership member) { if (VoiceStateUpdated != null) - VoiceStateUpdated(this, new UserEventArgs(user)); + VoiceStateUpdated(this, new MemberEventArgs(member)); } public event EventHandler UserTyping; private void RaiseUserTyping(User user, Channel channel) diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index a3bd7626e..d314370b6 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -113,7 +113,9 @@ namespace Discord foreach (var membership in extendedModel.Members) { _users.Update(membership.User.Id, membership.User); - server.AddMember(new Membership(server.Id, membership.User.Id, membership.JoinedAt, this) { RoleIds = membership.Roles, IsMuted = membership.IsMuted, IsDeafened = membership.IsDeaf }); + var newMember = new Membership(server.Id, membership.User.Id, membership.JoinedAt, this); + newMember.Update(membership); + server.AddMember(newMember); } } }, @@ -320,7 +322,7 @@ namespace Discord var data = e.Event.ToObject(); var user = _users.Update(data.User.Id, data.User); var server = _servers[data.GuildId]; - var membership = server.GetMembership(data.User.Id); + var membership = server.GetMember(data.User.Id); if (membership != null) membership.RoleIds = data.Roles; RaiseMemberUpdated(membership, server); @@ -426,8 +428,12 @@ namespace Discord case "VOICE_STATE_UPDATE": { var data = e.Event.ToObject(); - var user = _users[data.UserId]; //TODO: Don't ignore this - RaiseVoiceStateUpdated(user); + var member = GetMember(data.GuildId, data.UserId); + if (member != null) + { + member.Update(data); + RaiseVoiceStateUpdated(member); + } } break; case "TYPING_START": @@ -504,13 +510,31 @@ namespace Discord string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); } } + + /// Returns the user with the specified id, along with their server-specific data, or null if none was found. + public Membership GetMember(string serverId, User user) + => GetMember(_servers[serverId], user.Id); + /// Returns the user with the specified id, along with their server-specific data, or null if none was found. + public Membership GetMember(string serverId, string userId) + => GetMember(_servers[serverId], userId); + /// Returns the user with the specified id, along with their server-specific data, or null if none was found. + public Membership GetMember(Server server, User user) + => GetMember(server, user.Id); + /// Returns the user with the specified id, along with their server-specific data, or null if none was found. + public Membership GetMember(Server server, string userId) + { + if (server == null) + return null; + return server.GetMember(userId); + } + /// Returns all users in with the specified server and name, along with their server-specific data. - /// Name formats supported: Name and @Name. Search is case-insensitive. - public IEnumerable FindUsers(string serverId, string name) - => FindUsers(GetServer(serverId), name); + /// Name formats supported: Name and @Name. Search is case-insensitive. + public IEnumerable FindMembers(string serverId, string name) + => FindMembers(GetServer(serverId), name); /// Returns all users in with the specified server and name, along with their server-specific data. /// Name formats supported: Name and @Name. Search is case-insensitive. - public IEnumerable FindUsers(Server server, string name) + public IEnumerable FindMembers(Server server, string name) { if (server == null) return new Membership[0]; diff --git a/src/Discord.Net/Membership.cs b/src/Discord.Net/Membership.cs index 6aad34c12..64f95f9ed 100644 --- a/src/Discord.Net/Membership.cs +++ b/src/Discord.Net/Membership.cs @@ -1,4 +1,5 @@ -using System; +using Discord.API.Models; +using System; using System.Collections.Generic; using System.Linq; @@ -8,17 +9,25 @@ namespace Discord { private readonly DiscordClient _client; - public DateTime JoinedAt; + public DateTime JoinedAt { get; internal set; } public bool IsMuted { get; internal set; } public bool IsDeafened { get; internal set; } + public bool IsSelfMuted { get; internal set; } + public bool IsSelfDeafened { get; internal set; } + public bool IsSuppressed { get; internal set; } + + public string SessionId { get; internal set; } public string ServerId { get; } public Server Server => _client.GetServer(ServerId); public string UserId { get; } public User User => _client.GetUser(UserId); - + + public string VoiceChannelId { get; internal set; } + public Channel VoiceChannel => _client.GetChannel(VoiceChannelId); + public string[] RoleIds { get; internal set; } public IEnumerable Roles => RoleIds.Select(x => _client.GetRole(x)); @@ -29,5 +38,22 @@ namespace Discord JoinedAt = joinedAt; _client = client; } + + internal void Update(ExtendedServerInfo.Membership data) + { + IsDeafened = data.IsDeaf; + IsMuted = data.IsMuted; + RoleIds = data.Roles; + } + internal void Update(WebSocketEvents.VoiceStateUpdate data) + { + VoiceChannelId = data.ChannelId; + IsDeafened = data.IsDeafened; + IsMuted = data.IsMuted; + IsSelfDeafened = data.IsSelfDeafened; + IsSelfMuted = data.IsSelfMuted; + IsSuppressed = data.IsSuppressed; + SessionId = data.SessionId; + } } } diff --git a/src/Discord.Net/Server.cs b/src/Discord.Net/Server.cs index 6a51fa3a0..7031bf9e4 100644 --- a/src/Discord.Net/Server.cs +++ b/src/Discord.Net/Server.cs @@ -80,8 +80,8 @@ namespace Discord return result; } public Membership GetMembership(User user) - => GetMembership(user.Id); - public Membership GetMembership(string userId) + => GetMember(user.Id); + public Membership GetMember(string userId) { Membership result = null; _members.TryGetValue(userId, out result);