Project restructure, Added .Net Core support, Fixed some bugs
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -197,3 +197,4 @@ FakesAssemblies/
|
|||||||
|
|
||||||
#Custom
|
#Custom
|
||||||
Credentials.cs
|
Credentials.cs
|
||||||
|
project.lock.json
|
||||||
@@ -3,17 +3,28 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
# Visual Studio 14
|
# Visual Studio 14
|
||||||
VisualStudioVersion = 14.0.23107.0
|
VisualStudioVersion = 14.0.23107.0
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net", "Discord.Net\Discord.Net.csproj", "{8D23F61B-723C-4966-859D-1119B28BCF19}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8D7989F0-66CE-4DBB-8230-D8C811E9B1D7}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1DDC89B5-2A88-45E5-A743-7A43E6B5C4B3}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6317A2E6-8E36-4C3E-949B-3F10EC888AB9}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1BE8AF3F-3CFD-433F-A380-D294A4F617C1}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
.gitattributes = .gitattributes
|
global.json = global.json
|
||||||
.gitignore = .gitignore
|
|
||||||
LICENSE = LICENSE
|
|
||||||
README.md = README.md
|
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net.Tests", "Discord.Net.Tests\Discord.Net.Tests.csproj", "{855D6B1D-847B-42DA-BE6A-23683EA89511}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net.Tests", "test\Discord.Net.Tests\Discord.Net.Tests.csproj", "{855D6B1D-847B-42DA-BE6A-23683EA89511}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Discord.Net", "src\Discord.Net\Discord.Net.xproj", "{ACFB060B-EC8A-4926-B293-04C01E17EE23}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Discord.Net.Commands", "src\Discord.Net.Commands\Discord.Net.Commands.xproj", "{19793545-EF89-48F4-8100-3EBAAD0A9141}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{B47C4063-C4EB-46AA-886D-B868DA1BF0A0}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net", "src\Discord.Net.Net45\Discord.Net.csproj", "{8D71A857-879A-4A10-859E-5FF824ED6688}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net.Commands", "src\Discord.Net.Commands.Net45\Discord.Net.Commands.csproj", "{1B5603B4-6F8F-4289-B945-7BAAE523D740}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dotnet", "dotnet", "{EA68EBE2-51C8-4440-9EF7-D633C90A5D35}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -21,16 +32,37 @@ Global
|
|||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{8D23F61B-723C-4966-859D-1119B28BCF19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{8D23F61B-723C-4966-859D-1119B28BCF19}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{8D23F61B-723C-4966-859D-1119B28BCF19}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{8D23F61B-723C-4966-859D-1119B28BCF19}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Release|Any CPU.Build.0 = Release|Any CPU
|
{855D6B1D-847B-42DA-BE6A-23683EA89511}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{ACFB060B-EC8A-4926-B293-04C01E17EE23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{ACFB060B-EC8A-4926-B293-04C01E17EE23}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{ACFB060B-EC8A-4926-B293-04C01E17EE23}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{ACFB060B-EC8A-4926-B293-04C01E17EE23}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{19793545-EF89-48F4-8100-3EBAAD0A9141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{19793545-EF89-48F4-8100-3EBAAD0A9141}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{19793545-EF89-48F4-8100-3EBAAD0A9141}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{19793545-EF89-48F4-8100-3EBAAD0A9141}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8D71A857-879A-4A10-859E-5FF824ED6688}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{8D71A857-879A-4A10-859E-5FF824ED6688}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8D71A857-879A-4A10-859E-5FF824ED6688}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{8D71A857-879A-4A10-859E-5FF824ED6688}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{1B5603B4-6F8F-4289-B945-7BAAE523D740}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{1B5603B4-6F8F-4289-B945-7BAAE523D740}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{1B5603B4-6F8F-4289-B945-7BAAE523D740}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{1B5603B4-6F8F-4289-B945-7BAAE523D740}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(NestedProjects) = preSolution
|
||||||
|
{855D6B1D-847B-42DA-BE6A-23683EA89511} = {6317A2E6-8E36-4C3E-949B-3F10EC888AB9}
|
||||||
|
{ACFB060B-EC8A-4926-B293-04C01E17EE23} = {EA68EBE2-51C8-4440-9EF7-D633C90A5D35}
|
||||||
|
{19793545-EF89-48F4-8100-3EBAAD0A9141} = {EA68EBE2-51C8-4440-9EF7-D633C90A5D35}
|
||||||
|
{B47C4063-C4EB-46AA-886D-B868DA1BF0A0} = {8D7989F0-66CE-4DBB-8230-D8C811E9B1D7}
|
||||||
|
{8D71A857-879A-4A10-859E-5FF824ED6688} = {B47C4063-C4EB-46AA-886D-B868DA1BF0A0}
|
||||||
|
{1B5603B4-6F8F-4289-B945-7BAAE523D740} = {B47C4063-C4EB-46AA-886D-B868DA1BF0A0}
|
||||||
|
{EA68EBE2-51C8-4440-9EF7-D633C90A5D35} = {8D7989F0-66CE-4DBB-8230-D8C811E9B1D7}
|
||||||
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
nuget pack Discord.Net.csproj -Prop Configuration=Release
|
|
||||||
pause
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{8D23F61B-723C-4966-859D-1119B28BCF19}</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>Discord</RootNamespace>
|
|
||||||
<AssemblyName>Discord.Net</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<TargetFrameworkProfile />
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="API\Models\Common.cs" />
|
|
||||||
<Compile Include="API\Models\APIRequests.cs" />
|
|
||||||
<Compile Include="API\Endpoints.cs" />
|
|
||||||
<Compile Include="API\Models\APIResponses.cs" />
|
|
||||||
<Compile Include="API\Models\WebSocketCommands.cs" />
|
|
||||||
<Compile Include="ChannelTypes.cs" />
|
|
||||||
<Compile Include="Helpers\AsyncCache.cs" />
|
|
||||||
<Compile Include="Invite.cs" />
|
|
||||||
<Compile Include="Membership.cs" />
|
|
||||||
<Compile Include="Role.cs" />
|
|
||||||
<Compile Include="Message.cs" />
|
|
||||||
<Compile Include="Channel.cs" />
|
|
||||||
<Compile Include="DiscordWebSocket.Events.cs" />
|
|
||||||
<Compile Include="Helpers\Http.cs" />
|
|
||||||
<Compile Include="API\DiscordAPI.cs" />
|
|
||||||
<Compile Include="API\Models\WebSocketEvents.cs" />
|
|
||||||
<Compile Include="DiscordClient.cs" />
|
|
||||||
<Compile Include="Regions.cs" />
|
|
||||||
<Compile Include="DiscordClient.Events.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="DiscordWebSocket.cs" />
|
|
||||||
<Compile Include="Server.cs" />
|
|
||||||
<Compile Include="User.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="BuildNuget.cmd" />
|
|
||||||
<None Include="Discord.Net.nuspec">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</None>
|
|
||||||
<None Include="packages.config" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<!-- 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.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<package >
|
|
||||||
<metadata>
|
|
||||||
<id>$id$</id>
|
|
||||||
<version>$version$</version>
|
|
||||||
<title>$title$</title>
|
|
||||||
<authors>$author$</authors>
|
|
||||||
<owners>$author$</owners>
|
|
||||||
<licenseUrl>http://opensource.org/licenses/MIT</licenseUrl>
|
|
||||||
<projectUrl>https://github.com/RogueException/Discord.Net</projectUrl>
|
|
||||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
|
||||||
<description>$description$</description>
|
|
||||||
<releaseNotes></releaseNotes>
|
|
||||||
<copyright>Copyright 2015</copyright>
|
|
||||||
<tags>Discord DiscordApp</tags>
|
|
||||||
</metadata>
|
|
||||||
</package>
|
|
||||||
8
global.json
Normal file
8
global.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"projects": [ "src" ],
|
||||||
|
"sdk": {
|
||||||
|
"version": "1.0.0-beta6",
|
||||||
|
"architecture": "x64",
|
||||||
|
"runtime": "coreclr"
|
||||||
|
}
|
||||||
|
}
|
||||||
67
src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj
Normal file
67
src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{1B5603B4-6F8F-4289-B945-7BAAE523D740}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>Discord.Net</RootNamespace>
|
||||||
|
<AssemblyName>Discord.Net.Commands</AssemblyName>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup />
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Discord.Net.Net45\Discord.Net.csproj">
|
||||||
|
<Project>{8d71a857-879a-4a10-859e-5ff824ed6688}</Project>
|
||||||
|
<Name>Discord.Net</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Discord.Net.Commands\CommandBuilder.cs">
|
||||||
|
<Link>CommandBuilder.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net.Commands\CommandParser.cs">
|
||||||
|
<Link>CommandParser.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net.Commands\DiscordBotClient.cs">
|
||||||
|
<Link>DiscordBotClient.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net.Commands\DiscordBotClient.Events.cs">
|
||||||
|
<Link>DiscordBotClient.Events.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- 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.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
@@ -1,13 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
[assembly: AssemblyTitle("Discord.Net")]
|
[assembly: AssemblyTitle("Discord.Net")]
|
||||||
[assembly: AssemblyDescription("An unofficial .Net API wrapper for the Discord client.")]
|
[assembly: AssemblyDescription("An unofficial .Net API wrapper for the Discord client.")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("RogueException")]
|
[assembly: AssemblyCompany("RogueException")]
|
||||||
[assembly: AssemblyProduct("Discord.Net")]
|
[assembly: AssemblyProduct("Discord.Net")]
|
||||||
[assembly: AssemblyCopyright("Copyright © RogueException 2015")]
|
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
[assembly: AssemblyVersion("0.3.2.0")]
|
[assembly: ComVisible(false)]
|
||||||
[assembly: AssemblyFileVersion("0.3.2.0")]
|
[assembly: Guid("76ea00e6-ea24-41e1-acb2-639c0313fa80")]
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("0.2.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("0.2.0.0")]
|
||||||
32
src/Discord.Net.Commands/CommandBuilder.cs
Normal file
32
src/Discord.Net.Commands/CommandBuilder.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Discord
|
||||||
|
{
|
||||||
|
public sealed class CommandBuilder
|
||||||
|
{
|
||||||
|
private readonly DiscordBotClient _client;
|
||||||
|
private readonly string _prefix;
|
||||||
|
private readonly bool _useWhitelist;
|
||||||
|
|
||||||
|
public CommandBuilder(DiscordBotClient client, string prefix, bool useWhitelist = false)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
_prefix = prefix;
|
||||||
|
_useWhitelist = useWhitelist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCommandGroup(string cmd, Action<CommandBuilder> config, bool useWhitelist = false)
|
||||||
|
{
|
||||||
|
config(new CommandBuilder(_client, _prefix + ' ' + cmd, useWhitelist));
|
||||||
|
}
|
||||||
|
public void AddCommand(string cmd, int minArgs, int maxArgs, Action<DiscordBotClient.CommandEventArgs> handler, bool? useWhitelist = null)
|
||||||
|
{
|
||||||
|
AddCommand(cmd, minArgs, maxArgs, e => { handler(e); return null; }, useWhitelist);
|
||||||
|
}
|
||||||
|
public void AddCommand(string cmd, int minArgs, int maxArgs, Func<DiscordBotClient.CommandEventArgs, Task> handler, bool? useWhitelist = null)
|
||||||
|
{
|
||||||
|
_client.AddCommand(cmd != "" ? _prefix + ' ' + cmd : _prefix, minArgs, maxArgs, handler, useWhitelist ?? _useWhitelist);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
154
src/Discord.Net.Commands/CommandParser.cs
Normal file
154
src/Discord.Net.Commands/CommandParser.cs
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Discord
|
||||||
|
{
|
||||||
|
public static class CommandParser
|
||||||
|
{
|
||||||
|
private enum CommandParserPart
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
CommandName,
|
||||||
|
Parameter,
|
||||||
|
QuotedParameter,
|
||||||
|
DoubleQuotedParameter
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool Parse(string input, out string command, out string[] args)
|
||||||
|
{
|
||||||
|
return Parse(input, out command, out args, true);
|
||||||
|
}
|
||||||
|
public static bool ParseArgs(string input, out string[] args)
|
||||||
|
{
|
||||||
|
string ignored;
|
||||||
|
return Parse(input, out ignored, out args, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool Parse(string input, out string command, out string[] args, bool parseCommand)
|
||||||
|
{
|
||||||
|
CommandParserPart currentPart = parseCommand ? CommandParserPart.CommandName : CommandParserPart.None;
|
||||||
|
int startPosition = 0;
|
||||||
|
int endPosition = 0;
|
||||||
|
int inputLength = input.Length;
|
||||||
|
bool isEscaped = false;
|
||||||
|
List<string> argList = new List<string>();
|
||||||
|
|
||||||
|
command = null;
|
||||||
|
args = null;
|
||||||
|
|
||||||
|
if (input == "")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
while (endPosition < inputLength)
|
||||||
|
{
|
||||||
|
char currentChar = input[endPosition++];
|
||||||
|
if (isEscaped)
|
||||||
|
isEscaped = false;
|
||||||
|
else if (currentChar == '\\')
|
||||||
|
isEscaped = true;
|
||||||
|
|
||||||
|
switch (currentPart)
|
||||||
|
{
|
||||||
|
case CommandParserPart.CommandName:
|
||||||
|
if ((!isEscaped && currentChar == ' ') || endPosition >= inputLength)
|
||||||
|
{
|
||||||
|
int length = (currentChar == ' ' ? endPosition - 1 : endPosition) - startPosition;
|
||||||
|
string temp = input.Substring(startPosition, length);
|
||||||
|
if (temp == "")
|
||||||
|
startPosition = endPosition;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentPart = CommandParserPart.None;
|
||||||
|
command = temp;
|
||||||
|
startPosition = endPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CommandParserPart.None:
|
||||||
|
if ((!isEscaped && currentChar == '\"'))
|
||||||
|
{
|
||||||
|
currentPart = CommandParserPart.DoubleQuotedParameter;
|
||||||
|
startPosition = endPosition;
|
||||||
|
}
|
||||||
|
else if ((!isEscaped && currentChar == '\''))
|
||||||
|
{
|
||||||
|
currentPart = CommandParserPart.QuotedParameter;
|
||||||
|
startPosition = endPosition;
|
||||||
|
}
|
||||||
|
else if ((!isEscaped && currentChar == ' ') || endPosition >= inputLength)
|
||||||
|
{
|
||||||
|
int length = (currentChar == ' ' ? endPosition - 1 : endPosition) - startPosition;
|
||||||
|
string temp = input.Substring(startPosition, length);
|
||||||
|
if (temp == "")
|
||||||
|
startPosition = endPosition;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentPart = CommandParserPart.None;
|
||||||
|
argList.Add(temp);
|
||||||
|
startPosition = endPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CommandParserPart.QuotedParameter:
|
||||||
|
if ((!isEscaped && currentChar == '\''))
|
||||||
|
{
|
||||||
|
string temp = input.Substring(startPosition, endPosition - startPosition - 1);
|
||||||
|
currentPart = CommandParserPart.None;
|
||||||
|
argList.Add(temp);
|
||||||
|
startPosition = endPosition;
|
||||||
|
}
|
||||||
|
else if (endPosition >= inputLength)
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case CommandParserPart.DoubleQuotedParameter:
|
||||||
|
if ((!isEscaped && currentChar == '\"'))
|
||||||
|
{
|
||||||
|
string temp = input.Substring(startPosition, endPosition - startPosition - 1);
|
||||||
|
currentPart = CommandParserPart.None;
|
||||||
|
argList.Add(temp);
|
||||||
|
startPosition = endPosition;
|
||||||
|
}
|
||||||
|
else if (endPosition >= inputLength)
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseCommand && (command == null || command == ""))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
args = argList.ToArray();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool ArgsEqual(string[] args, int expected)
|
||||||
|
{
|
||||||
|
return args.Length == expected;
|
||||||
|
}
|
||||||
|
public static bool ArgsAtLeast(string[] args, int expected)
|
||||||
|
{
|
||||||
|
return args.Length >= expected;
|
||||||
|
}
|
||||||
|
public static bool ArgsAtMost(string[] args, int expected)
|
||||||
|
{
|
||||||
|
return args.Length <= expected;
|
||||||
|
}
|
||||||
|
public static bool ArgsIn(string[] args, params int[] expected)
|
||||||
|
{
|
||||||
|
int count = args.Length;
|
||||||
|
for (int i = 0; i < expected.Length; i++)
|
||||||
|
{
|
||||||
|
if (count == expected[i])
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public static bool ArgsBetween(string[] args, int min, int max)
|
||||||
|
{
|
||||||
|
return args.Length >= min && args.Length <= max;
|
||||||
|
}
|
||||||
|
public static bool NoArgs(string[] args, params int[] expected)
|
||||||
|
{
|
||||||
|
return args.Length == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/Discord.Net.Commands/Discord.Net.Commands.xproj
Normal file
21
src/Discord.Net.Commands/Discord.Net.Commands.xproj
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>19793545-ef89-48f4-8100-3ebaad0a9141</ProjectGuid>
|
||||||
|
<RootNamespace>Discord.Net.Commands</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<ProduceOutputsOnBuild>True</ProduceOutputsOnBuild>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
50
src/Discord.Net.Commands/DiscordBotClient.Events.cs
Normal file
50
src/Discord.Net.Commands/DiscordBotClient.Events.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Discord
|
||||||
|
{
|
||||||
|
public partial class DiscordBotClient : DiscordClient
|
||||||
|
{
|
||||||
|
public class CommandEventArgs
|
||||||
|
{
|
||||||
|
public readonly Message Message;
|
||||||
|
public readonly Command Command;
|
||||||
|
public readonly string[] Args;
|
||||||
|
|
||||||
|
public User User => Message.User;
|
||||||
|
public string UserId => Message.UserId;
|
||||||
|
public Channel Channel => Message.Channel;
|
||||||
|
public string ChannelId => Message.ChannelId;
|
||||||
|
public Server Server => Message.Channel.Server;
|
||||||
|
public string ServerId => Message.Channel.ServerId;
|
||||||
|
|
||||||
|
public CommandEventArgs(Message message, Command command, string[] args)
|
||||||
|
{
|
||||||
|
Message = message;
|
||||||
|
Command = command;
|
||||||
|
Args = args;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class CommandErrorEventArgs : CommandEventArgs
|
||||||
|
{
|
||||||
|
public readonly Exception Exception;
|
||||||
|
public CommandErrorEventArgs(Message message, Command command, string[] args, Exception ex)
|
||||||
|
: base(message, command, args)
|
||||||
|
{
|
||||||
|
Exception = ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public event EventHandler<CommandEventArgs> RanCommand;
|
||||||
|
private void RaiseRanCommand(CommandEventArgs args)
|
||||||
|
{
|
||||||
|
if (RanCommand != null)
|
||||||
|
RanCommand(this, args);
|
||||||
|
}
|
||||||
|
public event EventHandler<CommandErrorEventArgs> CommandError;
|
||||||
|
private void RaiseCommandError(Message msg, Command command, string[] args, Exception ex)
|
||||||
|
{
|
||||||
|
if (CommandError != null)
|
||||||
|
CommandError(this, new CommandErrorEventArgs(msg, command, args, ex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
151
src/Discord.Net.Commands/DiscordBotClient.cs
Normal file
151
src/Discord.Net.Commands/DiscordBotClient.cs
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Discord
|
||||||
|
{
|
||||||
|
public sealed class Command
|
||||||
|
{
|
||||||
|
public readonly string[] Text;
|
||||||
|
public readonly int MinArgs, MaxArgs;
|
||||||
|
public readonly bool UseWhitelist;
|
||||||
|
internal readonly Func<DiscordBotClient.CommandEventArgs, Task> Handler;
|
||||||
|
|
||||||
|
public Command(string[] text, int minArgs, int maxArgs, bool useWhitelist, Func<DiscordBotClient.CommandEventArgs, Task> handler)
|
||||||
|
{
|
||||||
|
Text = text;
|
||||||
|
MinArgs = minArgs;
|
||||||
|
MaxArgs = maxArgs;
|
||||||
|
UseWhitelist = useWhitelist;
|
||||||
|
Handler = handler;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A Discord.Net client with extensions for handling common bot operations like text commands.
|
||||||
|
/// </summary>
|
||||||
|
public partial class DiscordBotClient : DiscordClient
|
||||||
|
{
|
||||||
|
private List<Command> _commands;
|
||||||
|
private List<string> _whitelist;
|
||||||
|
|
||||||
|
public IEnumerable<Command> Commands => _commands;
|
||||||
|
|
||||||
|
public char CommandChar { get; set; }
|
||||||
|
public bool UseCommandChar { get; set; }
|
||||||
|
public bool RequireCommandCharInPublic { get; set; }
|
||||||
|
public bool RequireCommandCharInPrivate { get; set; }
|
||||||
|
public bool AlwaysUseWhitelist { get; set; }
|
||||||
|
|
||||||
|
public DiscordBotClient()
|
||||||
|
{
|
||||||
|
_commands = new List<Command>();
|
||||||
|
_whitelist = new List<string>();
|
||||||
|
|
||||||
|
CommandChar = '~';
|
||||||
|
RequireCommandCharInPublic = true;
|
||||||
|
RequireCommandCharInPrivate = true;
|
||||||
|
AlwaysUseWhitelist = false;
|
||||||
|
|
||||||
|
MessageCreated += async (s, e) =>
|
||||||
|
{
|
||||||
|
//Ignore messages from ourselves
|
||||||
|
if (e.Message.UserId == UserId)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Check the global whitelist
|
||||||
|
if (AlwaysUseWhitelist && !_whitelist.Contains(e.Message.UserId))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Check for the command character
|
||||||
|
string msg = e.Message.Text;
|
||||||
|
if (UseCommandChar)
|
||||||
|
{
|
||||||
|
if (msg.Length == 0)
|
||||||
|
return;
|
||||||
|
bool isPrivate = e.Message.Channel.IsPrivate;
|
||||||
|
bool hasCommandChar = msg[0] == CommandChar;
|
||||||
|
if (hasCommandChar)
|
||||||
|
msg = msg.Substring(1);
|
||||||
|
if (!isPrivate && RequireCommandCharInPublic && !hasCommandChar)
|
||||||
|
return;
|
||||||
|
if (isPrivate && RequireCommandCharInPrivate && !hasCommandChar)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] args;
|
||||||
|
if (!CommandParser.ParseArgs(msg, out args))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = 0; i < _commands.Count; i++)
|
||||||
|
{
|
||||||
|
Command cmd = _commands[i];
|
||||||
|
|
||||||
|
//Check Command Parts
|
||||||
|
if (args.Length < cmd.Text.Length)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool isValid = true;
|
||||||
|
for (int j = 0; j < cmd.Text.Length; j++)
|
||||||
|
{
|
||||||
|
if (!string.Equals(args[j], cmd.Text[j], StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
isValid = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isValid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Check Whitelist
|
||||||
|
if (cmd.UseWhitelist && !_whitelist.Contains(e.Message.UserId))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Check Arg Count
|
||||||
|
int argCount = args.Length - cmd.Text.Length;
|
||||||
|
if (argCount < cmd.MinArgs || argCount > cmd.MaxArgs)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Run Command
|
||||||
|
string[] newArgs = new string[argCount];
|
||||||
|
for (int j = 0; j < newArgs.Length; j++)
|
||||||
|
newArgs[j] = args[j + cmd.Text.Length];
|
||||||
|
|
||||||
|
var eventArgs = new CommandEventArgs(e.Message, cmd, newArgs);
|
||||||
|
RaiseRanCommand(eventArgs);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var task = cmd.Handler(eventArgs);
|
||||||
|
if (task != null)
|
||||||
|
await task;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
RaiseCommandError(e.Message, cmd, newArgs, ex);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCommandGroup(string cmd, Action<CommandBuilder> config, bool useWhitelist = false)
|
||||||
|
{
|
||||||
|
config(new CommandBuilder(this, cmd, useWhitelist));
|
||||||
|
}
|
||||||
|
public void AddCommand(string cmd, int minArgs, int maxArgs, Action<CommandEventArgs> handler, bool useWhitelist = false)
|
||||||
|
{
|
||||||
|
AddCommand(cmd, minArgs, maxArgs, e => { handler(e); return null; }, useWhitelist);
|
||||||
|
}
|
||||||
|
public void AddCommand(string cmd, int minArgs, int maxArgs, Func<CommandEventArgs, Task> handler, bool useWhitelist = false)
|
||||||
|
{
|
||||||
|
_commands.Add(new Command(cmd.Split(' '), minArgs, maxArgs, useWhitelist, handler));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddWhitelist(User user)
|
||||||
|
=> AddWhitelist(user.Id);
|
||||||
|
public void AddWhitelist(string userId)
|
||||||
|
{
|
||||||
|
_whitelist.Add(userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/Discord.Net.Commands/project.json
Normal file
26
src/Discord.Net.Commands/project.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0-*",
|
||||||
|
"description": "A small Discord.Net extension to make bot creation easier.",
|
||||||
|
"authors": [ "RogueException" ],
|
||||||
|
"tags": [ "discord", "discordapp" ],
|
||||||
|
"projectUrl": "https://github.com/RogueException/Discord.Net",
|
||||||
|
"licenseUrl": "http://opensource.org/licenses/MIT",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/RogueException/Discord.Net"
|
||||||
|
},
|
||||||
|
"compilationOptions": {
|
||||||
|
"warningsAsErrors": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Discord.Net": ""
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"dotnet": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Runtime": "4.0.20",
|
||||||
|
"Microsoft.CSharp": "4.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
121
src/Discord.Net.Net45/Discord.Net.csproj
Normal file
121
src/Discord.Net.Net45/Discord.Net.csproj
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{8D71A857-879A-4A10-859E-5FF824ED6688}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>Discord.Net</RootNamespace>
|
||||||
|
<AssemblyName>Discord.Net</AssemblyName>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Discord.Net\API\DiscordAPI.cs">
|
||||||
|
<Link>API\DiscordAPI.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\API\Endpoints.cs">
|
||||||
|
<Link>API\Endpoints.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\API\Models\APIRequests.cs">
|
||||||
|
<Link>API\Models\APIRequests.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\API\Models\APIResponses.cs">
|
||||||
|
<Link>API\Models\APIResponses.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\API\Models\Common.cs">
|
||||||
|
<Link>API\Models\Common.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\API\Models\WebSocketCommands.cs">
|
||||||
|
<Link>API\Models\WebSocketCommands.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\API\Models\WebSocketEvents.cs">
|
||||||
|
<Link>API\Models\WebSocketEvents.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Channel.cs">
|
||||||
|
<Link>Channel.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\ChannelTypes.cs">
|
||||||
|
<Link>ChannelTypes.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\DiscordClient.cs">
|
||||||
|
<Link>DiscordClient.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\DiscordClient.Events.cs">
|
||||||
|
<Link>DiscordClient.Events.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\DiscordWebSocket.cs">
|
||||||
|
<Link>DiscordWebSocket.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\DiscordWebSocket.Events.cs">
|
||||||
|
<Link>DiscordWebSocket.Events.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Helpers\AsyncCache.cs">
|
||||||
|
<Link>Helpers\AsyncCache.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Helpers\Http.cs">
|
||||||
|
<Link>Helpers\Http.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Invite.cs">
|
||||||
|
<Link>Invite.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Membership.cs">
|
||||||
|
<Link>Membership.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Message.cs">
|
||||||
|
<Link>Message.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Regions.cs">
|
||||||
|
<Link>Regions.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Role.cs">
|
||||||
|
<Link>Role.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Server.cs">
|
||||||
|
<Link>Server.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\User.cs">
|
||||||
|
<Link>User.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- 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.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
17
src/Discord.Net.Net45/Properties/AssemblyInfo.cs
Normal file
17
src/Discord.Net.Net45/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("Discord.Net")]
|
||||||
|
[assembly: AssemblyDescription("An unofficial .Net API wrapper for the Discord client.")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("RogueException")]
|
||||||
|
[assembly: AssemblyProduct("Discord.Net")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
[assembly: Guid("76ea00e6-ea24-41e1-acb2-639c0313fa80")]
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("0.3.3.0")]
|
||||||
|
[assembly: AssemblyFileVersion("0.3.3.0")]
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net452" />
|
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -11,7 +11,7 @@ namespace Discord
|
|||||||
public string Id { get; }
|
public string Id { get; }
|
||||||
|
|
||||||
private string _name;
|
private string _name;
|
||||||
public string Name { get { return !IsPrivate ? _name : '@' + Recipient.Name; } internal set { _name = value; } }
|
public string Name { get { return !IsPrivate ? $"#{_name}" : $"@{Recipient.Name}"; } internal set { _name = value; } }
|
||||||
|
|
||||||
public bool IsPrivate { get; }
|
public bool IsPrivate { get; }
|
||||||
public string Type { get; internal set; }
|
public string Type { get; internal set; }
|
||||||
21
src/Discord.Net/Discord.Net.xproj
Normal file
21
src/Discord.Net/Discord.Net.xproj
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>acfb060b-ec8a-4926-b293-04c01e17ee23</ProjectGuid>
|
||||||
|
<RootNamespace>Discord.Net</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<ProduceOutputsOnBuild>True</ProduceOutputsOnBuild>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
@@ -18,7 +18,7 @@ namespace Discord
|
|||||||
|
|
||||||
private DiscordWebSocket _webSocket;
|
private DiscordWebSocket _webSocket;
|
||||||
private HttpOptions _httpOptions;
|
private HttpOptions _httpOptions;
|
||||||
private bool _isClosing, _isReady;
|
private bool _isReady;
|
||||||
|
|
||||||
public string UserId { get; private set; }
|
public string UserId { get; private set; }
|
||||||
public User User => _users[UserId];
|
public User User => _users[UserId];
|
||||||
@@ -38,11 +38,14 @@ namespace Discord
|
|||||||
public IEnumerable<Role> Roles => _roles;
|
public IEnumerable<Role> Roles => _roles;
|
||||||
private AsyncCache<Role, API.Models.Role> _roles;
|
private AsyncCache<Role, API.Models.Role> _roles;
|
||||||
|
|
||||||
|
private ManualResetEventSlim _isStopping;
|
||||||
|
|
||||||
public bool IsConnected => _isReady;
|
public bool IsConnected => _isReady;
|
||||||
|
|
||||||
public DiscordClient()
|
public DiscordClient()
|
||||||
{
|
{
|
||||||
string version = typeof(DiscordClient).GetTypeInfo().Assembly.GetName().Version.ToString(2);
|
_isStopping = new ManualResetEventSlim(false);
|
||||||
|
string version = typeof(DiscordClient).GetTypeInfo().Assembly.GetName().Version.ToString(2);
|
||||||
_httpOptions = new HttpOptions($"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)");
|
_httpOptions = new HttpOptions($"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)");
|
||||||
|
|
||||||
_servers = new AsyncCache<Server, API.Models.ServerReference>(
|
_servers = new AsyncCache<Server, API.Models.ServerReference>(
|
||||||
@@ -152,12 +155,12 @@ namespace Discord
|
|||||||
{
|
{
|
||||||
//Reconnect if we didn't cause the disconnect
|
//Reconnect if we didn't cause the disconnect
|
||||||
RaiseDisconnected();
|
RaiseDisconnected();
|
||||||
while (!_isClosing)
|
while (!_isStopping.IsSet)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await Task.Delay(ReconnectDelay);
|
await Task.Delay(ReconnectDelay);
|
||||||
await _webSocket.ConnectAsync(Endpoints.WebSocket_Hub, _httpOptions);
|
await _webSocket.ConnectAsync(Endpoints.WebSocket_Hub, true, _httpOptions);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
@@ -395,7 +398,7 @@ namespace Discord
|
|||||||
public User FindUser(string name)
|
public User FindUser(string name)
|
||||||
{
|
{
|
||||||
return _users
|
return _users
|
||||||
.Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase))
|
.Where(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase))
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
public User FindUser(string name, string discriminator)
|
public User FindUser(string name, string discriminator)
|
||||||
@@ -405,7 +408,7 @@ namespace Discord
|
|||||||
|
|
||||||
return _users
|
return _users
|
||||||
.Where(x =>
|
.Where(x =>
|
||||||
string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase) &&
|
string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase) &&
|
||||||
x.Discriminator == discriminator
|
x.Discriminator == discriminator
|
||||||
)
|
)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
@@ -418,7 +421,7 @@ namespace Discord
|
|||||||
name = name.Substring(1);
|
name = name.Substring(1);
|
||||||
|
|
||||||
return _users
|
return _users
|
||||||
.Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase))
|
.Where(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase))
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,7 +429,7 @@ namespace Discord
|
|||||||
public Server FindServer(string name)
|
public Server FindServer(string name)
|
||||||
{
|
{
|
||||||
return _servers
|
return _servers
|
||||||
.Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase))
|
.Where(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase))
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,7 +440,7 @@ namespace Discord
|
|||||||
name = name.Substring(1);
|
name = name.Substring(1);
|
||||||
|
|
||||||
return _channels
|
return _channels
|
||||||
.Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase))
|
.Where(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase))
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
public Channel FindChannel(Server server, string name)
|
public Channel FindChannel(Server server, string name)
|
||||||
@@ -449,7 +452,7 @@ namespace Discord
|
|||||||
|
|
||||||
return _channels
|
return _channels
|
||||||
.Where(x =>
|
.Where(x =>
|
||||||
string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase) &&
|
string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase) &&
|
||||||
x.ServerId == serverId
|
x.ServerId == serverId
|
||||||
)
|
)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
@@ -461,7 +464,7 @@ namespace Discord
|
|||||||
public Role FindRole(string serverId, string name)
|
public Role FindRole(string serverId, string name)
|
||||||
{
|
{
|
||||||
return _roles
|
return _roles
|
||||||
.Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase))
|
.Where(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase))
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -495,26 +498,39 @@ namespace Discord
|
|||||||
//Auth
|
//Auth
|
||||||
public async Task Connect(string email, string password)
|
public async Task Connect(string email, string password)
|
||||||
{
|
{
|
||||||
_isClosing = false;
|
_isStopping.Reset();
|
||||||
|
|
||||||
|
//Open websocket while we wait for login response
|
||||||
|
Task socketTask = _webSocket.ConnectAsync(Endpoints.WebSocket_Hub, false, _httpOptions);
|
||||||
var response = await DiscordAPI.Login(email, password, _httpOptions);
|
var response = await DiscordAPI.Login(email, password, _httpOptions);
|
||||||
_httpOptions.Token = response.Token;
|
_httpOptions.Token = response.Token;
|
||||||
await _webSocket.ConnectAsync(Endpoints.WebSocket_Hub, _httpOptions);
|
|
||||||
|
//Wait for websocket to finish connecting, then send token
|
||||||
|
await socketTask;
|
||||||
|
_webSocket.Login(_httpOptions);
|
||||||
|
|
||||||
_isReady = true;
|
_isReady = true;
|
||||||
}
|
}
|
||||||
public async Task ConnectAnonymous(string username)
|
public async Task ConnectAnonymous(string username)
|
||||||
{
|
{
|
||||||
_isClosing = false;
|
_isStopping.Reset();
|
||||||
|
|
||||||
|
//Open websocket while we wait for login response
|
||||||
|
Task socketTask = _webSocket.ConnectAsync(Endpoints.WebSocket_Hub, false, _httpOptions);
|
||||||
var response = await DiscordAPI.LoginAnonymous(username, _httpOptions);
|
var response = await DiscordAPI.LoginAnonymous(username, _httpOptions);
|
||||||
_httpOptions.Token = response.Token;
|
_httpOptions.Token = response.Token;
|
||||||
await _webSocket.ConnectAsync(Endpoints.WebSocket_Hub, _httpOptions);
|
|
||||||
|
//Wait for websocket to finish connecting, then send token
|
||||||
|
await socketTask;
|
||||||
|
_webSocket.Login(_httpOptions);
|
||||||
|
|
||||||
_isReady = true;
|
_isReady = true;
|
||||||
}
|
}
|
||||||
public async Task Disconnect()
|
public async Task Disconnect()
|
||||||
{
|
{
|
||||||
_isReady = false;
|
_isReady = false;
|
||||||
_isClosing = true;
|
_isStopping.Set();
|
||||||
await _webSocket.DisconnectAsync();
|
await _webSocket.DisconnectAsync();
|
||||||
_isClosing = false;
|
|
||||||
|
|
||||||
_channels.Clear();
|
_channels.Clear();
|
||||||
_messages.Clear();
|
_messages.Clear();
|
||||||
@@ -783,12 +799,14 @@ namespace Discord
|
|||||||
if (!_isReady)
|
if (!_isReady)
|
||||||
throw new InvalidOperationException("The client is not currently connected to Discord");
|
throw new InvalidOperationException("The client is not currently connected to Discord");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Blocking call that will not return until client has been stopped. This is mainly intended for use in console applications.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
public void Block()
|
public void Block()
|
||||||
{
|
{
|
||||||
//Blocking call for console apps
|
_isStopping.Wait();
|
||||||
//TODO: Improve this
|
|
||||||
while (!_isClosing)
|
|
||||||
Thread.Sleep(1000);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ namespace Discord
|
|||||||
private DateTime _lastHeartbeat;
|
private DateTime _lastHeartbeat;
|
||||||
private AutoResetEvent _connectWaitOnLogin, _connectWaitOnLogin2;
|
private AutoResetEvent _connectWaitOnLogin, _connectWaitOnLogin2;
|
||||||
|
|
||||||
public async Task ConnectAsync(string url, HttpOptions options)
|
public async Task ConnectAsync(string url, bool autoLogin, HttpOptions options)
|
||||||
{
|
{
|
||||||
await DisconnectAsync();
|
await DisconnectAsync();
|
||||||
|
|
||||||
@@ -34,7 +34,6 @@ namespace Discord
|
|||||||
_sendQueue = new ConcurrentQueue<byte[]>();
|
_sendQueue = new ConcurrentQueue<byte[]>();
|
||||||
|
|
||||||
_webSocket = new ClientWebSocket();
|
_webSocket = new ClientWebSocket();
|
||||||
_webSocket.Options.Cookies = options.Cookies;
|
|
||||||
_webSocket.Options.KeepAliveInterval = TimeSpan.Zero;
|
_webSocket.Options.KeepAliveInterval = TimeSpan.Zero;
|
||||||
|
|
||||||
_cancelToken = new CancellationTokenSource();
|
_cancelToken = new CancellationTokenSource();
|
||||||
@@ -58,6 +57,11 @@ namespace Discord
|
|||||||
RaiseDisconnected();
|
RaiseDisconnected();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (autoLogin)
|
||||||
|
Login(options);
|
||||||
|
}
|
||||||
|
public void Login(HttpOptions options)
|
||||||
|
{
|
||||||
WebSocketCommands.Login msg = new WebSocketCommands.Login();
|
WebSocketCommands.Login msg = new WebSocketCommands.Login();
|
||||||
msg.Payload.Token = options.Token;
|
msg.Payload.Token = options.Token;
|
||||||
msg.Payload.Properties["$os"] = "";
|
msg.Payload.Properties["$os"] = "";
|
||||||
@@ -65,12 +69,14 @@ namespace Discord
|
|||||||
msg.Payload.Properties["$device"] = "Discord.Net";
|
msg.Payload.Properties["$device"] = "Discord.Net";
|
||||||
msg.Payload.Properties["$referrer"] = "";
|
msg.Payload.Properties["$referrer"] = "";
|
||||||
msg.Payload.Properties["$referring_domain"] = "";
|
msg.Payload.Properties["$referring_domain"] = "";
|
||||||
SendMessage(msg, cancelToken);
|
SendMessage(msg, _cancelToken.Token);
|
||||||
|
|
||||||
if (!_connectWaitOnLogin.WaitOne(ReadyTimeout)) //Pre-Event
|
if (!_connectWaitOnLogin.WaitOne(ReadyTimeout)) //Pre-Event
|
||||||
throw new Exception("No reply from Discord server");
|
throw new Exception("No reply from Discord server");
|
||||||
_connectWaitOnLogin2.WaitOne(); //Post-Event
|
_connectWaitOnLogin2.WaitOne(); //Post-Event
|
||||||
}
|
|
||||||
|
RaiseConnected();
|
||||||
|
}
|
||||||
public async Task DisconnectAsync()
|
public async Task DisconnectAsync()
|
||||||
{
|
{
|
||||||
if (_tasks != null)
|
if (_tasks != null)
|
||||||
@@ -82,8 +88,6 @@ namespace Discord
|
|||||||
|
|
||||||
private async Task ReceiveAsync()
|
private async Task ReceiveAsync()
|
||||||
{
|
{
|
||||||
RaiseConnected();
|
|
||||||
|
|
||||||
var cancelToken = _cancelToken.Token;
|
var cancelToken = _cancelToken.Token;
|
||||||
var buffer = new byte[ReceiveChunkSize];
|
var buffer = new byte[ReceiveChunkSize];
|
||||||
var builder = new StringBuilder();
|
var builder = new StringBuilder();
|
||||||
@@ -3,7 +3,6 @@ using System;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Cache;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@@ -13,18 +12,15 @@ namespace Discord.Helpers
|
|||||||
{
|
{
|
||||||
public readonly string UserAgent;
|
public readonly string UserAgent;
|
||||||
public string Token;
|
public string Token;
|
||||||
public CookieContainer Cookies;
|
|
||||||
|
|
||||||
public HttpOptions(string userAgent)
|
public HttpOptions(string userAgent)
|
||||||
{
|
{
|
||||||
UserAgent = userAgent;
|
UserAgent = userAgent;
|
||||||
Cookies = new CookieContainer(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static class Http
|
internal static class Http
|
||||||
{
|
{
|
||||||
private static readonly RequestCachePolicy _cachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
private const bool _isDebug = true;
|
private const bool _isDebug = true;
|
||||||
#else
|
#else
|
||||||
@@ -107,12 +103,13 @@ namespace Discord.Helpers
|
|||||||
//Create Request
|
//Create Request
|
||||||
HttpWebRequest request = WebRequest.CreateHttp(path);
|
HttpWebRequest request = WebRequest.CreateHttp(path);
|
||||||
request.Accept = "*/*";
|
request.Accept = "*/*";
|
||||||
|
request.Method = method;
|
||||||
|
request.Proxy = null;
|
||||||
request.Headers[HttpRequestHeader.AcceptLanguage] = "en-US;q=0.8";
|
request.Headers[HttpRequestHeader.AcceptLanguage] = "en-US;q=0.8";
|
||||||
request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
|
request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
|
||||||
request.CachePolicy = _cachePolicy;
|
request.Headers[HttpRequestHeader.UserAgent] = options.UserAgent;
|
||||||
request.CookieContainer = options.Cookies;
|
request.Headers[HttpRequestHeader.Authorization] = options.Token;
|
||||||
request.Method = method;
|
//request.UserAgent = options.UserAgent;
|
||||||
request.UserAgent = options.UserAgent;
|
|
||||||
|
|
||||||
//Add Payload
|
//Add Payload
|
||||||
if (data != null)
|
if (data != null)
|
||||||
@@ -140,18 +137,35 @@ namespace Discord.Helpers
|
|||||||
largeBuffer.Write(smallBuffer, 0, bytesRead);
|
largeBuffer.Write(smallBuffer, 0, bytesRead);
|
||||||
|
|
||||||
//Do we need to decompress?
|
//Do we need to decompress?
|
||||||
if (!string.IsNullOrEmpty(response.ContentEncoding))
|
string encoding = response.Headers[HttpResponseHeader.ContentEncoding];
|
||||||
|
if (!string.IsNullOrEmpty(encoding))
|
||||||
{
|
{
|
||||||
largeBuffer.Position = 0;
|
largeBuffer.Position = 0;
|
||||||
using (var decoder = GetDecoder(response.ContentEncoding, largeBuffer))
|
using (var decoder = GetDecoder(encoding, largeBuffer))
|
||||||
using (var decodedStream = new MemoryStream())
|
using (var decodedStream = new MemoryStream())
|
||||||
{
|
{
|
||||||
decoder.CopyTo(decodedStream);
|
decoder.CopyTo(decodedStream);
|
||||||
|
#if !DOTNET
|
||||||
return Encoding.UTF8.GetString(decodedStream.GetBuffer(), 0, (int)decodedStream.Length);
|
return Encoding.UTF8.GetString(decodedStream.GetBuffer(), 0, (int)decodedStream.Length);
|
||||||
|
#else
|
||||||
|
ArraySegment<byte> buffer;
|
||||||
|
if (!decodedStream.TryGetBuffer(out buffer))
|
||||||
|
throw new InvalidOperationException("Failed to get response buffer.");
|
||||||
|
return Encoding.UTF8.GetString(buffer.Array, buffer.Offset, (int)decodedStream.Length);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
#if !DOTNET
|
||||||
return Encoding.UTF8.GetString(largeBuffer.GetBuffer(), 0, (int)largeBuffer.Length);
|
return Encoding.UTF8.GetString(largeBuffer.GetBuffer(), 0, (int)largeBuffer.Length);
|
||||||
|
#else
|
||||||
|
ArraySegment<byte> buffer;
|
||||||
|
if (!largeBuffer.TryGetBuffer(out buffer))
|
||||||
|
throw new InvalidOperationException("Failed to get response buffer.");
|
||||||
|
return Encoding.UTF8.GetString(buffer.Array, buffer.Offset, (int)largeBuffer.Length);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
4
src/Discord.Net/packages.config
Normal file
4
src/Discord.Net/packages.config
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||||
|
</packages>
|
||||||
28
src/Discord.Net/project.json
Normal file
28
src/Discord.Net/project.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"version": "0.3.3-*",
|
||||||
|
"description": "An unofficial .Net API wrapper for the Discord client.",
|
||||||
|
"authors": [ "RogueException" ],
|
||||||
|
"tags": [ "discord", "discordapp" ],
|
||||||
|
"projectUrl": "https://github.com/RogueException/Discord.Net",
|
||||||
|
"licenseUrl": "http://opensource.org/licenses/MIT",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/RogueException/Discord.Net"
|
||||||
|
},
|
||||||
|
"compilationOptions": {
|
||||||
|
"warningsAsErrors": true
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"dotnet": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Collections.Concurrent": "4.0.10",
|
||||||
|
"System.IO.Compression": "4.0.0-beta-23109",
|
||||||
|
"System.Net.Requests": "4.0.10-beta-23109",
|
||||||
|
"System.Net.WebSockets.Client": "4.0.0-beta-23109",
|
||||||
|
"System.Runtime": "4.0.20",
|
||||||
|
"Microsoft.CSharp": "4.0.0",
|
||||||
|
"Newtonsoft.Json": "7.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>Discord.Net.Tests</RootNamespace>
|
<RootNamespace>Discord.Net.Tests</RootNamespace>
|
||||||
<AssemblyName>Discord.Net.Tests</AssemblyName>
|
<AssemblyName>Discord.Net.Tests</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
|
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
|
||||||
<IsCodedUITest>False</IsCodedUITest>
|
<IsCodedUITest>False</IsCodedUITest>
|
||||||
<TestProjectType>UnitTest</TestProjectType>
|
<TestProjectType>UnitTest</TestProjectType>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -55,8 +56,8 @@
|
|||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Discord.Net\Discord.Net.csproj">
|
<ProjectReference Include="..\..\src\Discord.Net.Net45\Discord.Net.csproj">
|
||||||
<Project>{8d23f61b-723c-4966-859d-1119b28bcf19}</Project>
|
<Project>{8d71a857-879a-4a10-859e-5ff824ed6688}</Project>
|
||||||
<Name>Discord.Net</Name>
|
<Name>Discord.Net</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
Reference in New Issue
Block a user