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