Starting reorganization - grouped all API serialization definitions together, moved Audio to Interop and grouped Net classes together.
This commit is contained in:
@@ -13,6 +13,6 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: ComVisible(false)]
|
[assembly: ComVisible(false)]
|
||||||
[assembly: Guid("76ea00e6-ea24-41e1-acb2-639c0313fa80")]
|
[assembly: Guid("76ea00e6-ea24-41e1-acb2-639c0313fa80")]
|
||||||
|
|
||||||
[assembly: AssemblyVersion("0.7.3.0")]
|
[assembly: AssemblyVersion("0.8.0.0")]
|
||||||
[assembly: AssemblyFileVersion("0.7.3.0")]
|
[assembly: AssemblyFileVersion("0.8.0.0")]
|
||||||
|
|
||||||
|
|||||||
@@ -67,49 +67,50 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="lib\libopus.so" />
|
<Compile Include="..\Discord.Net\API\Auth.cs">
|
||||||
<Content Include="lib\libsodium.dll" />
|
<Link>API\Auth.cs</Link>
|
||||||
<Content Include="lib\opus.dll" />
|
</Compile>
|
||||||
</ItemGroup>
|
<Compile Include="..\Discord.Net\API\Bans.cs">
|
||||||
<ItemGroup>
|
<Link>API\Bans.cs</Link>
|
||||||
<Compile Include="..\Discord.Net\API\Common.cs">
|
</Compile>
|
||||||
<Link>API\Common.cs</Link>
|
<Compile Include="..\Discord.Net\API\Channels.cs">
|
||||||
|
<Link>API\Channels.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\Endpoints.cs">
|
<Compile Include="..\Discord.Net\API\Endpoints.cs">
|
||||||
<Link>API\Endpoints.cs</Link>
|
<Link>API\Endpoints.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\HttpException.cs">
|
<Compile Include="..\Discord.Net\API\Invites.cs">
|
||||||
<Link>API\HttpException.cs</Link>
|
<Link>API\Invites.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\Requests.cs">
|
<Compile Include="..\Discord.Net\API\Maintenance.cs">
|
||||||
<Link>API\Requests.cs</Link>
|
<Link>API\Maintenance.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\Responses.cs">
|
<Compile Include="..\Discord.Net\API\Members.cs">
|
||||||
<Link>API\Responses.cs</Link>
|
<Link>API\Members.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\RestClient.BuiltIn.cs">
|
<Compile Include="..\Discord.Net\API\Messages.cs">
|
||||||
<Link>API\RestClient.BuiltIn.cs</Link>
|
<Link>API\Messages.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\RestClient.cs">
|
<Compile Include="..\Discord.Net\API\Permissions.cs">
|
||||||
<Link>API\RestClient.cs</Link>
|
<Link>API\Permissions.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\RestClient.Events.cs">
|
<Compile Include="..\Discord.Net\API\Presence.cs">
|
||||||
<Link>API\RestClient.Events.cs</Link>
|
<Link>API\Presence.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\API\RestClient.SharpRest.cs">
|
<Compile Include="..\Discord.Net\API\Roles.cs">
|
||||||
<Link>API\RestClient.SharpRest.cs</Link>
|
<Link>API\Roles.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Audio\Opus.cs">
|
<Compile Include="..\Discord.Net\API\Servers.cs">
|
||||||
<Link>Audio\Opus.cs</Link>
|
<Link>API\Servers.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Audio\OpusDecoder.cs">
|
<Compile Include="..\Discord.Net\API\Users.cs">
|
||||||
<Link>Audio\OpusDecoder.cs</Link>
|
<Link>API\Users.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Audio\OpusEncoder.cs">
|
<Compile Include="..\Discord.Net\API\Voice.cs">
|
||||||
<Link>Audio\OpusEncoder.cs</Link>
|
<Link>API\Voice.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Audio\Sodium.cs">
|
<Compile Include="..\Discord.Net\API\WebSockets.cs">
|
||||||
<Link>Audio\Sodium.cs</Link>
|
<Link>API\WebSockets.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Collections\AsyncCollection.cs">
|
<Compile Include="..\Discord.Net\Collections\AsyncCollection.cs">
|
||||||
<Link>Collections\AsyncCollection.cs</Link>
|
<Link>Collections\AsyncCollection.cs</Link>
|
||||||
@@ -132,9 +133,6 @@
|
|||||||
<Compile Include="..\Discord.Net\Collections\Users.cs">
|
<Compile Include="..\Discord.Net\Collections\Users.cs">
|
||||||
<Link>Collections\Users.cs</Link>
|
<Link>Collections\Users.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\DiscordAPIClient.cs">
|
|
||||||
<Link>DiscordAPIClient.cs</Link>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="..\Discord.Net\DiscordClient.API.cs">
|
<Compile Include="..\Discord.Net\DiscordClient.API.cs">
|
||||||
<Link>DiscordClient.API.cs</Link>
|
<Link>DiscordClient.API.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -174,26 +172,41 @@
|
|||||||
<Compile Include="..\Discord.Net\Enums\UserStatus.cs">
|
<Compile Include="..\Discord.Net\Enums\UserStatus.cs">
|
||||||
<Link>Enums\UserStatus.cs</Link>
|
<Link>Enums\UserStatus.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Format.cs">
|
|
||||||
<Link>Format.cs</Link>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="..\Discord.Net\Helpers\CollectionHelper.cs">
|
|
||||||
<Link>Helpers\CollectionHelper.cs</Link>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="..\Discord.Net\Helpers\EpochTime.cs">
|
<Compile Include="..\Discord.Net\Helpers\EpochTime.cs">
|
||||||
<Link>Helpers\EpochTime.cs</Link>
|
<Link>Helpers\EpochTime.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Helpers\Extensions.cs">
|
<Compile Include="..\Discord.Net\Helpers\Extensions.cs">
|
||||||
<Link>Helpers\Extensions.cs</Link>
|
<Link>Helpers\Extensions.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Helpers\Format.cs">
|
||||||
|
<Link>Helpers\Format.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Helpers\Mention.cs">
|
||||||
|
<Link>Helpers\Mention.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Helpers\MessageCleaner.cs">
|
<Compile Include="..\Discord.Net\Helpers\MessageCleaner.cs">
|
||||||
<Link>Helpers\MessageCleaner.cs</Link>
|
<Link>Helpers\MessageCleaner.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Helpers\TaskExtensions.cs">
|
<Compile Include="..\Discord.Net\Helpers\Shared\CollectionHelper.cs">
|
||||||
<Link>Helpers\TaskExtensions.cs</Link>
|
<Link>Helpers\Shared\CollectionHelper.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Mention.cs">
|
<Compile Include="..\Discord.Net\Helpers\Shared\TaskHelper.cs">
|
||||||
<Link>Mention.cs</Link>
|
<Link>Helpers\Shared\TaskHelper.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Helpers\TimeoutException.cs">
|
||||||
|
<Link>Helpers\TimeoutException.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Interop\Opus.cs">
|
||||||
|
<Link>Interop\Opus.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Interop\OpusDecoder.cs">
|
||||||
|
<Link>Interop\OpusDecoder.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Interop\OpusEncoder.cs">
|
||||||
|
<Link>Interop\OpusEncoder.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Interop\Sodium.cs">
|
||||||
|
<Link>Interop\Sodium.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Models\Channel.cs">
|
<Compile Include="..\Discord.Net\Models\Channel.cs">
|
||||||
<Link>Models\Channel.cs</Link>
|
<Link>Models\Channel.cs</Link>
|
||||||
@@ -222,59 +235,61 @@
|
|||||||
<Compile Include="..\Discord.Net\Models\User.cs">
|
<Compile Include="..\Discord.Net\Models\User.cs">
|
||||||
<Link>Models\User.cs</Link>
|
<Link>Models\User.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Shared\TaskHelper.cs">
|
<Compile Include="..\Discord.Net\Net\DataWebSocket.cs">
|
||||||
<Link>Shared\TaskHelper.cs</Link>
|
<Link>Net\DataWebSocket.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\TimeoutException.cs">
|
<Compile Include="..\Discord.Net\Net\DataWebSockets.Events.cs">
|
||||||
<Link>TimeoutException.cs</Link>
|
<Link>Net\DataWebSockets.Events.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Data\Commands.cs">
|
<Compile Include="..\Discord.Net\Net\DiscordAPIClient.cs">
|
||||||
<Link>WebSockets\Data\Commands.cs</Link>
|
<Link>Net\DiscordAPIClient.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Data\DataWebSocket.cs">
|
<Compile Include="..\Discord.Net\Net\HttpException.cs">
|
||||||
<Link>WebSockets\Data\DataWebSocket.cs</Link>
|
<Link>Net\HttpException.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Data\DataWebSockets.Events.cs">
|
<Compile Include="..\Discord.Net\Net\RestClient.cs">
|
||||||
<Link>WebSockets\Data\DataWebSockets.Events.cs</Link>
|
<Link>Net\RestClient.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Data\Events.cs">
|
<Compile Include="..\Discord.Net\Net\RestClient.Events.cs">
|
||||||
<Link>WebSockets\Data\Events.cs</Link>
|
<Link>Net\RestClient.Events.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Voice\Commands.cs">
|
<Compile Include="..\Discord.Net\Net\RestClient.SharpRest.cs">
|
||||||
<Link>WebSockets\Voice\Commands.cs</Link>
|
<Link>Net\RestClient.SharpRest.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Voice\Events.cs">
|
<Compile Include="..\Discord.Net\Net\VoiceBuffer.cs">
|
||||||
<Link>WebSockets\Voice\Events.cs</Link>
|
<Link>Net\VoiceBuffer.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Voice\VoiceBuffer.cs">
|
<Compile Include="..\Discord.Net\Net\VoiceWebSocket.cs">
|
||||||
<Link>WebSockets\Voice\VoiceBuffer.cs</Link>
|
<Link>Net\VoiceWebSocket.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Voice\VoiceWebSocket.cs">
|
<Compile Include="..\Discord.Net\Net\VoiceWebSocket.Events.cs">
|
||||||
<Link>WebSockets\Voice\VoiceWebSocket.cs</Link>
|
<Link>Net\VoiceWebSocket.Events.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\Voice\VoiceWebSocket.Events.cs">
|
<Compile Include="..\Discord.Net\Net\WebSocket.cs">
|
||||||
<Link>WebSockets\Voice\VoiceWebSocket.Events.cs</Link>
|
<Link>Net\WebSocket.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\WebSocket.BuiltIn.cs">
|
<Compile Include="..\Discord.Net\Net\WebSocket.Events.cs">
|
||||||
<Link>WebSockets\WebSocket.BuiltIn.cs</Link>
|
<Link>Net\WebSocket.Events.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\WebSockets\WebSocket.cs">
|
<Compile Include="..\Discord.Net\Net\WebSocket.WebSocketSharp.cs">
|
||||||
<Link>WebSockets\WebSocket.cs</Link>
|
<Link>Net\WebSocket.WebSocketSharp.cs</Link>
|
||||||
</Compile>
|
|
||||||
<Compile Include="..\Discord.Net\WebSockets\WebSocket.Events.cs">
|
|
||||||
<Link>WebSockets\WebSocket.Events.cs</Link>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="..\Discord.Net\WebSockets\WebSocket.WebSocketSharp.cs">
|
|
||||||
<Link>WebSockets\WebSocket.WebSocketSharp.cs</Link>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="..\Discord.Net\WebSockets\WebSocketMessage.cs">
|
|
||||||
<Link>WebSockets\WebSocketMessage.cs</Link>
|
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="..\Discord.Net\lib\libopus.so">
|
||||||
|
<Link>lib\libopus.so</Link>
|
||||||
|
</None>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="..\Discord.Net\lib\libsodium.dll">
|
||||||
|
<Link>lib\libsodium.dll</Link>
|
||||||
|
</Content>
|
||||||
|
<Content Include="..\Discord.Net\lib\opus.dll">
|
||||||
|
<Link>lib\opus.dll</Link>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
29
src/Discord.Net/API/Auth.cs
Normal file
29
src/Discord.Net/API/Auth.cs
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Gateway
|
||||||
|
public class GatewayResponse
|
||||||
|
{
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Login
|
||||||
|
public sealed class LoginRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("email")]
|
||||||
|
public string Email;
|
||||||
|
[JsonProperty("password")]
|
||||||
|
public string Password;
|
||||||
|
}
|
||||||
|
public sealed class LoginResponse
|
||||||
|
{
|
||||||
|
[JsonProperty("token")]
|
||||||
|
public string Token;
|
||||||
|
}
|
||||||
|
}
|
||||||
6
src/Discord.Net/API/Bans.cs
Normal file
6
src/Discord.Net/API/Bans.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Events
|
||||||
|
internal sealed class BanAddEvent : MemberReference { }
|
||||||
|
internal sealed class BanRemoveEvent : MemberReference { }
|
||||||
|
}
|
||||||
100
src/Discord.Net/API/Channels.cs
Normal file
100
src/Discord.Net/API/Channels.cs
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class ChannelReference
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("guild_id")]
|
||||||
|
public string GuildId;
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("type")]
|
||||||
|
public string Type;
|
||||||
|
}
|
||||||
|
public class ChannelInfo : ChannelReference
|
||||||
|
{
|
||||||
|
public sealed class PermissionOverwrite
|
||||||
|
{
|
||||||
|
[JsonProperty("type")]
|
||||||
|
public string Type;
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("deny")]
|
||||||
|
public uint Deny;
|
||||||
|
[JsonProperty("allow")]
|
||||||
|
public uint Allow;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty("last_message_id")]
|
||||||
|
public string LastMessageId;
|
||||||
|
[JsonProperty("is_private")]
|
||||||
|
public bool IsPrivate;
|
||||||
|
[JsonProperty("position")]
|
||||||
|
public int? Position;
|
||||||
|
[JsonProperty(PropertyName = "topic")]
|
||||||
|
public string Topic;
|
||||||
|
[JsonProperty("permission_overwrites")]
|
||||||
|
public PermissionOverwrite[] PermissionOverwrites;
|
||||||
|
[JsonProperty("recipient")]
|
||||||
|
public UserReference Recipient;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Create
|
||||||
|
public class CreateChannelRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("type")]
|
||||||
|
public string Type;
|
||||||
|
}
|
||||||
|
public class CreatePMChannelRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("recipient_id")]
|
||||||
|
public string RecipientId;
|
||||||
|
}
|
||||||
|
public class CreateChannelResponse : ChannelInfo { }
|
||||||
|
|
||||||
|
//Edit
|
||||||
|
public class EditChannelRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("topic", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Topic;
|
||||||
|
}
|
||||||
|
public class EditChannelResponse : ChannelInfo { }
|
||||||
|
|
||||||
|
//Destroy
|
||||||
|
public class DestroyChannelResponse : ChannelInfo { }
|
||||||
|
|
||||||
|
//Reorder
|
||||||
|
public class ReorderChannelsRequest : IEnumerable<ReorderChannelsRequest.Channel>
|
||||||
|
{
|
||||||
|
public sealed class Channel
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("position")]
|
||||||
|
public uint Position;
|
||||||
|
}
|
||||||
|
private IEnumerable<Channel> _channels;
|
||||||
|
public ReorderChannelsRequest(IEnumerable<Channel> channels) { _channels = channels; }
|
||||||
|
|
||||||
|
public IEnumerator<Channel> GetEnumerator() => _channels.GetEnumerator();
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => _channels.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class ChannelCreateEvent : ChannelInfo { }
|
||||||
|
internal sealed class ChannelDeleteEvent : ChannelInfo { }
|
||||||
|
internal sealed class ChannelUpdateEvent : ChannelInfo { }
|
||||||
|
}
|
||||||
@@ -1,318 +0,0 @@
|
|||||||
//Ignore unused/unassigned variable warnings
|
|
||||||
#pragma warning disable CS0649
|
|
||||||
#pragma warning disable CS0169
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Discord.API
|
|
||||||
{
|
|
||||||
//User
|
|
||||||
public class UserReference
|
|
||||||
{
|
|
||||||
[JsonProperty("username")]
|
|
||||||
public string Username;
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("discriminator")]
|
|
||||||
public string Discriminator;
|
|
||||||
[JsonProperty("avatar")]
|
|
||||||
public string Avatar;
|
|
||||||
}
|
|
||||||
public class SelfUserInfo : UserReference
|
|
||||||
{
|
|
||||||
[JsonProperty("email")]
|
|
||||||
public string Email;
|
|
||||||
[JsonProperty("verified")]
|
|
||||||
public bool IsVerified;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Members
|
|
||||||
public class MemberReference
|
|
||||||
{
|
|
||||||
[JsonProperty("user_id")]
|
|
||||||
public string UserId;
|
|
||||||
[JsonProperty("guild_id")]
|
|
||||||
public string GuildId;
|
|
||||||
|
|
||||||
[JsonProperty("user")]
|
|
||||||
private UserReference _user;
|
|
||||||
public UserReference User
|
|
||||||
{
|
|
||||||
get { return _user; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_user = value;
|
|
||||||
UserId = User.Id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public class MemberInfo : MemberReference
|
|
||||||
{
|
|
||||||
[JsonProperty("joined_at")]
|
|
||||||
public DateTime? JoinedAt;
|
|
||||||
[JsonProperty("roles")]
|
|
||||||
public string[] Roles;
|
|
||||||
}
|
|
||||||
public class ExtendedMemberInfo : MemberInfo
|
|
||||||
{
|
|
||||||
[JsonProperty("mute")]
|
|
||||||
public bool? IsServerMuted;
|
|
||||||
[JsonProperty("deaf")]
|
|
||||||
public bool? IsServerDeafened;
|
|
||||||
}
|
|
||||||
public class PresenceMemberInfo : MemberReference
|
|
||||||
{
|
|
||||||
[JsonProperty("game_id")]
|
|
||||||
public string GameId;
|
|
||||||
[JsonProperty("status")]
|
|
||||||
public string Status;
|
|
||||||
}
|
|
||||||
public class VoiceMemberInfo : MemberReference
|
|
||||||
{
|
|
||||||
[JsonProperty("channel_id")]
|
|
||||||
public string ChannelId;
|
|
||||||
[JsonProperty("session_id")]
|
|
||||||
public string SessionId;
|
|
||||||
[JsonProperty("token")]
|
|
||||||
public string Token;
|
|
||||||
|
|
||||||
[JsonProperty("self_mute")]
|
|
||||||
public bool? IsSelfMuted;
|
|
||||||
[JsonProperty("self_deaf")]
|
|
||||||
public bool? IsSelfDeafened;
|
|
||||||
[JsonProperty("mute")]
|
|
||||||
public bool? IsServerMuted;
|
|
||||||
[JsonProperty("deaf")]
|
|
||||||
public bool? IsServerDeafened;
|
|
||||||
[JsonProperty("suppress")]
|
|
||||||
public bool? IsServerSuppressed;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Channels
|
|
||||||
public class ChannelReference
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("guild_id")]
|
|
||||||
public string GuildId;
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("type")]
|
|
||||||
public string Type;
|
|
||||||
}
|
|
||||||
public class ChannelInfo : ChannelReference
|
|
||||||
{
|
|
||||||
public sealed class PermissionOverwrite
|
|
||||||
{
|
|
||||||
[JsonProperty("type")]
|
|
||||||
public string Type;
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("deny")]
|
|
||||||
public uint Deny;
|
|
||||||
[JsonProperty("allow")]
|
|
||||||
public uint Allow;
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty("last_message_id")]
|
|
||||||
public string LastMessageId;
|
|
||||||
[JsonProperty("is_private")]
|
|
||||||
public bool IsPrivate;
|
|
||||||
[JsonProperty("position")]
|
|
||||||
public int? Position;
|
|
||||||
[JsonProperty(PropertyName = "topic")]
|
|
||||||
public string Topic;
|
|
||||||
[JsonProperty("permission_overwrites")]
|
|
||||||
public PermissionOverwrite[] PermissionOverwrites;
|
|
||||||
[JsonProperty("recipient")]
|
|
||||||
public UserReference Recipient;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Guilds (Servers)
|
|
||||||
public class GuildReference
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
}
|
|
||||||
public class GuildInfo : GuildReference
|
|
||||||
{
|
|
||||||
[JsonProperty("afk_channel_id")]
|
|
||||||
public string AFKChannelId;
|
|
||||||
[JsonProperty("afk_timeout")]
|
|
||||||
public int AFKTimeout;
|
|
||||||
[JsonProperty("embed_channel_id")]
|
|
||||||
public string EmbedChannelId;
|
|
||||||
[JsonProperty("embed_enabled")]
|
|
||||||
public bool EmbedEnabled;
|
|
||||||
[JsonProperty("icon")]
|
|
||||||
public string Icon;
|
|
||||||
[JsonProperty("joined_at")]
|
|
||||||
public DateTime? JoinedAt;
|
|
||||||
[JsonProperty("owner_id")]
|
|
||||||
public string OwnerId;
|
|
||||||
[JsonProperty("region")]
|
|
||||||
public string Region;
|
|
||||||
[JsonProperty("roles")]
|
|
||||||
public RoleInfo[] Roles;
|
|
||||||
}
|
|
||||||
public class ExtendedGuildInfo : GuildInfo
|
|
||||||
{
|
|
||||||
[JsonProperty("channels")]
|
|
||||||
public ChannelInfo[] Channels;
|
|
||||||
[JsonProperty("members")]
|
|
||||||
public ExtendedMemberInfo[] Members;
|
|
||||||
[JsonProperty("presences")]
|
|
||||||
public PresenceMemberInfo[] Presences;
|
|
||||||
[JsonProperty("voice_states")]
|
|
||||||
public VoiceMemberInfo[] VoiceStates;
|
|
||||||
[JsonProperty("unavailable")]
|
|
||||||
public bool Unavailable;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Messages
|
|
||||||
public class MessageReference
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("channel_id")]
|
|
||||||
public string ChannelId;
|
|
||||||
[JsonProperty("message_id")]
|
|
||||||
public string MessageId { get { return Id; } set { Id = value; } }
|
|
||||||
}
|
|
||||||
public class Message : MessageReference
|
|
||||||
{
|
|
||||||
public sealed class Attachment
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
[JsonProperty("proxy_url")]
|
|
||||||
public string ProxyUrl;
|
|
||||||
[JsonProperty("size")]
|
|
||||||
public int Size;
|
|
||||||
[JsonProperty("filename")]
|
|
||||||
public string Filename;
|
|
||||||
[JsonProperty("width")]
|
|
||||||
public int Width;
|
|
||||||
[JsonProperty("height")]
|
|
||||||
public int Height;
|
|
||||||
}
|
|
||||||
public sealed class Embed
|
|
||||||
{
|
|
||||||
public sealed class Reference
|
|
||||||
{
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
}
|
|
||||||
public sealed class ThumbnailInfo
|
|
||||||
{
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
[JsonProperty("proxy_url")]
|
|
||||||
public string ProxyUrl;
|
|
||||||
[JsonProperty("width")]
|
|
||||||
public int Width;
|
|
||||||
[JsonProperty("height")]
|
|
||||||
public int Height;
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
[JsonProperty("type")]
|
|
||||||
public string Type;
|
|
||||||
[JsonProperty("title")]
|
|
||||||
public string Title;
|
|
||||||
[JsonProperty("description")]
|
|
||||||
public string Description;
|
|
||||||
[JsonProperty("author")]
|
|
||||||
public Reference Author;
|
|
||||||
[JsonProperty("provider")]
|
|
||||||
public Reference Provider;
|
|
||||||
[JsonProperty("thumbnail")]
|
|
||||||
public ThumbnailInfo Thumbnail;
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty("tts")]
|
|
||||||
public bool? IsTextToSpeech;
|
|
||||||
[JsonProperty("mention_everyone")]
|
|
||||||
public bool? IsMentioningEveryone;
|
|
||||||
[JsonProperty("timestamp")]
|
|
||||||
public DateTime? Timestamp;
|
|
||||||
[JsonProperty("edited_timestamp")]
|
|
||||||
public DateTime? EditedTimestamp;
|
|
||||||
[JsonProperty("mentions")]
|
|
||||||
public UserReference[] Mentions;
|
|
||||||
[JsonProperty("embeds")]
|
|
||||||
public Embed[] Embeds; //TODO: Parse this
|
|
||||||
[JsonProperty("attachments")]
|
|
||||||
public Attachment[] Attachments;
|
|
||||||
[JsonProperty("content")]
|
|
||||||
public string Content;
|
|
||||||
[JsonProperty("author")]
|
|
||||||
public UserReference Author;
|
|
||||||
[JsonProperty("nonce")]
|
|
||||||
public string Nonce;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Roles
|
|
||||||
public class RoleReference
|
|
||||||
{
|
|
||||||
[JsonProperty("guild_id")]
|
|
||||||
public string GuildId;
|
|
||||||
[JsonProperty("role_id")]
|
|
||||||
public string RoleId;
|
|
||||||
}
|
|
||||||
public class RoleInfo
|
|
||||||
{
|
|
||||||
[JsonProperty("permissions")]
|
|
||||||
public uint? Permissions;
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("position")]
|
|
||||||
public int? Position;
|
|
||||||
[JsonProperty("hoist")]
|
|
||||||
public bool? Hoist;
|
|
||||||
[JsonProperty("color")]
|
|
||||||
public uint? Color;
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("managed")]
|
|
||||||
public bool? Managed;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Invites
|
|
||||||
public class Invite
|
|
||||||
{
|
|
||||||
[JsonProperty("inviter")]
|
|
||||||
public UserReference Inviter;
|
|
||||||
[JsonProperty("guild")]
|
|
||||||
public GuildReference Guild;
|
|
||||||
[JsonProperty("channel")]
|
|
||||||
public ChannelReference Channel;
|
|
||||||
[JsonProperty("code")]
|
|
||||||
public string Code;
|
|
||||||
[JsonProperty("xkcdpass")]
|
|
||||||
public string XkcdPass;
|
|
||||||
}
|
|
||||||
public class ExtendedInvite : Invite
|
|
||||||
{
|
|
||||||
[JsonProperty("max_age")]
|
|
||||||
public int ?MaxAge;
|
|
||||||
[JsonProperty("max_uses")]
|
|
||||||
public int? MaxUses;
|
|
||||||
[JsonProperty("revoked")]
|
|
||||||
public bool? IsRevoked;
|
|
||||||
[JsonProperty("temporary")]
|
|
||||||
public bool? IsTemporary;
|
|
||||||
[JsonProperty("uses")]
|
|
||||||
public int? Uses;
|
|
||||||
[JsonProperty("created_at")]
|
|
||||||
public DateTime? CreatedAt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
namespace Discord.API
|
namespace Discord.API
|
||||||
{
|
{
|
||||||
internal static class Endpoints
|
public static class Endpoints
|
||||||
{
|
{
|
||||||
public const string BaseStatusApi = "https://status.discordapp.com/api/v2/";
|
public const string BaseStatusApi = "https://status.discordapp.com/api/v2/";
|
||||||
public const string BaseApi = "https://discordapp.com/api/";
|
public const string BaseApi = "https://discordapp.com/api/";
|
||||||
|
|
||||||
public const string Gateway = "gateway";
|
public const string Gateway = "gateway";
|
||||||
|
|
||||||
public const string Auth = "auth";
|
public const string Auth = "auth";
|
||||||
@@ -39,7 +40,7 @@
|
|||||||
|
|
||||||
public const string Voice = "voice";
|
public const string Voice = "voice";
|
||||||
public const string VoiceRegions = "voice/regions";
|
public const string VoiceRegions = "voice/regions";
|
||||||
public const string VoiceIce = "voice/ice";
|
//public const string VoiceIce = "voice/ice";
|
||||||
|
|
||||||
public const string StatusActiveMaintenance = "scheduled-maintenances/active.json";
|
public const string StatusActiveMaintenance = "scheduled-maintenances/active.json";
|
||||||
public const string StatusUpcomingMaintenance = "scheduled-maintenances/upcoming.json";
|
public const string StatusUpcomingMaintenance = "scheduled-maintenances/upcoming.json";
|
||||||
|
|||||||
59
src/Discord.Net/API/Invites.cs
Normal file
59
src/Discord.Net/API/Invites.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class InviteReference
|
||||||
|
{
|
||||||
|
[JsonProperty("inviter")]
|
||||||
|
public UserReference Inviter;
|
||||||
|
[JsonProperty("guild")]
|
||||||
|
public GuildReference Guild;
|
||||||
|
[JsonProperty("channel")]
|
||||||
|
public ChannelReference Channel;
|
||||||
|
[JsonProperty("code")]
|
||||||
|
public string Code;
|
||||||
|
[JsonProperty("xkcdpass")]
|
||||||
|
public string XkcdPass;
|
||||||
|
}
|
||||||
|
public class InviteInfo : InviteReference
|
||||||
|
{
|
||||||
|
[JsonProperty("max_age")]
|
||||||
|
public int? MaxAge;
|
||||||
|
[JsonProperty("max_uses")]
|
||||||
|
public int? MaxUses;
|
||||||
|
[JsonProperty("revoked")]
|
||||||
|
public bool? IsRevoked;
|
||||||
|
[JsonProperty("temporary")]
|
||||||
|
public bool? IsTemporary;
|
||||||
|
[JsonProperty("uses")]
|
||||||
|
public int? Uses;
|
||||||
|
[JsonProperty("created_at")]
|
||||||
|
public DateTime? CreatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Create
|
||||||
|
public class CreateInviteRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("max_age")]
|
||||||
|
public int MaxAge;
|
||||||
|
[JsonProperty("max_uses")]
|
||||||
|
public int MaxUses;
|
||||||
|
[JsonProperty("temporary")]
|
||||||
|
public bool IsTemporary;
|
||||||
|
[JsonProperty("xkcdpass")]
|
||||||
|
public bool WithXkcdPass;
|
||||||
|
}
|
||||||
|
public class CreateInviteResponse : InviteInfo { }
|
||||||
|
|
||||||
|
//Get
|
||||||
|
public class GetInviteResponse : InviteReference { }
|
||||||
|
|
||||||
|
//Accept
|
||||||
|
public class AcceptInviteResponse : InviteReference { }
|
||||||
|
}
|
||||||
33
src/Discord.Net/API/Maintenance.cs
Normal file
33
src/Discord.Net/API/Maintenance.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
public class GetIncidentsResponse
|
||||||
|
{
|
||||||
|
[JsonProperty("page")]
|
||||||
|
public PageData Page;
|
||||||
|
[JsonProperty("scheduled_maintenances")]
|
||||||
|
public MaintenanceData[] ScheduledMaintenances;
|
||||||
|
|
||||||
|
public sealed class PageData
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
[JsonProperty("updated-at")]
|
||||||
|
public DateTime? UpdatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class MaintenanceData
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
88
src/Discord.Net/API/Members.cs
Normal file
88
src/Discord.Net/API/Members.cs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class MemberReference
|
||||||
|
{
|
||||||
|
[JsonProperty("user_id")]
|
||||||
|
public string UserId;
|
||||||
|
[JsonProperty("guild_id")]
|
||||||
|
public string GuildId;
|
||||||
|
|
||||||
|
[JsonProperty("user")]
|
||||||
|
private UserReference _user;
|
||||||
|
public UserReference User
|
||||||
|
{
|
||||||
|
get { return _user; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_user = value;
|
||||||
|
UserId = User.Id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class MemberInfo : MemberReference
|
||||||
|
{
|
||||||
|
[JsonProperty("joined_at")]
|
||||||
|
public DateTime? JoinedAt;
|
||||||
|
[JsonProperty("roles")]
|
||||||
|
public string[] Roles;
|
||||||
|
}
|
||||||
|
public class ExtendedMemberInfo : MemberInfo
|
||||||
|
{
|
||||||
|
[JsonProperty("mute")]
|
||||||
|
public bool? IsServerMuted;
|
||||||
|
[JsonProperty("deaf")]
|
||||||
|
public bool? IsServerDeafened;
|
||||||
|
}
|
||||||
|
public class PresenceInfo : MemberReference
|
||||||
|
{
|
||||||
|
[JsonProperty("game_id")]
|
||||||
|
public string GameId;
|
||||||
|
[JsonProperty("status")]
|
||||||
|
public string Status;
|
||||||
|
}
|
||||||
|
public class VoiceMemberInfo : MemberReference
|
||||||
|
{
|
||||||
|
[JsonProperty("channel_id")]
|
||||||
|
public string ChannelId;
|
||||||
|
[JsonProperty("session_id")]
|
||||||
|
public string SessionId;
|
||||||
|
[JsonProperty("token")]
|
||||||
|
public string Token;
|
||||||
|
|
||||||
|
[JsonProperty("self_mute")]
|
||||||
|
public bool? IsSelfMuted;
|
||||||
|
[JsonProperty("self_deaf")]
|
||||||
|
public bool? IsSelfDeafened;
|
||||||
|
[JsonProperty("mute")]
|
||||||
|
public bool? IsServerMuted;
|
||||||
|
[JsonProperty("deaf")]
|
||||||
|
public bool? IsServerDeafened;
|
||||||
|
[JsonProperty("suppress")]
|
||||||
|
public bool? IsServerSuppressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EditMemberRequest
|
||||||
|
{
|
||||||
|
[JsonProperty(PropertyName = "mute", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public bool? Mute;
|
||||||
|
[JsonProperty(PropertyName = "deaf", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public bool? Deaf;
|
||||||
|
[JsonProperty(PropertyName = "roles", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public IEnumerable<string> Roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class MemberAddEvent : MemberInfo { }
|
||||||
|
internal sealed class MemberUpdateEvent : MemberInfo { }
|
||||||
|
internal sealed class MemberRemoveEvent : MemberInfo { }
|
||||||
|
internal sealed class MemberVoiceStateUpdateEvent : VoiceMemberInfo { }
|
||||||
|
}
|
||||||
133
src/Discord.Net/API/Messages.cs
Normal file
133
src/Discord.Net/API/Messages.cs
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class MessageReference
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("channel_id")]
|
||||||
|
public string ChannelId;
|
||||||
|
[JsonProperty("message_id")]
|
||||||
|
public string MessageId { get { return Id; } set { Id = value; } }
|
||||||
|
}
|
||||||
|
public class MessageInfo : MessageReference
|
||||||
|
{
|
||||||
|
public sealed class Attachment
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
[JsonProperty("proxy_url")]
|
||||||
|
public string ProxyUrl;
|
||||||
|
[JsonProperty("size")]
|
||||||
|
public int Size;
|
||||||
|
[JsonProperty("filename")]
|
||||||
|
public string Filename;
|
||||||
|
[JsonProperty("width")]
|
||||||
|
public int Width;
|
||||||
|
[JsonProperty("height")]
|
||||||
|
public int Height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class Embed
|
||||||
|
{
|
||||||
|
public sealed class Reference
|
||||||
|
{
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class ThumbnailInfo
|
||||||
|
{
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
[JsonProperty("proxy_url")]
|
||||||
|
public string ProxyUrl;
|
||||||
|
[JsonProperty("width")]
|
||||||
|
public int Width;
|
||||||
|
[JsonProperty("height")]
|
||||||
|
public int Height;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
[JsonProperty("type")]
|
||||||
|
public string Type;
|
||||||
|
[JsonProperty("title")]
|
||||||
|
public string Title;
|
||||||
|
[JsonProperty("description")]
|
||||||
|
public string Description;
|
||||||
|
[JsonProperty("author")]
|
||||||
|
public Reference Author;
|
||||||
|
[JsonProperty("provider")]
|
||||||
|
public Reference Provider;
|
||||||
|
[JsonProperty("thumbnail")]
|
||||||
|
public ThumbnailInfo Thumbnail;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty("tts")]
|
||||||
|
public bool? IsTextToSpeech;
|
||||||
|
[JsonProperty("mention_everyone")]
|
||||||
|
public bool? IsMentioningEveryone;
|
||||||
|
[JsonProperty("timestamp")]
|
||||||
|
public DateTime? Timestamp;
|
||||||
|
[JsonProperty("edited_timestamp")]
|
||||||
|
public DateTime? EditedTimestamp;
|
||||||
|
[JsonProperty("mentions")]
|
||||||
|
public UserReference[] Mentions;
|
||||||
|
[JsonProperty("embeds")]
|
||||||
|
public Embed[] Embeds; //TODO: Parse this
|
||||||
|
[JsonProperty("attachments")]
|
||||||
|
public Attachment[] Attachments;
|
||||||
|
[JsonProperty("content")]
|
||||||
|
public string Content;
|
||||||
|
[JsonProperty("author")]
|
||||||
|
public UserReference Author;
|
||||||
|
[JsonProperty("nonce")]
|
||||||
|
public string Nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Create
|
||||||
|
internal sealed class SendMessageRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("content")]
|
||||||
|
public string Content;
|
||||||
|
[JsonProperty("mentions")]
|
||||||
|
public IEnumerable<string> Mentions;
|
||||||
|
[JsonProperty("nonce", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Nonce;
|
||||||
|
[JsonProperty("tts", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public bool IsTTS;
|
||||||
|
}
|
||||||
|
public sealed class SendMessageResponse : MessageInfo { }
|
||||||
|
|
||||||
|
//Edit
|
||||||
|
internal sealed class EditMessageRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("content", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Content;
|
||||||
|
[JsonProperty("mentions", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public IEnumerable<string> Mentions;
|
||||||
|
}
|
||||||
|
public sealed class EditMessageResponse : MessageInfo { }
|
||||||
|
|
||||||
|
//Get
|
||||||
|
public sealed class GetMessagesResponse : List<MessageInfo> { }
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class MessageCreateEvent : MessageInfo { }
|
||||||
|
internal sealed class MessageUpdateEvent : MessageInfo { }
|
||||||
|
internal sealed class MessageDeleteEvent : MessageReference { }
|
||||||
|
internal sealed class MessageAckEvent : MessageReference { }
|
||||||
|
}
|
||||||
21
src/Discord.Net/API/Permissions.cs
Normal file
21
src/Discord.Net/API/Permissions.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Create/Edit
|
||||||
|
internal sealed class SetChannelPermissionsRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("type")]
|
||||||
|
public string Type;
|
||||||
|
[JsonProperty("allow")]
|
||||||
|
public uint Allow;
|
||||||
|
[JsonProperty("deny")]
|
||||||
|
public uint Deny;
|
||||||
|
}
|
||||||
|
}
|
||||||
33
src/Discord.Net/API/Presence.cs
Normal file
33
src/Discord.Net/API/Presence.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Commands
|
||||||
|
internal sealed class UpdateStatusCommand : WebSocketMessage<UpdateStatusCommand.Data>
|
||||||
|
{
|
||||||
|
public UpdateStatusCommand() : base(3) { }
|
||||||
|
public class Data
|
||||||
|
{
|
||||||
|
[JsonProperty("idle_since")]
|
||||||
|
public ulong? IdleSince;
|
||||||
|
[JsonProperty("game_id")]
|
||||||
|
public int? GameId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class TypingStartEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("user_id")]
|
||||||
|
public string UserId;
|
||||||
|
[JsonProperty("channel_id")]
|
||||||
|
public string ChannelId;
|
||||||
|
[JsonProperty("timestamp")]
|
||||||
|
public int Timestamp;
|
||||||
|
}
|
||||||
|
internal sealed class PresenceUpdateEvent : PresenceInfo { }
|
||||||
|
}
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
//Ignore unused/unassigned variable warnings
|
|
||||||
#pragma warning disable CS0649
|
|
||||||
#pragma warning disable CS0169
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Collections;
|
|
||||||
|
|
||||||
namespace Discord.API
|
|
||||||
{
|
|
||||||
//Auth
|
|
||||||
internal sealed class RegisterRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("fingerprint")]
|
|
||||||
public string Fingerprint;
|
|
||||||
[JsonProperty("username")]
|
|
||||||
public string Username;
|
|
||||||
}
|
|
||||||
internal sealed class LoginRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("email")]
|
|
||||||
public string Email;
|
|
||||||
[JsonProperty("password")]
|
|
||||||
public string Password;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Channels
|
|
||||||
internal sealed class CreateChannelRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("type")]
|
|
||||||
public string Type;
|
|
||||||
}
|
|
||||||
internal sealed class CreatePMChannelRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("recipient_id")]
|
|
||||||
public string RecipientId;
|
|
||||||
}
|
|
||||||
internal sealed class EditChannelRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("topic", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Topic;
|
|
||||||
}
|
|
||||||
internal sealed class ReorderChannelsRequest : IEnumerable<ReorderChannelsRequest.Channel>
|
|
||||||
{
|
|
||||||
public sealed class Channel
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("position")]
|
|
||||||
public uint Position;
|
|
||||||
}
|
|
||||||
private IEnumerable<Channel> _channels;
|
|
||||||
public ReorderChannelsRequest(IEnumerable<Channel> channels) { _channels = channels; }
|
|
||||||
|
|
||||||
public IEnumerator<Channel> GetEnumerator() =>_channels.GetEnumerator();
|
|
||||||
IEnumerator IEnumerable.GetEnumerator() => _channels.GetEnumerator();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Invites
|
|
||||||
internal sealed class CreateInviteRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("max_age")]
|
|
||||||
public int MaxAge;
|
|
||||||
[JsonProperty("max_uses")]
|
|
||||||
public int MaxUses;
|
|
||||||
[JsonProperty("temporary")]
|
|
||||||
public bool IsTemporary;
|
|
||||||
[JsonProperty("xkcdpass")]
|
|
||||||
public bool WithXkcdPass;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Members
|
|
||||||
internal sealed class EditMemberRequest
|
|
||||||
{
|
|
||||||
[JsonProperty(PropertyName = "mute", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public bool? Mute;
|
|
||||||
[JsonProperty(PropertyName = "deaf", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public bool? Deaf;
|
|
||||||
[JsonProperty(PropertyName = "roles", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public IEnumerable<string> Roles;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Messages
|
|
||||||
internal sealed class SendMessageRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("content")]
|
|
||||||
public string Content;
|
|
||||||
[JsonProperty("mentions")]
|
|
||||||
public IEnumerable<string> Mentions;
|
|
||||||
[JsonProperty("nonce", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Nonce;
|
|
||||||
[JsonProperty("tts", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public bool IsTTS;
|
|
||||||
}
|
|
||||||
internal sealed class EditMessageRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("content", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Content;
|
|
||||||
[JsonProperty("mentions", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public IEnumerable<string> Mentions;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Permissions
|
|
||||||
internal sealed class SetChannelPermissionsRequest //Both creates and modifies
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("type")]
|
|
||||||
public string Type;
|
|
||||||
[JsonProperty("allow")]
|
|
||||||
public uint Allow;
|
|
||||||
[JsonProperty("deny")]
|
|
||||||
public uint Deny;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Profile
|
|
||||||
internal sealed class EditProfileRequest
|
|
||||||
{
|
|
||||||
[JsonProperty(PropertyName = "password")]
|
|
||||||
public string CurrentPassword;
|
|
||||||
[JsonProperty(PropertyName = "email", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Email;
|
|
||||||
[JsonProperty(PropertyName = "new_password")]
|
|
||||||
public string Password;
|
|
||||||
[JsonProperty(PropertyName = "username", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Username;
|
|
||||||
[JsonProperty(PropertyName = "avatar", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Avatar;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Roles
|
|
||||||
internal sealed class EditRoleRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("permissions", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public uint? Permissions;
|
|
||||||
[JsonProperty("hoist", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public bool? Hoist;
|
|
||||||
[JsonProperty("color", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public uint? Color;
|
|
||||||
}
|
|
||||||
internal sealed class ReorderRolesRequest : IEnumerable<ReorderRolesRequest.Role>
|
|
||||||
{
|
|
||||||
public sealed class Role
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("position")]
|
|
||||||
public uint Position;
|
|
||||||
}
|
|
||||||
private IEnumerable<Role> _roles;
|
|
||||||
public ReorderRolesRequest(IEnumerable<Role> roles) { _roles = roles; }
|
|
||||||
|
|
||||||
public IEnumerator<Role> GetEnumerator() => _roles.GetEnumerator();
|
|
||||||
IEnumerator IEnumerable.GetEnumerator() => _roles.GetEnumerator();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Servers
|
|
||||||
internal sealed class CreateServerRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("region")]
|
|
||||||
public string Region;
|
|
||||||
}
|
|
||||||
internal sealed class EditServerRequest
|
|
||||||
{
|
|
||||||
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("region", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Region;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
//Ignore unused/unassigned variable warnings
|
|
||||||
#pragma warning disable CS0649
|
|
||||||
#pragma warning disable CS0169
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Discord.API
|
|
||||||
{
|
|
||||||
//Auth
|
|
||||||
public sealed class GatewayResponse
|
|
||||||
{
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
}
|
|
||||||
public sealed class LoginResponse
|
|
||||||
{
|
|
||||||
[JsonProperty("token")]
|
|
||||||
public string Token;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Channels
|
|
||||||
public sealed class CreateChannelResponse : ChannelInfo { }
|
|
||||||
public sealed class DestroyChannelResponse : ChannelInfo { }
|
|
||||||
public sealed class EditChannelResponse : ChannelInfo { }
|
|
||||||
|
|
||||||
//Invites
|
|
||||||
public sealed class CreateInviteResponse : ExtendedInvite { }
|
|
||||||
public sealed class GetInviteResponse : Invite { }
|
|
||||||
public sealed class AcceptInviteResponse : Invite { }
|
|
||||||
|
|
||||||
//Messages
|
|
||||||
public sealed class SendMessageResponse : Message { }
|
|
||||||
public sealed class EditMessageResponse : Message { }
|
|
||||||
public sealed class GetMessagesResponse : List<Message> { }
|
|
||||||
|
|
||||||
//Profile
|
|
||||||
public sealed class EditProfileResponse : SelfUserInfo { }
|
|
||||||
|
|
||||||
//Roles
|
|
||||||
public sealed class CreateRoleResponse : RoleInfo { }
|
|
||||||
public sealed class EditRoleResponse : RoleInfo { }
|
|
||||||
|
|
||||||
//Servers
|
|
||||||
public sealed class CreateServerResponse : GuildInfo { }
|
|
||||||
public sealed class DeleteServerResponse : GuildInfo { }
|
|
||||||
public sealed class EditServerResponse : GuildInfo { }
|
|
||||||
|
|
||||||
//Voice
|
|
||||||
public sealed class GetRegionsResponse : List<GetRegionsResponse.RegionData>
|
|
||||||
{
|
|
||||||
public sealed class RegionData
|
|
||||||
{
|
|
||||||
[JsonProperty("sample_hostname")]
|
|
||||||
public string Hostname;
|
|
||||||
[JsonProperty("sample_port")]
|
|
||||||
public int Port;
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public sealed class GetIceResponse
|
|
||||||
{
|
|
||||||
[JsonProperty("ttl")]
|
|
||||||
public string TTL;
|
|
||||||
[JsonProperty("servers")]
|
|
||||||
public ServerData[] Servers;
|
|
||||||
|
|
||||||
public sealed class ServerData
|
|
||||||
{
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string URL;
|
|
||||||
[JsonProperty("username")]
|
|
||||||
public string Username;
|
|
||||||
[JsonProperty("credential")]
|
|
||||||
public string Credential;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class GetIncidentsResponse
|
|
||||||
{
|
|
||||||
[JsonProperty("page")]
|
|
||||||
public PageData Page;
|
|
||||||
[JsonProperty("scheduled_maintenances")]
|
|
||||||
public MaintenanceData[] ScheduledMaintenances;
|
|
||||||
|
|
||||||
public sealed class PageData
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string Id;
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
[JsonProperty("updated-at")]
|
|
||||||
public DateTime? UpdatedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class MaintenanceData
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
using Discord.API;
|
|
||||||
using System;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.IO;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Discord.API
|
|
||||||
{
|
|
||||||
internal class BuiltInRestEngine : IRestEngine
|
|
||||||
{
|
|
||||||
private readonly HttpClient _client;
|
|
||||||
|
|
||||||
public BuiltInRestEngine(string userAgent, int timeout)
|
|
||||||
{
|
|
||||||
_client = new HttpClient(new HttpClientHandler
|
|
||||||
{
|
|
||||||
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
|
|
||||||
UseCookies = false,
|
|
||||||
PreAuthenticate = false //We do auth ourselves
|
|
||||||
});
|
|
||||||
_client.DefaultRequestHeaders.Add("accept", "*\/*");
|
|
||||||
_client.DefaultRequestHeaders.Add("accept-encoding", "gzip,deflate");
|
|
||||||
_client.DefaultRequestHeaders.Add("user-agent", userAgent);
|
|
||||||
_client.Timeout = TimeSpan.FromMilliseconds(timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetToken(string token)
|
|
||||||
{
|
|
||||||
_client.DefaultRequestHeaders.Remove("authorization");
|
|
||||||
if (token != null)
|
|
||||||
_client.DefaultRequestHeaders.Add("authorization", token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<string> Send(HttpMethod method, string path, string json, CancellationToken cancelToken)
|
|
||||||
{
|
|
||||||
using (var request = new HttpRequestMessage(method, Endpoints.BaseApi + path))
|
|
||||||
{
|
|
||||||
if (json != null)
|
|
||||||
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
|
|
||||||
return await Send(request, cancelToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public async Task<string> SendFile(HttpMethod method, string path, string filePath, CancellationToken cancelToken)
|
|
||||||
{
|
|
||||||
using (var request = new HttpRequestMessage(method, Endpoints.BaseApi + path))
|
|
||||||
{
|
|
||||||
var content = new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture));
|
|
||||||
content.Add(new StreamContent(File.OpenRead(filePath)), "file", Path.GetFileName(filePath));
|
|
||||||
request.Content = content;
|
|
||||||
return await Send(request, cancelToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private async Task<string> Send(HttpRequestMessage request, CancellationToken cancelToken)
|
|
||||||
{
|
|
||||||
var response = await _client.SendAsync(request, cancelToken).ConfigureAwait(false);
|
|
||||||
if (!response.IsSuccessStatusCode)
|
|
||||||
throw new HttpException(response.StatusCode);
|
|
||||||
return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
87
src/Discord.Net/API/Roles.cs
Normal file
87
src/Discord.Net/API/Roles.cs
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class RoleReference
|
||||||
|
{
|
||||||
|
[JsonProperty("guild_id")]
|
||||||
|
public string GuildId;
|
||||||
|
[JsonProperty("role_id")]
|
||||||
|
public string RoleId;
|
||||||
|
}
|
||||||
|
public class RoleInfo
|
||||||
|
{
|
||||||
|
[JsonProperty("permissions")]
|
||||||
|
public uint? Permissions;
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("position")]
|
||||||
|
public int? Position;
|
||||||
|
[JsonProperty("hoist")]
|
||||||
|
public bool? Hoist;
|
||||||
|
[JsonProperty("color")]
|
||||||
|
public uint? Color;
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("managed")]
|
||||||
|
public bool? Managed;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Create
|
||||||
|
public sealed class CreateRoleResponse : RoleInfo { }
|
||||||
|
|
||||||
|
//Edit
|
||||||
|
public sealed class EditRoleRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("permissions", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public uint? Permissions;
|
||||||
|
[JsonProperty("hoist", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public bool? Hoist;
|
||||||
|
[JsonProperty("color", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public uint? Color;
|
||||||
|
}
|
||||||
|
public sealed class EditRoleResponse : RoleInfo { }
|
||||||
|
|
||||||
|
//Reorder
|
||||||
|
public sealed class ReorderRolesRequest : IEnumerable<ReorderRolesRequest.Role>
|
||||||
|
{
|
||||||
|
public sealed class Role
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("position")]
|
||||||
|
public uint Position;
|
||||||
|
}
|
||||||
|
private IEnumerable<Role> _roles;
|
||||||
|
public ReorderRolesRequest(IEnumerable<Role> roles) { _roles = roles; }
|
||||||
|
|
||||||
|
public IEnumerator<Role> GetEnumerator() => _roles.GetEnumerator();
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => _roles.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class RoleCreateEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("guild_id")]
|
||||||
|
public string GuildId;
|
||||||
|
[JsonProperty("role")]
|
||||||
|
public RoleInfo Data;
|
||||||
|
}
|
||||||
|
internal sealed class RoleUpdateEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("guild_id")]
|
||||||
|
public string GuildId;
|
||||||
|
[JsonProperty("role")]
|
||||||
|
public RoleInfo Data;
|
||||||
|
}
|
||||||
|
internal sealed class RoleDeleteEvent : RoleReference { }
|
||||||
|
}
|
||||||
80
src/Discord.Net/API/Servers.cs
Normal file
80
src/Discord.Net/API/Servers.cs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class GuildReference
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
}
|
||||||
|
public class GuildInfo : GuildReference
|
||||||
|
{
|
||||||
|
[JsonProperty("afk_channel_id")]
|
||||||
|
public string AFKChannelId;
|
||||||
|
[JsonProperty("afk_timeout")]
|
||||||
|
public int AFKTimeout;
|
||||||
|
[JsonProperty("embed_channel_id")]
|
||||||
|
public string EmbedChannelId;
|
||||||
|
[JsonProperty("embed_enabled")]
|
||||||
|
public bool EmbedEnabled;
|
||||||
|
[JsonProperty("icon")]
|
||||||
|
public string Icon;
|
||||||
|
[JsonProperty("joined_at")]
|
||||||
|
public DateTime? JoinedAt;
|
||||||
|
[JsonProperty("owner_id")]
|
||||||
|
public string OwnerId;
|
||||||
|
[JsonProperty("region")]
|
||||||
|
public string Region;
|
||||||
|
[JsonProperty("roles")]
|
||||||
|
public RoleInfo[] Roles;
|
||||||
|
}
|
||||||
|
public class ExtendedGuildInfo : GuildInfo
|
||||||
|
{
|
||||||
|
[JsonProperty("channels")]
|
||||||
|
public ChannelInfo[] Channels;
|
||||||
|
[JsonProperty("members")]
|
||||||
|
public ExtendedMemberInfo[] Members;
|
||||||
|
[JsonProperty("presences")]
|
||||||
|
public PresenceInfo[] Presences;
|
||||||
|
[JsonProperty("voice_states")]
|
||||||
|
public VoiceMemberInfo[] VoiceStates;
|
||||||
|
[JsonProperty("unavailable")]
|
||||||
|
public bool Unavailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Create
|
||||||
|
internal sealed class CreateServerRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("region")]
|
||||||
|
public string Region;
|
||||||
|
}
|
||||||
|
public sealed class CreateServerResponse : GuildInfo { }
|
||||||
|
|
||||||
|
//Edit
|
||||||
|
internal sealed class EditServerRequest
|
||||||
|
{
|
||||||
|
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Name;
|
||||||
|
[JsonProperty("region", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Region;
|
||||||
|
}
|
||||||
|
public sealed class EditServerResponse : GuildInfo { }
|
||||||
|
|
||||||
|
//Delete
|
||||||
|
public sealed class DeleteServerResponse : GuildInfo { }
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class GuildCreateEvent : ExtendedGuildInfo { }
|
||||||
|
internal sealed class GuildUpdateEvent : GuildInfo { }
|
||||||
|
internal sealed class GuildDeleteEvent : ExtendedGuildInfo { }
|
||||||
|
}
|
||||||
47
src/Discord.Net/API/Users.cs
Normal file
47
src/Discord.Net/API/Users.cs
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class UserReference
|
||||||
|
{
|
||||||
|
[JsonProperty("username")]
|
||||||
|
public string Username;
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("discriminator")]
|
||||||
|
public string Discriminator;
|
||||||
|
[JsonProperty("avatar")]
|
||||||
|
public string Avatar;
|
||||||
|
}
|
||||||
|
public class UserInfo : UserReference
|
||||||
|
{
|
||||||
|
[JsonProperty("email")]
|
||||||
|
public string Email;
|
||||||
|
[JsonProperty("verified")]
|
||||||
|
public bool? IsVerified;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Edit
|
||||||
|
internal sealed class EditUserRequest
|
||||||
|
{
|
||||||
|
[JsonProperty(PropertyName = "password")]
|
||||||
|
public string CurrentPassword;
|
||||||
|
[JsonProperty(PropertyName = "email", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Email;
|
||||||
|
[JsonProperty(PropertyName = "new_password")]
|
||||||
|
public string Password;
|
||||||
|
[JsonProperty(PropertyName = "username", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Username;
|
||||||
|
[JsonProperty(PropertyName = "avatar", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Avatar;
|
||||||
|
}
|
||||||
|
public sealed class EditUserResponse : UserInfo { }
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class UserUpdateEvent : UserInfo { }
|
||||||
|
}
|
||||||
153
src/Discord.Net/API/Voice.cs
Normal file
153
src/Discord.Net/API/Voice.cs
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
public class GetRegionsResponse : List<GetRegionsResponse.RegionData>
|
||||||
|
{
|
||||||
|
public sealed class RegionData
|
||||||
|
{
|
||||||
|
[JsonProperty("sample_hostname")]
|
||||||
|
public string Hostname;
|
||||||
|
[JsonProperty("sample_port")]
|
||||||
|
public int Port;
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id;
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetIceResponse
|
||||||
|
{
|
||||||
|
[JsonProperty("ttl")]
|
||||||
|
public string TTL;
|
||||||
|
[JsonProperty("servers")]
|
||||||
|
public ServerData[] Servers;
|
||||||
|
|
||||||
|
public sealed class ServerData
|
||||||
|
{
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string URL;
|
||||||
|
[JsonProperty("username")]
|
||||||
|
public string Username;
|
||||||
|
[JsonProperty("credential")]
|
||||||
|
public string Credential;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Commands
|
||||||
|
internal sealed class JoinVoiceCommand : WebSocketMessage<JoinVoiceCommand.Data>
|
||||||
|
{
|
||||||
|
public JoinVoiceCommand() : base(4) { }
|
||||||
|
public class Data
|
||||||
|
{
|
||||||
|
[JsonProperty("guild_id")]
|
||||||
|
public string ServerId;
|
||||||
|
[JsonProperty("channel_id")]
|
||||||
|
public string ChannelId;
|
||||||
|
[JsonProperty("self_mute")]
|
||||||
|
public string SelfMute;
|
||||||
|
[JsonProperty("self_deaf")]
|
||||||
|
public string SelfDeaf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class VoiceServerUpdateEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("guild_id")]
|
||||||
|
public string GuildId;
|
||||||
|
[JsonProperty("endpoint")]
|
||||||
|
public string Endpoint;
|
||||||
|
[JsonProperty("token")]
|
||||||
|
public string Token;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Commands (Voice)
|
||||||
|
internal sealed class VoiceLoginCommand : WebSocketMessage<VoiceLoginCommand.Data>
|
||||||
|
{
|
||||||
|
public VoiceLoginCommand() : base(0) { }
|
||||||
|
public class Data
|
||||||
|
{
|
||||||
|
[JsonProperty("server_id")]
|
||||||
|
public string ServerId;
|
||||||
|
[JsonProperty("user_id")]
|
||||||
|
public string UserId;
|
||||||
|
[JsonProperty("session_id")]
|
||||||
|
public string SessionId;
|
||||||
|
[JsonProperty("token")]
|
||||||
|
public string Token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
internal sealed class VoiceLogin2Command : WebSocketMessage<VoiceLogin2Command.Data>
|
||||||
|
{
|
||||||
|
public VoiceLogin2Command() : base(1) { }
|
||||||
|
public class Data
|
||||||
|
{
|
||||||
|
public class SocketInfo
|
||||||
|
{
|
||||||
|
[JsonProperty("address")]
|
||||||
|
public string Address;
|
||||||
|
[JsonProperty("port")]
|
||||||
|
public int Port;
|
||||||
|
[JsonProperty("mode")]
|
||||||
|
public string Mode = "xsalsa20_poly1305";
|
||||||
|
}
|
||||||
|
[JsonProperty("protocol")]
|
||||||
|
public string Protocol = "udp";
|
||||||
|
[JsonProperty("data")]
|
||||||
|
public SocketInfo SocketData = new SocketInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
internal sealed class VoiceKeepAliveCommand : WebSocketMessage<object>
|
||||||
|
{
|
||||||
|
public VoiceKeepAliveCommand() : base(3, null) { }
|
||||||
|
}
|
||||||
|
internal sealed class IsTalkingCommand : WebSocketMessage<IsTalkingCommand.Data>
|
||||||
|
{
|
||||||
|
public IsTalkingCommand() : base(5) { }
|
||||||
|
public class Data
|
||||||
|
{
|
||||||
|
[JsonProperty("delay")]
|
||||||
|
public int Delay;
|
||||||
|
[JsonProperty("speaking")]
|
||||||
|
public bool IsSpeaking;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Events (Voice)
|
||||||
|
public class VoiceReadyEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("ssrc")]
|
||||||
|
public uint SSRC;
|
||||||
|
[JsonProperty("port")]
|
||||||
|
public ushort Port;
|
||||||
|
[JsonProperty("modes")]
|
||||||
|
public string[] Modes;
|
||||||
|
[JsonProperty("heartbeat_interval")]
|
||||||
|
public int HeartbeatInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class JoinServerEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("secret_key")]
|
||||||
|
public byte[] SecretKey;
|
||||||
|
[JsonProperty("mode")]
|
||||||
|
public string Mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IsTalkingEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("user_id")]
|
||||||
|
public string UserId;
|
||||||
|
[JsonProperty("ssrc")]
|
||||||
|
public uint SSRC;
|
||||||
|
[JsonProperty("speaking")]
|
||||||
|
public bool IsSpeaking;
|
||||||
|
}
|
||||||
|
}
|
||||||
112
src/Discord.Net/API/WebSockets.cs
Normal file
112
src/Discord.Net/API/WebSockets.cs
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
//Ignore unused/unassigned variable warnings
|
||||||
|
#pragma warning disable CS0649
|
||||||
|
#pragma warning disable CS0169
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Discord.API
|
||||||
|
{
|
||||||
|
//Common
|
||||||
|
public class WebSocketMessage
|
||||||
|
{
|
||||||
|
[JsonProperty("op")]
|
||||||
|
public int Operation;
|
||||||
|
[JsonProperty("d")]
|
||||||
|
public object Payload;
|
||||||
|
[JsonProperty("t", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public string Type;
|
||||||
|
[JsonProperty("s", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public int? Sequence;
|
||||||
|
}
|
||||||
|
internal abstract class WebSocketMessage<T> : WebSocketMessage
|
||||||
|
where T : new()
|
||||||
|
{
|
||||||
|
public WebSocketMessage() { Payload = new T(); }
|
||||||
|
public WebSocketMessage(int op) { Operation = op; Payload = new T(); }
|
||||||
|
public WebSocketMessage(int op, T payload) { Operation = op; Payload = payload; }
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public new T Payload
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (base.Payload is JToken)
|
||||||
|
base.Payload = (base.Payload as JToken).ToObject<T>();
|
||||||
|
return (T)base.Payload;
|
||||||
|
}
|
||||||
|
set { base.Payload = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Commands
|
||||||
|
internal sealed class KeepAliveCommand : WebSocketMessage<ulong>
|
||||||
|
{
|
||||||
|
public KeepAliveCommand() : base(1, EpochTime.GetMilliseconds()) { }
|
||||||
|
}
|
||||||
|
internal sealed class LoginCommand : WebSocketMessage<LoginCommand.Data>
|
||||||
|
{
|
||||||
|
public LoginCommand() : base(2) { }
|
||||||
|
public class Data
|
||||||
|
{
|
||||||
|
[JsonProperty("token")]
|
||||||
|
public string Token;
|
||||||
|
[JsonProperty("v")]
|
||||||
|
public int Version = 3;
|
||||||
|
[JsonProperty("properties")]
|
||||||
|
public Dictionary<string, string> Properties = new Dictionary<string, string>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
internal sealed class ResumeCommand : WebSocketMessage<ResumeCommand.Data>
|
||||||
|
{
|
||||||
|
public ResumeCommand() : base(6) { }
|
||||||
|
public class Data
|
||||||
|
{
|
||||||
|
[JsonProperty("session_id")]
|
||||||
|
public string SessionId;
|
||||||
|
[JsonProperty("seq")]
|
||||||
|
public int Sequence;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Events
|
||||||
|
internal sealed class ReadyEvent
|
||||||
|
{
|
||||||
|
public sealed class ReadStateInfo
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string ChannelId;
|
||||||
|
[JsonProperty("mention_count")]
|
||||||
|
public int MentionCount;
|
||||||
|
[JsonProperty("last_message_id")]
|
||||||
|
public string LastMessageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty("v")]
|
||||||
|
public int Version;
|
||||||
|
[JsonProperty("user")]
|
||||||
|
public UserInfo User;
|
||||||
|
[JsonProperty("session_id")]
|
||||||
|
public string SessionId;
|
||||||
|
[JsonProperty("read_state")]
|
||||||
|
public ReadStateInfo[] ReadState;
|
||||||
|
[JsonProperty("guilds")]
|
||||||
|
public ExtendedGuildInfo[] Guilds;
|
||||||
|
[JsonProperty("private_channels")]
|
||||||
|
public ChannelInfo[] PrivateChannels;
|
||||||
|
[JsonProperty("heartbeat_interval")]
|
||||||
|
public int HeartbeatInterval;
|
||||||
|
}
|
||||||
|
internal sealed class ResumedEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("heartbeat_interval")]
|
||||||
|
public int HeartbeatInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal sealed class RedirectEvent
|
||||||
|
{
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Discord.API;
|
using Discord.API;
|
||||||
|
using Discord.Net;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -312,7 +313,7 @@ namespace Discord
|
|||||||
{
|
{
|
||||||
var msg = _messages.GetOrAdd("nonce_" + nonce, channel.Id, CurrentUserId);
|
var msg = _messages.GetOrAdd("nonce_" + nonce, channel.Id, CurrentUserId);
|
||||||
var currentMember = _members[msg.UserId, channel.ServerId];
|
var currentMember = _members[msg.UserId, channel.ServerId];
|
||||||
msg.Update(new API.Message
|
msg.Update(new MessageInfo
|
||||||
{
|
{
|
||||||
Content = blockText,
|
Content = blockText,
|
||||||
Timestamp = DateTime.UtcNow,
|
Timestamp = DateTime.UtcNow,
|
||||||
@@ -611,26 +612,20 @@ namespace Discord
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Profile
|
//Profile
|
||||||
public Task<EditProfileResponse> EditProfile(string currentPassword = "",
|
public Task<EditUserResponse> EditProfile(string currentPassword = "",
|
||||||
string username = null, string email = null, string password = null,
|
string username = null, string email = null, string password = null,
|
||||||
AvatarImageType avatarType = AvatarImageType.Png, byte[] avatar = null)
|
AvatarImageType avatarType = AvatarImageType.Png, byte[] avatar = null)
|
||||||
{
|
{
|
||||||
if (currentPassword == null) throw new ArgumentNullException(nameof(currentPassword));
|
if (currentPassword == null) throw new ArgumentNullException(nameof(currentPassword));
|
||||||
|
|
||||||
return _api.EditProfile(currentPassword: currentPassword, username: username ?? _currentUser?.Name, email: email ?? _currentUser?.Email, password: password,
|
return _api.EditUser(currentPassword: currentPassword, username: username ?? _currentUser?.Name, email: email ?? _currentUser?.Email, password: password,
|
||||||
avatarType: avatarType, avatar: avatar);
|
avatarType: avatarType, avatar: avatar);
|
||||||
}
|
}
|
||||||
public Task SetStatus(string status)
|
public Task SetStatus(string status)
|
||||||
{
|
{
|
||||||
switch (status)
|
if (status != UserStatus.Online && status != UserStatus.Idle)
|
||||||
{
|
throw new ArgumentException($"Invalid status, must be {UserStatus.Online} or {UserStatus.Idle}");
|
||||||
case UserStatus.Online:
|
_status = status;
|
||||||
case UserStatus.Away:
|
|
||||||
_status = status;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new ArgumentException($"Invalid status, must be {UserStatus.Online} or {UserStatus.Away}");
|
|
||||||
}
|
|
||||||
return SendStatus();
|
return SendStatus();
|
||||||
}
|
}
|
||||||
public Task SetGame(int? gameId)
|
public Task SetGame(int? gameId)
|
||||||
@@ -640,7 +635,7 @@ namespace Discord
|
|||||||
}
|
}
|
||||||
private Task SendStatus()
|
private Task SendStatus()
|
||||||
{
|
{
|
||||||
_dataSocket.SendStatus(_status == UserStatus.Away ? EpochTime.GetMilliseconds() - (10 * 60 * 1000) : (ulong?)null, _gameId);
|
_dataSocket.SendStatus(_status == UserStatus.Idle ? EpochTime.GetMilliseconds() - (10 * 60 * 1000) : (ulong?)null, _gameId);
|
||||||
return TaskHelper.CompletedTask;
|
return TaskHelper.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Discord.API;
|
using Discord.API;
|
||||||
using Discord.Collections;
|
using Discord.Collections;
|
||||||
using Discord.WebSockets;
|
using Discord.Net;
|
||||||
using Discord.WebSockets.Data;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
@@ -9,7 +8,6 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using VoiceWebSocket = Discord.WebSockets.Voice.VoiceWebSocket;
|
|
||||||
|
|
||||||
namespace Discord
|
namespace Discord
|
||||||
{
|
{
|
||||||
@@ -474,7 +472,7 @@ namespace Discord
|
|||||||
//Members
|
//Members
|
||||||
case "GUILD_MEMBER_ADD":
|
case "GUILD_MEMBER_ADD":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildMemberAddEvent>(_serializer);
|
var data = e.Payload.ToObject<MemberAddEvent>(_serializer);
|
||||||
var user = _users.GetOrAdd(data.User.Id);
|
var user = _users.GetOrAdd(data.User.Id);
|
||||||
user.Update(data.User);
|
user.Update(data.User);
|
||||||
var member = _members.GetOrAdd(data.User.Id, data.GuildId);
|
var member = _members.GetOrAdd(data.User.Id, data.GuildId);
|
||||||
@@ -486,7 +484,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_MEMBER_UPDATE":
|
case "GUILD_MEMBER_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildMemberUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<MemberUpdateEvent>(_serializer);
|
||||||
var member = _members[data.User.Id, data.GuildId];
|
var member = _members[data.User.Id, data.GuildId];
|
||||||
if (member != null)
|
if (member != null)
|
||||||
{
|
{
|
||||||
@@ -497,7 +495,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_MEMBER_REMOVE":
|
case "GUILD_MEMBER_REMOVE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildMemberRemoveEvent>(_serializer);
|
var data = e.Payload.ToObject<MemberRemoveEvent>(_serializer);
|
||||||
var member = _members.TryRemove(data.UserId, data.GuildId);
|
var member = _members.TryRemove(data.UserId, data.GuildId);
|
||||||
if (member != null)
|
if (member != null)
|
||||||
RaiseUserRemoved(member);
|
RaiseUserRemoved(member);
|
||||||
@@ -507,7 +505,7 @@ namespace Discord
|
|||||||
//Roles
|
//Roles
|
||||||
case "GUILD_ROLE_CREATE":
|
case "GUILD_ROLE_CREATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildRoleCreateEvent>(_serializer);
|
var data = e.Payload.ToObject<RoleCreateEvent>(_serializer);
|
||||||
var role = _roles.GetOrAdd(data.Data.Id, data.GuildId, false);
|
var role = _roles.GetOrAdd(data.Data.Id, data.GuildId, false);
|
||||||
role.Update(data.Data);
|
role.Update(data.Data);
|
||||||
var server = _servers[data.GuildId];
|
var server = _servers[data.GuildId];
|
||||||
@@ -518,7 +516,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_ROLE_UPDATE":
|
case "GUILD_ROLE_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildRoleUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<RoleUpdateEvent>(_serializer);
|
||||||
var role = _roles[data.Data.Id];
|
var role = _roles[data.Data.Id];
|
||||||
if (role != null)
|
if (role != null)
|
||||||
role.Update(data.Data);
|
role.Update(data.Data);
|
||||||
@@ -527,7 +525,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_ROLE_DELETE":
|
case "GUILD_ROLE_DELETE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildRoleDeleteEvent>(_serializer);
|
var data = e.Payload.ToObject<RoleDeleteEvent>(_serializer);
|
||||||
var server = _servers[data.GuildId];
|
var server = _servers[data.GuildId];
|
||||||
if (server != null)
|
if (server != null)
|
||||||
server.RemoveRole(data.RoleId);
|
server.RemoveRole(data.RoleId);
|
||||||
@@ -540,7 +538,7 @@ namespace Discord
|
|||||||
//Bans
|
//Bans
|
||||||
case "GUILD_BAN_ADD":
|
case "GUILD_BAN_ADD":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildBanAddEvent>(_serializer);
|
var data = e.Payload.ToObject<BanAddEvent>(_serializer);
|
||||||
var server = _servers[data.GuildId];
|
var server = _servers[data.GuildId];
|
||||||
if (server != null)
|
if (server != null)
|
||||||
{
|
{
|
||||||
@@ -551,7 +549,7 @@ namespace Discord
|
|||||||
break;
|
break;
|
||||||
case "GUILD_BAN_REMOVE":
|
case "GUILD_BAN_REMOVE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<GuildBanRemoveEvent>(_serializer);
|
var data = e.Payload.ToObject<BanRemoveEvent>(_serializer);
|
||||||
var server = _servers[data.GuildId];
|
var server = _servers[data.GuildId];
|
||||||
if (server != null && server.RemoveBan(data.User?.Id))
|
if (server != null && server.RemoveBan(data.User?.Id))
|
||||||
RaiseBanRemoved(data.User?.Id, server);
|
RaiseBanRemoved(data.User?.Id, server);
|
||||||
@@ -682,7 +680,7 @@ namespace Discord
|
|||||||
//Voice
|
//Voice
|
||||||
case "VOICE_STATE_UPDATE":
|
case "VOICE_STATE_UPDATE":
|
||||||
{
|
{
|
||||||
var data = e.Payload.ToObject<VoiceStateUpdateEvent>(_serializer);
|
var data = e.Payload.ToObject<MemberVoiceStateUpdateEvent>(_serializer);
|
||||||
var member = _members[data.UserId, data.GuildId];
|
var member = _members[data.UserId, data.GuildId];
|
||||||
if (member != null)
|
if (member != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
using Discord.WebSockets.Data;
|
using Discord.Net;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.ExceptionServices;
|
using System.Runtime.ExceptionServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using VoiceWebSocket = Discord.WebSockets.Voice.VoiceWebSocket;
|
|
||||||
|
|
||||||
namespace Discord
|
namespace Discord
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,6 +6,53 @@ namespace Discord
|
|||||||
{
|
{
|
||||||
internal static class Extensions
|
internal static class Extensions
|
||||||
{
|
{
|
||||||
|
public static async Task Timeout(this Task self, int milliseconds)
|
||||||
|
{
|
||||||
|
Task timeoutTask = Task.Delay(milliseconds);
|
||||||
|
Task finishedTask = await Task.WhenAny(self, timeoutTask).ConfigureAwait(false);
|
||||||
|
if (finishedTask == timeoutTask)
|
||||||
|
throw new TimeoutException();
|
||||||
|
else
|
||||||
|
await self.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
public static async Task<T> Timeout<T>(this Task<T> self, int milliseconds)
|
||||||
|
{
|
||||||
|
Task timeoutTask = Task.Delay(milliseconds);
|
||||||
|
Task finishedTask = await Task.WhenAny(self, timeoutTask).ConfigureAwait(false);
|
||||||
|
if (finishedTask == timeoutTask)
|
||||||
|
throw new TimeoutException();
|
||||||
|
else
|
||||||
|
return await self.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
public static async Task Timeout(this Task self, int milliseconds, CancellationTokenSource timeoutToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
timeoutToken.CancelAfter(milliseconds);
|
||||||
|
await self.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
if (timeoutToken.IsCancellationRequested)
|
||||||
|
throw new TimeoutException();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static async Task<T> Timeout<T>(this Task<T> self, int milliseconds, CancellationTokenSource timeoutToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
timeoutToken.CancelAfter(milliseconds);
|
||||||
|
return await self.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
if (timeoutToken.IsCancellationRequested)
|
||||||
|
throw new TimeoutException();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task Wait(this CancellationTokenSource tokenSource)
|
public static async Task Wait(this CancellationTokenSource tokenSource)
|
||||||
{
|
{
|
||||||
var token = tokenSource.Token;
|
var token = tokenSource.Token;
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Discord
|
|
||||||
{
|
|
||||||
public static class TaskExtensions
|
|
||||||
{
|
|
||||||
public static async Task Timeout(this Task self, int milliseconds)
|
|
||||||
{
|
|
||||||
Task timeoutTask = Task.Delay(milliseconds);
|
|
||||||
Task finishedTask = await Task.WhenAny(self, timeoutTask);
|
|
||||||
if (finishedTask == timeoutTask)
|
|
||||||
throw new TimeoutException();
|
|
||||||
else
|
|
||||||
await self;
|
|
||||||
}
|
|
||||||
public static async Task<T> Timeout<T>(this Task<T> self, int milliseconds)
|
|
||||||
{
|
|
||||||
Task timeoutTask = Task.Delay(milliseconds);
|
|
||||||
Task finishedTask = await Task.WhenAny(self, timeoutTask).ConfigureAwait(false);
|
|
||||||
if (finishedTask == timeoutTask)
|
|
||||||
throw new TimeoutException();
|
|
||||||
else
|
|
||||||
return await self.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
public static async Task Timeout(this Task self, int milliseconds, CancellationTokenSource timeoutToken)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
timeoutToken.CancelAfter(milliseconds);
|
|
||||||
await self.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
if (timeoutToken.IsCancellationRequested)
|
|
||||||
throw new TimeoutException();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static async Task<T> Timeout<T>(this Task<T> self, int milliseconds, CancellationTokenSource timeoutToken)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
timeoutToken.CancelAfter(milliseconds);
|
|
||||||
return await self.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
if (timeoutToken.IsCancellationRequested)
|
|
||||||
throw new TimeoutException();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Discord.Audio
|
namespace Discord.Interop
|
||||||
{
|
{
|
||||||
internal unsafe static class Opus
|
internal unsafe static class Opus
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Discord.Audio
|
namespace Discord.Interop
|
||||||
{
|
{
|
||||||
/// <summary> Opus codec wrapper. </summary>
|
/// <summary> Opus codec wrapper. </summary>
|
||||||
internal class OpusDecoder : IDisposable
|
internal class OpusDecoder : IDisposable
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Discord.Audio
|
namespace Discord.Interop
|
||||||
{
|
{
|
||||||
/// <summary> Opus codec wrapper. </summary>
|
/// <summary> Opus codec wrapper. </summary>
|
||||||
internal class OpusEncoder : IDisposable
|
internal class OpusEncoder : IDisposable
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Discord.Audio
|
namespace Discord.Interop
|
||||||
{
|
{
|
||||||
internal unsafe static class Sodium
|
internal unsafe static class Sodium
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -99,16 +100,16 @@ namespace Discord
|
|||||||
_areMembersStale = true;
|
_areMembersStale = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update(API.ChannelReference model)
|
internal void Update(ChannelReference model)
|
||||||
{
|
{
|
||||||
if (model.Name != null)
|
if (model.Name != null)
|
||||||
Name = model.Name;
|
Name = model.Name;
|
||||||
if (model.Type != null)
|
if (model.Type != null)
|
||||||
Type = model.Type;
|
Type = model.Type;
|
||||||
}
|
}
|
||||||
internal void Update(API.ChannelInfo model)
|
internal void Update(ChannelInfo model)
|
||||||
{
|
{
|
||||||
Update(model as API.ChannelReference);
|
Update(model as ChannelReference);
|
||||||
|
|
||||||
if (model.Position != null)
|
if (model.Position != null)
|
||||||
Position = model.Position.Value;
|
Position = model.Position.Value;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace Discord
|
namespace Discord
|
||||||
{
|
{
|
||||||
@@ -53,7 +54,7 @@ namespace Discord
|
|||||||
|
|
||||||
public override string ToString() => XkcdPass ?? Id;
|
public override string ToString() => XkcdPass ?? Id;
|
||||||
|
|
||||||
internal void Update(API.Invite model)
|
internal void Update(InviteReference model)
|
||||||
{
|
{
|
||||||
if (model.Channel != null)
|
if (model.Channel != null)
|
||||||
ChannelId = model.Channel.Id;
|
ChannelId = model.Channel.Id;
|
||||||
@@ -61,9 +62,9 @@ namespace Discord
|
|||||||
InviterId = model.Inviter.Id;
|
InviterId = model.Inviter.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update(API.ExtendedInvite model)
|
internal void Update(InviteInfo model)
|
||||||
{
|
{
|
||||||
Update(model as API.Invite);
|
Update(model as InviteReference);
|
||||||
if (model.IsRevoked != null)
|
if (model.IsRevoked != null)
|
||||||
IsRevoked = model.IsRevoked.Value;
|
IsRevoked = model.IsRevoked.Value;
|
||||||
if (model.IsTemporary != null)
|
if (model.IsTemporary != null)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -77,7 +78,7 @@ namespace Discord
|
|||||||
|
|
||||||
public override string ToString() => UserId;
|
public override string ToString() => UserId;
|
||||||
|
|
||||||
internal void Update(API.UserReference model)
|
internal void Update(UserReference model)
|
||||||
{
|
{
|
||||||
if (model.Avatar != null)
|
if (model.Avatar != null)
|
||||||
AvatarId = model.Avatar;
|
AvatarId = model.Avatar;
|
||||||
@@ -86,7 +87,7 @@ namespace Discord
|
|||||||
if (model.Username != null)
|
if (model.Username != null)
|
||||||
Name = model.Username;
|
Name = model.Username;
|
||||||
}
|
}
|
||||||
internal void Update(API.MemberInfo model)
|
internal void Update(MemberInfo model)
|
||||||
{
|
{
|
||||||
if (model.User != null)
|
if (model.User != null)
|
||||||
Update(model.User);
|
Update(model.User);
|
||||||
@@ -102,7 +103,7 @@ namespace Discord
|
|||||||
|
|
||||||
UpdatePermissions();
|
UpdatePermissions();
|
||||||
}
|
}
|
||||||
internal void Update(API.ExtendedMemberInfo model)
|
internal void Update(ExtendedMemberInfo model)
|
||||||
{
|
{
|
||||||
Update(model as API.MemberInfo);
|
Update(model as API.MemberInfo);
|
||||||
if (model.IsServerDeafened != null)
|
if (model.IsServerDeafened != null)
|
||||||
@@ -110,7 +111,7 @@ namespace Discord
|
|||||||
if (model.IsServerMuted != null)
|
if (model.IsServerMuted != null)
|
||||||
IsServerMuted = model.IsServerMuted.Value;
|
IsServerMuted = model.IsServerMuted.Value;
|
||||||
}
|
}
|
||||||
internal void Update(API.PresenceMemberInfo model)
|
internal void Update(PresenceInfo model)
|
||||||
{
|
{
|
||||||
//Allows null
|
//Allows null
|
||||||
if (Status != model.Status)
|
if (Status != model.Status)
|
||||||
@@ -121,7 +122,7 @@ namespace Discord
|
|||||||
}
|
}
|
||||||
GameId = model.GameId;
|
GameId = model.GameId;
|
||||||
}
|
}
|
||||||
internal void Update(API.VoiceMemberInfo model)
|
internal void Update(VoiceMemberInfo model)
|
||||||
{
|
{
|
||||||
if (model.IsServerDeafened != null)
|
if (model.IsServerDeafened != null)
|
||||||
IsServerDeafened = model.IsServerDeafened.Value;
|
IsServerDeafened = model.IsServerDeafened.Value;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -175,7 +176,7 @@ namespace Discord
|
|||||||
MentionIds = _initialMentions;
|
MentionIds = _initialMentions;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update(API.Message model)
|
internal void Update(MessageInfo model)
|
||||||
{
|
{
|
||||||
if (model.Attachments != null)
|
if (model.Attachments != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
@@ -52,7 +53,7 @@ namespace Discord
|
|||||||
Position = int.MinValue;
|
Position = int.MinValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update(API.RoleInfo model)
|
internal void Update(RoleInfo model)
|
||||||
{
|
{
|
||||||
if (model.Name != null)
|
if (model.Name != null)
|
||||||
Name = model.Name;
|
Name = model.Name;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -103,7 +104,7 @@ namespace Discord
|
|||||||
_roles = new ConcurrentDictionary<string, bool>();
|
_roles = new ConcurrentDictionary<string, bool>();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update(API.GuildInfo model)
|
internal void Update(GuildInfo model)
|
||||||
{
|
{
|
||||||
AFKChannelId = model.AFKChannelId;
|
AFKChannelId = model.AFKChannelId;
|
||||||
AFKTimeout = model.AFKTimeout;
|
AFKTimeout = model.AFKTimeout;
|
||||||
@@ -124,9 +125,9 @@ namespace Discord
|
|||||||
isEveryone = false;
|
isEveryone = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
internal void Update(API.ExtendedGuildInfo model)
|
internal void Update(ExtendedGuildInfo model)
|
||||||
{
|
{
|
||||||
Update(model as API.GuildInfo);
|
Update(model as GuildInfo);
|
||||||
|
|
||||||
var channels = _client.Channels;
|
var channels = _client.Channels;
|
||||||
foreach (var subModel in model.Channels)
|
foreach (var subModel in model.Channels)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -77,7 +78,7 @@ namespace Discord
|
|||||||
_servers = new ConcurrentDictionary<string, bool>();
|
_servers = new ConcurrentDictionary<string, bool>();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update(API.UserReference model)
|
internal void Update(UserReference model)
|
||||||
{
|
{
|
||||||
if (model.Avatar != null)
|
if (model.Avatar != null)
|
||||||
AvatarId = model.Avatar;
|
AvatarId = model.Avatar;
|
||||||
@@ -86,11 +87,14 @@ namespace Discord
|
|||||||
if (model.Username != null)
|
if (model.Username != null)
|
||||||
Name = model.Username;
|
Name = model.Username;
|
||||||
}
|
}
|
||||||
internal void Update(API.SelfUserInfo model)
|
internal void Update(UserInfo model)
|
||||||
{
|
{
|
||||||
Update(model as API.UserReference);
|
Update(model as UserReference);
|
||||||
Email = model.Email;
|
|
||||||
IsVerified = model.IsVerified;
|
if (model.Email != null)
|
||||||
|
Email = model.Email;
|
||||||
|
if (model.IsVerified != null)
|
||||||
|
IsVerified = model.IsVerified;
|
||||||
}
|
}
|
||||||
internal void UpdateActivity(DateTime? activity = null)
|
internal void UpdateActivity(DateTime? activity = null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord.WebSockets.Data
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal partial class DataWebSocket : WebSocket
|
internal partial class DataWebSocket : WebSocket
|
||||||
{
|
{
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Discord.WebSockets.Data
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal sealed class WebSocketEventEventArgs : EventArgs
|
internal sealed class WebSocketEventEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
@@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
/// <summary> A lightweight wrapper around the Discord API. </summary>
|
/// <summary> A lightweight wrapper around the Discord API. </summary>
|
||||||
public class DiscordAPIClient
|
public class DiscordAPIClient
|
||||||
@@ -225,26 +225,6 @@ namespace Discord
|
|||||||
return _rest.Delete(Endpoints.ChannelPermission(channelId, userOrRoleId), null);
|
return _rest.Delete(Endpoints.ChannelPermission(channelId, userOrRoleId), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Profile
|
|
||||||
public Task<EditProfileResponse> EditProfile(string currentPassword = "",
|
|
||||||
string username = null, string email = null, string password = null,
|
|
||||||
AvatarImageType avatarType = AvatarImageType.Png, byte[] avatar = null)
|
|
||||||
{
|
|
||||||
if (currentPassword == null) throw new ArgumentNullException(nameof(currentPassword));
|
|
||||||
|
|
||||||
string avatarBase64 = null;
|
|
||||||
if (avatarType == AvatarImageType.None)
|
|
||||||
avatarBase64 = "";
|
|
||||||
else if (avatar != null)
|
|
||||||
{
|
|
||||||
string base64 = Convert.ToBase64String(avatar);
|
|
||||||
string type = avatarType == AvatarImageType.Jpeg ? "image/jpeg;base64" : "image/png;base64";
|
|
||||||
avatarBase64 = $"data:{type},{base64}";
|
|
||||||
}
|
|
||||||
var request = new EditProfileRequest { CurrentPassword = currentPassword, Username = username, Email = email, Password = password, Avatar = avatarBase64 };
|
|
||||||
return _rest.Patch<EditProfileResponse>(Endpoints.UserMe, request);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Roles
|
//Roles
|
||||||
public Task<RoleInfo> CreateRole(string serverId)
|
public Task<RoleInfo> CreateRole(string serverId)
|
||||||
{
|
{
|
||||||
@@ -302,10 +282,30 @@ namespace Discord
|
|||||||
return _rest.Patch<EditServerResponse>(Endpoints.Server(serverId), request);
|
return _rest.Patch<EditServerResponse>(Endpoints.Server(serverId), request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//User
|
||||||
|
public Task<EditUserResponse> EditUser(string currentPassword = "",
|
||||||
|
string username = null, string email = null, string password = null,
|
||||||
|
AvatarImageType avatarType = AvatarImageType.Png, byte[] avatar = null)
|
||||||
|
{
|
||||||
|
if (currentPassword == null) throw new ArgumentNullException(nameof(currentPassword));
|
||||||
|
|
||||||
|
string avatarBase64 = null;
|
||||||
|
if (avatarType == AvatarImageType.None)
|
||||||
|
avatarBase64 = "";
|
||||||
|
else if (avatar != null)
|
||||||
|
{
|
||||||
|
string base64 = Convert.ToBase64String(avatar);
|
||||||
|
string type = avatarType == AvatarImageType.Jpeg ? "image/jpeg;base64" : "image/png;base64";
|
||||||
|
avatarBase64 = $"data:{type},{base64}";
|
||||||
|
}
|
||||||
|
var request = new EditUserRequest { CurrentPassword = currentPassword, Username = username, Email = email, Password = password, Avatar = avatarBase64 };
|
||||||
|
return _rest.Patch<EditUserResponse>(Endpoints.UserMe, request);
|
||||||
|
}
|
||||||
|
|
||||||
//Voice
|
//Voice
|
||||||
public Task<GetRegionsResponse> GetVoiceRegions()
|
public Task<GetRegionsResponse> GetVoiceRegions()
|
||||||
=> _rest.Get<GetRegionsResponse>(Endpoints.VoiceRegions);
|
=> _rest.Get<GetRegionsResponse>(Endpoints.VoiceRegions);
|
||||||
public Task<GetIceResponse> GetVoiceIce()
|
/*public Task<GetIceResponse> GetVoiceIce()
|
||||||
=> _rest.Get<GetIceResponse>(Endpoints.VoiceIce);
|
=> _rest.Get<GetIceResponse>(Endpoints.VoiceIce);*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
|
||||||
namespace Discord.API
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
public class HttpException : Exception
|
public class HttpException : Exception
|
||||||
{
|
{
|
||||||
public HttpStatusCode StatusCode { get; }
|
public HttpStatusCode StatusCode { get; }
|
||||||
|
|
||||||
public HttpException(HttpStatusCode statusCode)
|
public HttpException(HttpStatusCode statusCode)
|
||||||
: base($"The server responded with error {statusCode}")
|
: base($"The server responded with error {(int)statusCode} ({statusCode})")
|
||||||
{
|
{
|
||||||
StatusCode = statusCode;
|
StatusCode = statusCode;
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
|
||||||
namespace Discord.API
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal partial class RestClient
|
internal partial class RestClient
|
||||||
{
|
{
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
using RestSharp;
|
using Discord.API;
|
||||||
|
using RestSharp;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord.API
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal class RestSharpRestEngine : IRestEngine
|
internal partial class RestClient
|
||||||
{
|
{
|
||||||
private readonly RestSharp.RestClient _client;
|
private RestSharp.RestClient _client;
|
||||||
|
|
||||||
public RestSharpRestEngine(string userAgent, int timeout)
|
partial void Initialize(string userAgent, int timeout)
|
||||||
{
|
{
|
||||||
_client = new RestSharp.RestClient(Endpoints.BaseApi)
|
_client = new RestSharp.RestClient(Endpoints.BaseApi)
|
||||||
{
|
{
|
||||||
@@ -24,20 +24,20 @@ namespace Discord.API
|
|||||||
_client.ReadWriteTimeout = timeout;
|
_client.ReadWriteTimeout = timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetToken(string token)
|
internal void SetToken(string token)
|
||||||
{
|
{
|
||||||
_client.RemoveDefaultParameter("authorization");
|
_client.RemoveDefaultParameter("authorization");
|
||||||
if (token != null)
|
if (token != null)
|
||||||
_client.AddDefaultHeader("authorization", token);
|
_client.AddDefaultHeader("authorization", token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<string> Send(HttpMethod method, string path, string json, CancellationToken cancelToken)
|
private Task<string> SendInternal(HttpMethod method, string path, string json, CancellationToken cancelToken)
|
||||||
{
|
{
|
||||||
var request = new RestRequest(path, GetMethod(method));
|
var request = new RestRequest(path, GetMethod(method));
|
||||||
request.AddParameter("application/json", json, ParameterType.RequestBody);
|
request.AddParameter("application/json", json, ParameterType.RequestBody);
|
||||||
return Send(request, cancelToken);
|
return Send(request, cancelToken);
|
||||||
}
|
}
|
||||||
public Task<string> SendFile(HttpMethod method, string path, string filePath, CancellationToken cancelToken)
|
private Task<string> SendFileInternal(HttpMethod method, string path, string filePath, CancellationToken cancelToken)
|
||||||
{
|
{
|
||||||
var request = new RestRequest(path, Method.POST);
|
var request = new RestRequest(path, Method.POST);
|
||||||
request.AddFile("file", filePath);
|
request.AddFile("file", filePath);
|
||||||
@@ -1,32 +1,25 @@
|
|||||||
using Newtonsoft.Json;
|
using Discord.API;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord.API
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal interface IRestEngine
|
|
||||||
{
|
|
||||||
void SetToken(string token);
|
|
||||||
Task<string> Send(HttpMethod method, string path, string json, CancellationToken cancelToken);
|
|
||||||
Task<string> SendFile(HttpMethod method, string path, string filePath, CancellationToken cancelToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal partial class RestClient
|
internal partial class RestClient
|
||||||
{
|
{
|
||||||
private readonly IRestEngine _engine;
|
|
||||||
private readonly LogMessageSeverity _logLevel;
|
private readonly LogMessageSeverity _logLevel;
|
||||||
private CancellationToken _cancelToken;
|
private CancellationToken _cancelToken;
|
||||||
|
|
||||||
public RestClient(LogMessageSeverity logLevel, string userAgent, int timeout)
|
public RestClient(LogMessageSeverity logLevel, string userAgent, int timeout)
|
||||||
{
|
{
|
||||||
_logLevel = logLevel;
|
_logLevel = logLevel;
|
||||||
|
|
||||||
_engine = new RestSharpRestEngine(userAgent, timeout);
|
|
||||||
}
|
}
|
||||||
|
partial void Initialize(string userAgent, int timeout);
|
||||||
|
|
||||||
|
//DELETE
|
||||||
private static readonly HttpMethod _delete = HttpMethod.Delete;
|
private static readonly HttpMethod _delete = HttpMethod.Delete;
|
||||||
internal Task<ResponseT> Delete<ResponseT>(string path, object data) where ResponseT : class
|
internal Task<ResponseT> Delete<ResponseT>(string path, object data) where ResponseT : class
|
||||||
=> Send<ResponseT>(_delete, path, data);
|
=> Send<ResponseT>(_delete, path, data);
|
||||||
@@ -37,12 +30,14 @@ namespace Discord.API
|
|||||||
internal Task Delete(string path)
|
internal Task Delete(string path)
|
||||||
=> Send(_delete, path);
|
=> Send(_delete, path);
|
||||||
|
|
||||||
|
//GET
|
||||||
private static readonly HttpMethod _get = HttpMethod.Get;
|
private static readonly HttpMethod _get = HttpMethod.Get;
|
||||||
internal Task<ResponseT> Get<ResponseT>(string path) where ResponseT : class
|
internal Task<ResponseT> Get<ResponseT>(string path) where ResponseT : class
|
||||||
=> Send<ResponseT>(_get, path);
|
=> Send<ResponseT>(_get, path);
|
||||||
internal Task Get(string path)
|
internal Task Get(string path)
|
||||||
=> Send(_get, path);
|
=> Send(_get, path);
|
||||||
|
|
||||||
|
//PATCH
|
||||||
private static readonly HttpMethod _patch = new HttpMethod("PATCH");
|
private static readonly HttpMethod _patch = new HttpMethod("PATCH");
|
||||||
internal Task<ResponseT> Patch<ResponseT>(string path, object data) where ResponseT : class
|
internal Task<ResponseT> Patch<ResponseT>(string path, object data) where ResponseT : class
|
||||||
=> Send<ResponseT>(_patch, path, data);
|
=> Send<ResponseT>(_patch, path, data);
|
||||||
@@ -97,7 +92,7 @@ namespace Discord.API
|
|||||||
if (_logLevel >= LogMessageSeverity.Verbose)
|
if (_logLevel >= LogMessageSeverity.Verbose)
|
||||||
stopwatch = Stopwatch.StartNew();
|
stopwatch = Stopwatch.StartNew();
|
||||||
|
|
||||||
string responseJson = await _engine.Send(method, path, requestJson, _cancelToken).ConfigureAwait(false);
|
string responseJson = await SendInternal(method, path, requestJson, _cancelToken).ConfigureAwait(false);
|
||||||
|
|
||||||
#if TEST_RESPONSES
|
#if TEST_RESPONSES
|
||||||
if (!hasResponse && !string.IsNullOrEmpty(responseJson))
|
if (!hasResponse && !string.IsNullOrEmpty(responseJson))
|
||||||
@@ -136,7 +131,7 @@ namespace Discord.API
|
|||||||
if (_logLevel >= LogMessageSeverity.Verbose)
|
if (_logLevel >= LogMessageSeverity.Verbose)
|
||||||
stopwatch = Stopwatch.StartNew();
|
stopwatch = Stopwatch.StartNew();
|
||||||
|
|
||||||
string responseJson = await _engine.SendFile(method, path, filePath, _cancelToken).ConfigureAwait(false);
|
string responseJson = await SendFileInternal(method, path, filePath, _cancelToken).ConfigureAwait(false);
|
||||||
|
|
||||||
#if TEST_RESPONSES
|
#if TEST_RESPONSES
|
||||||
if (!hasResponse && !string.IsNullOrEmpty(responseJson))
|
if (!hasResponse && !string.IsNullOrEmpty(responseJson))
|
||||||
@@ -173,7 +168,6 @@ namespace Discord.API
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void SetToken(string token) => _engine.SetToken(token);
|
|
||||||
internal void SetCancelToken(CancellationToken token) => _cancelToken = token;
|
internal void SetCancelToken(CancellationToken token) => _cancelToken = token;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace Discord.WebSockets.Voice
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal class VoiceBuffer : IDiscordVoiceBuffer
|
internal class VoiceBuffer : IDiscordVoiceBuffer
|
||||||
{
|
{
|
||||||
@@ -46,7 +46,11 @@ namespace Discord.WebSockets.Voice
|
|||||||
if (_readCursor == nextPosition)
|
if (_readCursor == nextPosition)
|
||||||
{
|
{
|
||||||
_notOverflowEvent.Reset();
|
_notOverflowEvent.Reset();
|
||||||
_notOverflowEvent.Wait(cancelToken);
|
try
|
||||||
|
{
|
||||||
|
_notOverflowEvent.Wait(cancelToken);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException) { return; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == wholeFrames)
|
if (i == wholeFrames)
|
||||||
@@ -100,7 +104,11 @@ namespace Discord.WebSockets.Voice
|
|||||||
_isClearing = true;
|
_isClearing = true;
|
||||||
for (int i = 0; i < _frameCount; i++)
|
for (int i = 0; i < _frameCount; i++)
|
||||||
Buffer.BlockCopy(_blankFrame, 0, _buffer, i * _frameCount, i++);
|
Buffer.BlockCopy(_blankFrame, 0, _buffer, i * _frameCount, i++);
|
||||||
_underflowEvent.Wait(cancelToken);
|
try
|
||||||
|
{
|
||||||
|
_underflowEvent.Wait(cancelToken);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException) { }
|
||||||
_writeCursor = 0;
|
_writeCursor = 0;
|
||||||
_readCursor = 0;
|
_readCursor = 0;
|
||||||
_isClearing = false;
|
_isClearing = false;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Discord.WebSockets.Voice
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal sealed class IsTalkingEventArgs : EventArgs
|
internal sealed class IsTalkingEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
#define USE_THREAD
|
#define USE_THREAD
|
||||||
using Discord.Audio;
|
using Discord.API;
|
||||||
|
using Discord.Interop;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
@@ -13,7 +14,7 @@ using System.Text;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord.WebSockets.Voice
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal partial class VoiceWebSocket : WebSocket
|
internal partial class VoiceWebSocket : WebSocket
|
||||||
{
|
{
|
||||||
@@ -109,8 +110,8 @@ namespace Discord.WebSockets.Voice
|
|||||||
#if !DNX451 && !__MonoCS__
|
#if !DNX451 && !__MonoCS__
|
||||||
_udp.AllowNatTraversal(true);
|
_udp.AllowNatTraversal(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LoginCommand msg = new LoginCommand();
|
VoiceLoginCommand msg = new VoiceLoginCommand();
|
||||||
msg.Payload.ServerId = _serverId;
|
msg.Payload.ServerId = _serverId;
|
||||||
msg.Payload.SessionId = _sessionId;
|
msg.Payload.SessionId = _sessionId;
|
||||||
msg.Payload.Token = _token;
|
msg.Payload.Token = _token;
|
||||||
@@ -238,7 +239,7 @@ namespace Discord.WebSockets.Voice
|
|||||||
int port = packet[68] | packet[69] << 8;
|
int port = packet[68] | packet[69] << 8;
|
||||||
string ip = Encoding.ASCII.GetString(packet, 4, 70 - 6).TrimEnd('\0');
|
string ip = Encoding.ASCII.GetString(packet, 4, 70 - 6).TrimEnd('\0');
|
||||||
|
|
||||||
var login2 = new Login2Command();
|
var login2 = new VoiceLogin2Command();
|
||||||
login2.Payload.Protocol = "udp";
|
login2.Payload.Protocol = "udp";
|
||||||
login2.Payload.SocketData.Address = ip;
|
login2.Payload.SocketData.Address = ip;
|
||||||
login2.Payload.SocketData.Mode = _encryptionMode;
|
login2.Payload.SocketData.Mode = _encryptionMode;
|
||||||
@@ -458,7 +459,7 @@ namespace Discord.WebSockets.Voice
|
|||||||
{
|
{
|
||||||
if (_state != (int)WebSocketState.Connected)
|
if (_state != (int)WebSocketState.Connected)
|
||||||
{
|
{
|
||||||
var payload = (msg.Payload as JToken).ToObject<ReadyEvent>();
|
var payload = (msg.Payload as JToken).ToObject<VoiceReadyEvent>();
|
||||||
_heartbeatInterval = payload.HeartbeatInterval;
|
_heartbeatInterval = payload.HeartbeatInterval;
|
||||||
_ssrc = payload.SSRC;
|
_ssrc = payload.SSRC;
|
||||||
_endpoint = new IPEndPoint((await Dns.GetHostAddressesAsync(Host.Replace("wss://", "")).ConfigureAwait(false)).FirstOrDefault(), payload.Port);
|
_endpoint = new IPEndPoint((await Dns.GetHostAddressesAsync(Host.Replace("wss://", "")).ConfigureAwait(false)).FirstOrDefault(), payload.Port);
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
/*
|
using Discord.Helpers;
|
||||||
using Discord.Helpers;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -149,5 +148,4 @@ namespace Discord.WebSockets
|
|||||||
_sendQueue.Enqueue(message);
|
_sendQueue.Enqueue(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Discord.WebSockets
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal abstract partial class WebSocket
|
internal abstract partial class WebSocket
|
||||||
{
|
{
|
||||||
@@ -5,7 +5,7 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using WSSharpNWebSocket = WebSocketSharp.WebSocket;
|
using WSSharpNWebSocket = WebSocketSharp.WebSocket;
|
||||||
|
|
||||||
namespace Discord.WebSockets
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
internal class WSSharpWebSocketEngine : IWebSocketEngine
|
internal class WSSharpWebSocketEngine : IWebSocketEngine
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@ using System.Runtime.ExceptionServices;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord.WebSockets
|
namespace Discord.Net
|
||||||
{
|
{
|
||||||
public enum WebSocketState : byte
|
public enum WebSocketState : byte
|
||||||
{
|
{
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
//Ignore unused/unassigned variable warnings
|
|
||||||
#pragma warning disable CS0649
|
|
||||||
#pragma warning disable CS0169
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Discord.WebSockets.Data
|
|
||||||
{
|
|
||||||
internal sealed class KeepAliveCommand : WebSocketMessage<ulong>
|
|
||||||
{
|
|
||||||
public KeepAliveCommand() : base(1, EpochTime.GetMilliseconds()) { }
|
|
||||||
}
|
|
||||||
internal sealed class LoginCommand : WebSocketMessage<LoginCommand.Data>
|
|
||||||
{
|
|
||||||
public LoginCommand() : base(2) { }
|
|
||||||
public class Data
|
|
||||||
{
|
|
||||||
[JsonProperty("token")]
|
|
||||||
public string Token;
|
|
||||||
[JsonProperty("v")]
|
|
||||||
public int Version = 3;
|
|
||||||
[JsonProperty("properties")]
|
|
||||||
public Dictionary<string, string> Properties = new Dictionary<string, string>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
internal sealed class UpdateStatusCommand : WebSocketMessage<UpdateStatusCommand.Data>
|
|
||||||
{
|
|
||||||
public UpdateStatusCommand() : base(3) { }
|
|
||||||
public class Data
|
|
||||||
{
|
|
||||||
[JsonProperty("idle_since")]
|
|
||||||
public ulong? IdleSince;
|
|
||||||
[JsonProperty("game_id")]
|
|
||||||
public int? GameId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
internal sealed class JoinVoiceCommand : WebSocketMessage<JoinVoiceCommand.Data>
|
|
||||||
{
|
|
||||||
public JoinVoiceCommand() : base(4) { }
|
|
||||||
public class Data
|
|
||||||
{
|
|
||||||
[JsonProperty("guild_id")]
|
|
||||||
public string ServerId;
|
|
||||||
[JsonProperty("channel_id")]
|
|
||||||
public string ChannelId;
|
|
||||||
[JsonProperty("self_mute")]
|
|
||||||
public string SelfMute;
|
|
||||||
[JsonProperty("self_deaf")]
|
|
||||||
public string SelfDeaf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
internal sealed class ResumeCommand : WebSocketMessage<ResumeCommand.Data>
|
|
||||||
{
|
|
||||||
public ResumeCommand() : base(6) { }
|
|
||||||
public class Data
|
|
||||||
{
|
|
||||||
[JsonProperty("session_id")]
|
|
||||||
public string SessionId;
|
|
||||||
[JsonProperty("seq")]
|
|
||||||
public int Sequence;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
//Ignore unused/unassigned variable warnings
|
|
||||||
#pragma warning disable CS0649
|
|
||||||
#pragma warning disable CS0169
|
|
||||||
|
|
||||||
using Discord.API;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace Discord.WebSockets.Data
|
|
||||||
{
|
|
||||||
internal sealed class ReadyEvent
|
|
||||||
{
|
|
||||||
public sealed class ReadStateInfo
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public string ChannelId;
|
|
||||||
[JsonProperty("mention_count")]
|
|
||||||
public int MentionCount;
|
|
||||||
[JsonProperty("last_message_id")]
|
|
||||||
public string LastMessageId;
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty("v")]
|
|
||||||
public int Version;
|
|
||||||
[JsonProperty("user")]
|
|
||||||
public SelfUserInfo User;
|
|
||||||
[JsonProperty("session_id")]
|
|
||||||
public string SessionId;
|
|
||||||
[JsonProperty("read_state")]
|
|
||||||
public ReadStateInfo[] ReadState;
|
|
||||||
[JsonProperty("guilds")]
|
|
||||||
public ExtendedGuildInfo[] Guilds;
|
|
||||||
[JsonProperty("private_channels")]
|
|
||||||
public ChannelInfo[] PrivateChannels;
|
|
||||||
[JsonProperty("heartbeat_interval")]
|
|
||||||
public int HeartbeatInterval;
|
|
||||||
}
|
|
||||||
internal sealed class ResumedEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("heartbeat_interval")]
|
|
||||||
public int HeartbeatInterval;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal sealed class RedirectEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Servers
|
|
||||||
internal sealed class GuildCreateEvent : ExtendedGuildInfo { }
|
|
||||||
internal sealed class GuildUpdateEvent : GuildInfo { }
|
|
||||||
internal sealed class GuildDeleteEvent : ExtendedGuildInfo { }
|
|
||||||
|
|
||||||
//Channels
|
|
||||||
internal sealed class ChannelCreateEvent : ChannelInfo { }
|
|
||||||
internal sealed class ChannelDeleteEvent : ChannelInfo { }
|
|
||||||
internal sealed class ChannelUpdateEvent : ChannelInfo { }
|
|
||||||
|
|
||||||
//Memberships
|
|
||||||
internal sealed class GuildMemberAddEvent : MemberInfo { }
|
|
||||||
internal sealed class GuildMemberUpdateEvent : MemberInfo { }
|
|
||||||
internal sealed class GuildMemberRemoveEvent : MemberInfo { }
|
|
||||||
|
|
||||||
//Roles
|
|
||||||
internal sealed class GuildRoleCreateEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("guild_id")]
|
|
||||||
public string GuildId;
|
|
||||||
[JsonProperty("role")]
|
|
||||||
public RoleInfo Data;
|
|
||||||
}
|
|
||||||
internal sealed class GuildRoleUpdateEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("guild_id")]
|
|
||||||
public string GuildId;
|
|
||||||
[JsonProperty("role")]
|
|
||||||
public RoleInfo Data;
|
|
||||||
}
|
|
||||||
internal sealed class GuildRoleDeleteEvent : RoleReference { }
|
|
||||||
|
|
||||||
//Bans
|
|
||||||
internal sealed class GuildBanAddEvent : MemberReference { }
|
|
||||||
internal sealed class GuildBanRemoveEvent : MemberReference { }
|
|
||||||
|
|
||||||
//User
|
|
||||||
internal sealed class UserUpdateEvent : SelfUserInfo { }
|
|
||||||
internal sealed class PresenceUpdateEvent : PresenceMemberInfo { }
|
|
||||||
internal sealed class VoiceStateUpdateEvent : VoiceMemberInfo { }
|
|
||||||
|
|
||||||
//Chat
|
|
||||||
internal sealed class MessageCreateEvent : API.Message { }
|
|
||||||
internal sealed class MessageUpdateEvent : API.Message { }
|
|
||||||
internal sealed class MessageDeleteEvent : MessageReference { }
|
|
||||||
internal sealed class MessageAckEvent : MessageReference { }
|
|
||||||
internal sealed class TypingStartEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("user_id")]
|
|
||||||
public string UserId;
|
|
||||||
[JsonProperty("channel_id")]
|
|
||||||
public string ChannelId;
|
|
||||||
[JsonProperty("timestamp")]
|
|
||||||
public int Timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Voice
|
|
||||||
internal sealed class VoiceServerUpdateEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("guild_id")]
|
|
||||||
public string GuildId;
|
|
||||||
[JsonProperty("endpoint")]
|
|
||||||
public string Endpoint;
|
|
||||||
[JsonProperty("token")]
|
|
||||||
public string Token;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
//Ignore unused/unassigned variable warnings
|
|
||||||
#pragma warning disable CS0649
|
|
||||||
#pragma warning disable CS0169
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace Discord.WebSockets.Voice
|
|
||||||
{
|
|
||||||
internal sealed class LoginCommand : WebSocketMessage<LoginCommand.Data>
|
|
||||||
{
|
|
||||||
public LoginCommand() : base(0) { }
|
|
||||||
public class Data
|
|
||||||
{
|
|
||||||
[JsonProperty("server_id")]
|
|
||||||
public string ServerId;
|
|
||||||
[JsonProperty("user_id")]
|
|
||||||
public string UserId;
|
|
||||||
[JsonProperty("session_id")]
|
|
||||||
public string SessionId;
|
|
||||||
[JsonProperty("token")]
|
|
||||||
public string Token;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
internal sealed class Login2Command : WebSocketMessage<Login2Command.Data>
|
|
||||||
{
|
|
||||||
public Login2Command() : base(1) { }
|
|
||||||
public class Data
|
|
||||||
{
|
|
||||||
public class SocketInfo
|
|
||||||
{
|
|
||||||
[JsonProperty("address")]
|
|
||||||
public string Address;
|
|
||||||
[JsonProperty("port")]
|
|
||||||
public int Port;
|
|
||||||
[JsonProperty("mode")]
|
|
||||||
public string Mode = "xsalsa20_poly1305";
|
|
||||||
}
|
|
||||||
[JsonProperty("protocol")]
|
|
||||||
public string Protocol = "udp";
|
|
||||||
[JsonProperty("data")]
|
|
||||||
public SocketInfo SocketData = new SocketInfo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
internal sealed class KeepAliveCommand : WebSocketMessage<object>
|
|
||||||
{
|
|
||||||
public KeepAliveCommand() : base(3, null) { }
|
|
||||||
}
|
|
||||||
internal sealed class IsTalkingCommand : WebSocketMessage<IsTalkingCommand.Data>
|
|
||||||
{
|
|
||||||
public IsTalkingCommand() : base(5) { }
|
|
||||||
public class Data
|
|
||||||
{
|
|
||||||
[JsonProperty("delay")]
|
|
||||||
public int Delay;
|
|
||||||
[JsonProperty("speaking")]
|
|
||||||
public bool IsSpeaking;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
//Ignore unused/unassigned variable warnings
|
|
||||||
#pragma warning disable CS0649
|
|
||||||
#pragma warning disable CS0169
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace Discord.WebSockets.Voice
|
|
||||||
{
|
|
||||||
internal sealed class ReadyEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("ssrc")]
|
|
||||||
public uint SSRC;
|
|
||||||
[JsonProperty("port")]
|
|
||||||
public ushort Port;
|
|
||||||
[JsonProperty("modes")]
|
|
||||||
public string[] Modes;
|
|
||||||
[JsonProperty("heartbeat_interval")]
|
|
||||||
public int HeartbeatInterval;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal sealed class JoinServerEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("secret_key")]
|
|
||||||
public byte[] SecretKey;
|
|
||||||
[JsonProperty("mode")]
|
|
||||||
public string Mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal sealed class IsTalkingEvent
|
|
||||||
{
|
|
||||||
[JsonProperty("user_id")]
|
|
||||||
public string UserId;
|
|
||||||
[JsonProperty("ssrc")]
|
|
||||||
public uint SSRC;
|
|
||||||
[JsonProperty("speaking")]
|
|
||||||
public bool IsSpeaking;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
namespace Discord.WebSockets
|
|
||||||
{
|
|
||||||
public class WebSocketMessage
|
|
||||||
{
|
|
||||||
[JsonProperty("op")]
|
|
||||||
public int Operation;
|
|
||||||
[JsonProperty("d")]
|
|
||||||
public object Payload;
|
|
||||||
[JsonProperty("t", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public string Type;
|
|
||||||
[JsonProperty("s", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public int? Sequence;
|
|
||||||
}
|
|
||||||
internal abstract class WebSocketMessage<T> : WebSocketMessage
|
|
||||||
where T : new()
|
|
||||||
{
|
|
||||||
public WebSocketMessage() { Payload = new T(); }
|
|
||||||
public WebSocketMessage(int op) { Operation = op; Payload = new T(); }
|
|
||||||
public WebSocketMessage(int op, T payload) { Operation = op; Payload = payload; }
|
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public new T Payload
|
|
||||||
{
|
|
||||||
get { if (base.Payload is JToken) { base.Payload = (base.Payload as JToken).ToObject<T>(); } return (T)base.Payload; }
|
|
||||||
set { base.Payload = value; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
|
||||||
</packages>
|
|
||||||
Reference in New Issue
Block a user