diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..1ff0c4230
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,63 @@
+###############################################################################
+# Set default behavior to automatically normalize line endings.
+###############################################################################
+* text=auto
+
+###############################################################################
+# Set default behavior for command prompt diff.
+#
+# This is need for earlier builds of msysgit that does not have it on by
+# default for csharp files.
+# Note: This is only used by command line
+###############################################################################
+#*.cs diff=csharp
+
+###############################################################################
+# Set the merge driver for project and solution files
+#
+# Merging from the command prompt will add diff markers to the files if there
+# are conflicts (Merging from VS is not affected by the settings below, in VS
+# the diff markers are never inserted). Diff markers may cause the following
+# file extensions to fail to load in VS. An alternative would be to treat
+# these files as binary and thus will always conflict and require user
+# intervention with every merge. To do so, just uncomment the entries below
+###############################################################################
+#*.sln merge=binary
+#*.csproj merge=binary
+#*.vbproj merge=binary
+#*.vcxproj merge=binary
+#*.vcproj merge=binary
+#*.dbproj merge=binary
+#*.fsproj merge=binary
+#*.lsproj merge=binary
+#*.wixproj merge=binary
+#*.modelproj merge=binary
+#*.sqlproj merge=binary
+#*.wwaproj merge=binary
+
+###############################################################################
+# behavior for image files
+#
+# image files are treated as binary by default.
+###############################################################################
+#*.jpg binary
+#*.png binary
+#*.gif binary
+
+###############################################################################
+# diff behavior for common document formats
+#
+# Convert binary document formats to text before diffing them. This feature
+# is only available from the command line. Turn it on by uncommenting the
+# entries below.
+###############################################################################
+#*.doc diff=astextplain
+#*.DOC diff=astextplain
+#*.docx diff=astextplain
+#*.DOCX diff=astextplain
+#*.dot diff=astextplain
+#*.DOT diff=astextplain
+#*.pdf diff=astextplain
+#*.PDF diff=astextplain
+#*.rtf diff=astextplain
+#*.RTF diff=astextplain
diff --git a/Discord.Net/API/Models/General.cs b/Discord.Net/API/Models/General.cs
index 46c487d8d..c20b7f7bc 100644
--- a/Discord.Net/API/Models/General.cs
+++ b/Discord.Net/API/Models/General.cs
@@ -106,7 +106,7 @@ namespace Discord.API.Models
[JsonProperty(PropertyName = "channels")]
public ChannelInfo[] Channels;
[JsonProperty(PropertyName = "joined_at")]
- public DateTime JoinedAt;
+ public DateTime? JoinedAt;
[JsonProperty(PropertyName = "members")]
public MembershipInfo[] Members;
[JsonProperty(PropertyName = "owner_id")]
diff --git a/Discord.Net/Models/Channel.cs b/Discord.Net/Channel.cs
similarity index 97%
rename from Discord.Net/Models/Channel.cs
rename to Discord.Net/Channel.cs
index 23919e192..25d59818f 100644
--- a/Discord.Net/Models/Channel.cs
+++ b/Discord.Net/Channel.cs
@@ -1,6 +1,6 @@
using Newtonsoft.Json;
-namespace Discord.Models
+namespace Discord
{
public sealed class Channel
{
diff --git a/Discord.Net/Models/ChatMessage.cs b/Discord.Net/ChatMessage.cs
similarity index 66%
rename from Discord.Net/Models/ChatMessage.cs
rename to Discord.Net/ChatMessage.cs
index 1b8d95d90..e25d1e8b0 100644
--- a/Discord.Net/Models/ChatMessage.cs
+++ b/Discord.Net/ChatMessage.cs
@@ -1,15 +1,23 @@
using Newtonsoft.Json;
using System;
-namespace Discord.Models
+namespace Discord
{
- public sealed class ChatMessage : ChatMessageReference
+ public sealed class ChatMessage
{
+ private readonly DiscordClient _client;
+
+ public string Id { get; }
+
public bool IsMentioningEveryone { get; internal set; }
public bool IsTTS { get; internal set; }
public string Text { get; internal set; }
public DateTime Timestamp { get; internal set; }
-
+
+ public string ChannelId { get; internal set; }
+ [JsonIgnore]
+ public Channel Channel { get { return _client.GetChannel(ChannelId); } }
+
public string UserId { get; internal set; }
[JsonIgnore]
public User User { get { return _client.GetUser(UserId); } }
@@ -19,9 +27,11 @@ namespace Discord.Models
public object[] Embeds { get; internal set; }
internal ChatMessage(string id, string channelId, DiscordClient client)
- : base(id, channelId, client)
{
- }
+ Id = id;
+ ChannelId = channelId;
+ _client = client;
+ }
public override string ToString()
{
diff --git a/Discord.Net/Discord.Net.csproj b/Discord.Net/Discord.Net.csproj
index eda49edcd..6fb72ee9c 100644
--- a/Discord.Net/Discord.Net.csproj
+++ b/Discord.Net/Discord.Net.csproj
@@ -49,10 +49,9 @@
-
-
-
-
+
+
+
@@ -62,8 +61,8 @@
-
-
+
+
diff --git a/Discord.Net/DiscordClient.Events.cs b/Discord.Net/DiscordClient.Events.cs
index 62349c566..23bd54d63 100644
--- a/Discord.Net/DiscordClient.Events.cs
+++ b/Discord.Net/DiscordClient.Events.cs
@@ -1,5 +1,4 @@
-using Discord.Models;
-using System;
+using System;
namespace Discord
{
@@ -98,40 +97,35 @@ namespace Discord
}
//Message
- public sealed class MessageCreateEventArgs : EventArgs
- {
- public readonly ChatMessage Message;
- internal MessageCreateEventArgs(ChatMessage msg) { Message = msg; }
- }
public sealed class MessageEventArgs : EventArgs
{
- public readonly ChatMessageReference Message;
- internal MessageEventArgs(ChatMessageReference msg) { Message = msg; }
+ public readonly ChatMessage Message;
+ internal MessageEventArgs(ChatMessage msg) { Message = msg; }
}
- public event EventHandler MessageCreated;
+ public event EventHandler MessageCreated;
private void RaiseMessageCreated(ChatMessage msg)
{
if (MessageCreated != null)
- MessageCreated(this, new MessageCreateEventArgs(msg));
+ MessageCreated(this, new MessageEventArgs(msg));
}
public event EventHandler MessageDeleted;
- private void RaiseMessageDeleted(ChatMessageReference msg)
+ private void RaiseMessageDeleted(ChatMessage msg)
{
if (MessageDeleted != null)
MessageDeleted(this, new MessageEventArgs(msg));
}
public event EventHandler MessageUpdated;
- private void RaiseMessageUpdated(ChatMessageReference msg)
+ private void RaiseMessageUpdated(ChatMessage msg)
{
if (MessageUpdated != null)
MessageUpdated(this, new MessageEventArgs(msg));
}
public event EventHandler MessageAcknowledged;
- private void RaiseMessageAcknowledged(ChatMessageReference msg)
+ private void RaiseMessageAcknowledged(ChatMessage msg)
{
if (MessageAcknowledged != null)
MessageAcknowledged(this, new MessageEventArgs(msg));
diff --git a/Discord.Net/DiscordClient.cs b/Discord.Net/DiscordClient.cs
index ff51ae9f3..703933dc5 100644
--- a/Discord.Net/DiscordClient.cs
+++ b/Discord.Net/DiscordClient.cs
@@ -1,13 +1,11 @@
using Discord.API;
using Discord.API.Models;
using Discord.Helpers;
-using Discord.Models;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
-using Role = Discord.Models.Role;
namespace Discord
{
@@ -372,7 +370,7 @@ namespace Discord
var extendedModel = model as ExtendedServerInfo;
server.AFKChannelId = extendedModel.AFKChannelId;
server.AFKTimeout = extendedModel.AFKTimeout;
- server.JoinedAt = extendedModel.JoinedAt;
+ server.JoinedAt = extendedModel.JoinedAt ?? DateTime.MinValue;
server.OwnerId = extendedModel.OwnerId;
server.Presence = extendedModel.Presence;
server.Region = extendedModel.Region;
@@ -420,7 +418,7 @@ namespace Discord
private Channel DeleteChannel(string id)
{
Channel channel = null;
- if (_channels.TryRemove(id, out channel))
+ if (_channels.TryRemove(id, out channel) && !channel.IsPrivate)
{
bool ignored;
channel.Server._channels.TryRemove(id, out ignored);
@@ -429,10 +427,10 @@ namespace Discord
}
//TODO: Temporary measure, unsure if we want to store these or not.
- private ChatMessageReference GetMessage(string id, string channelId)
+ private ChatMessage GetMessage(string id, string channelId)
{
if (id == null || channelId == null) return null;
- return new ChatMessageReference(id, channelId, this);
+ return new ChatMessage(id, channelId, this);
}
private ChatMessage UpdateMessage(WebSocketEvents.MessageCreate model, bool addNew = true)
{
diff --git a/Discord.Net/DiscordWebSocket.cs b/Discord.Net/DiscordWebSocket.cs
index 8bd2b6d80..5c8c83c49 100644
--- a/Discord.Net/DiscordWebSocket.cs
+++ b/Discord.Net/DiscordWebSocket.cs
@@ -114,14 +114,14 @@ namespace Discord
RaiseGotEvent(msg.Type, msg.Payload as JToken);
break;
default:
- RaiseOnDebugMessage("Unknown WebSocket operation ID: " + msg.Operation);
+ RaiseOnDebugMessage("Warning: Unknown WebSocket operation ID: " + msg.Operation);
break;
}
builder.Clear();
}
}
- catch { }
+ catch (Exception ex) { RaiseOnDebugMessage($"Error: {ex.Message}"); }
finally { _cancelToken.Cancel(); }
}
diff --git a/Discord.Net/Models/ChatMessageReference.cs b/Discord.Net/Models/ChatMessageReference.cs
deleted file mode 100644
index d3c800cf3..000000000
--- a/Discord.Net/Models/ChatMessageReference.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using Newtonsoft.Json;
-
-namespace Discord.Models
-{
- public class ChatMessageReference
- {
- protected readonly DiscordClient _client;
-
- public string Id { get; }
-
- public string ChannelId { get; }
- [JsonIgnore]
- public Channel Channel { get { return _client.GetChannel(ChannelId); } }
-
- internal ChatMessageReference(string id, string channelId, DiscordClient client)
- {
- Id = id;
- ChannelId = channelId;
- _client = client;
- }
- }
-}
diff --git a/Discord.Net/Models/Role.cs b/Discord.Net/Role.cs
similarity index 95%
rename from Discord.Net/Models/Role.cs
rename to Discord.Net/Role.cs
index 1c6d47a8e..ccc774dfc 100644
--- a/Discord.Net/Models/Role.cs
+++ b/Discord.Net/Role.cs
@@ -1,6 +1,6 @@
using Newtonsoft.Json;
-namespace Discord.Models
+namespace Discord
{
public sealed class Role
{
diff --git a/Discord.Net/Models/Server.cs b/Discord.Net/Server.cs
similarity index 98%
rename from Discord.Net/Models/Server.cs
rename to Discord.Net/Server.cs
index 667f0cc66..373ea8010 100644
--- a/Discord.Net/Models/Server.cs
+++ b/Discord.Net/Server.cs
@@ -4,7 +4,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
-namespace Discord.Models
+namespace Discord
{
public sealed class Server
{
diff --git a/Discord.Net/Models/User.cs b/Discord.Net/User.cs
similarity index 97%
rename from Discord.Net/Models/User.cs
rename to Discord.Net/User.cs
index f9f528e89..b38ce01bc 100644
--- a/Discord.Net/Models/User.cs
+++ b/Discord.Net/User.cs
@@ -1,6 +1,6 @@
using System;
-namespace Discord.Models
+namespace Discord
{
public sealed class User
{