* 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})"; | |||||
| } | |||||
| } | |||||