@@ -11,14 +11,14 @@ namespace Discord.API | |||||
public bool IsPrivate { get; set; } | public bool IsPrivate { get; set; } | ||||
[JsonProperty("last_message_id")] | [JsonProperty("last_message_id")] | ||||
public ulong? LastMessageId { get; set; } | public ulong? LastMessageId { get; set; } | ||||
[JsonProperty("type")] | |||||
public ChannelType Type { get; set; } | |||||
//GuildChannel | //GuildChannel | ||||
[JsonProperty("guild_id")] | [JsonProperty("guild_id")] | ||||
public Optional<ulong> GuildId { get; set; } | public Optional<ulong> GuildId { get; set; } | ||||
[JsonProperty("name")] | [JsonProperty("name")] | ||||
public Optional<string> Name { get; set; } | public Optional<string> Name { get; set; } | ||||
[JsonProperty("type")] | |||||
public Optional<ChannelType> Type { get; set; } | |||||
[JsonProperty("position")] | [JsonProperty("position")] | ||||
public Optional<int> Position { get; set; } | public Optional<int> Position { get; set; } | ||||
[JsonProperty("permission_overwrites")] | [JsonProperty("permission_overwrites")] | ||||
@@ -34,8 +34,9 @@ namespace Discord.API | |||||
[JsonProperty("user_limit")] | [JsonProperty("user_limit")] | ||||
public Optional<int> UserLimit { get; set; } | public Optional<int> UserLimit { get; set; } | ||||
//DMChannel | |||||
[JsonProperty("recipient")] | |||||
public Optional<User> Recipient { get; set; } | |||||
//DMChannel or GroupChannel | |||||
[JsonProperty("recipients")] | |||||
public Optional<User[]> Recipients { get; set; } | |||||
} | } | ||||
} | } |
@@ -9,6 +9,8 @@ namespace Discord.API | |||||
public ulong Id { get; set; } | public ulong Id { get; set; } | ||||
[JsonProperty("channel_id")] | [JsonProperty("channel_id")] | ||||
public ulong ChannelId { get; set; } | public ulong ChannelId { get; set; } | ||||
[JsonProperty("type")] | |||||
public MessageType Type { get; set; } | |||||
[JsonProperty("author")] | [JsonProperty("author")] | ||||
public Optional<User> Author { get; set; } | public Optional<User> Author { get; set; } | ||||
[JsonProperty("content")] | [JsonProperty("content")] | ||||
@@ -4,6 +4,7 @@ | |||||
{ | { | ||||
Friend = 1, | Friend = 1, | ||||
Blocked = 2, | Blocked = 2, | ||||
Pending = 4 | |||||
Incoming = 3, | |||||
Outgoing = 3 | |||||
} | } | ||||
} | } |
@@ -166,7 +166,11 @@ namespace Discord | |||||
} | } | ||||
} | } | ||||
else | else | ||||
return new DMChannel(this, new User(model.Recipient.Value), model); | |||||
{ | |||||
if (model.Type == ChannelType.DM) | |||||
return new DMChannel(this, new User(model.Recipients.Value[0]), model); | |||||
throw new NotImplementedException("Groups are not implemented."); | |||||
} | |||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
@@ -174,7 +178,7 @@ namespace Discord | |||||
public virtual async Task<IReadOnlyCollection<IDMChannel>> GetDMChannelsAsync() | public virtual async Task<IReadOnlyCollection<IDMChannel>> GetDMChannelsAsync() | ||||
{ | { | ||||
var models = await ApiClient.GetMyDMsAsync().ConfigureAwait(false); | var models = await ApiClient.GetMyDMsAsync().ConfigureAwait(false); | ||||
return models.Select(x => new DMChannel(this, new User(x.Recipient.Value), x)).ToImmutableArray(); | |||||
return models.Where(m => m.Type == ChannelType.DM).Select(x => new DMChannel(this, new User(x.Recipients.Value[0]), x)).ToImmutableArray(); | |||||
} | } | ||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
@@ -8,10 +8,10 @@ namespace Discord | |||||
public static string Version { get; } = typeof(DiscordConfig).GetTypeInfo().Assembly?.GetName().Version.ToString(3) ?? "Unknown"; | public static string Version { get; } = typeof(DiscordConfig).GetTypeInfo().Assembly?.GetName().Version.ToString(3) ?? "Unknown"; | ||||
public static string UserAgent { get; } = $"DiscordBot (https://github.com/RogueException/Discord.Net, v{Version})"; | public static string UserAgent { get; } = $"DiscordBot (https://github.com/RogueException/Discord.Net, v{Version})"; | ||||
public const int GatewayAPIVersion = 5; | |||||
public const int GatewayAPIVersion = 6; | |||||
public const string GatewayEncoding = "json"; | public const string GatewayEncoding = "json"; | ||||
public const string ClientAPIUrl = "https://discordapp.com/api/"; | |||||
public const string ClientAPIUrl = "https://discordapp.com/api/v6/"; | |||||
public const string CDNUrl = "https://cdn.discordapp.com/"; | public const string CDNUrl = "https://cdn.discordapp.com/"; | ||||
public const string InviteUrl = "https://discord.gg/"; | public const string InviteUrl = "https://discord.gg/"; | ||||
@@ -335,7 +335,7 @@ namespace Discord | |||||
} | } | ||||
internal CachedDMChannel AddDMChannel(API.Channel model, DataStore dataStore) | internal CachedDMChannel AddDMChannel(API.Channel model, DataStore dataStore) | ||||
{ | { | ||||
var recipient = GetOrAddUser(model.Recipient.Value, dataStore); | |||||
var recipient = GetOrAddUser(model.Recipients.Value[0], dataStore); | |||||
var channel = new CachedDMChannel(this, new CachedDMUser(recipient), model); | var channel = new CachedDMChannel(this, new CachedDMUser(recipient), model); | ||||
recipient.AddRef(); | recipient.AddRef(); | ||||
dataStore.AddDMChannel(channel); | dataStore.AddDMChannel(channel); | ||||
@@ -505,7 +505,8 @@ namespace Discord | |||||
await _gatewayLogger.DebugAsync("Received Dispatch (READY)").ConfigureAwait(false); | await _gatewayLogger.DebugAsync("Received Dispatch (READY)").ConfigureAwait(false); | ||||
var data = (payload as JToken).ToObject<ReadyEvent>(_serializer); | var data = (payload as JToken).ToObject<ReadyEvent>(_serializer); | ||||
var dataStore = new DataStore( data.Guilds.Length, data.PrivateChannels.Length); | |||||
var privateChannels = data.PrivateChannels.Where(c => c.Type == ChannelType.DM).ToArray(); | |||||
var dataStore = new DataStore( data.Guilds.Length, privateChannels.Length); | |||||
var currentUser = new CachedSelfUser(this, data.User); | var currentUser = new CachedSelfUser(this, data.User); | ||||
int unavailableGuilds = 0; | int unavailableGuilds = 0; | ||||
@@ -517,8 +518,8 @@ namespace Discord | |||||
if (model.Unavailable == true) | if (model.Unavailable == true) | ||||
unavailableGuilds++; | unavailableGuilds++; | ||||
} | } | ||||
for (int i = 0; i < data.PrivateChannels.Length; i++) | |||||
AddDMChannel(data.PrivateChannels[i], dataStore); | |||||
for (int i = 0; i < privateChannels.Length; i++) | |||||
AddDMChannel(privateChannels[i], dataStore); | |||||
_sessionId = data.SessionId; | _sessionId = data.SessionId; | ||||
_currentUser = currentUser; | _currentUser = currentUser; | ||||
@@ -740,7 +741,7 @@ namespace Discord | |||||
} | } | ||||
} | } | ||||
else | else | ||||
channel = RemoveDMChannel(data.Recipient.Value.Id); | |||||
channel = RemoveDMChannel(data.Id); | |||||
if (channel != null) | if (channel != null) | ||||
await _channelDestroyedEvent.InvokeAsync(channel).ConfigureAwait(false); | await _channelDestroyedEvent.InvokeAsync(channel).ConfigureAwait(false); | ||||
else | else | ||||
@@ -2,8 +2,9 @@ | |||||
{ | { | ||||
public enum ChannelType : byte | public enum ChannelType : byte | ||||
{ | { | ||||
DM, | |||||
Text, | |||||
Voice | |||||
DM = 1, | |||||
Text = 0, | |||||
Voice = 2, | |||||
Group = 3 | |||||
} | } | ||||
} | } |
@@ -30,7 +30,7 @@ namespace Discord | |||||
{ | { | ||||
if (/*source == UpdateSource.Rest && */IsAttached) return; | if (/*source == UpdateSource.Rest && */IsAttached) return; | ||||
(Recipient as User).Update(model.Recipient.Value, source); | |||||
(Recipient as User).Update(model.Recipients.Value[0], source); | |||||
} | } | ||||
public async Task UpdateAsync() | public async Task UpdateAsync() | ||||
@@ -296,14 +296,14 @@ namespace Discord | |||||
internal GuildChannel ToChannel(API.Channel model) | internal GuildChannel ToChannel(API.Channel model) | ||||
{ | { | ||||
switch (model.Type.Value) | |||||
switch (model.Type) | |||||
{ | { | ||||
case ChannelType.Text: | case ChannelType.Text: | ||||
return new TextChannel(this, model); | return new TextChannel(this, model); | ||||
case ChannelType.Voice: | case ChannelType.Voice: | ||||
return new VoiceChannel(this, model); | return new VoiceChannel(this, model); | ||||
default: | default: | ||||
throw new InvalidOperationException($"Unknown channel type: {model.Type.Value}"); | |||||
throw new InvalidOperationException($"Unknown channel type: {model.Type}"); | |||||
} | } | ||||
} | } | ||||
@@ -17,6 +17,8 @@ namespace Discord | |||||
string Text { get; } | string Text { get; } | ||||
/// <summary> Gets the time this message was sent. </summary> | /// <summary> Gets the time this message was sent. </summary> | ||||
DateTimeOffset Timestamp { get; } | DateTimeOffset Timestamp { get; } | ||||
/// <summary> Gets the type of message this is. Value will always be default, unless the message was sent in a group. </summary> | |||||
MessageType Type { get; } | |||||
/// <summary> Gets the channel this message was sent to. </summary> | /// <summary> Gets the channel this message was sent to. </summary> | ||||
IMessageChannel Channel { get; } | IMessageChannel Channel { get; } | ||||
@@ -18,6 +18,7 @@ namespace Discord | |||||
public bool IsTTS { get; private set; } | public bool IsTTS { get; private set; } | ||||
public string Text { get; private set; } | public string Text { get; private set; } | ||||
public bool IsPinned { get; private set; } | public bool IsPinned { get; private set; } | ||||
public MessageType Type { get; private set; } | |||||
public IMessageChannel Channel { get; } | public IMessageChannel Channel { get; } | ||||
public IUser Author { get; } | public IUser Author { get; } | ||||
@@ -0,0 +1,17 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Threading.Tasks; | |||||
namespace Discord | |||||
{ | |||||
public enum MessageType | |||||
{ | |||||
Default = 0, | |||||
RecipientAdd = 1, | |||||
RecipientRemove = 2, | |||||
Call = 3, | |||||
NameChange = 4, | |||||
IconChange = 5 | |||||
} | |||||
} |
@@ -311,14 +311,14 @@ namespace Discord | |||||
new internal ICachedGuildChannel ToChannel(ChannelModel model) | new internal ICachedGuildChannel ToChannel(ChannelModel model) | ||||
{ | { | ||||
switch (model.Type.Value) | |||||
switch (model.Type) | |||||
{ | { | ||||
case ChannelType.Text: | case ChannelType.Text: | ||||
return new CachedTextChannel(this, model); | return new CachedTextChannel(this, model); | ||||
case ChannelType.Voice: | case ChannelType.Voice: | ||||
return new CachedVoiceChannel(this, model); | return new CachedVoiceChannel(this, model); | ||||
default: | default: | ||||
throw new InvalidOperationException($"Unknown channel type: {model.Type.Value}"); | |||||
throw new InvalidOperationException($"Unknown channel type: {model.Type}"); | |||||
} | } | ||||
} | } | ||||
@@ -13,30 +13,12 @@ namespace Discord.Net.Converters | |||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | ||||
{ | { | ||||
switch ((string)reader.Value) | |||||
{ | |||||
case "text": | |||||
return ChannelType.Text; | |||||
case "voice": | |||||
return ChannelType.Voice; | |||||
default: | |||||
throw new JsonSerializationException("Unknown channel type"); | |||||
} | |||||
return (ChannelType)((long)reader.Value); | |||||
} | } | ||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | ||||
{ | { | ||||
switch ((ChannelType)value) | |||||
{ | |||||
case ChannelType.Text: | |||||
writer.WriteValue("text"); | |||||
break; | |||||
case ChannelType.Voice: | |||||
writer.WriteValue("voice"); | |||||
break; | |||||
default: | |||||
throw new JsonSerializationException("Invalid channel type"); | |||||
} | |||||
writer.WriteValue((int)value); | |||||
} | } | ||||
} | } | ||||
} | } |