@@ -3,8 +3,13 @@ using Newtonsoft.Json; | |||
namespace Discord.API.Client | |||
{ | |||
public class MemberVoiceState : MemberReference | |||
public class MemberVoiceState | |||
{ | |||
[JsonProperty("guild_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong GuildId { get; set; } | |||
[JsonProperty("user_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong UserId { get; set; } | |||
[JsonProperty("channel_id"), JsonConverter(typeof(NullableLongStringConverter))] | |||
public ulong? ChannelId { get; set; } | |||
[JsonProperty("session_id")] | |||
@@ -0,0 +1,23 @@ | |||
using Discord.API.Converters; | |||
using Newtonsoft.Json; | |||
namespace Discord.API.Client | |||
{ | |||
public class Role | |||
{ | |||
[JsonProperty("id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong Id { get; set; } | |||
[JsonProperty("permissions")] | |||
public uint? Permissions { get; set; } | |||
[JsonProperty("name")] | |||
public string Name { get; set; } | |||
[JsonProperty("position")] | |||
public int? Position { get; set; } | |||
[JsonProperty("hoist")] | |||
public bool? Hoist { get; set; } | |||
[JsonProperty("color")] | |||
public uint? Color { get; set; } | |||
[JsonProperty("managed")] | |||
public bool? Managed { get; set; } | |||
} | |||
} |
@@ -0,0 +1,12 @@ | |||
using Newtonsoft.Json; | |||
namespace Discord.API.Client | |||
{ | |||
public class User : UserReference | |||
{ | |||
[JsonProperty("email")] | |||
public string Email { get; set; } | |||
[JsonProperty("verified")] | |||
public bool? IsVerified { get; set; } | |||
} | |||
} |
@@ -6,8 +6,8 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class GuildBanAddEvent | |||
{ | |||
[JsonProperty("guild_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong GuildId { get; } | |||
public ulong GuildId { get; set; } | |||
[JsonProperty("user_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong UserId { get; } | |||
public ulong UserId { get; set; } | |||
} | |||
} |
@@ -6,8 +6,8 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class GuildBanRemoveEvent | |||
{ | |||
[JsonProperty("guild_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong GuildId { get; } | |||
public ulong GuildId { get; set; } | |||
[JsonProperty("user_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong UserId { get; } | |||
public ulong UserId { get; set; } | |||
} | |||
} |
@@ -6,8 +6,8 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class GuildRoleCreateEvent | |||
{ | |||
[JsonProperty("guild_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong GuildId { get; } | |||
public ulong GuildId { get; set; } | |||
[JsonProperty("role")] | |||
public Role Data { get; } | |||
public Role Data { get; set; } | |||
} | |||
} |
@@ -6,8 +6,8 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class GuildRoleUpdateEvent | |||
{ | |||
[JsonProperty("guild_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong GuildId { get; } | |||
public ulong GuildId { get; set; } | |||
[JsonProperty("role")] | |||
public Role Data { get; } | |||
public Role Data { get; set; } | |||
} | |||
} |
@@ -7,26 +7,26 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class ReadState | |||
{ | |||
[JsonProperty("id")] | |||
public string ChannelId { get; } | |||
public string ChannelId { get; set; } | |||
[JsonProperty("mention_count")] | |||
public int MentionCount { get; } | |||
public int MentionCount { get; set; } | |||
[JsonProperty("last_message_id")] | |||
public string LastMessageId { get; } | |||
public string LastMessageId { get; set; } | |||
} | |||
[JsonProperty("v")] | |||
public int Version { get; } | |||
public int Version { get; set; } | |||
[JsonProperty("user")] | |||
public User User { get; } | |||
public User User { get; set; } | |||
[JsonProperty("session_id")] | |||
public string SessionId { get; } | |||
public string SessionId { get; set; } | |||
[JsonProperty("read_state")] | |||
public ReadState[] ReadStates { get; } | |||
public ReadState[] ReadStates { get; set; } | |||
[JsonProperty("guilds")] | |||
public ExtendedGuild[] Guilds { get; } | |||
public ExtendedGuild[] Guilds { get; set; } | |||
[JsonProperty("private_channels")] | |||
public Channel[] PrivateChannels { get; } | |||
public Channel[] PrivateChannels { get; set; } | |||
[JsonProperty("heartbeat_interval")] | |||
public int HeartbeatInterval { get; } | |||
public int HeartbeatInterval { get; set; } | |||
} | |||
} |
@@ -5,6 +5,6 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class RedirectEvent | |||
{ | |||
[JsonProperty("url")] | |||
public string Url { get; } | |||
public string Url { get; set; } | |||
} | |||
} |
@@ -5,6 +5,6 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class ResumedEvent | |||
{ | |||
[JsonProperty("heartbeat_interval")] | |||
public int HeartbeatInterval { get; } | |||
public int HeartbeatInterval { get; set; } | |||
} | |||
} |
@@ -6,10 +6,10 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class TypingStartEvent | |||
{ | |||
[JsonProperty("user_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong UserId { get; } | |||
public ulong UserId { get; set; } | |||
[JsonProperty("channel_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong ChannelId { get; } | |||
public ulong ChannelId { get; set; } | |||
[JsonProperty("timestamp")] | |||
public int Timestamp { get; } | |||
public int Timestamp { get; set; } | |||
} | |||
} |
@@ -6,10 +6,10 @@ namespace Discord.API.Client.GatewaySocket | |||
public sealed class VoiceServerUpdateEvent | |||
{ | |||
[JsonProperty("guild_id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong GuildId { get; } | |||
public ulong GuildId { get; set; } | |||
[JsonProperty("endpoint")] | |||
public string Endpoint { get; } | |||
public string Endpoint { get; set; } | |||
[JsonProperty("token")] | |||
public string Token { get; } | |||
} | |||
public string Token { get; set; } | |||
} | |||
} |
@@ -11,13 +11,13 @@ namespace Discord.API.Client | |||
public class WebSocketMessage | |||
{ | |||
[JsonProperty("op")] | |||
public int Operation { get; } | |||
[JsonProperty("d")] | |||
public object Payload { get; } | |||
public int Operation { get; set; } | |||
[JsonProperty("t", NullValueHandling = NullValueHandling.Ignore)] | |||
public string Type { get; } | |||
public string Type { get; set; } | |||
[JsonProperty("s", NullValueHandling = NullValueHandling.Ignore)] | |||
public int? Sequence { get; } | |||
public int? Sequence { get; set; } | |||
[JsonProperty("d")] | |||
public object Payload { get; set; } | |||
public WebSocketMessage() { } | |||
public WebSocketMessage(IWebSocketMessage msg) | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class AcceptInviteRequest : IRestRequest<InviteReference> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/invite/{InviteId}"; | |||
string IRestRequest.Endpoint => $"invite/{InviteId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class AckMessageRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/messages/{MessageId}/ack"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/messages/{MessageId}/ack"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -0,0 +1,30 @@ | |||
using Discord.API.Converters; | |||
using Newtonsoft.Json; | |||
namespace Discord.API.Client.Rest | |||
{ | |||
[JsonObject(MemberSerialization.OptIn)] | |||
public sealed class AddChannelPermissionsRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "PUT"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/permissions"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
public ulong ChannelId { get; } | |||
[JsonProperty("id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong TargetId { get; set; } | |||
[JsonProperty("type")] | |||
public string TargetType { get; set; } | |||
[JsonProperty("allow")] | |||
public uint Allow { get; set; } | |||
[JsonProperty("deny")] | |||
public uint Deny { get; set; } | |||
public AddChannelPermissionsRequest(ulong channelId) | |||
{ | |||
ChannelId = channelId; | |||
} | |||
} | |||
} |
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class AddGuildBanRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "PUT"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/bans/{UserId}?delete-message-days={PruneDays}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/bans/{UserId}?delete-message-days={PruneDays}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class BroadcastTypingRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/typing"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/typing"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class CreateChannelRequest : IRestRequest<Channel> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/channels"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/channels"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class CreateGuildRequest : IRestRequest<Guild> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds"; | |||
string IRestRequest.Endpoint => $"guilds"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class CreateInviteRequest : IRestRequest<Invite> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/invites"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/invites"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -7,7 +7,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class CreatePrivateChannelRequest : IRestRequest<Channel> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/users/@me/channels"; | |||
string IRestRequest.Endpoint => $"users/@me/channels"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class CreateRoleRequest : IRestRequest<Role> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/roles"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/roles"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class DeleteChannelRequest : IRestRequest<Channel> | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class DeleteInviteRequest : IRestRequest<Invite> | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/invite/{InviteCode}"; | |||
string IRestRequest.Endpoint => $"invite/{InviteCode}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class DeleteMessageRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/messages/{MessageId}"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/messages/{MessageId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class DeleteRoleRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/roles/{RoleId}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/roles/{RoleId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class GatewayRequest : IRestRequest<GatewayResponse> | |||
{ | |||
string IRestRequest.Method => "GET"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/gateway"; | |||
string IRestRequest.Endpoint => $"gateway"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
} | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class GetInviteRequest : IRestRequest<InviteReference> | |||
{ | |||
string IRestRequest.Method => "GET"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/invite/{InviteCode}"; | |||
string IRestRequest.Endpoint => $"invite/{InviteCode}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class GetInvitesRequest : IRestRequest<InviteReference[]> | |||
{ | |||
string IRestRequest.Method => "GET"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/invites"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/invites"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -15,7 +15,7 @@ namespace Discord.API.Client.Rest | |||
this.AddQueryParam(query, "limit", Limit.ToString()); | |||
if (RelativeDir != null) | |||
this.AddQueryParam(query, RelativeDir, RelativeId.Value.ToString()); | |||
return $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/messages{query}"; | |||
return $"channels/{ChannelId}/messages{query}"; | |||
} | |||
} | |||
object IRestRequest.Payload => null; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class GetVoiceRegionsRequest : IRestRequest<GetVoiceRegionsResponse[]> | |||
{ | |||
string IRestRequest.Method => "GET"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/voice/regions"; | |||
string IRestRequest.Endpoint => $"voice/regions"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
} | |||
@@ -7,7 +7,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class GetWidgetRequest : IRestRequest<GetWidgetResponse> | |||
{ | |||
string IRestRequest.Method => "GET"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/servers/{GuildId}/widget.json"; | |||
string IRestRequest.Endpoint => $"servers/{GuildId}/widget.json"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class KickMemberRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/members/{UserId}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/members/{UserId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class LeaveGuildRequest : IRestRequest<Guild> | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -0,0 +1,24 @@ | |||
using Newtonsoft.Json; | |||
namespace Discord.API.Client.Rest | |||
{ | |||
[JsonObject(MemberSerialization.OptIn)] | |||
public sealed class LoginRequest : IRestRequest<LoginResponse> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"auth/login"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
[JsonProperty("email")] | |||
public string Email { get; set; } | |||
[JsonProperty("password")] | |||
public string Password { get; set; } | |||
} | |||
public sealed class LoginResponse | |||
{ | |||
[JsonProperty("token")] | |||
public string Token { get; set; } | |||
} | |||
} |
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class LogoutRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/auth/logout"; | |||
string IRestRequest.Endpoint => $"auth/logout"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
} | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class PruneMembersRequest : IRestRequest<PruneMembersResponse> | |||
{ | |||
string IRestRequest.Method => IsSimulation ? "GET" : "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/prune?days={Days}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/prune?days={Days}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class RemoveChannelPermissionsRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/permissions/{TargetId}"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/permissions/{TargetId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class RemoveGuildBanRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "DELETE"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/bans/{UserId}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/bans/{UserId}"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -8,7 +8,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class ReorderChannelsRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/channels"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/channels"; | |||
object IRestRequest.Payload | |||
{ | |||
get | |||
@@ -8,7 +8,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class ReorderRolesRequest : IRestRequest<Role[]> | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/roles"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/roles"; | |||
object IRestRequest.Payload | |||
{ | |||
get | |||
@@ -7,7 +7,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class SendFileRequest : IRestFileRequest<Message> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/messages"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/messages"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
string IRestFileRequest.Filename => Filename; | |||
@@ -7,7 +7,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class SendMessageRequest : IRestRequest<Message> | |||
{ | |||
string IRestRequest.Method => "POST"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/messages"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/messages"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class UpdateChannelRequest : IRestRequest<Channel> | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -7,7 +7,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class UpdateGuildRequest : IRestRequest<Guild> | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -8,7 +8,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class UpdateMemberRequest : IRestRequest | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/members/{UserId}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/members/{UserId}"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -7,7 +7,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class UpdateMessageRequest : IRestRequest<Message> | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/channels/{ChannelId}/messages/{MessageId}"; | |||
string IRestRequest.Endpoint => $"channels/{ChannelId}/messages/{MessageId}"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class UpdateProfileRequest : IRestRequest<User> | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/users/@me"; | |||
string IRestRequest.Endpoint => $"users/@me"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Client.Rest | |||
public sealed class UpdateRoleRequest : IRestRequest<Role> | |||
{ | |||
string IRestRequest.Method => "PATCH"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.ClientAPIUrl}/guilds/{GuildId}/roles/{RoleId}"; | |||
string IRestRequest.Endpoint => $"guilds/{GuildId}/roles/{RoleId}"; | |||
object IRestRequest.Payload => this; | |||
bool IRestRequest.IsPrivate => false; | |||
@@ -7,20 +7,20 @@ namespace Discord.API.Status | |||
public class Incident | |||
{ | |||
[JsonProperty("page")] | |||
public PageData Page { get; } | |||
public PageData Page { get; set; } | |||
[JsonProperty("scheduled_maintenances")] | |||
public MaintenanceData[] ScheduledMaintenances { get; } | |||
public MaintenanceData[] ScheduledMaintenances { get; set; } | |||
public sealed class PageData | |||
{ | |||
[JsonProperty("id"), JsonConverter(typeof(LongStringConverter))] | |||
public ulong Id { get; } | |||
public ulong Id { get; set; } | |||
[JsonProperty("name")] | |||
public string Name { get; } | |||
public string Name { get; set; } | |||
[JsonProperty("url")] | |||
public string Url { get; } | |||
public string Url { get; set; } | |||
[JsonProperty("updated-at")] | |||
public DateTime? UpdatedAt { get; } | |||
public DateTime? UpdatedAt { get; set; } | |||
} | |||
public sealed class MaintenanceData | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Status.Rest | |||
public sealed class GetActiveIncidentsRequest : IRestRequest<Incident> | |||
{ | |||
string IRestRequest.Method => "GET"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.StatusAPIUrl}/scheduled-maintenances/active.json"; | |||
string IRestRequest.Endpoint => $"scheduled-maintenances/active.json"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
} | |||
@@ -6,7 +6,7 @@ namespace Discord.API.Status.Rest | |||
public sealed class GetUpcomingIncidentsRequest : IRestRequest<Incident> | |||
{ | |||
string IRestRequest.Method => "GET"; | |||
string IRestRequest.Endpoint => $"{DiscordConfig.StatusAPIUrl}/scheduled-maintenances/upcoming.json"; | |||
string IRestRequest.Endpoint => $"scheduled-maintenances/upcoming.json"; | |||
object IRestRequest.Payload => null; | |||
bool IRestRequest.IsPrivate => false; | |||
} | |||
@@ -120,7 +120,7 @@ namespace Discord | |||
CheckReady(); | |||
var request = new CreateChannelRequest(server.Id) { Name = name, Type = type.Value }; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
var channel = _channels.GetOrAdd(response.Id, response.GuildId, response.Recipient?.Id); | |||
channel.Update(response); | |||
@@ -139,7 +139,7 @@ namespace Discord | |||
if (channel == null) | |||
{ | |||
var request = new CreatePrivateChannelRequest() { RecipientId = user.Id }; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
var recipient = _users.GetOrAdd(response.Recipient.Id, null); | |||
recipient.Update(response.Recipient); | |||
@@ -163,7 +163,7 @@ namespace Discord | |||
Topic = topic ?? channel.Topic, | |||
Position = channel.Position | |||
}; | |||
await _rest.Send(request).ConfigureAwait(false); | |||
await _clientRest.Send(request).ConfigureAwait(false); | |||
} | |||
if (position != null) | |||
@@ -207,7 +207,7 @@ namespace Discord | |||
ChannelIds = channels.Select(x => x.Id).ToArray(), | |||
StartPos = after != null ? after.Position + 1 : channels.Min(x => x.Position) | |||
}; | |||
return _rest.Send(request); | |||
return _clientRest.Send(request); | |||
} | |||
/// <summary> Destroys the provided channel. </summary> | |||
@@ -216,7 +216,7 @@ namespace Discord | |||
if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||
CheckReady(); | |||
try { await _rest.Send(new DeleteChannelRequest(channel.Id)).ConfigureAwait(false); } | |||
try { await _clientRest.Send(new DeleteChannelRequest(channel.Id)).ConfigureAwait(false); } | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
} |
@@ -24,7 +24,7 @@ namespace Discord | |||
if (index >= 0) | |||
inviteIdOrXkcd = inviteIdOrXkcd.Substring(index + 1); | |||
var response = await _rest.Send(new GetInviteRequest(inviteIdOrXkcd)).ConfigureAwait(false); | |||
var response = await _clientRest.Send(new GetInviteRequest(inviteIdOrXkcd)).ConfigureAwait(false); | |||
var invite = new Invite(response.Code, response.XkcdPass); | |||
invite.Update(response); | |||
return invite; | |||
@@ -36,7 +36,7 @@ namespace Discord | |||
if (server == null) throw new ArgumentNullException(nameof(server)); | |||
CheckReady(); | |||
var response = await _rest.Send(new GetInvitesRequest(server.Id)).ConfigureAwait(false); | |||
var response = await _clientRest.Send(new GetInvitesRequest(server.Id)).ConfigureAwait(false); | |||
return response.Select(x => | |||
{ | |||
var invite = new Invite(x.Code, x.XkcdPass); | |||
@@ -77,7 +77,7 @@ namespace Discord | |||
WithXkcdPass = withXkcd | |||
}; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
var invite = new Invite(response.Code, response.XkcdPass); | |||
return invite; | |||
} | |||
@@ -88,7 +88,7 @@ namespace Discord | |||
if (invite == null) throw new ArgumentNullException(nameof(invite)); | |||
CheckReady(); | |||
try { await _rest.Send(new DeleteInviteRequest(invite.Code)).ConfigureAwait(false); } | |||
try { await _clientRest.Send(new DeleteInviteRequest(invite.Code)).ConfigureAwait(false); } | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
@@ -98,7 +98,7 @@ namespace Discord | |||
if (invite == null) throw new ArgumentNullException(nameof(invite)); | |||
CheckReady(); | |||
return _rest.Send(new AcceptInviteRequest(invite.Code)); | |||
return _clientRest.Send(new AcceptInviteRequest(invite.Code)); | |||
} | |||
} | |||
} |
@@ -164,7 +164,7 @@ namespace Discord | |||
Filename = filename, | |||
Stream = stream | |||
}; | |||
var model = await _rest.Send(request).ConfigureAwait(false); | |||
var model = await _clientRest.Send(request).ConfigureAwait(false); | |||
var msg = _messages.GetOrAdd(model.Id, channel.Id, model.Author.Id); | |||
msg.Update(model); | |||
@@ -229,7 +229,7 @@ namespace Discord | |||
Nonce = null, | |||
IsTTS = isTextToSpeech | |||
}; | |||
var model = await _rest.Send(request).ConfigureAwait(false); | |||
var model = await _clientRest.Send(request).ConfigureAwait(false); | |||
msg = _messages.GetOrAdd(model.Id, channel.Id, model.Author.Id); | |||
msg.Update(model); | |||
RaiseMessageSent(msg); | |||
@@ -262,7 +262,7 @@ namespace Discord | |||
Content = text, | |||
MentionedUserIds = mentionedUsers.Select(x => x.Id).ToArray() | |||
}; | |||
await _rest.Send(request).ConfigureAwait(false); | |||
await _clientRest.Send(request).ConfigureAwait(false); | |||
} | |||
} | |||
@@ -273,7 +273,7 @@ namespace Discord | |||
CheckReady(); | |||
var request = new DeleteMessageRequest(message.Id, message.Channel.Id); | |||
try { await _rest.Send(request).ConfigureAwait(false); } | |||
try { await _clientRest.Send(request).ConfigureAwait(false); } | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
public async Task DeleteMessages(IEnumerable<Message> messages) | |||
@@ -284,7 +284,7 @@ namespace Discord | |||
foreach (var message in messages) | |||
{ | |||
var request = new DeleteMessageRequest(message.Id, message.Channel.Id); | |||
try { await _rest.Send(request).ConfigureAwait(false); } | |||
try { await _clientRest.Send(request).ConfigureAwait(false); } | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
} | |||
@@ -307,7 +307,7 @@ namespace Discord | |||
RelativeDir = relativeDir == RelativeDirection.Before ? "before" : "after", | |||
RelativeId = relativeMessageId | |||
}; | |||
var msgs = await _rest.Send(request).ConfigureAwait(false); | |||
var msgs = await _clientRest.Send(request).ConfigureAwait(false); | |||
return msgs.Select(x => | |||
{ | |||
Message msg = null; | |||
@@ -336,7 +336,7 @@ namespace Discord | |||
if (message == null) throw new ArgumentNullException(nameof(message)); | |||
if (!message.IsAuthor) | |||
_rest.Send(new AckMessageRequest(message.Id, message.Channel.Id)); | |||
_clientRest.Send(new AckMessageRequest(message.Id, message.Channel.Id)); | |||
} | |||
/// <summary> Deserializes messages from JSON format and imports them into the message cache.</summary> | |||
@@ -401,7 +401,7 @@ namespace Discord | |||
Nonce = IdConvert.ToString(msg.Id), //Nonce | |||
IsTTS = msg.IsTTS | |||
}; | |||
await _rest.Send(request).ConfigureAwait(false); | |||
await _clientRest.Send(request).ConfigureAwait(false); | |||
} | |||
else | |||
{ | |||
@@ -410,7 +410,7 @@ namespace Discord | |||
Content = queuedMessage.Text, | |||
MentionedUserIds = queuedMessage.MentionedUsers | |||
}; | |||
await _rest.Send(request).ConfigureAwait(false); | |||
await _clientRest.Send(request).ConfigureAwait(false); | |||
} | |||
} | |||
catch (WebException) { break; } | |||
@@ -73,7 +73,7 @@ namespace Discord | |||
Allow = allow?.RawValue ?? 0, | |||
Deny = deny?.RawValue ?? 0 | |||
}; | |||
return _rest.Send(request); | |||
return _clientRest.Send(request); | |||
} | |||
public Task RemoveChannelPermissions(Channel channel, User user) | |||
@@ -97,7 +97,7 @@ namespace Discord | |||
try | |||
{ | |||
var perms = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != userOrRoleId).FirstOrDefault(); | |||
await _rest.Send(new RemoveChannelPermissionsRequest(channel.Id, userOrRoleId)).ConfigureAwait(false); | |||
await _clientRest.Send(new RemoveChannelPermissionsRequest(channel.Id, userOrRoleId)).ConfigureAwait(false); | |||
} | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
@@ -87,7 +87,7 @@ namespace Discord | |||
CheckReady(); | |||
var request1 = new CreateRoleRequest(server.Id); | |||
var response1 = await _rest.Send(request1).ConfigureAwait(false); | |||
var response1 = await _clientRest.Send(request1).ConfigureAwait(false); | |||
var role = _roles.GetOrAdd(response1.Id, server.Id); | |||
role.Update(response1); | |||
@@ -98,7 +98,7 @@ namespace Discord | |||
Color = (color ?? Color.Default).RawValue, | |||
IsHoisted = isHoisted | |||
}; | |||
var response2 = await _rest.Send(request2).ConfigureAwait(false); | |||
var response2 = await _clientRest.Send(request2).ConfigureAwait(false); | |||
role.Update(response2); | |||
return role; | |||
@@ -117,7 +117,7 @@ namespace Discord | |||
IsHoisted = isHoisted ?? role.IsHoisted | |||
}; | |||
var response = await _rest.Send(request1).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request1).ConfigureAwait(false); | |||
if (position != null) | |||
{ | |||
@@ -146,7 +146,7 @@ namespace Discord | |||
RoleIds = roles.Skip(minPos).Select(x => x.Id).ToArray(), | |||
StartPos = minPos | |||
}; | |||
await _rest.Send(request2).ConfigureAwait(false); | |||
await _clientRest.Send(request2).ConfigureAwait(false); | |||
} | |||
} | |||
@@ -155,7 +155,7 @@ namespace Discord | |||
if (role == null) throw new ArgumentNullException(nameof(role)); | |||
CheckReady(); | |||
try { await _rest.Send(new DeleteRoleRequest(role.Server.Id, role.Id)).ConfigureAwait(false); } | |||
try { await _clientRest.Send(new DeleteRoleRequest(role.Server.Id, role.Id)).ConfigureAwait(false); } | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
@@ -166,7 +166,7 @@ namespace Discord | |||
if (startPos < 0) throw new ArgumentOutOfRangeException(nameof(startPos), "startPos must be a positive integer."); | |||
CheckReady(); | |||
return _rest.Send(new ReorderRolesRequest(server.Id) | |||
return _clientRest.Send(new ReorderRolesRequest(server.Id) | |||
{ | |||
RoleIds = roles.Select(x => x.Id).ToArray(), | |||
StartPos = startPos | |||
@@ -94,7 +94,7 @@ namespace Discord | |||
Region = region.Id, | |||
IconBase64 = Base64Image(iconType, icon, null) | |||
}; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
var server = _servers.GetOrAdd(response.Id); | |||
server.Update(response); | |||
@@ -115,7 +115,7 @@ namespace Discord | |||
AFKChannelId = server.AFKChannel?.Id, | |||
AFKTimeout = server.AFKTimeout | |||
}; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
server.Update(response); | |||
} | |||
@@ -125,7 +125,7 @@ namespace Discord | |||
if (server == null) throw new ArgumentNullException(nameof(server)); | |||
CheckReady(); | |||
try { await _rest.Send(new LeaveGuildRequest(server.Id)).ConfigureAwait(false); } | |||
try { await _clientRest.Send(new LeaveGuildRequest(server.Id)).ConfigureAwait(false); } | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
@@ -133,7 +133,7 @@ namespace Discord | |||
{ | |||
CheckReady(); | |||
var regions = await _rest.Send(new GetVoiceRegionsRequest()).ConfigureAwait(false); | |||
var regions = await _clientRest.Send(new GetVoiceRegionsRequest()).ConfigureAwait(false); | |||
return regions.Select(x => new Region(x.Id, x.Name, x.Hostname, x.Port)); | |||
} | |||
} |
@@ -218,7 +218,7 @@ namespace Discord | |||
VoiceChannelId = voiceChannel?.Id, | |||
RoleIds = roleIds.ToArray() | |||
}; | |||
return _rest.Send(request); | |||
return _clientRest.Send(request); | |||
} | |||
public Task KickUser(User user) | |||
@@ -228,7 +228,7 @@ namespace Discord | |||
CheckReady(); | |||
var request = new KickMemberRequest(user.Server.Id, user.Id); | |||
return _rest.Send(request); | |||
return _clientRest.Send(request); | |||
} | |||
public Task BanUser(User user, int pruneDays = 0) | |||
{ | |||
@@ -238,7 +238,7 @@ namespace Discord | |||
var request = new AddGuildBanRequest(user.Server.Id, user.Id); | |||
request.PruneDays = pruneDays; | |||
return _rest.Send(request); | |||
return _clientRest.Send(request); | |||
} | |||
public async Task UnbanUser(Server server, ulong userId) | |||
{ | |||
@@ -246,7 +246,7 @@ namespace Discord | |||
if (userId <= 0) throw new ArgumentOutOfRangeException(nameof(userId)); | |||
CheckReady(); | |||
try { await _rest.Send(new RemoveGuildBanRequest(server.Id, userId)).ConfigureAwait(false); } | |||
try { await _clientRest.Send(new RemoveGuildBanRequest(server.Id, userId)).ConfigureAwait(false); } | |||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||
} | |||
@@ -261,7 +261,7 @@ namespace Discord | |||
Days = days, | |||
IsSimulation = simulate | |||
}; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
return response.Pruned; | |||
} | |||
@@ -289,7 +289,7 @@ namespace Discord | |||
AvatarBase64 = Base64Image(avatarType, avatar, _privateUser?.AvatarId) | |||
}; | |||
await _rest.Send(request).ConfigureAwait(false); | |||
await _clientRest.Send(request).ConfigureAwait(false); | |||
if (password != null) | |||
{ | |||
@@ -298,8 +298,8 @@ namespace Discord | |||
Email = _currentUser.Email, | |||
Password = password | |||
}; | |||
var loginResponse = await _rest.Send(loginRequest).ConfigureAwait(false); | |||
_rest.SetToken(loginResponse.Token); | |||
var loginResponse = await _clientRest.Send(loginRequest).ConfigureAwait(false); | |||
_clientRest.SetToken(loginResponse.Token); | |||
} | |||
} | |||
@@ -54,7 +54,7 @@ namespace Discord | |||
public partial class DiscordClient | |||
{ | |||
private readonly LogService _log; | |||
private readonly Logger _logger, _restLogger, _cacheLogger; | |||
private readonly Logger _logger, _restLogger, _cacheLogger, _webSocketLogger; | |||
private readonly Dictionary<Type, object> _singletons; | |||
private readonly object _cacheLock; | |||
private readonly Semaphore _lock; | |||
@@ -73,8 +73,9 @@ namespace Discord | |||
private ConnectionState _state; | |||
/// <summary> Gives direct access to the underlying DiscordAPIClient. This can be used to modify objects not in cache. </summary> | |||
public RestClient Rest => _rest; | |||
private readonly RestClient _rest; | |||
public RestClient ClientAPI => _clientRest; | |||
public RestClient StatusAPI => _statusRest; | |||
private readonly RestClient _clientRest, _statusRest; | |||
/// <summary> Returns the internal websocket object. </summary> | |||
public GatewaySocket WebSocket => _webSocket; | |||
@@ -122,7 +123,10 @@ namespace Discord | |||
//Services | |||
_singletons = new Dictionary<Type, object>(); | |||
_log = AddService(new LogService()); | |||
_logger = CreateMainLogger(); | |||
_logger = _log.CreateLogger("Client"); | |||
_cacheLogger = _log.CreateLogger("Cache"); | |||
_restLogger = _log.CreateLogger("Rest"); | |||
_webSocketLogger = _log.CreateLogger("WebSocket"); | |||
//Async | |||
_lock = new Semaphore(1, 1); | |||
@@ -133,20 +137,17 @@ namespace Discord | |||
//Cache | |||
_cacheLock = new object(); | |||
_channels = new Channels(this, _cacheLock); | |||
_users = new Users(this, _cacheLock); | |||
_messages = new Messages(this, _cacheLock, Config.MessageCacheSize > 0); | |||
_roles = new Roles(this, _cacheLock); | |||
_servers = new Servers(this, _cacheLock); | |||
_globalUsers = new GlobalUsers(this, _cacheLock); | |||
_cacheLogger = CreateCacheLogger(); | |||
_channels = new Channels(this, _cacheLock); | |||
_users = new Users(this, _cacheLock); | |||
_messages = new Messages(this, _cacheLock, Config.MessageCacheSize > 0); | |||
_roles = new Roles(this, _cacheLock); | |||
_servers = new Servers(this, _cacheLock); | |||
_globalUsers = new GlobalUsers(this, _cacheLock); | |||
//Networking | |||
_restLogger = CreateRestLogger(); | |||
_rest = new RestClient(_config, _restLogger); | |||
var webSocketLogger = _log.CreateLogger("WebSocket"); | |||
_webSocket = new GatewaySocket(this, webSocketLogger); | |||
_clientRest = new RestClient(_config, _restLogger, DiscordConfig.ClientAPIUrl); | |||
_statusRest = new RestClient(_config, _restLogger, DiscordConfig.StatusAPIUrl); | |||
_webSocket = new GatewaySocket(this, _webSocketLogger); | |||
_webSocket.Connected += (s, e) => | |||
{ | |||
if (_state == ConnectionState.Connecting) | |||
@@ -162,94 +163,80 @@ namespace Discord | |||
_pendingMessages = new ConcurrentQueue<MessageQueueItem>(); | |||
Connected += async (s, e) => | |||
{ | |||
_rest.SetCancelToken(_cancelToken); | |||
_clientRest.SetCancelToken(_cancelToken); | |||
await SendStatus().ConfigureAwait(false); | |||
}; | |||
//Import/Export | |||
_messageImporter = new JsonSerializer(); | |||
_messageImporter.ContractResolver = new Message.ImportResolver(); | |||
} | |||
private Logger CreateMainLogger() | |||
{ | |||
Logger logger = _log.CreateLogger("Client"); | |||
//Logging | |||
if (_log.Level >= LogSeverity.Info) | |||
{ | |||
JoinedServer += (s, e) => logger.Info($"Server Created: {e.Server?.Name ?? "[Private]"}"); | |||
LeftServer += (s, e) => logger.Info($"Server Destroyed: {e.Server?.Name ?? "[Private]"}"); | |||
ServerUpdated += (s, e) => logger.Info($"Server Updated: {e.Server?.Name ?? "[Private]"}"); | |||
ServerAvailable += (s, e) => logger.Info($"Server Available: {e.Server?.Name ?? "[Private]"}"); | |||
ServerUnavailable += (s, e) => logger.Info($"Server Unavailable: {e.Server?.Name ?? "[Private]"}"); | |||
ChannelCreated += (s, e) => logger.Info($"Channel Created: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}"); | |||
ChannelDestroyed += (s, e) => logger.Info($"Channel Destroyed: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}"); | |||
ChannelUpdated += (s, e) => logger.Info($"Channel Updated: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}"); | |||
MessageReceived += (s, e) => logger.Info($"Message Received: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
MessageDeleted += (s, e) => logger.Info($"Message Deleted: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
MessageUpdated += (s, e) => logger.Info($"Message Update: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
RoleCreated += (s, e) => logger.Info($"Role Created: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}"); | |||
RoleUpdated += (s, e) => logger.Info($"Role Updated: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}"); | |||
RoleDeleted += (s, e) => logger.Info($"Role Deleted: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}"); | |||
UserBanned += (s, e) => logger.Info($"Banned User: {e.Server?.Name ?? "[Private]" }/{e.UserId}"); | |||
UserUnbanned += (s, e) => logger.Info($"Unbanned User: {e.Server?.Name ?? "[Private]"}/{e.UserId}"); | |||
UserJoined += (s, e) => logger.Info($"User Joined: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
UserLeft += (s, e) => logger.Info($"User Left: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
UserUpdated += (s, e) => logger.Info($"User Updated: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
UserVoiceStateUpdated += (s, e) => logger.Info($"Voice Updated: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
ProfileUpdated += (s, e) => logger.Info("Profile Updated"); | |||
} | |||
if (_log.Level >= LogSeverity.Verbose) | |||
{ | |||
UserIsTypingUpdated += (s, e) => logger.Verbose($"Is Typing: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.User?.Name}"); | |||
MessageAcknowledged += (s, e) => logger.Verbose($"Ack Message: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
MessageSent += (s, e) => logger.Verbose($"Sent Message: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
UserPresenceUpdated += (s, e) => logger.Verbose($"Presence Updated: {e.Server?.Name ?? "[Private]"}/{e.User?.Name}"); | |||
} | |||
return logger; | |||
} | |||
private Logger CreateRestLogger() | |||
{ | |||
Logger logger = null; | |||
JoinedServer += (s, e) => _logger.Info($"Server Created: {e.Server?.Name ?? "[Private]"}"); | |||
LeftServer += (s, e) => _logger.Info($"Server Destroyed: {e.Server?.Name ?? "[Private]"}"); | |||
ServerUpdated += (s, e) => _logger.Info($"Server Updated: {e.Server?.Name ?? "[Private]"}"); | |||
ServerAvailable += (s, e) => _logger.Info($"Server Available: {e.Server?.Name ?? "[Private]"}"); | |||
ServerUnavailable += (s, e) => _logger.Info($"Server Unavailable: {e.Server?.Name ?? "[Private]"}"); | |||
ChannelCreated += (s, e) => _logger.Info($"Channel Created: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}"); | |||
ChannelDestroyed += (s, e) => _logger.Info($"Channel Destroyed: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}"); | |||
ChannelUpdated += (s, e) => _logger.Info($"Channel Updated: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}"); | |||
MessageReceived += (s, e) => _logger.Info($"Message Received: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
MessageDeleted += (s, e) => _logger.Info($"Message Deleted: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
MessageUpdated += (s, e) => _logger.Info($"Message Update: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
RoleCreated += (s, e) => _logger.Info($"Role Created: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}"); | |||
RoleUpdated += (s, e) => _logger.Info($"Role Updated: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}"); | |||
RoleDeleted += (s, e) => _logger.Info($"Role Deleted: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}"); | |||
UserBanned += (s, e) => _logger.Info($"Banned User: {e.Server?.Name ?? "[Private]" }/{e.UserId}"); | |||
UserUnbanned += (s, e) => _logger.Info($"Unbanned User: {e.Server?.Name ?? "[Private]"}/{e.UserId}"); | |||
UserJoined += (s, e) => _logger.Info($"User Joined: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
UserLeft += (s, e) => _logger.Info($"User Left: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
UserUpdated += (s, e) => _logger.Info($"User Updated: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
UserVoiceStateUpdated += (s, e) => _logger.Info($"Voice Updated: {e.Server?.Name ?? "[Private]"}/{e.User.Name}"); | |||
ProfileUpdated += (s, e) => _logger.Info("Profile Updated"); | |||
} | |||
if (_log.Level >= LogSeverity.Verbose) | |||
{ | |||
logger = _log.CreateLogger("Rest"); | |||
_rest.OnRequest += (s, e) => | |||
{ | |||
if (e.Payload != null) | |||
logger.Verbose( $"{e.Method} {e.Path}: {Math.Round(e.ElapsedMilliseconds, 2)} ms ({e.Payload})"); | |||
else | |||
logger.Verbose( $"{e.Method} {e.Path}: {Math.Round(e.ElapsedMilliseconds, 2)} ms"); | |||
}; | |||
UserIsTypingUpdated += (s, e) => _logger.Verbose($"Is Typing: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.User?.Name}"); | |||
MessageAcknowledged += (s, e) => _logger.Verbose($"Ack Message: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
MessageSent += (s, e) => _logger.Verbose($"Sent Message: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}"); | |||
UserPresenceUpdated += (s, e) => _logger.Verbose($"Presence Updated: {e.Server?.Name ?? "[Private]"}/{e.User?.Name}"); | |||
} | |||
return logger; | |||
} | |||
private Logger CreateCacheLogger() | |||
{ | |||
Logger logger = null; | |||
if (_log.Level >= LogSeverity.Verbose) | |||
{ | |||
_clientRest.OnRequest += (s, e) => | |||
{ | |||
if (e.Payload != null) | |||
_restLogger.Verbose($"{e.Method} {e.Path}: {Math.Round(e.ElapsedMilliseconds, 2)} ms ({e.Payload})"); | |||
else | |||
_restLogger.Verbose($"{e.Method} {e.Path}: {Math.Round(e.ElapsedMilliseconds, 2)} ms"); | |||
}; | |||
} | |||
if (_log.Level >= LogSeverity.Debug) | |||
{ | |||
logger = _log.CreateLogger("Cache"); | |||
_channels.ItemCreated += (s, e) => logger.Debug( $"Created Channel {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_channels.ItemDestroyed += (s, e) => logger.Debug( $"Destroyed Channel {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_channels.Cleared += (s, e) => logger.Debug( $"Cleared Channels"); | |||
_users.ItemCreated += (s, e) => logger.Debug( $"Created User {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_users.ItemDestroyed += (s, e) => logger.Debug( $"Destroyed User {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_users.Cleared += (s, e) => logger.Debug( $"Cleared Users"); | |||
_messages.ItemCreated += (s, e) => logger.Debug( $"Created Message {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Channel.Id}/{e.Item.Id}"); | |||
_messages.ItemDestroyed += (s, e) => logger.Debug( $"Destroyed Message {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Channel.Id}/{e.Item.Id}"); | |||
_messages.ItemRemapped += (s, e) => logger.Debug( $"Remapped Message {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Channel.Id}/[{e.OldId} -> {e.NewId}]"); | |||
_messages.Cleared += (s, e) => logger.Debug( $"Cleared Messages"); | |||
_roles.ItemCreated += (s, e) => logger.Debug( $"Created Role {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_roles.ItemDestroyed += (s, e) => logger.Debug( $"Destroyed Role {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_roles.Cleared += (s, e) => logger.Debug( $"Cleared Roles"); | |||
_servers.ItemCreated += (s, e) => logger.Debug( $"Created Server {e.Item.Id}"); | |||
_servers.ItemDestroyed += (s, e) => logger.Debug( $"Destroyed Server {e.Item.Id}"); | |||
_servers.Cleared += (s, e) => logger.Debug( $"Cleared Servers"); | |||
_globalUsers.ItemCreated += (s, e) => logger.Debug( $"Created User {e.Item.Id}"); | |||
_globalUsers.ItemDestroyed += (s, e) => logger.Debug( $"Destroyed User {e.Item.Id}"); | |||
_globalUsers.Cleared += (s, e) => logger.Debug( $"Cleared Users"); | |||
_channels.ItemCreated += (s, e) => _cacheLogger.Debug($"Created Channel {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_channels.ItemDestroyed += (s, e) => _cacheLogger.Debug($"Destroyed Channel {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_channels.Cleared += (s, e) => _cacheLogger.Debug($"Cleared Channels"); | |||
_users.ItemCreated += (s, e) => _cacheLogger.Debug($"Created User {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_users.ItemDestroyed += (s, e) => _cacheLogger.Debug($"Destroyed User {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_users.Cleared += (s, e) => _cacheLogger.Debug($"Cleared Users"); | |||
_messages.ItemCreated += (s, e) => _cacheLogger.Debug($"Created Message {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Channel.Id}/{e.Item.Id}"); | |||
_messages.ItemDestroyed += (s, e) => _cacheLogger.Debug($"Destroyed Message {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Channel.Id}/{e.Item.Id}"); | |||
_messages.ItemRemapped += (s, e) => _cacheLogger.Debug($"Remapped Message {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Channel.Id}/[{e.OldId} -> {e.NewId}]"); | |||
_messages.Cleared += (s, e) => _cacheLogger.Debug($"Cleared Messages"); | |||
_roles.ItemCreated += (s, e) => _cacheLogger.Debug($"Created Role {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_roles.ItemDestroyed += (s, e) => _cacheLogger.Debug($"Destroyed Role {IdConvert.ToString(e.Item.Server?.Id) ?? "[Private]"}/{e.Item.Id}"); | |||
_roles.Cleared += (s, e) => _cacheLogger.Debug($"Cleared Roles"); | |||
_servers.ItemCreated += (s, e) => _cacheLogger.Debug($"Created Server {e.Item.Id}"); | |||
_servers.ItemDestroyed += (s, e) => _cacheLogger.Debug($"Destroyed Server {e.Item.Id}"); | |||
_servers.Cleared += (s, e) => _cacheLogger.Debug($"Cleared Servers"); | |||
_globalUsers.ItemCreated += (s, e) => _cacheLogger.Debug($"Created User {e.Item.Id}"); | |||
_globalUsers.ItemDestroyed += (s, e) => _cacheLogger.Debug($"Destroyed User {e.Item.Id}"); | |||
_globalUsers.Cleared += (s, e) => _cacheLogger.Debug($"Cleared Users"); | |||
} | |||
return logger; | |||
} | |||
/// <summary> Connects to the Discord server with the provided email and password. </summary> | |||
@@ -342,7 +329,7 @@ namespace Discord | |||
if (token == null) | |||
{ | |||
var request = new LoginRequest() { Email = email, Password = password }; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
token = response.Token; | |||
SaveToken(tokenPath, key, token); | |||
useCache = false; | |||
@@ -351,17 +338,17 @@ namespace Discord | |||
else | |||
{ | |||
var request = new LoginRequest() { Email = email, Password = password }; | |||
var response = await _rest.Send(request).ConfigureAwait(false); | |||
var response = await _clientRest.Send(request).ConfigureAwait(false); | |||
token = response.Token; | |||
} | |||
} | |||
_token = token; | |||
_rest.SetToken(token); | |||
_clientRest.SetToken(token); | |||
//Get gateway and check token | |||
try | |||
{ | |||
var gatewayResponse = await _rest.Send(new GatewayRequest()).ConfigureAwait(false); | |||
var gatewayResponse = await _clientRest.Send(new GatewayRequest()).ConfigureAwait(false); | |||
var gateway = gatewayResponse.Url; | |||
_gateway = gateway; | |||
if (_config.LogLevel >= LogSeverity.Verbose) | |||
@@ -395,7 +382,7 @@ namespace Discord | |||
while (_pendingMessages.TryDequeue(out ignored)) { } | |||
} | |||
await _rest.Send(new LogoutRequest()).ConfigureAwait(false); | |||
await _clientRest.Send(new LogoutRequest()).ConfigureAwait(false); | |||
_channels.Clear(); | |||
_users.Clear(); | |||
@@ -722,7 +709,7 @@ namespace Discord | |||
case "VOICE_STATE_UPDATE": | |||
{ | |||
var data = e.Payload.ToObject<VoiceStateUpdateEvent>(_webSocket.Serializer); | |||
var user = _users[data.User.Id, data.GuildId]; | |||
var user = _users[data.UserId, data.GuildId]; | |||
if (user != null) | |||
{ | |||
/*var voiceChannel = user.VoiceChannel; | |||
@@ -192,7 +192,7 @@ namespace Discord | |||
} | |||
foreach (var subModel in model.VoiceStates) | |||
{ | |||
var user = usersCache[subModel.User.Id, Id]; | |||
var user = usersCache[subModel.UserId, Id]; | |||
if (user != null) | |||
user.Update(subModel); | |||
} | |||
@@ -13,13 +13,13 @@ namespace Discord.Net.Rest | |||
private readonly IRestEngine _engine; | |||
private CancellationToken _cancelToken; | |||
public RestClient(DiscordConfig config, Logger logger) | |||
public RestClient(DiscordConfig config, Logger logger, string baseUrl) | |||
{ | |||
_config = config; | |||
#if !DOTNET5_4 | |||
_engine = new RestSharpEngine(config, logger, DiscordConfig.ClientAPIUrl); | |||
_engine = new RestSharpEngine(config, logger, baseUrl); | |||
#else | |||
//_engine = new BuiltInRestEngine(config, logger); | |||
//_engine = new BuiltInRestEngine(config, logger, baseUrl); | |||
#endif | |||
} | |||
@@ -1,5 +1,4 @@ | |||
#if !DOTNET5_4 | |||
using Discord.API; | |||
using RestSharp; | |||
using System; | |||
using System.IO; | |||