merging recent .NET Core 3.0 supportpull/1399/head
| @@ -16,18 +16,23 @@ jobs: | |||
| pool: | |||
| vmImage: 'ubuntu-16.04' | |||
| steps: | |||
| - task: UseDotNet@2 | |||
| displayName: 'Use .NET Core sdk' | |||
| inputs: | |||
| packageType: 'sdk' | |||
| version: '3.x' | |||
| - template: azure/build.yml | |||
| - job: Windows_build | |||
| pool: | |||
| vmImage: 'vs2017-win2016' | |||
| vmImage: 'windows-2019' | |||
| condition: ne(variables['Build.SourceBranch'], 'refs/heads/dev') | |||
| steps: | |||
| - template: azure/build.yml | |||
| - job: Windows_deploy | |||
| pool: | |||
| vmImage: 'vs2017-win2016' | |||
| vmImage: 'windows-2019' | |||
| condition: | | |||
| and ( | |||
| succeeded(), | |||
| @@ -1,32 +1,35 @@ | |||
| steps: | |||
| - script: | | |||
| dotnet pack "src\Discord.Net.Core\Discord.Net.Core.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "../../artifacts/" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Rest\Discord.Net.Rest.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "../../artifacts/" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "../../artifacts/" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Commands\Discord.Net.Commands.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "../../artifacts/" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Webhook\Discord.Net.Webhook.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "../../artifacts/" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Providers.WS4Net\Discord.Net.Providers.WS4Net.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "../../artifacts/" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Analyzers\Discord.Net.Analyzers.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "../../artifacts/" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Core\Discord.Net.Core.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Rest\Discord.Net.Rest.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Commands\Discord.Net.Commands.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Webhook\Discord.Net.Webhook.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Providers.WS4Net\Discord.Net.Providers.WS4Net.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| dotnet pack "src\Discord.Net.Analyzers\Discord.Net.Analyzers.csproj" --no-restore --no-build -v minimal -c $(buildConfiguration) -o "$(Build.ArtifactStagingDirectory)" /p:BuildNumber=$(buildNumber) /p:IsTagBuild=$(buildTag) | |||
| displayName: Pack projects | |||
| - task: NuGet@0 | |||
| inputs: | |||
| command: pack | |||
| arguments: src/Discord.Net/Discord.Net.nuspec -OutputDirectory "artifacts" -properties suffix="" | |||
| - task: NuGetCommand@2 | |||
| displayName: Pack metapackage (release mode) | |||
| condition: eq(variables['buildTag'], True) | |||
| - task: NuGet@0 | |||
| inputs: | |||
| command: pack | |||
| arguments: src/Discord.Net/Discord.Net.nuspec -OutputDirectory "artifacts" -properties suffix="-$(buildNumber)" | |||
| command: 'pack' | |||
| packagesToPack: 'src/Discord.Net/Discord.Net.nuspec' | |||
| versioningScheme: 'off' | |||
| - task: NuGetCommand@2 | |||
| displayName: Pack metapackage | |||
| condition: eq(variables['buildTag'], False) | |||
| inputs: | |||
| command: 'pack' | |||
| packagesToPack: 'src/Discord.Net/Discord.Net.nuspec' | |||
| versioningScheme: 'off' | |||
| buildProperties: 'suffix=-$(buildNumber)' | |||
| - task: NuGetCommand@2 | |||
| displayName: Push to NuGet | |||
| inputs: | |||
| command: push | |||
| nuGetFeedType: external | |||
| packagesToPush: 'artifacts/*.nupkg' | |||
| packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg' | |||
| publishFeedCredentials: myget-discord | |||
| @@ -5,7 +5,8 @@ ECHO remove old 'latest' | |||
| ECHO Y | RMDIR /S docs-static\latest || EXIT /B 1 | |||
| ECHO build docs | |||
| docfx.console\tools\docfx.exe docs/docfx.json -o docs-static/latest/ || EXIT /B 1 | |||
| docfx.console\tools\docfx.exe docs/docfx.json -o docs-staging || EXIT /B 1 | |||
| ROBOCOPY docs-staging\_site docs-static\latest /MIR | |||
| ECHO commit and deploy | |||
| git config --global user.name "Discord.Net CI Robot" && git config --global user.email "robot@foxbot.me" | |||
| @@ -111,7 +111,7 @@ optional, give it a default value (i.e., `int num = 0`). | |||
| #### Parameters with Spaces | |||
| To accept a comma-separated list, set the parameter to `params Type[]`. | |||
| To accept a space-separated list, set the parameter to `params Type[]`. | |||
| Should a parameter include spaces, the parameter **must** be | |||
| wrapped in quotes. For example, for a command with a parameter | |||
| @@ -218,4 +218,4 @@ Submodules are "modules" that reside within another one. Typically, | |||
| submodules are used to create nested groups (although not required to | |||
| create nested groups). | |||
| [!code-csharp[Groups and Submodules](samples/intro/groups.cs)] | |||
| [!code-csharp[Groups and Submodules](samples/intro/groups.cs)] | |||
| @@ -2,7 +2,7 @@ | |||
| <PropertyGroup> | |||
| <OutputType>Exe</OutputType> | |||
| <TargetFramework>netcoreapp2.0</TargetFramework> | |||
| <TargetFramework>netcoreapp3.0</TargetFramework> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| @@ -2,11 +2,11 @@ | |||
| <PropertyGroup> | |||
| <OutputType>Exe</OutputType> | |||
| <TargetFramework>netcoreapp2.0</TargetFramework> | |||
| <TargetFramework>netcoreapp3.0</TargetFramework> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" /> | |||
| <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.0.0" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| @@ -2,10 +2,14 @@ | |||
| <PropertyGroup> | |||
| <OutputType>Exe</OutputType> | |||
| <TargetFramework>netcoreapp2.1</TargetFramework> | |||
| <TargetFramework>netcoreapp3.0</TargetFramework> | |||
| <RootNamespace>_03_sharded_client</RootNamespace> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.0.0" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\..\src\Discord.Net.Commands\Discord.Net.Commands.csproj" /> | |||
| <ProjectReference Include="..\..\src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" /> | |||
| @@ -1,13 +1,13 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <Import Project="../../Discord.Net.targets" /> | |||
| <PropertyGroup> | |||
| <AssemblyName>Discord.Net.Analyzers</AssemblyName> | |||
| <RootNamespace>Discord.Analyzers</RootNamespace> | |||
| <Description>A Discord.Net extension adding support for design-time analysis of the API usage.</Description> | |||
| <TargetFramework>netstandard1.3</TargetFramework> | |||
| <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.CodeAnalysis" Version="2.8.0" /> | |||
| <PackageReference Include="Microsoft.CodeAnalysis" Version="3.3.1" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Discord.Net.Commands\Discord.Net.Commands.csproj" /> | |||
| @@ -1,4 +1,4 @@ | |||
| using System; | |||
| using System; | |||
| using System.Collections.Immutable; | |||
| using System.Linq; | |||
| using Microsoft.CodeAnalysis; | |||
| @@ -24,6 +24,8 @@ namespace Discord.Analyzers | |||
| public override void Initialize(AnalysisContext context) | |||
| { | |||
| context.EnableConcurrentExecution(); | |||
| context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics); | |||
| context.RegisterSyntaxNodeAction(AnalyzeMemberAccess, SyntaxKind.SimpleMemberAccessExpression); | |||
| } | |||
| @@ -4,16 +4,11 @@ | |||
| <AssemblyName>Discord.Net.Commands</AssemblyName> | |||
| <RootNamespace>Discord.Commands</RootNamespace> | |||
| <Description>A Discord.Net extension adding support for bot commands.</Description> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net46;netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net461;netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Discord.Net.Core\Discord.Net.Core.csproj" /> | |||
| </ItemGroup> | |||
| <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' "> | |||
| <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" /> | |||
| </ItemGroup> | |||
| <ItemGroup Condition=" '$(TargetFramework)' != 'netstandard2.0' "> | |||
| <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="1.1.1" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -49,7 +49,7 @@ namespace Discord.Commands | |||
| string username = input.Substring(0, index); | |||
| if (ushort.TryParse(input.Substring(index + 1), out ushort discriminator)) | |||
| { | |||
| var channelUser = await channelUsers.FirstOrDefault(x => x.DiscriminatorValue == discriminator && | |||
| var channelUser = await channelUsers.FirstOrDefaultAsync(x => x.DiscriminatorValue == discriminator && | |||
| string.Equals(username, x.Username, StringComparison.OrdinalIgnoreCase)).ConfigureAwait(false); | |||
| AddResult(results, channelUser as T, channelUser?.Username == username ? 0.85f : 0.75f); | |||
| @@ -4,13 +4,13 @@ | |||
| <AssemblyName>Discord.Net.Core</AssemblyName> | |||
| <RootNamespace>Discord</RootNamespace> | |||
| <Description>The core components for the Discord.Net library.</Description> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net46;netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net461;netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Newtonsoft.Json" Version="11.0.2" /> | |||
| <PackageReference Include="Newtonsoft.Json" Version="12.0.2" /> | |||
| <PackageReference Include="System.Collections.Immutable" Version="1.3.1" /> | |||
| <PackageReference Include="System.Interactive.Async" Version="3.2.0" /> | |||
| <PackageReference Include="System.Interactive.Async" Version="4.0.0" /> | |||
| <PackageReference Include="IDisposableAnalyzers" Version="2.1.2"> | |||
| <PrivateAssets>all</PrivateAssets> | |||
| </PackageReference> | |||
| @@ -1,3 +1,5 @@ | |||
| using System.Globalization; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -84,5 +86,23 @@ namespace Discord | |||
| /// are enabled, without the need to manipulate the logic of the flag. | |||
| /// </remarks> | |||
| public Optional<SystemChannelMessageDeny> SystemChannelFlags { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the preferred locale of the guild in IETF BCP 47 language tag format. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// This property takes precedence over <see cref="PreferredCulture"/>. | |||
| /// When it is set, the value of <see cref="PreferredCulture"/> | |||
| /// will not be used. | |||
| /// </remarks> | |||
| public Optional<string> PreferredLocale { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the preferred locale of the guild. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// The <see cref="PreferredLocale"/> property takes precedence | |||
| /// over this property. When <see cref="PreferredLocale"/> is set, | |||
| /// the value of <see cref="PreferredCulture"/> will be unused. | |||
| /// </remarks> | |||
| public Optional<CultureInfo> PreferredCulture { get; set; } | |||
| } | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| using Discord.Audio; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Globalization; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| @@ -249,6 +250,24 @@ namespace Discord | |||
| /// </returns> | |||
| int PremiumSubscriptionCount { get; } | |||
| /// <summary> | |||
| /// Gets the preferred locale of this guild in IETF BCP 47 | |||
| /// language tag format. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// The preferred locale of the guild in IETF BCP 47 | |||
| /// language tag format. | |||
| /// </returns> | |||
| string PreferredLocale { get; } | |||
| /// <summary> | |||
| /// Gets the preferred culture of this guild. | |||
| /// </summary> | |||
| /// <returns> | |||
| /// The preferred culture information of this guild. | |||
| /// </returns> | |||
| CultureInfo PreferredCulture { get; } | |||
| /// <summary> | |||
| /// Modifies this guild. | |||
| /// </summary> | |||
| @@ -1,8 +1,6 @@ | |||
| using System; | |||
| using System.Diagnostics; | |||
| #if NETSTANDARD2_0 || NET45 | |||
| using StandardColor = System.Drawing.Color; | |||
| #endif | |||
| namespace Discord | |||
| { | |||
| @@ -190,12 +188,10 @@ namespace Discord | |||
| public override int GetHashCode() => RawValue.GetHashCode(); | |||
| #if NETSTANDARD2_0 || NET45 | |||
| public static implicit operator StandardColor(Color color) => | |||
| StandardColor.FromArgb((int)color.RawValue); | |||
| public static explicit operator Color(StandardColor color) => | |||
| new Color((uint)color.ToArgb() << 8 >> 8); | |||
| #endif | |||
| /// <summary> | |||
| /// Gets the hexadecimal representation of the color (e.g. <c>#000ccc</c>). | |||
| @@ -15,7 +15,7 @@ namespace Discord | |||
| /// <summary> Flattens the specified pages into one <see cref="IEnumerable{T}"/> asynchronously. </summary> | |||
| public static async Task<IEnumerable<T>> FlattenAsync<T>(this IAsyncEnumerable<IEnumerable<T>> source) | |||
| { | |||
| return await source.Flatten().ToArray().ConfigureAwait(false); | |||
| return await source.Flatten().ToArrayAsync().ConfigureAwait(false); | |||
| } | |||
| /// <summary> Flattens the specified pages into one <see cref="IAsyncEnumerable{T}"/>. </summary> | |||
| public static IAsyncEnumerable<T> Flatten<T>(this IAsyncEnumerable<IEnumerable<T>> source) | |||
| @@ -25,26 +25,28 @@ namespace Discord | |||
| _nextPage = nextPage; | |||
| } | |||
| public IAsyncEnumerator<IReadOnlyCollection<T>> GetEnumerator() => new Enumerator(this); | |||
| public IAsyncEnumerator<IReadOnlyCollection<T>> GetAsyncEnumerator(CancellationToken cancellationToken = new CancellationToken()) => new Enumerator(this, cancellationToken); | |||
| internal class Enumerator : IAsyncEnumerator<IReadOnlyCollection<T>> | |||
| { | |||
| private readonly PagedAsyncEnumerable<T> _source; | |||
| private readonly CancellationToken _token; | |||
| private readonly PageInfo _info; | |||
| public IReadOnlyCollection<T> Current { get; private set; } | |||
| public Enumerator(PagedAsyncEnumerable<T> source) | |||
| public Enumerator(PagedAsyncEnumerable<T> source, CancellationToken token) | |||
| { | |||
| _source = source; | |||
| _token = token; | |||
| _info = new PageInfo(source._start, source._count, source.PageSize); | |||
| } | |||
| public async Task<bool> MoveNext(CancellationToken cancelToken) | |||
| public async ValueTask<bool> MoveNextAsync() | |||
| { | |||
| if (_info.Remaining == 0) | |||
| return false; | |||
| var data = await _source._getPage(_info, cancelToken).ConfigureAwait(false); | |||
| var data = await _source._getPage(_info, _token).ConfigureAwait(false); | |||
| Current = new Page<T>(_info, data); | |||
| _info.Page++; | |||
| @@ -71,7 +73,11 @@ namespace Discord | |||
| return true; | |||
| } | |||
| public void Dispose() { Current = null; } | |||
| public ValueTask DisposeAsync() | |||
| { | |||
| Current = null; | |||
| return default; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,4 +1,4 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <PropertyGroup> | |||
| <TargetFramework>netstandard2.0</TargetFramework> | |||
| @@ -15,7 +15,7 @@ | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Discord.Net.Core\Discord.Net.Core.csproj" /> | |||
| <ProjectReference Include="..\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" /> | |||
| <PackageReference Include="JetBrains.Annotations" Version="2018.3.0" /> | |||
| <PackageReference Include="JetBrains.Annotations" Version="2019.1.3" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -1,10 +1,10 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <Import Project="../../Discord.Net.targets" /> | |||
| <PropertyGroup> | |||
| <AssemblyName>Discord.Net.Providers.WS4Net</AssemblyName> | |||
| <RootNamespace>Discord.Providers.WS4Net</RootNamespace> | |||
| <Description>An optional WebSocket client provider for Discord.Net using WebSocket4Net</Description> | |||
| <TargetFramework>netstandard1.3</TargetFramework> | |||
| <TargetFramework>netstandard2.0</TargetFramework> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Discord.Net.Core\Discord.Net.Core.csproj" /> | |||
| @@ -1,4 +1,4 @@ | |||
| using Discord.Net.WebSockets; | |||
| using Discord.Net.WebSockets; | |||
| namespace Discord.Net.Providers.WS4Net | |||
| { | |||
| @@ -58,5 +58,7 @@ namespace Discord.API | |||
| public SystemChannelMessageDeny SystemChannelFlags { get; set; } | |||
| [JsonProperty("premium_subscription_count")] | |||
| public int? PremiumSubscriptionCount { get; set; } | |||
| [JsonProperty("preferred_locale")] | |||
| public string PreferredLocale { get; set; } | |||
| } | |||
| } | |||
| @@ -32,5 +32,7 @@ namespace Discord.API.Rest | |||
| public Optional<ExplicitContentFilterLevel> ExplicitContentFilter { get; set; } | |||
| [JsonProperty("system_channel_flags")] | |||
| public Optional<SystemChannelMessageDeny> SystemChannelFlags { get; set; } | |||
| [JsonProperty("preferred_locale")] | |||
| public string PreferredLocale { get; set; } | |||
| } | |||
| } | |||
| @@ -4,16 +4,13 @@ | |||
| <AssemblyName>Discord.Net.Rest</AssemblyName> | |||
| <RootNamespace>Discord.Rest</RootNamespace> | |||
| <Description>A core Discord.Net library containing the REST client and models.</Description> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net46;netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net461;netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Discord.Net.Core\Discord.Net.Core.csproj" /> | |||
| </ItemGroup> | |||
| <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' "> | |||
| <PackageReference Include="System.Net.Http" Version="4.3.3" /> | |||
| </ItemGroup> | |||
| <ItemGroup Condition=" '$(TargetFramework)' == 'net46' "> | |||
| <ItemGroup Condition=" '$(TargetFramework)' == 'net461' "> | |||
| <Reference Include="System.Net.Http" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -68,6 +68,12 @@ namespace Discord.Rest | |||
| if (args.SystemChannelFlags.IsSpecified) | |||
| apiArgs.SystemChannelFlags = args.SystemChannelFlags.Value; | |||
| // PreferredLocale takes precedence over PreferredCulture | |||
| if (args.PreferredLocale.IsSpecified) | |||
| apiArgs.PreferredLocale = args.PreferredLocale.Value; | |||
| else if (args.PreferredCulture.IsSpecified) | |||
| apiArgs.PreferredLocale = args.PreferredCulture.Value.Name; | |||
| return await client.ApiClient.ModifyGuildAsync(guild.Id, apiArgs, options).ConfigureAwait(false); | |||
| } | |||
| /// <exception cref="ArgumentNullException"><paramref name="func"/> is <c>null</c>.</exception> | |||
| @@ -3,6 +3,7 @@ using System; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| using System.Diagnostics; | |||
| using System.Globalization; | |||
| using System.Linq; | |||
| using System.Threading.Tasks; | |||
| using EmbedModel = Discord.API.GuildEmbed; | |||
| @@ -64,6 +65,11 @@ namespace Discord.Rest | |||
| public string Description { get; private set; } | |||
| /// <inheritdoc /> | |||
| public int PremiumSubscriptionCount { get; private set; } | |||
| /// <inheritdoc /> | |||
| public string PreferredLocale { get; private set; } | |||
| /// <inheritdoc /> | |||
| public CultureInfo PreferredCulture { get; private set; } | |||
| /// <inheritdoc /> | |||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||
| @@ -124,6 +130,8 @@ namespace Discord.Rest | |||
| SystemChannelFlags = model.SystemChannelFlags; | |||
| Description = model.Description; | |||
| PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); | |||
| PreferredLocale = model.PreferredLocale; | |||
| PreferredCulture = new CultureInfo(PreferredLocale); | |||
| if (model.Emojis != null) | |||
| { | |||
| @@ -11,6 +11,16 @@ namespace Discord.Rest | |||
| { | |||
| internal static class MessageHelper | |||
| { | |||
| /// <summary> | |||
| /// Regex used to check if some text is formatted as inline code. | |||
| /// </summary> | |||
| private static readonly Regex InlineCodeRegex = new Regex(@"[^\\]?(`).+?[^\\](`)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | |||
| /// <summary> | |||
| /// Regex used to check if some text is formatted as a code block. | |||
| /// </summary> | |||
| private static readonly Regex BlockCodeRegex = new Regex(@"[^\\]?(```).+?[^\\](```)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | |||
| /// <exception cref="InvalidOperationException">Only the author of a message may modify the message.</exception> | |||
| /// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception> | |||
| public static async Task<Model> ModifyAsync(IMessage msg, BaseDiscordClient client, Action<MessageProperties> func, | |||
| @@ -112,9 +122,6 @@ namespace Discord.Rest | |||
| int index = 0; | |||
| var codeIndex = 0; | |||
| var inlineRegex = new Regex(@"[^\\]?(`).+?[^\\](`)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | |||
| var blockRegex = new Regex(@"[^\\]?(```).+?[^\\](```)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | |||
| // checks if the tag being parsed is wrapped in code blocks | |||
| bool CheckWrappedCode() | |||
| { | |||
| @@ -125,7 +132,7 @@ namespace Discord.Rest | |||
| // loop through all code blocks that are before the start of the tag | |||
| while (codeIndex < index) | |||
| { | |||
| var blockMatch = blockRegex.Match(text, codeIndex); | |||
| var blockMatch = BlockCodeRegex.Match(text, codeIndex); | |||
| if (blockMatch.Success) | |||
| { | |||
| if (EnclosedInBlock(blockMatch)) | |||
| @@ -136,7 +143,7 @@ namespace Discord.Rest | |||
| continue; | |||
| return false; | |||
| } | |||
| var inlineMatch = inlineRegex.Match(text, codeIndex); | |||
| var inlineMatch = InlineCodeRegex.Match(text, codeIndex); | |||
| if (inlineMatch.Success) | |||
| { | |||
| if (EnclosedInBlock(inlineMatch)) | |||
| @@ -4,15 +4,12 @@ | |||
| <AssemblyName>Discord.Net.WebSocket</AssemblyName> | |||
| <RootNamespace>Discord.WebSocket</RootNamespace> | |||
| <Description>A core Discord.Net library containing the WebSocket client and models.</Description> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net46;netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard1.3;netstandard2.0</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net461;netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Discord.Net.Core\Discord.Net.Core.csproj" /> | |||
| <ProjectReference Include="..\Discord.Net.Rest\Discord.Net.Rest.csproj" /> | |||
| </ItemGroup> | |||
| <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' "> | |||
| <PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -5,6 +5,7 @@ using System.Collections.Concurrent; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| using System.Diagnostics; | |||
| using System.Globalization; | |||
| using System.Linq; | |||
| using System.Threading; | |||
| using System.Threading.Tasks; | |||
| @@ -105,6 +106,11 @@ namespace Discord.WebSocket | |||
| public string Description { get; private set; } | |||
| /// <inheritdoc /> | |||
| public int PremiumSubscriptionCount { get; private set; } | |||
| /// <inheritdoc /> | |||
| public string PreferredLocale { get; private set; } | |||
| /// <inheritdoc /> | |||
| public CultureInfo PreferredCulture { get; private set; } | |||
| /// <inheritdoc /> | |||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||
| @@ -374,6 +380,8 @@ namespace Discord.WebSocket | |||
| SystemChannelFlags = model.SystemChannelFlags; | |||
| Description = model.Description; | |||
| PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); | |||
| PreferredLocale = model.PreferredLocale; | |||
| PreferredCulture = new CultureInfo(PreferredLocale); | |||
| if (model.Emojis != null) | |||
| { | |||
| @@ -4,7 +4,7 @@ | |||
| <AssemblyName>Discord.Net.Webhook</AssemblyName> | |||
| <RootNamespace>Discord.Webhook</RootNamespace> | |||
| <Description>A core Discord.Net library containing the Webhook client and models.</Description> | |||
| <TargetFrameworks>netstandard1.3</TargetFrameworks> | |||
| <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Discord.Net.Core\Discord.Net.Core.csproj" /> | |||
| @@ -13,21 +13,21 @@ | |||
| <requireLicenseAcceptance>false</requireLicenseAcceptance> | |||
| <iconUrl>https://github.com/RogueException/Discord.Net/raw/dev/docs/marketing/logo/PackageLogo.png</iconUrl> | |||
| <dependencies> | |||
| <group targetFramework="net46"> | |||
| <group targetFramework="net461"> | |||
| <dependency id="Discord.Net.Core" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.Rest" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.WebSocket" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.Commands" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.Webhook" version="2.2.0-dev$suffix$" /> | |||
| </group> | |||
| <group targetFramework="netstandard1.3"> | |||
| </group> | |||
| <group targetFramework="netstandard2.0"> | |||
| <dependency id="Discord.Net.Core" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.Rest" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.WebSocket" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.Commands" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.Webhook" version="2.2.0-dev$suffix$" /> | |||
| </group> | |||
| <group targetFramework="netstandard2.0"> | |||
| <group targetFramework="netstandard2.1"> | |||
| <dependency id="Discord.Net.Core" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.Rest" version="2.2.0-dev$suffix$" /> | |||
| <dependency id="Discord.Net.WebSocket" version="2.2.0-dev$suffix$" /> | |||
| @@ -1,7 +1,7 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <PropertyGroup> | |||
| <TargetFramework>netcoreapp2.1</TargetFramework> | |||
| <TargetFramework>netcoreapp3.0</TargetFramework> | |||
| <IsPackable>false</IsPackable> | |||
| </PropertyGroup> | |||
| @@ -15,10 +15,13 @@ | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.CodeAnalysis" Version="3.0.0-beta4-final" /> | |||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | |||
| <PackageReference Include="xunit" Version="2.4.0" /> | |||
| <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" /> | |||
| <PackageReference Include="Microsoft.CodeAnalysis" Version="3.3.1" /> | |||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" /> | |||
| <PackageReference Include="xunit" Version="2.4.1" /> | |||
| <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | |||
| <PrivateAssets>all</PrivateAssets> | |||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
| </PackageReference> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -1,30 +0,0 @@ | |||
| using System.Linq; | |||
| using System.Reflection; | |||
| using Microsoft.DotNet.PlatformAbstractions; | |||
| using Microsoft.Extensions.DependencyModel; | |||
| namespace System | |||
| { | |||
| /// <summary> Polyfill of the AppDomain class from full framework. </summary> | |||
| internal class AppDomain | |||
| { | |||
| public static AppDomain CurrentDomain { get; private set; } | |||
| private AppDomain() | |||
| { | |||
| } | |||
| static AppDomain() | |||
| { | |||
| CurrentDomain = new AppDomain(); | |||
| } | |||
| public Assembly[] GetAssemblies() | |||
| { | |||
| var rid = RuntimeEnvironment.GetRuntimeIdentifier(); | |||
| var ass = DependencyContext.Default.GetRuntimeAssemblyNames(rid); | |||
| return ass.Select(xan => Assembly.Load(xan)).ToArray(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,4 +1,4 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <PropertyGroup> | |||
| <TargetFramework>netcoreapp2.1</TargetFramework> | |||
| @@ -15,9 +15,12 @@ | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | |||
| <PackageReference Include="xunit" Version="2.4.0" /> | |||
| <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" /> | |||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" /> | |||
| <PackageReference Include="xunit" Version="2.4.1" /> | |||
| <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | |||
| <PrivateAssets>all</PrivateAssets> | |||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
| </PackageReference> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| @@ -1,7 +1,7 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <PropertyGroup> | |||
| <TargetFramework>netcoreapp2.1</TargetFramework> | |||
| <TargetFramework>netcoreapp3.0</TargetFramework> | |||
| <IsPackable>false</IsPackable> | |||
| </PropertyGroup> | |||
| @@ -13,9 +13,12 @@ | |||
| <ProjectReference Include="..\..\src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | |||
| <PackageReference Include="xunit" Version="2.4.0" /> | |||
| <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" /> | |||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" /> | |||
| <PackageReference Include="xunit" Version="2.4.1" /> | |||
| <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | |||
| <PrivateAssets>all</PrivateAssets> | |||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
| </PackageReference> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -1,7 +1,6 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.IO; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Discord.Audio; | |||