Browse Source

Added RPC Subscription funcs and Message Events

tags/1.0-rc
RogueException 9 years ago
parent
commit
ab9e70dc67
7 changed files with 95 additions and 27 deletions
  1. +5
    -5
      src/Discord.Net/API/Rpc/MessageEvent.cs
  2. +4
    -7
      src/Discord.Net/Entities/Messages/Message.cs
  3. +6
    -6
      src/Discord.Net/Rpc/DiscordRpcClient.Events.cs
  4. +59
    -3
      src/Discord.Net/Rpc/DiscordRpcClient.cs
  5. +14
    -0
      src/Discord.Net/Rpc/RpcChannelEvent.cs
  6. +0
    -6
      src/Discord.Net/Rpc/RpcEvents.cs
  7. +7
    -0
      src/Discord.Net/Rpc/RpcGuildEvent.cs

+ 5
- 5
src/Discord.Net/API/Rpc/MessageEvent.cs View File

@@ -1,11 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using Newtonsoft.Json;
namespace Discord.API.Rpc namespace Discord.API.Rpc
{ {
public class MessageEvent public class MessageEvent
{ {
[JsonProperty("channel_id")]
public ulong ChannelId { get; set; }
[JsonProperty("message")]
public Message Message { get; set; }
} }
} }

+ 4
- 7
src/Discord.Net/Entities/Messages/Message.cs View File

@@ -40,13 +40,10 @@ namespace Discord
Channel = channel; Channel = channel;
Author = author; Author = author;
Type = model.Type; Type = model.Type;

if (channel is IGuildChannel)
{
MentionedUsers = ImmutableArray.Create<IUser>();
MentionedChannelIds = ImmutableArray.Create<ulong>();
MentionedRoles = ImmutableArray.Create<IRole>();
}
MentionedUsers = ImmutableArray.Create<IUser>();
MentionedChannelIds = ImmutableArray.Create<ulong>();
MentionedRoles = ImmutableArray.Create<IRole>();


Update(model, UpdateSource.Creation); Update(model, UpdateSource.Creation);
} }


+ 6
- 6
src/Discord.Net/Rpc/DiscordRpcClient.Events.cs View File

@@ -42,23 +42,23 @@ namespace Discord.Rpc
private readonly AsyncEvent<Func<Task>> _voiceStateUpdatedEvent = new AsyncEvent<Func<Task>>(); private readonly AsyncEvent<Func<Task>> _voiceStateUpdatedEvent = new AsyncEvent<Func<Task>>();


//Messages //Messages
public event Func<Task> MessageReceived
public event Func<ulong, IMessage, Task> MessageReceived
{ {
add { _messageReceivedEvent.Add(value); } add { _messageReceivedEvent.Add(value); }
remove { _messageReceivedEvent.Remove(value); } remove { _messageReceivedEvent.Remove(value); }
} }
private readonly AsyncEvent<Func<Task>> _messageReceivedEvent = new AsyncEvent<Func<Task>>();
public event Func<Task> MessageUpdated
private readonly AsyncEvent<Func<ulong, IMessage, Task>> _messageReceivedEvent = new AsyncEvent<Func<ulong, IMessage, Task>>();
public event Func<ulong, IMessage, Task> MessageUpdated
{ {
add { _messageUpdatedEvent.Add(value); } add { _messageUpdatedEvent.Add(value); }
remove { _messageUpdatedEvent.Remove(value); } remove { _messageUpdatedEvent.Remove(value); }
} }
private readonly AsyncEvent<Func<Task>> _messageUpdatedEvent = new AsyncEvent<Func<Task>>();
public event Func<Task> MessageDeleted
private readonly AsyncEvent<Func<ulong, IMessage, Task>> _messageUpdatedEvent = new AsyncEvent<Func<ulong, IMessage, Task>>();
public event Func<ulong, ulong, Task> MessageDeleted
{ {
add { _messageDeletedEvent.Add(value); } add { _messageDeletedEvent.Add(value); }
remove { _messageDeletedEvent.Remove(value); } remove { _messageDeletedEvent.Remove(value); }
} }
private readonly AsyncEvent<Func<Task>> _messageDeletedEvent = new AsyncEvent<Func<Task>>();
private readonly AsyncEvent<Func<ulong, ulong, Task>> _messageDeletedEvent = new AsyncEvent<Func<ulong, ulong, Task>>();
} }
} }

+ 59
- 3
src/Discord.Net/Rpc/DiscordRpcClient.cs View File

@@ -213,6 +213,57 @@ namespace Discord.Rpc
return result.Code; 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<string> evnt, Optional<object> payload) private async Task ProcessMessageAsync(string cmd, Optional<string> evnt, Optional<object> payload)
{ {
try try
@@ -291,17 +342,22 @@ namespace Discord.Rpc
//Messages //Messages
case "MESSAGE_CREATE": case "MESSAGE_CREATE":
{ {
await _messageReceivedEvent.InvokeAsync().ConfigureAwait(false);
var data = (payload.Value as JToken).ToObject<MessageEvent>(_serializer);
var msg = new Message(null, new User(data.Message.Author.Value), data.Message);
await _messageReceivedEvent.InvokeAsync(data.ChannelId, msg).ConfigureAwait(false);
} }
break; break;
case "MESSAGE_UPDATE": case "MESSAGE_UPDATE":
{ {
await _messageUpdatedEvent.InvokeAsync().ConfigureAwait(false);
var data = (payload.Value as JToken).ToObject<MessageEvent>(_serializer);
var msg = new Message(null, new User(data.Message.Author.Value), data.Message);
await _messageUpdatedEvent.InvokeAsync(data.ChannelId, msg).ConfigureAwait(false);
} }
break; break;
case "MESSAGE_DELETE": case "MESSAGE_DELETE":
{ {
await _messageDeletedEvent.InvokeAsync().ConfigureAwait(false);
var data = (payload.Value as JToken).ToObject<MessageEvent>(_serializer);
await _messageDeletedEvent.InvokeAsync(data.ChannelId, data.Message.Id).ConfigureAwait(false);
} }
break; break;




+ 14
- 0
src/Discord.Net/Rpc/RpcChannelEvent.cs View File

@@ -0,0 +1,14 @@
namespace Discord.Rpc
{
public enum RpcChannelEvent
{
VoiceStateCreate,
VoiceStateUpdate,
VoiceStateDelete,
SpeakingStart,
SpeakingStop,
MessageCreate,
MessageUpdate,
MessageDelete
}
}

+ 0
- 6
src/Discord.Net/Rpc/RpcEvents.cs View File

@@ -1,6 +0,0 @@
namespace Discord.Rpc
{
public enum RpcEvent
{
}
}

+ 7
- 0
src/Discord.Net/Rpc/RpcGuildEvent.cs View File

@@ -0,0 +1,7 @@
namespace Discord.Rpc
{
public enum RpcGuildEvent
{
GuildStatus
}
}

Loading…
Cancel
Save