Browse Source

Added better voice state parsing

tags/docs-0.9
Brandon Smith 9 years ago
parent
commit
6b547449b8
4 changed files with 66 additions and 16 deletions
  1. +3
    -3
      src/Discord.Net/DiscordClient.Events.cs
  2. +32
    -8
      src/Discord.Net/DiscordClient.cs
  3. +29
    -3
      src/Discord.Net/Membership.cs
  4. +2
    -2
      src/Discord.Net/Server.cs

+ 3
- 3
src/Discord.Net/DiscordClient.Events.cs View File

@@ -223,11 +223,11 @@ namespace Discord
if (PresenceUpdated != null)
PresenceUpdated(this, new UserEventArgs(user));
}
public event EventHandler<UserEventArgs> VoiceStateUpdated;
private void RaiseVoiceStateUpdated(User user)
public event EventHandler<MemberEventArgs> VoiceStateUpdated;
private void RaiseVoiceStateUpdated(Membership member)
{
if (VoiceStateUpdated != null)
VoiceStateUpdated(this, new UserEventArgs(user));
VoiceStateUpdated(this, new MemberEventArgs(member));
}
public event EventHandler<UserTypingEventArgs> UserTyping;
private void RaiseUserTyping(User user, Channel channel)


+ 32
- 8
src/Discord.Net/DiscordClient.cs View File

@@ -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<WebSocketEvents.GuildMemberUpdate>();
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<WebSocketEvents.VoiceStateUpdate>();
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));
}
}

/// <summary> Returns the user with the specified id, along with their server-specific data, or null if none was found. </summary>
public Membership GetMember(string serverId, User user)
=> GetMember(_servers[serverId], user.Id);
/// <summary> Returns the user with the specified id, along with their server-specific data, or null if none was found. </summary>
public Membership GetMember(string serverId, string userId)
=> GetMember(_servers[serverId], userId);
/// <summary> Returns the user with the specified id, along with their server-specific data, or null if none was found. </summary>
public Membership GetMember(Server server, User user)
=> GetMember(server, user.Id);
/// <summary> Returns the user with the specified id, along with their server-specific data, or null if none was found. </summary>
public Membership GetMember(Server server, string userId)
{
if (server == null)
return null;
return server.GetMember(userId);
}

/// <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<Membership> FindUsers(string serverId, string name)
=> FindUsers(GetServer(serverId), name);
/// <remarks> Name formats supported: Name and @Name. Search is case-insensitive.</remarks>
public IEnumerable<Membership> FindMembers(string serverId, string name)
=> FindMembers(GetServer(serverId), name);
/// <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<Membership> FindUsers(Server server, string name)
public IEnumerable<Membership> FindMembers(Server server, string name)
{
if (server == null)
return new Membership[0];


+ 29
- 3
src/Discord.Net/Membership.cs View File

@@ -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<Role> 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;
}
}
}

+ 2
- 2
src/Discord.Net/Server.cs View File

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


Loading…
Cancel
Save