diff --git a/ref/Discord.Net.xproj b/ref/Discord.Net.xproj
new file mode 100644
index 000000000..d3559797d
--- /dev/null
+++ b/ref/Discord.Net.xproj
@@ -0,0 +1,21 @@
+
+
+
+ 14.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+
+
+
+ 5b2afee6-fff6-4ba2-be12-61b283b72ac0
+ Discord
+ ..\..\artifacts\obj\$(MSBuildProjectName)
+ ..\..\artifacts\bin\$(MSBuildProjectName)\
+
+
+ 2.0
+
+
+ True
+
+
+
\ No newline at end of file
diff --git a/ref/DiscordClient.Events.cs b/ref/DiscordClient.Events.cs
new file mode 100644
index 000000000..42b2601e3
--- /dev/null
+++ b/ref/DiscordClient.Events.cs
@@ -0,0 +1,32 @@
+using System;
+
+namespace Discord
+{
+ public partial class DiscordClient
+ {
+ public event EventHandler Ready = delegate { };
+ public event EventHandler ChannelCreated = delegate { };
+ public event EventHandler ChannelDestroyed = delegate { };
+ public event EventHandler ChannelUpdated = delegate { };
+ public event EventHandler MessageAcknowledged = delegate { };
+ public event EventHandler MessageDeleted = delegate { };
+ public event EventHandler MessageReceived = delegate { };
+ public event EventHandler MessageSent = delegate { };
+ public event EventHandler MessageUpdated = delegate { };
+ public event EventHandler ProfileUpdated = delegate { };
+ public event EventHandler RoleCreated = delegate { };
+ public event EventHandler RoleUpdated = delegate { };
+ public event EventHandler RoleDeleted = delegate { };
+ public event EventHandler JoinedServer = delegate { };
+ public event EventHandler LeftServer = delegate { };
+ public event EventHandler ServerAvailable = delegate { };
+ public event EventHandler ServerUpdated = delegate { };
+ public event EventHandler ServerUnavailable = delegate { };
+ public event EventHandler UserBanned = delegate { };
+ public event EventHandler UserIsTyping = delegate { };
+ public event EventHandler UserJoined = delegate { };
+ public event EventHandler UserLeft = delegate { };
+ public event EventHandler UserUpdated = delegate { };
+ public event EventHandler UserUnbanned = delegate { };
+ }
+}
diff --git a/ref/DiscordClient.cs b/ref/DiscordClient.cs
new file mode 100644
index 000000000..f2a1cb95d
--- /dev/null
+++ b/ref/DiscordClient.cs
@@ -0,0 +1,59 @@
+using Discord.Net;
+using Discord.Net.Rest;
+using Discord.Net.WebSockets;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ /// Provides a connection to the DiscordApp service.
+ public partial class DiscordClient : IDisposable
+ {
+ public DiscordConfig Config { get; }
+ public RestClient ClientAPI { get; }
+ public RestClient StatusAPI { get; }
+ public GatewaySocket GatewaySocket { get; }
+ public MessageQueue MessageQueue { get; }
+ public JsonSerializer Serializer { get; }
+
+ public ConnectionState State { get; }
+ public CancellationToken CancelToken { get; }
+ public Profile CurrentUser { get; }
+ public string SessionId { get; }
+ public UserStatus Status { get; }
+ public string CurrentGame { get; }
+
+ public IEnumerable Servers { get; }
+ public IEnumerable PrivateChannels { get; }
+ public IEnumerable Regions { get; }
+
+ public DiscordClient() { }
+ public DiscordClient(DiscordConfig config) { }
+ public DiscordClient(Action configFunc) { }
+
+ public Task Connect(string email, string password, string token = null) => null;
+ public Task Connect(string token) => null;
+ public Task Disconnect() => null;
+
+ public void SetStatus(UserStatus status) { }
+ public void SetGame(string game) { }
+
+ public Channel GetChannel(ulong id) => null;
+ public Task CreatePrivateChannel(ulong userId) => null;
+
+ public Task GetInvite(string inviteIdOrXkcd) => null;
+
+ public Region GetRegion(string id) => null;
+
+ public Server GetServer(ulong id) => null;
+ public IEnumerable FindServers(string name) => null;
+ public Task CreateServer(string name, Region region, ImageType iconType = ImageType.None, Stream icon = null) => null;
+
+ public void Dispose() { }
+ }
+}
\ No newline at end of file
diff --git a/ref/DiscordConfig.cs b/ref/DiscordConfig.cs
new file mode 100644
index 000000000..657a58437
--- /dev/null
+++ b/ref/DiscordConfig.cs
@@ -0,0 +1,36 @@
+using System;
+
+namespace Discord
+{
+ public class DiscordConfig
+ {
+ public const int MaxMessageSize = 2000;
+ public const string LibName = "Discord.Net";
+ public static readonly string LibVersion = null;
+ public const string LibUrl = "https://github.com/RogueException/Discord.Net";
+
+ public const string ClientAPIUrl = "https://discordapp.com/api/";
+ public const string StatusAPIUrl = "https://srhpyqt94yxb.statuspage.io/api/v2/"; //"https://status.discordapp.com/api/v2/";
+ public const string CDNUrl = "https://cdn.discordapp.com/";
+ public const string InviteUrl = "https://discord.gg/";
+
+ public string AppName { get; set; } = null;
+ public string AppUrl { get; set; } = null;
+ public string AppVersion { get; set; } = null;
+ public LogSeverity LogLevel { get; set; } = LogSeverity.Info;
+
+ public int ConnectionTimeout { get; set; } = 30000;
+ public int ReconnectDelay { get; set; } = 1000;
+ public int FailedReconnectDelay { get; set; } = 15000;
+
+ public bool CacheToken { get; set; } = true;
+ public int MessageCacheSize { get; set; } = 100;
+
+ public bool UsePermissionsCache { get; set; } = true;
+ public bool EnablePreUpdateEvents { get; set; } = true;
+ public int LargeThreshold { get; set; } = 250;
+
+ public EventHandler LogHandler { get; set; }
+ public string UserAgent { get; }
+ }
+}
diff --git a/ref/Entities/Channels/Channel.cs b/ref/Entities/Channels/Channel.cs
new file mode 100644
index 000000000..8cb4a1afb
--- /dev/null
+++ b/ref/Entities/Channels/Channel.cs
@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public abstract class Channel : IChannel
+ {
+ public ulong Id { get; }
+
+ public abstract DiscordClient Client { get; }
+ public abstract ChannelType Type { get; }
+ public bool IsText { get; }
+ public bool IsVoice { get; }
+ public bool IsPrivate { get; }
+ public bool IsPublic { get; }
+
+ public abstract User CurrentUser { get; }
+ public abstract IEnumerable Users { get; }
+
+ public abstract Task Save();
+ }
+}
diff --git a/ref/Entities/Channels/IChannel.cs b/ref/Entities/Channels/IChannel.cs
new file mode 100644
index 000000000..7fbe67208
--- /dev/null
+++ b/ref/Entities/Channels/IChannel.cs
@@ -0,0 +1,17 @@
+using System.Collections.Generic;
+
+namespace Discord
+{
+ public interface IChannel : IModel
+ {
+ DiscordClient Client { get; }
+
+ ChannelType Type { get; }
+ bool IsText { get; }
+ bool IsVoice { get; }
+ bool IsPrivate { get; }
+ bool IsPublic { get; }
+
+ IEnumerable Users { get; }
+ }
+}
diff --git a/src/Discord.Net/Models/IPrivateChannel.cs b/ref/Entities/Channels/IPrivateChannel.cs
similarity index 72%
rename from src/Discord.Net/Models/IPrivateChannel.cs
rename to ref/Entities/Channels/IPrivateChannel.cs
index 02c4c1b9c..44d55a67f 100644
--- a/src/Discord.Net/Models/IPrivateChannel.cs
+++ b/ref/Entities/Channels/IPrivateChannel.cs
@@ -2,5 +2,6 @@
{
public interface IPrivateChannel : IChannel
{
+ User Recipient { get; }
}
}
diff --git a/ref/Entities/Channels/IPublicChannel.cs b/ref/Entities/Channels/IPublicChannel.cs
new file mode 100644
index 000000000..8b8f87b45
--- /dev/null
+++ b/ref/Entities/Channels/IPublicChannel.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public interface IPublicChannel : IChannel
+ {
+ Server Server { get; }
+
+ string Name { get; set; }
+ int Position { get; set; }
+
+ IEnumerable PermissionOverwrites { get; }
+
+ PermissionOverwrite? GetPermissionsRule(User user);
+ PermissionOverwrite? GetPermissionsRule(Role role);
+ Task> DownloadInvites();
+
+ Task Delete();
+
+ Task CreateInvite(int? maxAge = 1800, int? maxUses = null, bool tempMembership = false, bool withXkcd = false);
+
+ Task AddPermissionsRule(User user, ChannelPermissions allow, ChannelPermissions deny);
+ Task AddPermissionsRule(User user, TriStateChannelPermissions permissions);
+ Task AddPermissionsRule(Role role, ChannelPermissions allow, ChannelPermissions deny);
+ Task AddPermissionsRule(Role role, TriStateChannelPermissions permissions);
+ Task RemovePermissionsRule(User user);
+ Task RemovePermissionsRule(Role role);
+ }
+}
diff --git a/ref/Entities/Channels/ITextChannel.cs b/ref/Entities/Channels/ITextChannel.cs
new file mode 100644
index 000000000..aa7e09435
--- /dev/null
+++ b/ref/Entities/Channels/ITextChannel.cs
@@ -0,0 +1,18 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public interface ITextChannel : IChannel
+ {
+ Message GetMessage(ulong id);
+ Task> DownloadMessages(int limit = 100, ulong? relativeMessageId = null, Relative relativeDir = Relative.Before);
+
+ Task SendMessage(string text, bool isTTS = false);
+ Task SendFile(string filePath, string text = null, bool isTTS = false);
+ Task SendFile(Stream stream, string filename, string text = null, bool isTTS = false);
+
+ Task SendIsTyping();
+ }
+}
diff --git a/ref/Entities/Channels/IVoiceChannel.cs b/ref/Entities/Channels/IVoiceChannel.cs
new file mode 100644
index 000000000..85d093209
--- /dev/null
+++ b/ref/Entities/Channels/IVoiceChannel.cs
@@ -0,0 +1,7 @@
+namespace Discord
+{
+ public interface IVoiceChannel : IChannel
+ {
+ int Bitrate { get; set; }
+ }
+}
diff --git a/ref/Entities/Channels/PrivateChannel.cs b/ref/Entities/Channels/PrivateChannel.cs
new file mode 100644
index 000000000..ca25dadab
--- /dev/null
+++ b/ref/Entities/Channels/PrivateChannel.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class PrivateChannel : Channel, ITextChannel, IPrivateChannel
+ {
+ public User Recipient { get; }
+ public IEnumerable Messages { get; }
+
+ public override DiscordClient Client => null;
+ public override ChannelType Type => default(ChannelType);
+
+ public override User CurrentUser => null;
+ public override IEnumerable Users => null;
+
+ public Message GetMessage(ulong id) => null;
+ public Task> DownloadMessages(int limit) => null;
+ public Task> DownloadMessages(int limit, ulong? relativeMessageId, Relative relativeDir) => null;
+
+ public Task SendMessage(string text, bool isTTS = false) => null;
+ public Task SendFile(string path, string text = null, bool isTTS = false) => null;
+ public Task SendFile(Stream stream, string filename, string text = null, bool isTTS = false) => null;
+
+ public Task SendIsTyping() => null;
+
+ public override Task Save() => null;
+ }
+}
diff --git a/ref/Entities/Channels/TextChannel.cs b/ref/Entities/Channels/TextChannel.cs
new file mode 100644
index 000000000..e09528e01
--- /dev/null
+++ b/ref/Entities/Channels/TextChannel.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class TextChannel : Channel, ITextChannel, IPublicChannel, IMentionable
+ {
+ public Server Server { get; }
+ public string Mention { get; }
+ public IEnumerable PermissionOverwrites { get; }
+ public IEnumerable Messages { get; }
+
+ public string Topic { get; set; }
+ public bool IsTyping { get; set; }
+ public string Name { get; set; }
+ public int Position { get; set; }
+
+ public override DiscordClient Client => null;
+ public override ChannelType Type => default(ChannelType);
+ public override User CurrentUser => null;
+ public override IEnumerable Users => null;
+
+ public Message GetMessage(ulong id) => null;
+ public PermissionOverwrite? GetPermissionsRule(User user) => null;
+ public PermissionOverwrite? GetPermissionsRule(Role role) => null;
+
+ public Task> DownloadMessages(int limit) => null;
+ public Task> DownloadMessages(int limit, ulong? relativeMessageId, Relative relativeDir) => null;
+ public Task> DownloadInvites() => null;
+
+ public Task SendMessage(string text, bool isTTS = false) => null;
+ public Task SendFile(string path, string text = null, bool isTTS = false) => null;
+ public Task SendFile(Stream stream, string filename, string text = null, bool isTTS = false) => null;
+
+ public Task SendIsTyping() => null;
+
+ public Task CreateInvite(int? maxAge = 1800, int? maxUses = default(int?), bool tempMembership = false, bool withXkcd = false) => null;
+
+ public Task AddPermissionsRule(User user, ChannelPermissions allow, ChannelPermissions deny) => null;
+ public Task AddPermissionsRule(User user, TriStateChannelPermissions permissions) => null;
+ public Task AddPermissionsRule(Role role, ChannelPermissions allow, ChannelPermissions deny) => null;
+ public Task AddPermissionsRule(Role role, TriStateChannelPermissions permissions) => null;
+ public Task RemovePermissionsRule(User user) => null;
+ public Task RemovePermissionsRule(Role role) => null;
+
+ public Task Delete() => null;
+ public override Task Save() => null;
+ }
+}
diff --git a/ref/Entities/Channels/VoiceChannel.cs b/ref/Entities/Channels/VoiceChannel.cs
new file mode 100644
index 000000000..c38d6c40b
--- /dev/null
+++ b/ref/Entities/Channels/VoiceChannel.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class VoiceChannel : IPublicChannel, IVoiceChannel
+ {
+ public ulong Id { get; }
+ public DiscordClient Client { get; }
+ public Server Server { get; }
+ public ChannelType Type { get; }
+ public bool IsText { get; }
+ public bool IsVoice { get; }
+ public bool IsPrivate { get; }
+ public bool IsPublic { get; }
+ public IEnumerable PermissionOverwrites { get; }
+ public IEnumerable Users { get; }
+
+ public string Name { get; set; }
+ public int Position { get; set; }
+ public int Bitrate { get; set; }
+
+ public Message GetMessage(ulong id) => null;
+ public PermissionOverwrite? GetPermissionsRule(User user) => null;
+ public PermissionOverwrite? GetPermissionsRule(Role role) => null;
+
+ public Task> DownloadMessages(int limit) => null;
+ public Task> DownloadMessages(int limit, ulong? relativeMessageId, Relative relativeDir) => null;
+ public Task> DownloadInvites() => null;
+
+ public Task SendMessage(string text, bool isTTS = false) => null;
+ public Task SendFile(string path, string text = null, bool isTTS = false) => null;
+ public Task SendFile(Stream stream, string filename, string text = null, bool isTTS = false) => null;
+
+ public Task CreateInvite(int? maxAge = 1800, int? maxUses = default(int?), bool tempMembership = false, bool withXkcd = false) => null;
+
+ public Task AddPermissionsRule(User user, ChannelPermissions allow, ChannelPermissions deny) => null;
+ public Task AddPermissionsRule(User user, TriStateChannelPermissions permissions) => null;
+ public Task AddPermissionsRule(Role role, ChannelPermissions allow, ChannelPermissions deny) => null;
+ public Task AddPermissionsRule(Role role, TriStateChannelPermissions permissions) => null;
+ public Task RemovePermissionsRule(User user) => null;
+ public Task RemovePermissionsRule(Role role) => null;
+
+ public Task Delete() => null;
+ public Task Save() => null;
+ }
+}
diff --git a/ref/Entities/Color.cs b/ref/Entities/Color.cs
new file mode 100644
index 000000000..b3c78debf
--- /dev/null
+++ b/ref/Entities/Color.cs
@@ -0,0 +1,17 @@
+namespace Discord
+{
+ public class Color
+ {
+ public static readonly Color Default = new Color(0);
+
+ public uint RawValue { get; }
+
+ public Color(uint rawValue) { }
+ public Color(byte r, byte g, byte b) { }
+ public Color(float r, float g, float b) { }
+
+ public byte R { get; }
+ public byte G { get; }
+ public byte B { get; }
+ }
+}
diff --git a/ref/Entities/IMentionable.cs b/ref/Entities/IMentionable.cs
new file mode 100644
index 000000000..0a4bf439c
--- /dev/null
+++ b/ref/Entities/IMentionable.cs
@@ -0,0 +1,7 @@
+namespace Discord
+{
+ public interface IMentionable
+ {
+ string Mention { get; }
+ }
+}
diff --git a/ref/Entities/IModel.cs b/ref/Entities/IModel.cs
new file mode 100644
index 000000000..58c016a27
--- /dev/null
+++ b/ref/Entities/IModel.cs
@@ -0,0 +1,13 @@
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public interface IModel : IModel
+ {
+ TId Id { get; }
+ }
+ public interface IModel
+ {
+ Task Save();
+ }
+}
diff --git a/ref/Entities/Invite.cs b/ref/Entities/Invite.cs
new file mode 100644
index 000000000..041ef2e97
--- /dev/null
+++ b/ref/Entities/Invite.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class Invite : IModel
+ {
+ public class ServerInfo
+ {
+ public ulong Id { get; }
+ public string Name { get; }
+ }
+ public class ChannelInfo
+ {
+ public ulong Id { get; }
+ public string Name { get; }
+ }
+ public class InviterInfo
+ {
+ public ulong Id { get; }
+ public string Name { get; }
+ public ushort Discriminator { get; }
+ public string AvatarId { get; }
+ public string AvatarUrl { get; }
+ }
+
+ public DiscordClient Client { get; }
+
+ string IModel.Id => Code;
+ public string Code { get; }
+ public string XkcdCode { get; }
+
+ public ServerInfo Server { get; }
+ public ChannelInfo Channel { get; }
+ public int? MaxAge { get; }
+ public int Uses { get; }
+ public int? MaxUses { get; }
+ public bool IsRevoked { get; }
+ public bool IsTemporary { get; }
+ public DateTime CreatedAt { get; }
+ public string Url { get; }
+
+ public Task Delete() => null;
+ public Task Accept() => null;
+
+ public Task Save() => null;
+ }
+}
diff --git a/ref/Entities/Message.cs b/ref/Entities/Message.cs
new file mode 100644
index 000000000..f315315fc
--- /dev/null
+++ b/ref/Entities/Message.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class Message : IModel
+ {
+ public class Attachment : File
+ {
+ public string Id { get; }
+ public int Size { get; }
+ public string Filename { get; }
+ }
+
+ public class Embed
+ {
+ public string Url { get; }
+ public string Type { get; }
+ public string Title { get; }
+ public string Description { get; }
+ public EmbedLink Author { get; }
+ public EmbedLink Provider { get; }
+ public File Thumbnail { get; }
+ public File Video { get; }
+ }
+
+ public class EmbedLink
+ {
+ public string Url { get; }
+ public string Name { get; }
+ }
+
+ public class File
+ {
+ public string Url { get; }
+ public string ProxyUrl { get; }
+ public int? Width { get; }
+ public int? Height { get; }
+ }
+
+ public DiscordClient Client { get; }
+ public ulong Id { get; }
+ public ITextChannel Channel { get; }
+ public User User { get; }
+ public bool IsTTS { get; }
+ public MessageState State { get; }
+ public string RawText { get; }
+ public string Text { get; }
+ public DateTime Timestamp { get; }
+ public DateTime? EditedTimestamp { get; }
+ public Attachment[] Attachments { get; }
+ public Embed[] Embeds { get; }
+
+ public IEnumerable MentionedUsers { get; }
+ public IEnumerable MentionedChannels { get; }
+ public IEnumerable MentionedRoles { get; }
+
+ public Server Server => null;
+ public bool IsAuthor => false;
+
+ public Task Delete() => null;
+
+ public Task Save() => null;
+
+ public bool IsMentioningMe(bool includeRoles = false) => false;
+ }
+}
diff --git a/ref/Entities/Permissions/ChannelPermissions.cs b/ref/Entities/Permissions/ChannelPermissions.cs
new file mode 100644
index 000000000..9a4248923
--- /dev/null
+++ b/ref/Entities/Permissions/ChannelPermissions.cs
@@ -0,0 +1,54 @@
+namespace Discord
+{
+ public struct ChannelPermissions
+ {
+ public static ChannelPermissions None { get; }
+ public static ChannelPermissions TextOnly { get; }
+ public static ChannelPermissions PrivateOnly { get; }
+ public static ChannelPermissions VoiceOnly { get; }
+ public static ChannelPermissions All(Channel channel) => default(ChannelPermissions);
+ public static ChannelPermissions All(ChannelType channelType, bool isPrivate) => default(ChannelPermissions);
+
+ public uint RawValue { get; }
+
+ public bool CreateInstantInvit { get; }
+ public bool ManagePermission { get; }
+ public bool ManageChannel { get; }
+
+ public bool ReadMessages { get; }
+ public bool SendMessages { get; }
+ public bool SendTTSMessages { get; }
+ public bool ManageMessages { get; }
+ public bool EmbedLinks { get; }
+ public bool AttachFiles { get; }
+ public bool ReadMessageHistory { get; }
+ public bool MentionEveryone { get; }
+
+ public bool Connect { get; }
+ public bool Speak { get; }
+ public bool MuteMembers { get; }
+ public bool DeafenMembers { get; }
+ public bool MoveMembers { get; }
+ public bool UseVoiceActivation { get; }
+
+ public ChannelPermissions(bool? createInstantInvite = null, bool? managePermissions = null,
+ bool? manageChannel = null, bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null,
+ bool? manageMessages = null, bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null,
+ bool? mentionEveryone = null, bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null,
+ bool? moveMembers = null, bool? useVoiceActivation = null)
+ : this()
+ {
+ }
+ public ChannelPermissions(uint rawValue)
+ : this()
+ {
+ }
+
+ public ChannelPermissions Modify(ChannelPermissions basePerms, bool? createInstantInvite = null, bool? managePermissions = null,
+ bool? manageChannel = null, bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null,
+ bool? manageMessages = null, bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null,
+ bool? mentionEveryone = null, bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null,
+ bool? moveMembers = null, bool? useVoiceActivation = null)
+ => default(ChannelPermissions);
+ }
+}
diff --git a/ref/Entities/Permissions/PermissionOverwrite.cs b/ref/Entities/Permissions/PermissionOverwrite.cs
new file mode 100644
index 000000000..94658160a
--- /dev/null
+++ b/ref/Entities/Permissions/PermissionOverwrite.cs
@@ -0,0 +1,9 @@
+namespace Discord
+{
+ public struct PermissionOverwrite
+ {
+ public PermissionTarget TargetType { get; }
+ public ulong TargetId { get; }
+ public TriStateChannelPermissions Permissions { get; }
+ }
+}
diff --git a/ref/Entities/Permissions/ServerPermissions.cs b/ref/Entities/Permissions/ServerPermissions.cs
new file mode 100644
index 000000000..67f208b97
--- /dev/null
+++ b/ref/Entities/Permissions/ServerPermissions.cs
@@ -0,0 +1,55 @@
+namespace Discord
+{
+ public struct ServerPermissions
+ {
+ public static ServerPermissions None { get; }
+ public static ServerPermissions All { get; }
+
+ public uint RawValue { get; }
+
+ public bool CreateInstantInvite { get; }
+ public bool BanMembers { get; }
+ public bool KickMembers { get; }
+ public bool ManageRoles { get; }
+ public bool ManageChannels { get; }
+ public bool ManageServer { get; }
+
+ public bool ReadMessages { get; }
+ public bool SendMessages { get; }
+ public bool SendTTSMessages { get; }
+ public bool ManageMessages { get; }
+ public bool EmbedLinks { get; }
+ public bool AttachFiles { get; }
+ public bool ReadMessageHistory { get; }
+ public bool MentionEveryone { get; }
+
+ public bool Connect { get; }
+ public bool Speak { get; }
+ public bool MuteMembers { get; }
+ public bool DeafenMembers { get; }
+ public bool MoveMembers { get; }
+ public bool UseVoiceActivation { get; }
+
+ public ServerPermissions(bool? createInstantInvite = null, bool? manageRoles = null,
+ bool? kickMembers = null, bool? banMembers = null, bool? manageChannel = null, bool? manageServer = null,
+ bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null, bool? manageMessages = null,
+ bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null, bool? mentionEveryone = null,
+ bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null,
+ bool? moveMembers = null, bool? useVoiceActivation = null)
+ : this()
+ {
+ }
+ public ServerPermissions(uint rawValue)
+ : this()
+ {
+ }
+
+ public ServerPermissions Modify(ServerPermissions basePerms, bool? createInstantInvite = null, bool? manageRoles = null,
+ bool? kickMembers = null, bool? banMembers = null, bool? manageChannel = null, bool? manageServer = null,
+ bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null, bool? manageMessages = null,
+ bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null, bool? mentionEveryone = null,
+ bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null,
+ bool? moveMembers = null, bool? useVoiceActivation = null)
+ => default(ServerPermissions);
+ }
+}
diff --git a/ref/Entities/Permissions/TriStateChannelPermissions.cs b/ref/Entities/Permissions/TriStateChannelPermissions.cs
new file mode 100644
index 000000000..7a26bd185
--- /dev/null
+++ b/ref/Entities/Permissions/TriStateChannelPermissions.cs
@@ -0,0 +1,50 @@
+namespace Discord
+{
+ public struct TriStateChannelPermissions
+ {
+ public static TriStateChannelPermissions InheritAll { get; }
+
+ public uint AllowValue { get; }
+ public uint DenyValue { get; }
+
+ public PermValue CreateInstantInvite { get; }
+ public PermValue ManagePermissions { get; }
+ public PermValue ManageChannel { get; }
+ public PermValue ReadMessages { get; }
+ public PermValue SendMessages { get; }
+ public PermValue SendTTSMessages { get; }
+ public PermValue ManageMessages { get; }
+ public PermValue EmbedLinks { get; }
+ public PermValue AttachFiles { get; }
+ public PermValue ReadMessageHistory { get; }
+ public PermValue MentionEveryone { get; }
+
+ public PermValue Connect { get; }
+ public PermValue Speak { get; }
+ public PermValue MuteMembers { get; }
+ public PermValue DeafenMembers { get; }
+ public PermValue MoveMembers { get; }
+ public PermValue UseVoiceActivation { get; }
+
+ public TriStateChannelPermissions(PermValue? createInstantInvite = null, PermValue? managePermissions = null,
+ PermValue? manageChannel = null, PermValue? readMessages = null, PermValue? sendMessages = null, PermValue? sendTTSMessages = null,
+ PermValue? manageMessages = null, PermValue? embedLinks = null, PermValue? attachFiles = null, PermValue? readMessageHistory = null,
+ PermValue? mentionEveryone = null, PermValue? connect = null, PermValue? speak = null, PermValue? muteMembers = null, PermValue? deafenMembers = null,
+ PermValue? moveMembers = null, PermValue? useVoiceActivation = null)
+ : this()
+ {
+ }
+
+ public TriStateChannelPermissions(uint allow = 0, uint deny = 0)
+ : this()
+ {
+ }
+
+ public TriStateChannelPermissions Modify(PermValue? createInstantInvite = null, PermValue? managePermissions = null,
+ PermValue? manageChannel = null, PermValue? readMessages = null, PermValue? sendMessages = null, PermValue? sendTTSMessages = null,
+ PermValue? manageMessages = null, PermValue? embedLinks = null, PermValue? attachFiles = null, PermValue? readMessageHistory = null,
+ PermValue? mentionEveryone = null, PermValue? connect = null, PermValue? speak = null, PermValue? muteMembers = null, PermValue? deafenMembers = null,
+ PermValue? moveMembers = null, PermValue? useVoiceActivation = null)
+ => default(TriStateChannelPermissions);
+ }
+}
diff --git a/ref/Entities/Profile.cs b/ref/Entities/Profile.cs
new file mode 100644
index 000000000..067a58988
--- /dev/null
+++ b/ref/Entities/Profile.cs
@@ -0,0 +1,23 @@
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class Profile : IModel
+ {
+ public DiscordClient Client { get; }
+
+ public ulong Id { get; }
+ public string AvatarId { get; }
+ public string AvatarUrl { get; }
+ public ushort Discriminator { get; }
+ public string CurrentGame { get; }
+ public UserStatus Status { get; }
+ public string Mention { get; }
+ public string Email { get; }
+ public bool? IsVerified { get; }
+
+ public string Name { get; set; }
+
+ public Task Save() => null;
+ }
+}
diff --git a/ref/Entities/Region.cs b/ref/Entities/Region.cs
new file mode 100644
index 000000000..5b0354048
--- /dev/null
+++ b/ref/Entities/Region.cs
@@ -0,0 +1,20 @@
+namespace Discord
+{
+ public class Region
+ {
+ public string Id { get; }
+ public string Name { get; }
+ public string Hostname { get; }
+ public int Port { get; }
+ public bool Vip { get; }
+
+ internal Region(string id, string name, string hostname, int port, bool vip)
+ {
+ Id = id;
+ Name = name;
+ Hostname = hostname;
+ Port = port;
+ Vip = vip;
+ }
+ }
+}
diff --git a/ref/Entities/Role.cs b/ref/Entities/Role.cs
new file mode 100644
index 000000000..ae2c92988
--- /dev/null
+++ b/ref/Entities/Role.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class Role : IModel, IMentionable
+ {
+ public DiscordClient Client { get; }
+
+ public ulong Id { get; }
+ public Server Server { get; }
+
+ public string Name { get; }
+ public bool IsHoisted { get; }
+ public int Position { get; }
+ public bool IsManaged { get; }
+ public ServerPermissions Permissions { get; }
+ public Color Color { get; }
+
+ public bool IsEveryone { get; }
+ public IEnumerable Members { get; }
+
+ public string Mention { get; }
+
+ public Task Delete() => null;
+
+ public Task Save() => null;
+ }
+}
diff --git a/ref/Entities/Server.cs b/ref/Entities/Server.cs
new file mode 100644
index 000000000..75b98d979
--- /dev/null
+++ b/ref/Entities/Server.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class Server : IModel
+ {
+ public class Emoji
+ {
+ public string Id { get; }
+ public string Name { get; }
+ public bool IsManaged { get; }
+ public bool RequireColons { get; }
+ public IEnumerable Roles { get; }
+ }
+
+ public ulong Id { get; }
+ public User CurrentUser { get; }
+ public string IconId { get; }
+ public string SplashId { get; }
+ public string IconUrl { get; }
+ public string SplashUrl { get; }
+ public int ChannelCount { get; }
+ public int UserCount { get; }
+ public int RoleCount { get; }
+ public TextChannel DefaultChannel { get; }
+ public Role EveryoneRole { get; }
+ public IEnumerable Features { get; }
+ public IEnumerable CustomEmojis { get; }
+ public IEnumerable Channels { get; }
+ public IEnumerable TextChannels { get; }
+ public IEnumerable VoiceChannels { get; }
+ public IEnumerable Users { get; }
+ public IEnumerable Roles { get; }
+
+ public string Name { get; set; }
+ public Region Region { get; set; }
+ public int AFKTimeout { get; set; }
+ public DateTime JoinedAt { get; set; }
+ public User Owner { get; set; }
+ public VoiceChannel AFKChannel { get; set; }
+
+ public IPublicChannel GetChannel(ulong id) => null;
+ public IPublicChannel GetChannel(string mention) => null;
+ public Role GetRole(ulong id) => null;
+ public User GetUser(ulong id) => null;
+ public User GetUser(string name, ushort discriminator) => null;
+ public User GetUser(string mention) => null;
+ public Task> DownloadBans() => null;
+ public Task> DownloadInvites() => null;
+
+ public Task Leave() => null;
+ public Task Delete() => null;
+ public Task Save() => null;
+
+ public Task CreateChannel(string name, ChannelType type) => null;
+ public Task CreateInvite(int? maxAge = 1800, int? maxUses = null, bool tempMembership = false, bool withXkcd = false) => null;
+ public Task CreateRole(string name, ServerPermissions? permissions = null, Color color = null, bool isHoisted = false) => null;
+
+ public Task Ban(User user, int pruneDays = 0) => null;
+ public Task Unban(User user) => null;
+ public Task Unban(ulong userId) => null;
+
+ public Task ReorderChannels(IEnumerable channels) => null;
+ public Task ReorderRoles(IEnumerable roles, Role after = null) => null;
+
+ public Task PruneUsers(int days = 30, bool simulate = false) => null;
+ }
+}
diff --git a/ref/Entities/User.cs b/ref/Entities/User.cs
new file mode 100644
index 000000000..4bef43605
--- /dev/null
+++ b/ref/Entities/User.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ public class User : IModel
+ {
+ public DiscordClient Client { get; }
+
+ public ulong Id { get; }
+ public Server Server { get; }
+
+ public string Name { get; }
+ public ushort Discriminator { get; }
+ public string AvatarId { get; }
+ public string CurrentGame { get; }
+ public UserStatus Status { get; }
+ public DateTime JoinedAt { get; }
+ public DateTime? LastActivityAt { get; }
+
+ public Channel PrivateChannel => null;
+ public string Mention => null;
+ public bool IsSelfMuted => false;
+ public bool IsSelfDeafened => false;
+ public bool IsServerMuted => false;
+ public bool IsServerDeafened => false;
+ public bool IsServerSuppressed => false;
+ public DateTime? LastOnlineAt => null;
+ public Channel VoiceChannel => null;
+ public string AvatarUrl => null;
+ public IEnumerable Roles => null;
+
+ public IEnumerable Channels => null;
+
+ public Task Kick() => null;
+
+ public ServerPermissions ServerPermissions => default(ServerPermissions);
+ public ChannelPermissions GetPermissions(Channel channel) => default(ChannelPermissions);
+
+ public Task CreatePMChannel() => null;
+
+ public Task SendMessage(string text) => null;
+ public Task SendFile(string filePath) => null;
+ public Task SendFile(string filename, Stream stream) => null;
+
+ public bool HasRole(Role role) => false;
+
+ public Task AddRoles(params Role[] roles) => null;
+ public Task RemoveRoles(params Role[] roles) => null;
+
+ public Task Save() => null;
+ }
+}
\ No newline at end of file
diff --git a/ref/Enums/ChannelType.cs b/ref/Enums/ChannelType.cs
new file mode 100644
index 000000000..84491070b
--- /dev/null
+++ b/ref/Enums/ChannelType.cs
@@ -0,0 +1,8 @@
+namespace Discord
+{
+ public enum ChannelType
+ {
+ Text,
+ Voice
+ }
+}
diff --git a/ref/Enums/ConnectionState.cs b/ref/Enums/ConnectionState.cs
new file mode 100644
index 000000000..dfd4ac9eb
--- /dev/null
+++ b/ref/Enums/ConnectionState.cs
@@ -0,0 +1,10 @@
+namespace Discord
+{
+ public enum ConnectionState
+ {
+ Disconnected,
+ Connecting,
+ Connected,
+ Disconnecting
+ }
+}
diff --git a/ref/Enums/ImageType.cs b/ref/Enums/ImageType.cs
new file mode 100644
index 000000000..738c67a3d
--- /dev/null
+++ b/ref/Enums/ImageType.cs
@@ -0,0 +1,9 @@
+namespace Discord
+{
+ public enum ImageType
+ {
+ None,
+ Jpeg,
+ Png
+ }
+}
diff --git a/ref/Enums/LogSeverity.cs b/ref/Enums/LogSeverity.cs
new file mode 100644
index 000000000..879aecd09
--- /dev/null
+++ b/ref/Enums/LogSeverity.cs
@@ -0,0 +1,11 @@
+namespace Discord
+{
+ public enum LogSeverity
+ {
+ Error = 1,
+ Warning = 2,
+ Info = 3,
+ Verbose = 4,
+ Debug = 5
+ }
+}
diff --git a/ref/Enums/MessageState.cs b/ref/Enums/MessageState.cs
new file mode 100644
index 000000000..59f65614d
--- /dev/null
+++ b/ref/Enums/MessageState.cs
@@ -0,0 +1,18 @@
+namespace Discord
+{
+ public enum MessageState : byte
+ {
+ /// Message did not originate from this session, or was successfully sent.
+ Normal = 0,
+ /// Message is current queued.
+ Queued,
+ /// Message was deleted.
+ Deleted,
+ /// Message was deleted before it was sent.
+ Aborted,
+ /// Message failed to be sent.
+ Failed,
+ /// Message has been removed from cache and will no longer receive updates.
+ Detached
+ }
+}
diff --git a/ref/Enums/PermValue.cs b/ref/Enums/PermValue.cs
new file mode 100644
index 000000000..fe048b016
--- /dev/null
+++ b/ref/Enums/PermValue.cs
@@ -0,0 +1,9 @@
+namespace Discord
+{
+ public enum PermValue
+ {
+ Allow,
+ Deny,
+ Inherit
+ }
+}
diff --git a/ref/Enums/PermissionBits.cs b/ref/Enums/PermissionBits.cs
new file mode 100644
index 000000000..b5acab73f
--- /dev/null
+++ b/ref/Enums/PermissionBits.cs
@@ -0,0 +1,31 @@
+namespace Discord
+{
+ internal enum PermissionBits
+ {
+ //General
+ CreateInstantInvite = 0,
+ KickMembers = 1,
+ BanMembers = 2,
+ ManageRolesOrPermissions = 3,
+ ManageChannel = 4,
+ ManageServer = 5,
+
+ //Text
+ ReadMessages = 10,
+ SendMessages = 11,
+ SendTTSMessages = 12,
+ ManageMessages = 13,
+ EmbedLinks = 14,
+ AttachFiles = 15,
+ ReadMessageHistory = 16,
+ MentionEveryone = 17,
+
+ //Voice
+ Connect = 20,
+ Speak = 21,
+ MuteMembers = 22,
+ DeafenMembers = 23,
+ MoveMembers = 24,
+ UseVoiceActivation = 25
+ }
+}
diff --git a/ref/Enums/PermissionTarget.cs b/ref/Enums/PermissionTarget.cs
new file mode 100644
index 000000000..96595fb69
--- /dev/null
+++ b/ref/Enums/PermissionTarget.cs
@@ -0,0 +1,8 @@
+namespace Discord
+{
+ public enum PermissionTarget
+ {
+ Role,
+ User
+ }
+}
diff --git a/ref/Enums/Relative.cs b/ref/Enums/Relative.cs
new file mode 100644
index 000000000..aade047d1
--- /dev/null
+++ b/ref/Enums/Relative.cs
@@ -0,0 +1,8 @@
+namespace Discord
+{
+ public enum Relative
+ {
+ Before,
+ After
+ }
+}
diff --git a/ref/Enums/UserStatus.cs b/ref/Enums/UserStatus.cs
new file mode 100644
index 000000000..f2fdfda7c
--- /dev/null
+++ b/ref/Enums/UserStatus.cs
@@ -0,0 +1,9 @@
+namespace Discord
+{
+ public enum UserStatus
+ {
+ Online,
+ Idle,
+ Offline
+ }
+}
diff --git a/ref/Events/ChannelEventArgs.cs b/ref/Events/ChannelEventArgs.cs
new file mode 100644
index 000000000..cafdf2fa7
--- /dev/null
+++ b/ref/Events/ChannelEventArgs.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Discord
+{
+ public class ChannelEventArgs : EventArgs
+ {
+ public Channel Channel => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/ChannelUpdatedEventArgs.cs b/ref/Events/ChannelUpdatedEventArgs.cs
new file mode 100644
index 000000000..bc93ba7ae
--- /dev/null
+++ b/ref/Events/ChannelUpdatedEventArgs.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Discord
+{
+ public class ChannelUpdatedEventArgs : EventArgs
+ {
+ public Channel Before => null;
+ public Channel After => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/ChannelUserEventArgs.cs b/ref/Events/ChannelUserEventArgs.cs
new file mode 100644
index 000000000..a17856e82
--- /dev/null
+++ b/ref/Events/ChannelUserEventArgs.cs
@@ -0,0 +1,8 @@
+namespace Discord
+{
+ public class ChannelUserEventArgs
+ {
+ public Channel Channel => null;
+ public User User => null;
+ }
+}
diff --git a/ref/Events/DisconnectedEventArgs.cs b/ref/Events/DisconnectedEventArgs.cs
new file mode 100644
index 000000000..616f3f09d
--- /dev/null
+++ b/ref/Events/DisconnectedEventArgs.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Discord
+{
+ public class DisconnectedEventArgs : EventArgs
+ {
+ public bool WasUnexpected => false;
+ public Exception Exception => null;
+ }
+}
diff --git a/ref/Events/LogMessageEventArgs.cs b/ref/Events/LogMessageEventArgs.cs
new file mode 100644
index 000000000..7dec182d1
--- /dev/null
+++ b/ref/Events/LogMessageEventArgs.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Discord
+{
+ public class LogMessageEventArgs : EventArgs
+ {
+ public LogSeverity Severity => default(LogSeverity);
+ public string Source => null;
+ public string Message => null;
+ public Exception Exception => null;
+ }
+}
diff --git a/ref/Events/MessageEventArgs.cs b/ref/Events/MessageEventArgs.cs
new file mode 100644
index 000000000..98eeb4f9d
--- /dev/null
+++ b/ref/Events/MessageEventArgs.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Discord
+{
+ public class MessageEventArgs : EventArgs
+ {
+ public Message Message => null;
+ public User User => null;
+ public Channel Channel => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/MessageUpdatedEventArgs.cs b/ref/Events/MessageUpdatedEventArgs.cs
new file mode 100644
index 000000000..d529907a4
--- /dev/null
+++ b/ref/Events/MessageUpdatedEventArgs.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace Discord
+{
+ public class MessageUpdatedEventArgs : EventArgs
+ {
+ public Message Before => null;
+ public Message After => null;
+ public User User => null;
+ public Channel Channel => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/ProfileUpdatedEventArgs.cs b/ref/Events/ProfileUpdatedEventArgs.cs
new file mode 100644
index 000000000..dba55af3b
--- /dev/null
+++ b/ref/Events/ProfileUpdatedEventArgs.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Discord
+{
+ public class ProfileUpdatedEventArgs : EventArgs
+ {
+ public Profile Before => null;
+ public Profile After => null;
+ }
+}
diff --git a/ref/Events/RoleEventArgs.cs b/ref/Events/RoleEventArgs.cs
new file mode 100644
index 000000000..db1d09cbc
--- /dev/null
+++ b/ref/Events/RoleEventArgs.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Discord
+{
+ public class RoleEventArgs : EventArgs
+ {
+ public Role Role => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/RoleUpdatedEventArgs.cs b/ref/Events/RoleUpdatedEventArgs.cs
new file mode 100644
index 000000000..1fa0f2a81
--- /dev/null
+++ b/ref/Events/RoleUpdatedEventArgs.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Discord
+{
+ public class RoleUpdatedEventArgs : EventArgs
+ {
+ public Role Before => null;
+ public Role After => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/ServerEventArgs.cs b/ref/Events/ServerEventArgs.cs
new file mode 100644
index 000000000..b06993de9
--- /dev/null
+++ b/ref/Events/ServerEventArgs.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Discord
+{
+ public class ServerEventArgs : EventArgs
+ {
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/ServerUpdatedEventArgs.cs b/ref/Events/ServerUpdatedEventArgs.cs
new file mode 100644
index 000000000..1e05f1721
--- /dev/null
+++ b/ref/Events/ServerUpdatedEventArgs.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Discord
+{
+ public class ServerUpdatedEventArgs : EventArgs
+ {
+ public Server Before => null;
+ public Server After => null;
+ }
+}
diff --git a/ref/Events/UserEventArgs.cs b/ref/Events/UserEventArgs.cs
new file mode 100644
index 000000000..4ff745307
--- /dev/null
+++ b/ref/Events/UserEventArgs.cs
@@ -0,0 +1,9 @@
+using System;
+namespace Discord
+{
+ public class UserEventArgs : EventArgs
+ {
+ public User User => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Events/UserUpdatedEventArgs.cs b/ref/Events/UserUpdatedEventArgs.cs
new file mode 100644
index 000000000..c5b2b0acd
--- /dev/null
+++ b/ref/Events/UserUpdatedEventArgs.cs
@@ -0,0 +1,10 @@
+using System;
+namespace Discord
+{
+ public class UserUpdatedEventArgs : EventArgs
+ {
+ public User Before => null;
+ public User After => null;
+ public Server Server => null;
+ }
+}
diff --git a/ref/Format.cs b/ref/Format.cs
new file mode 100644
index 000000000..e30931ae9
--- /dev/null
+++ b/ref/Format.cs
@@ -0,0 +1,14 @@
+namespace Discord
+{
+ public static class Format
+ {
+ public static string Escape(string text) => null;
+
+ public static string Bold(string text, bool escape = true) => null;
+ public static string Italics(string text, bool escape = true) => null;
+ public static string Underline(string text, bool escape = true) => null;
+ public static string Strikeout(string text, bool escape = true) => null;
+
+ public static string Code(string text, string language = null) => null;
+ }
+}
diff --git a/ref/ILogger.cs b/ref/ILogger.cs
new file mode 100644
index 000000000..a3123edc9
--- /dev/null
+++ b/ref/ILogger.cs
@@ -0,0 +1,30 @@
+using System;
+
+namespace Discord.Logging
+{
+ public interface ILogger
+ {
+ LogSeverity Level { get; }
+
+ void Log(LogSeverity severity, string message, Exception exception = null);
+ void Error(string message, Exception exception = null);
+ void Error(Exception exception);
+ void Warning(string message, Exception exception = null);
+ void Warning(Exception exception);
+ void Info(string message, Exception exception = null);
+ void Info(Exception exception);
+ void Verbose(string message, Exception exception = null);
+ void Verbose(Exception exception);
+ void Debug(string message, Exception exception = null);
+ void Debug(Exception exception);
+
+#if DOTNET5_4
+ void Log(LogSeverity severity, FormattableString message, Exception exception = null);
+ void Error(FormattableString message, Exception exception = null);
+ void Warning(FormattableString message, Exception exception = null);
+ void Info(FormattableString message, Exception exception = null);
+ void Verbose(FormattableString message, Exception exception = null);
+ void Debug(FormattableString message, Exception exception = null);
+#endif
+ }
+}
diff --git a/ref/MessageQueue.cs b/ref/MessageQueue.cs
new file mode 100644
index 000000000..e909bdacf
--- /dev/null
+++ b/ref/MessageQueue.cs
@@ -0,0 +1,9 @@
+namespace Discord.Net
+{
+ public class MessageQueue
+ {
+ public int Count { get; }
+
+ public void Clear() { }
+ }
+}
diff --git a/ref/Net/HttpException.cs b/ref/Net/HttpException.cs
new file mode 100644
index 000000000..3704ffb83
--- /dev/null
+++ b/ref/Net/HttpException.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Net;
+
+namespace Discord.Net
+{
+ public class HttpException : Exception
+ {
+ public HttpStatusCode StatusCode { get; }
+
+ public HttpException(HttpStatusCode statusCode)
+ : base($"The server responded with error {(int)statusCode} ({statusCode})")
+ {
+ StatusCode = statusCode;
+ }
+ }
+}
diff --git a/ref/Net/Rest/CompletedRequestEventArgs.cs b/ref/Net/Rest/CompletedRequestEventArgs.cs
new file mode 100644
index 000000000..ed9d1673f
--- /dev/null
+++ b/ref/Net/Rest/CompletedRequestEventArgs.cs
@@ -0,0 +1,17 @@
+namespace Discord.Net.Rest
+{
+ public class CompletedRequestEventArgs : RequestEventArgs
+ {
+ public object Response { get; set; }
+ public string ResponseJson { get; set; }
+ public double Milliseconds { get; set; }
+
+ public CompletedRequestEventArgs(IRestRequest request, object response, string responseJson, double milliseconds)
+ : base(request)
+ {
+ Response = response;
+ ResponseJson = responseJson;
+ Milliseconds = milliseconds;
+ }
+ }
+}
diff --git a/ref/Net/Rest/IRestRequest.cs b/ref/Net/Rest/IRestRequest.cs
new file mode 100644
index 000000000..bb8083103
--- /dev/null
+++ b/ref/Net/Rest/IRestRequest.cs
@@ -0,0 +1,23 @@
+namespace Discord.Net.Rest
+{
+ public interface IRestRequest
+ {
+ string Method { get; }
+ string Endpoint { get; }
+ object Payload { get; }
+ }
+ public interface IRestRequest : IRestRequest
+ where ResponseT : class
+ {
+ }
+
+ public interface IRestFileRequest : IRestRequest
+ {
+ string Filename { get; }
+ Stream Stream { get; }
+ }
+ public interface IRestFileRequest : IRestFileRequest, IRestRequest
+ where ResponseT : class
+ {
+ }
+}
diff --git a/ref/Net/Rest/RequestEventArgs.cs b/ref/Net/Rest/RequestEventArgs.cs
new file mode 100644
index 000000000..cac734fc6
--- /dev/null
+++ b/ref/Net/Rest/RequestEventArgs.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Discord.Net.Rest
+{
+ public class RequestEventArgs : EventArgs
+ {
+ public IRestRequest Request { get; set; }
+ public bool Cancel { get; set; }
+
+ public RequestEventArgs(IRestRequest request) { }
+ }
+}
diff --git a/ref/Net/Rest/RestClient.cs b/ref/Net/Rest/RestClient.cs
new file mode 100644
index 000000000..33de1e9a4
--- /dev/null
+++ b/ref/Net/Rest/RestClient.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Discord.Net.Rest
+{
+ public abstract partial class RestClient
+ {
+ public event EventHandler SendingRequest = delegate { };
+ public event EventHandler SentRequest = delegate { };
+
+ public CancellationToken CancelToken { get; set; }
+ public string Token { get; set; }
+
+ public Task Send(IRestRequest request)
+ where ResponseT : class
+ => null;
+ public Task Send(IRestRequest request) => null;
+
+ public Task Send(IRestFileRequest request)
+ where ResponseT : class
+ => null;
+ public Task Send(IRestFileRequest request) => null;
+ }
+}
diff --git a/ref/Net/TimeoutException.cs b/ref/Net/TimeoutException.cs
new file mode 100644
index 000000000..d1a644049
--- /dev/null
+++ b/ref/Net/TimeoutException.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Discord.Net
+{
+ public class TimeoutException : OperationCanceledException
+ {
+ public TimeoutException() { }
+ }
+}
diff --git a/ref/Net/WebSocketException.cs b/ref/Net/WebSocketException.cs
new file mode 100644
index 000000000..df6377e13
--- /dev/null
+++ b/ref/Net/WebSocketException.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Discord.Net
+{
+ public class WebSocketException : Exception
+ {
+ public int Code { get; }
+ public string Reason { get; }
+
+ public WebSocketException(int code, string reason) { }
+ }
+}
diff --git a/ref/Net/WebSockets/BinaryMessageEventArgs.cs b/ref/Net/WebSockets/BinaryMessageEventArgs.cs
new file mode 100644
index 000000000..3fd4425fa
--- /dev/null
+++ b/ref/Net/WebSockets/BinaryMessageEventArgs.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Discord.Net.WebSockets
+{
+ public class BinaryMessageEventArgs : EventArgs
+ {
+ public byte[] Data { get; }
+
+ public BinaryMessageEventArgs(byte[] data) { }
+ }
+}
diff --git a/ref/Net/WebSockets/GatewaySocket.cs b/ref/Net/WebSockets/GatewaySocket.cs
new file mode 100644
index 000000000..65ec02fad
--- /dev/null
+++ b/ref/Net/WebSockets/GatewaySocket.cs
@@ -0,0 +1,31 @@
+using Discord.Logging;
+using Discord.Net.Rest;
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Discord.Net.WebSockets
+{
+ public class GatewaySocket : WebSocket
+ {
+ public string SessionId { get; private set; }
+
+ public event EventHandler ReceivedDispatch = delegate { };
+
+ public GatewaySocket(DiscordConfig config, ILogger logger) : base(config, logger) { }
+
+ public Task Connect(RestClient rest, CancellationToken parentCancelToken) => null;
+ public Task Disconnect() => null;
+
+ public void SendIdentify(string token) { }
+
+ public void SendResume() { }
+ public override void SendHeartbeat() { }
+ public void SendUpdateStatus(long? idleSince, string gameName) { }
+ public void SendUpdateVoice(ulong? serverId, ulong? channelId, bool isSelfMuted, bool isSelfDeafened) { }
+ public void SendRequestMembers(IEnumerable serverId, string query, int limit) { }
+
+ public override void WaitForConnection(CancellationToken cancelToken) { }
+ }
+}
diff --git a/ref/Net/WebSockets/IWebSocketEngine.cs b/ref/Net/WebSockets/IWebSocketEngine.cs
new file mode 100644
index 000000000..68f31f12b
--- /dev/null
+++ b/ref/Net/WebSockets/IWebSocketEngine.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Discord.Net.WebSockets
+{
+ public interface IWebSocketEngine
+ {
+ event EventHandler BinaryMessage;
+ event EventHandler TextMessage;
+
+ Task Connect(string host, CancellationToken cancelToken);
+ Task Disconnect();
+ void QueueMessage(string message);
+ IEnumerable GetTasks(CancellationToken cancelToken);
+ }
+}
diff --git a/ref/Net/WebSockets/TextMessageEventArgs.cs b/ref/Net/WebSockets/TextMessageEventArgs.cs
new file mode 100644
index 000000000..e4e186044
--- /dev/null
+++ b/ref/Net/WebSockets/TextMessageEventArgs.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Discord.Net.WebSockets
+{
+ public class TextMessageEventArgs : EventArgs
+ {
+ public string Message { get; }
+
+ public TextMessageEventArgs(string msg) { Message = msg; }
+ }
+}
diff --git a/ref/Net/WebSockets/WebSocket.cs b/ref/Net/WebSockets/WebSocket.cs
new file mode 100644
index 000000000..1257f2474
--- /dev/null
+++ b/ref/Net/WebSockets/WebSocket.cs
@@ -0,0 +1,22 @@
+using Discord.Logging;
+using System;
+using System.Threading;
+
+namespace Discord.Net.WebSockets
+{
+ public abstract partial class WebSocket
+ {
+ public CancellationToken CancelToken { get; }
+ public ConnectionState State { get; }
+ public string Host { get; }
+
+ public event EventHandler Connected = delegate { };
+ public event EventHandler Disconnected = delegate { };
+
+ public WebSocket(DiscordConfig config, ILogger logger) { }
+
+ public abstract void SendHeartbeat();
+
+ public virtual void WaitForConnection(CancellationToken cancelToken) { }
+ }
+}
diff --git a/ref/Net/WebSockets/WebSocketEventEventArgs.cs b/ref/Net/WebSockets/WebSocketEventEventArgs.cs
new file mode 100644
index 000000000..a0c60edcf
--- /dev/null
+++ b/ref/Net/WebSockets/WebSocketEventEventArgs.cs
@@ -0,0 +1,17 @@
+using Newtonsoft.Json.Linq;
+using System;
+
+namespace Discord.Net.WebSockets
+{
+ public class WebSocketEventEventArgs : EventArgs
+ {
+ public string Type { get; }
+ public JToken Payload { get; }
+
+ internal WebSocketEventEventArgs(string type, JToken data)
+ {
+ Type = type;
+ Payload = data;
+ }
+ }
+}
diff --git a/ref/project.json b/ref/project.json
new file mode 100644
index 000000000..565bc2e86
--- /dev/null
+++ b/ref/project.json
@@ -0,0 +1,81 @@
+{
+ "version": "0.9.0-rc3-3",
+ "description": "An unofficial .Net API wrapper for the Discord client.",
+ "authors": [
+ "RogueException"
+ ],
+ "tags": [
+ "discord",
+ "discordapp"
+ ],
+ "projectUrl": "https://github.com/RogueException/Discord.Net",
+ "licenseUrl": "http://opensource.org/licenses/MIT",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/RogueException/Discord.Net"
+ },
+ "compile": [ "**/*.cs", "../Discord.Net.Shared/*.cs" ],
+
+ "compilationOptions": {
+ "allowUnsafe": true,
+ "warningsAsErrors": true
+ },
+
+ "configurations": {
+ "TestResponses": {
+ "compilationOptions": {
+ "define": [
+ "DEBUG",
+ "TRACE",
+ "TEST_RESPONSES"
+ ]
+ }
+ }
+ },
+
+ "dependencies": {
+ "Newtonsoft.Json": "8.0.1",
+ "Nito.AsyncEx": "3.0.1"
+ },
+
+ "frameworks": {
+ "dotnet5.4": {
+ "dependencies": {
+ "System.Collections": "4.0.11-beta-23516",
+ "System.Collections.Concurrent": "4.0.11-beta-23516",
+ "System.Dynamic.Runtime": "4.0.11-beta-23516",
+ "System.IO.FileSystem": "4.0.1-beta-23516",
+ "System.IO.Compression": "4.1.0-beta-23516",
+ "System.Linq": "4.0.1-beta-23516",
+ "System.Net.Http": "4.0.1-beta-23516",
+ "System.Net.NameResolution": "4.0.0-beta-23516",
+ "System.Net.Sockets": "4.1.0-beta-23409",
+ "System.Net.Requests": "4.0.11-beta-23516",
+ "System.Net.WebSockets.Client": "4.0.0-beta-23516",
+ "System.Reflection": "4.1.0-beta-23516",
+ "System.Reflection.Emit.Lightweight": "4.0.1-beta-23516",
+ "System.Runtime.InteropServices": "4.0.21-beta-23516",
+ "System.Runtime.Serialization.Primitives": "4.1.0-beta-23516",
+ "System.Security.Cryptography.Algorithms": "4.0.0-beta-23516",
+ "System.Text.RegularExpressions": "4.0.11-beta-23516",
+ "System.Threading": "4.0.11-beta-23516"
+ }
+ },
+ "net45": {
+ "frameworkAssemblies": {
+ "System.Runtime": {
+ "type": "build",
+ "version": ""
+ },
+ "System.Threading.Tasks": {
+ "type": "build",
+ "version": ""
+ }
+ },
+ "dependencies": {
+ "WebSocket4Net": "0.14.1",
+ "RestSharp": "105.2.3"
+ }
+ }
+ }
+}
\ No newline at end of file