* Expose VoiceServerUpdate events * Amend based on feedback * Move this out of guild entity * Fix namespace issue * Adjust based on feedback #2 * Use cacheable instead * Change based on feedbacktags/2.0
@@ -1,4 +1,4 @@ | |||||
using System; | |||||
using System; | |||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
namespace Discord.WebSocket | namespace Discord.WebSocket | ||||
@@ -165,6 +165,13 @@ namespace Discord.WebSocket | |||||
remove { _userVoiceStateUpdatedEvent.Remove(value); } | remove { _userVoiceStateUpdatedEvent.Remove(value); } | ||||
} | } | ||||
internal readonly AsyncEvent<Func<SocketUser, SocketVoiceState, SocketVoiceState, Task>> _userVoiceStateUpdatedEvent = new AsyncEvent<Func<SocketUser, SocketVoiceState, SocketVoiceState, Task>>(); | internal readonly AsyncEvent<Func<SocketUser, SocketVoiceState, SocketVoiceState, Task>> _userVoiceStateUpdatedEvent = new AsyncEvent<Func<SocketUser, SocketVoiceState, SocketVoiceState, Task>>(); | ||||
/// <summary> Fired when the bot connects to a Discord voice server. </summary> | |||||
public event Func<SocketVoiceServer, Task> VoiceServerUpdated | |||||
{ | |||||
add { _voiceServerUpdatedEvent.Add(value); } | |||||
remove { _voiceServerUpdatedEvent.Remove(value); } | |||||
} | |||||
internal readonly AsyncEvent<Func<SocketVoiceServer, Task>> _voiceServerUpdatedEvent = new AsyncEvent<Func<SocketVoiceServer, Task>>(); | |||||
/// <summary> Fired when the connected account is updated. </summary> | /// <summary> Fired when the connected account is updated. </summary> | ||||
public event Func<SocketSelfUser, SocketSelfUser, Task> CurrentUserUpdated { | public event Func<SocketSelfUser, SocketSelfUser, Task> CurrentUserUpdated { | ||||
add { _selfUpdatedEvent.Add(value); } | add { _selfUpdatedEvent.Add(value); } | ||||
@@ -1466,6 +1466,12 @@ namespace Discord.WebSocket | |||||
var data = (payload as JToken).ToObject<VoiceServerUpdateEvent>(_serializer); | var data = (payload as JToken).ToObject<VoiceServerUpdateEvent>(_serializer); | ||||
var guild = State.GetGuild(data.GuildId); | var guild = State.GetGuild(data.GuildId); | ||||
var cacheable = new Cacheable<IGuild, ulong>(guild, data.GuildId, guild != null, | |||||
async () => await ApiClient.GetGuildAsync(data.GuildId).ConfigureAwait(false) as IGuild); | |||||
var voiceServer = new SocketVoiceServer(cacheable, data.GuildId, data.Endpoint, data.Token); | |||||
await TimedInvokeAsync(_voiceServerUpdatedEvent, nameof(UserVoiceStateUpdated), voiceServer).ConfigureAwait(false); | |||||
if (guild != null) | if (guild != null) | ||||
{ | { | ||||
string endpoint = data.Endpoint.Substring(0, data.Endpoint.LastIndexOf(':')); | string endpoint = data.Endpoint.Substring(0, data.Endpoint.LastIndexOf(':')); | ||||
@@ -1476,6 +1482,7 @@ namespace Discord.WebSocket | |||||
await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); | await UnknownGuildAsync(type, data.GuildId).ConfigureAwait(false); | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
break; | break; | ||||
@@ -0,0 +1,21 @@ | |||||
using System.Diagnostics; | |||||
namespace Discord.WebSocket | |||||
{ | |||||
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] | |||||
public class SocketVoiceServer | |||||
{ | |||||
public Cacheable<IGuild, ulong> Guild { get; private set; } | |||||
public string Endpoint { get; private set; } | |||||
public string Token { get; private set; } | |||||
internal SocketVoiceServer(Cacheable<IGuild, ulong> guild, ulong guildId, string endpoint, string token) | |||||
{ | |||||
Guild = guild; | |||||
Endpoint = endpoint; | |||||
Token = token; | |||||
} | |||||
private string DebuggerDisplay => $"SocketVoiceServer ({Guild.Id})"; | |||||
} | |||||
} |