diff --git a/src/Discord.Net/API/Rpc/MessageEvent.cs b/src/Discord.Net/API/Rpc/MessageEvent.cs index 4aaa87f33..337fec910 100644 --- a/src/Discord.Net/API/Rpc/MessageEvent.cs +++ b/src/Discord.Net/API/Rpc/MessageEvent.cs @@ -1,11 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - +using Newtonsoft.Json; namespace Discord.API.Rpc { public class MessageEvent { + [JsonProperty("channel_id")] + public ulong ChannelId { get; set; } + [JsonProperty("message")] + public Message Message { get; set; } } } diff --git a/src/Discord.Net/Entities/Messages/Message.cs b/src/Discord.Net/Entities/Messages/Message.cs index a4ff34733..aaf81aad2 100644 --- a/src/Discord.Net/Entities/Messages/Message.cs +++ b/src/Discord.Net/Entities/Messages/Message.cs @@ -40,13 +40,10 @@ namespace Discord Channel = channel; Author = author; Type = model.Type; - - if (channel is IGuildChannel) - { - MentionedUsers = ImmutableArray.Create(); - MentionedChannelIds = ImmutableArray.Create(); - MentionedRoles = ImmutableArray.Create(); - } + + MentionedUsers = ImmutableArray.Create(); + MentionedChannelIds = ImmutableArray.Create(); + MentionedRoles = ImmutableArray.Create(); Update(model, UpdateSource.Creation); } diff --git a/src/Discord.Net/Rpc/DiscordRpcClient.Events.cs b/src/Discord.Net/Rpc/DiscordRpcClient.Events.cs index f614642af..25989d01a 100644 --- a/src/Discord.Net/Rpc/DiscordRpcClient.Events.cs +++ b/src/Discord.Net/Rpc/DiscordRpcClient.Events.cs @@ -42,23 +42,23 @@ namespace Discord.Rpc private readonly AsyncEvent> _voiceStateUpdatedEvent = new AsyncEvent>(); //Messages - public event Func MessageReceived + public event Func MessageReceived { add { _messageReceivedEvent.Add(value); } remove { _messageReceivedEvent.Remove(value); } } - private readonly AsyncEvent> _messageReceivedEvent = new AsyncEvent>(); - public event Func MessageUpdated + private readonly AsyncEvent> _messageReceivedEvent = new AsyncEvent>(); + public event Func MessageUpdated { add { _messageUpdatedEvent.Add(value); } remove { _messageUpdatedEvent.Remove(value); } } - private readonly AsyncEvent> _messageUpdatedEvent = new AsyncEvent>(); - public event Func MessageDeleted + private readonly AsyncEvent> _messageUpdatedEvent = new AsyncEvent>(); + public event Func MessageDeleted { add { _messageDeletedEvent.Add(value); } remove { _messageDeletedEvent.Remove(value); } } - private readonly AsyncEvent> _messageDeletedEvent = new AsyncEvent>(); + private readonly AsyncEvent> _messageDeletedEvent = new AsyncEvent>(); } } diff --git a/src/Discord.Net/Rpc/DiscordRpcClient.cs b/src/Discord.Net/Rpc/DiscordRpcClient.cs index 3916f4696..c4bb1c38b 100644 --- a/src/Discord.Net/Rpc/DiscordRpcClient.cs +++ b/src/Discord.Net/Rpc/DiscordRpcClient.cs @@ -213,6 +213,57 @@ namespace Discord.Rpc return result.Code; } + public async Task SubscribeGuild(ulong guildId, params RpcChannelEvent[] events) + { + Preconditions.AtLeast(events?.Length ?? 0, 1, nameof(events)); + for (int i = 0; i < events.Length; i++) + await ApiClient.SendGuildSubscribeAsync(GetEventName(events[i]), guildId); + } + public async Task UnsubscribeGuild(ulong guildId, params RpcChannelEvent[] events) + { + Preconditions.AtLeast(events?.Length ?? 0, 1, nameof(events)); + for (int i = 0; i < events.Length; i++) + await ApiClient.SendGuildUnsubscribeAsync(GetEventName(events[i]), guildId); + } + public async Task SubscribeChannel(ulong channelId, params RpcChannelEvent[] events) + { + Preconditions.AtLeast(events?.Length ?? 0, 1, nameof(events)); + for (int i = 0; i < events.Length; i++) + await ApiClient.SendChannelSubscribeAsync(GetEventName(events[i]), channelId); + } + public async Task UnsubscribeChannel(ulong channelId, params RpcChannelEvent[] events) + { + Preconditions.AtLeast(events?.Length ?? 0, 1, nameof(events)); + for (int i = 0; i < events.Length; i++) + await ApiClient.SendChannelUnsubscribeAsync(GetEventName(events[i]), channelId); + } + + private static string GetEventName(RpcGuildEvent rpcEvent) + { + switch (rpcEvent) + { + case RpcGuildEvent.GuildStatus: return "GUILD_STATUS"; + default: + throw new InvalidOperationException($"Unknown RPC Guild Event: {rpcEvent}"); + } + } + private static string GetEventName(RpcChannelEvent rpcEvent) + { + switch (rpcEvent) + { + case RpcChannelEvent.VoiceStateCreate: return "VOICE_STATE_CREATE"; + case RpcChannelEvent.VoiceStateUpdate: return "VOICE_STATE_UPDATE"; + case RpcChannelEvent.VoiceStateDelete: return "VOICE_STATE_DELETE"; + case RpcChannelEvent.SpeakingStart: return "SPEAKING_START"; + case RpcChannelEvent.SpeakingStop: return "SPEAKING_STOP"; + case RpcChannelEvent.MessageCreate: return "MESSAGE_CREATE"; + case RpcChannelEvent.MessageUpdate: return "MESSAGE_UPDATE"; + case RpcChannelEvent.MessageDelete: return "MESSAGE_DELETE"; + default: + throw new InvalidOperationException($"Unknown RPC Channel Event: {rpcEvent}"); + } + } + private async Task ProcessMessageAsync(string cmd, Optional evnt, Optional payload) { try @@ -291,17 +342,22 @@ namespace Discord.Rpc //Messages case "MESSAGE_CREATE": { - await _messageReceivedEvent.InvokeAsync().ConfigureAwait(false); + var data = (payload.Value as JToken).ToObject(_serializer); + var msg = new Message(null, new User(data.Message.Author.Value), data.Message); + await _messageReceivedEvent.InvokeAsync(data.ChannelId, msg).ConfigureAwait(false); } break; case "MESSAGE_UPDATE": { - await _messageUpdatedEvent.InvokeAsync().ConfigureAwait(false); + var data = (payload.Value as JToken).ToObject(_serializer); + var msg = new Message(null, new User(data.Message.Author.Value), data.Message); + await _messageUpdatedEvent.InvokeAsync(data.ChannelId, msg).ConfigureAwait(false); } break; case "MESSAGE_DELETE": { - await _messageDeletedEvent.InvokeAsync().ConfigureAwait(false); + var data = (payload.Value as JToken).ToObject(_serializer); + await _messageDeletedEvent.InvokeAsync(data.ChannelId, data.Message.Id).ConfigureAwait(false); } break; diff --git a/src/Discord.Net/Rpc/RpcChannelEvent.cs b/src/Discord.Net/Rpc/RpcChannelEvent.cs new file mode 100644 index 000000000..2916dc88d --- /dev/null +++ b/src/Discord.Net/Rpc/RpcChannelEvent.cs @@ -0,0 +1,14 @@ +namespace Discord.Rpc +{ + public enum RpcChannelEvent + { + VoiceStateCreate, + VoiceStateUpdate, + VoiceStateDelete, + SpeakingStart, + SpeakingStop, + MessageCreate, + MessageUpdate, + MessageDelete + } +} diff --git a/src/Discord.Net/Rpc/RpcEvents.cs b/src/Discord.Net/Rpc/RpcEvents.cs deleted file mode 100644 index 6d2e85e8f..000000000 --- a/src/Discord.Net/Rpc/RpcEvents.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Discord.Rpc -{ - public enum RpcEvent - { - } -} diff --git a/src/Discord.Net/Rpc/RpcGuildEvent.cs b/src/Discord.Net/Rpc/RpcGuildEvent.cs new file mode 100644 index 000000000..34e5dc390 --- /dev/null +++ b/src/Discord.Net/Rpc/RpcGuildEvent.cs @@ -0,0 +1,7 @@ +namespace Discord.Rpc +{ + public enum RpcGuildEvent + { + GuildStatus + } +}