diff --git a/Maki/Discord.cs b/Maki/Discord.cs
index 9aff807..ccb6acc 100644
--- a/Maki/Discord.cs
+++ b/Maki/Discord.cs
@@ -34,21 +34,30 @@ namespace Maki
///
public DiscordTokenType TokenType = DiscordTokenType.Bot;
+ #region Token
+
///
/// Discord token
///
- public string Token = string.Empty;
+ public string Token {
+ get => token;
+
+ set
+ {
+ token = value;
+ WebRequest.Authorisation = (IsBot ? "Bot " : string.Empty) + token;
+ }
+ }
+
+ private string token = string.Empty;
+
+ #endregion
///
/// Gateway Url
///
internal string Gateway { get; private set; }
- ///
- /// Rest API request client
- ///
- internal readonly RestClient RestClient;
-
///
/// Gateway shard client
///
@@ -209,7 +218,6 @@ namespace Maki
public Discord(DiscordParams parameters = null)
{
Params = parameters ?? new DiscordParams();
- RestClient = new RestClient(this);
ShardClient = new GatewayShardClient(this);
#region Assigning event handlers
@@ -268,15 +276,22 @@ namespace Maki
{
ClearContainers();
- RestResponse gateway = RestClient.Request(
- RestRequestMethod.GET,
- IsBot ? RestEndpoints.GatewayBot : RestEndpoints.Gateway
- );
+ int shards = 1;
- if (gateway.ErrorCode != RestErrorCode.Ok)
- throw new DiscordException($"{gateway.ErrorCode}: {gateway.ErrorMessage}");
+ using (WebRequest wr = new WebRequest(HttpMethod.GET, IsBot ? RestEndpoints.GatewayBot : RestEndpoints.Gateway))
+ {
+ wr.Perform();
- Gateway = gateway.Response.Url;
+ if (wr.Status != 200)
+ throw new DiscordException("Failed to retrieve gateway url, is your token valid?");
+
+ GatewayInfo gi = wr.ResponseJson();
+
+ Gateway = gi.Url;
+
+ if (gi.Shards.HasValue)
+ shards = gi.Shards.Value;
+ }
if (Gateway.Contains("?"))
Gateway = Gateway.Substring(0, Gateway.IndexOf('?'));
@@ -284,8 +299,6 @@ namespace Maki
if (!Gateway.EndsWith("/"))
Gateway += "/";
- int shards = gateway.Response.Shards ?? 1;
-
for (int i = 0; i < shards; i++)
ShardClient.Create(i);
}
@@ -298,54 +311,64 @@ namespace Maki
/// Multi factor authentication token
public void Connect(string email, string password, string code = null)
{
- TokenType = DiscordTokenType.User;
+ // TODO: not tested with new request backend yet
- RestResponse login = RestClient.Request(
- RestRequestMethod.POST,
- RestEndpoints.AuthLogin,
- new LoginRequest
+ TokenType = DiscordTokenType.User;
+ LoginResponse login;
+
+ using (WebRequest wr = new WebRequest(HttpMethod.POST, RestEndpoints.AuthLogin))
+ {
+ wr.AddJson(new LoginRequest
{
Email = email,
Password = password,
- }
- );
+ });
+ wr.Perform();
- if (login.ErrorCode != RestErrorCode.Ok)
- throw new DiscordException($"{login.ErrorCode}: {login.ErrorMessage}");
+ if (wr.Response.Length < 1)
+ throw new DiscordException("Login failed");
- if (login.Response.UsernameError?.Length > 0)
- throw new DiscordException(login.Response.UsernameError.FirstOrDefault());
+ login = wr.ResponseJson();
+ }
- if (login.Response.PasswordError?.Length > 0)
- throw new DiscordException(login.Response.PasswordError.FirstOrDefault());
+ if (login.UsernameError?.Length > 0)
+ throw new DiscordException(login.UsernameError.FirstOrDefault());
- Token = login.Response.Token;
+ if (login.PasswordError?.Length > 0)
+ throw new DiscordException(login.PasswordError.FirstOrDefault());
+
+ Token = login.Token;
if (string.IsNullOrEmpty(Token))
{
- if (login.Response.MFA == true && !string.IsNullOrEmpty(login.Response.Ticket))
+ if (login.MFA == true && !string.IsNullOrEmpty(login.Ticket))
{
- RestResponse totp = RestClient.Request(
- RestRequestMethod.POST,
- RestEndpoints.AuthMfaTotp,
- new LoginMultiFactorAuth
+ using (WebRequest wr = new WebRequest(HttpMethod.POST, RestEndpoints.AuthMfaTotp))
+ {
+ wr.AddJson(new LoginMultiFactorAuth
{
Code = code,
- Ticket = login.Response.Ticket,
- }
- );
+ Ticket = login.Ticket,
+ });
+ wr.Perform();
- if (totp.ErrorCode != RestErrorCode.Ok)
- throw new DiscordException($"{totp.ErrorCode}: {totp.ErrorMessage}");
+ if (wr.Response.Length < 1)
+ throw new DiscordException("Multi factor auth failed");
- Token = totp.Response.Token;
+ login = wr.ResponseJson();
+ }
+
+ //if (totp.ErrorCode != RestErrorCode.Ok)
+ // throw new DiscordException($"{totp.ErrorCode}: {totp.ErrorMessage}");
+
+ Token = login.Token;
}
else
throw new DiscordException("Token was null but MFA is false and/or ticket is empty?");
}
if (string.IsNullOrEmpty(Token))
- throw new DiscordException("Authentication failed!");
+ throw new DiscordException("Authentication failed");
Connect();
}
@@ -468,6 +491,7 @@ namespace Maki
server.Name = guild.Name;
server.OwnerId = guild.OwnerId ?? 0;
server.IconHash = guild.IconHash;
+ server.Created = guild.Created ?? DateTime.MinValue;
}
if (guild.Channels != null)
@@ -693,20 +717,30 @@ namespace Maki
if (msg == null)
{
- RestResponse getMsg = RestClient.Request(RestRequestMethod.GET, RestEndpoints.ChannelMessage(message.ChannelId, message.Id));
- DiscordChannel channel = channels.Where(x => x.Id == getMsg.Response.ChannelId).FirstOrDefault();
- DiscordMember member = members.Where(x => x.User.Id == getMsg.Response.User.Id && (channel.Server == null || channel.Server == x.Server)).FirstOrDefault();
- msg = new DiscordMessage(this, getMsg.Response, channel, member);
+ using (WebRequest wr = new WebRequest(HttpMethod.GET, RestEndpoints.ChannelMessage(message.ChannelId, message.Id)))
+ {
+ wr.Perform();
+
+ if (wr.Status != 200 || wr.Response.Length < 1)
+ throw new DiscordException("Failed to load message from API");
+
+ message = wr.ResponseJson();
+ }
+
+ DiscordChannel channel = channels.Where(x => x.Id == message.ChannelId).FirstOrDefault();
+ DiscordMember member = members.Where(x => x.User.Id == message.User.Id && (channel.Server == null || channel.Server == x.Server)).FirstOrDefault();
+ msg = new DiscordMessage(this, message, channel, member);
messages.Add(msg);
+ } else
+ {
+ if (!string.IsNullOrEmpty(message.Content))
+ msg.Text = message.Content;
+
+ msg.IsPinned = message.IsPinned == true;
}
msg.Edited = DateTime.Now;
- if (!string.IsNullOrEmpty(message.Content))
- msg.Text = message.Content;
-
- msg.IsPinned = message.IsPinned == true;
-
OnMessageUpdate?.Invoke(msg);
}
diff --git a/Maki/DiscordChannel.cs b/Maki/DiscordChannel.cs
index a2b5dea..fe8ae57 100644
--- a/Maki/DiscordChannel.cs
+++ b/Maki/DiscordChannel.cs
@@ -2,6 +2,8 @@
using Maki.Structures.Channels;
using Maki.Structures.Messages;
using Maki.Structures.Rest;
+using Newtonsoft.Json;
+using System.IO;
namespace Maki
{
@@ -38,19 +40,41 @@ namespace Maki
Server = server;
}
- public DiscordMessage Send(string text = "", DiscordEmbed embed = null)
+ public DiscordMessage Send(Stream stream, string filename, string text = "", DiscordEmbed embed = null)
{
- RestResponse msg = client.RestClient.Request(
- RestRequestMethod.POST,
- RestEndpoints.ChannelMessages(Id),
- new MessageCreate
+ byte[] bytes = new byte[stream.Length];
+ stream.Read(bytes, 0, bytes.Length);
+ return Send(text, embed, filename, bytes);
+ }
+
+ public DiscordMessage Send(string text = "", DiscordEmbed embed = null, string filename = null, byte[] file = null)
+ {
+ Message? msg = null;
+
+ using (WebRequest wr = new WebRequest(HttpMethod.POST, RestEndpoints.ChannelMessages(Id)))
+ {
+ wr.AddParam("payload_json", JsonConvert.SerializeObject(new MessageCreate
{
Text = text,
Embed = embed?.ToStruct(),
- }
- );
+ }));
+
+ if (file != null && !string.IsNullOrEmpty(filename))
+ wr.AddFile(filename, file);
- DiscordMessage message = new DiscordMessage(client, msg.Response, this, client.members.Find(x => x.User.Id == msg.Response.User.Id));
+ wr.Perform();
+
+ if (wr.Status != 200 || wr.Response.Length < 1)
+ // TODO: elaborate
+ throw new DiscordException("Failed to send message");
+
+ msg = wr.ResponseJson();
+ }
+
+ if (!msg.HasValue)
+ throw new DiscordException("Empty response?");
+
+ DiscordMessage message = new DiscordMessage(client, msg.Value, this, client.members.Find(x => x.User.Id == msg.Value.User.Id));
client.messages.Add(message);
return message;
}
diff --git a/Maki/DiscordMember.cs b/Maki/DiscordMember.cs
index 60cff3f..1f3b959 100644
--- a/Maki/DiscordMember.cs
+++ b/Maki/DiscordMember.cs
@@ -44,7 +44,9 @@ namespace Maki
{
foreach (DiscordRole role in roles)
{
- client.RestClient.Request