Browse Source

Initial commit for 3.0 rewrite

pull/1483/head
FiniteReality 5 years ago
commit
86f23d8075
23 changed files with 2712 additions and 0 deletions
  1. +155
    -0
      .editorconfig
  2. +26
    -0
      .gitattributes
  3. +17
    -0
      .github/PULL_REQUEST_TEMPLATE.md
  4. +429
    -0
      .gitignore
  5. +82
    -0
      Directory.Build.props
  6. +29
    -0
      Directory.Build.targets
  7. +39
    -0
      Discord.Net.sln
  8. +22
    -0
      LICENSE
  9. +245
    -0
      docs/CHANGELOG.md
  10. +62
    -0
      docs/CONTRIBUTING.md
  11. +55
    -0
      docs/README.md
  12. +1445
    -0
      docs/marketing/logo/Logo.ai
  13. BIN
      docs/marketing/logo/PackageLogo.png
  14. +1
    -0
      docs/marketing/logo/SVG/Combinationmark White Background.svg
  15. +1
    -0
      docs/marketing/logo/SVG/Combinationmark White.svg
  16. +1
    -0
      docs/marketing/logo/SVG/Combinationmark.svg
  17. +1
    -0
      docs/marketing/logo/SVG/Logomark Full Black.svg
  18. +1
    -0
      docs/marketing/logo/SVG/Logomark Full Purple.svg
  19. +1
    -0
      docs/marketing/logo/SVG/Logomark Purple.svg
  20. +1
    -0
      docs/marketing/logo/SVG/Logomark White.svg
  21. +11
    -0
      src/Core/Discord.Net.Core.csproj
  22. +31
    -0
      src/Directory.Build.props
  23. +57
    -0
      src/Directory.Build.targets

+ 155
- 0
.editorconfig View File

@@ -0,0 +1,155 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.{cmd,config,csproj,cxxproj,json,props,ps1,resx,sh,targets}]
indent_size = 2

[*.sln]
end_of_line = crlf
indent_style = tab

[*.cs]
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = false
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = accessors, control_blocks, events, indexers, local_functions, methods, properties, types, object_collection_array_initializers
csharp_new_line_within_query_expression_clauses = true
csharp_prefer_braces = false:silent
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = do_not_ignore
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
csharp_style_conditional_delegate_call = true:suggestion
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_style_expression_bodied_accessors = false:suggestion
csharp_style_expression_bodied_constructors = false:suggestion
csharp_style_expression_bodied_indexers = false:suggestion
csharp_style_expression_bodied_lambdas = true:suggestion
csharp_style_expression_bodied_methods = false:suggestion
csharp_style_expression_bodied_operators = false:suggestion
csharp_style_expression_bodied_properties = false:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion
csharp_style_var_elsewhere = true:suggestion
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
dotnet_code_quality_unused_parameters = all:suggestion
dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.severity = suggestion
dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.style = pascal_case_suffixed_with_async
dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.symbols = async_members
dotnet_naming_rule.const_declarations_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.const_declarations_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.const_declarations_should_be_pascal_case.symbols = const_declarations
dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.severity = suggestion
dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.style = pascal_case_prefixed_with_i
dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.symbols = interfaces
dotnet_naming_rule.parameters_should_be_camel_case.severity = suggestion
dotnet_naming_rule.parameters_should_be_camel_case.style = camel_case
dotnet_naming_rule.parameters_should_be_camel_case.symbols = parameters
dotnet_naming_rule.private_and_internal_fields_should_be_camel_case_prefixed_with_underscore.severity = suggestion
dotnet_naming_rule.private_and_internal_fields_should_be_camel_case_prefixed_with_underscore.style = camel_case_prefixed_with_underscore
dotnet_naming_rule.private_and_internal_fields_should_be_camel_case_prefixed_with_underscore.symbols = private_and_internal_fields
dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case_prefixed_with_s_and_underscore.severity = suggestion
dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case_prefixed_with_s_and_underscore.style = camel_case_prefixed_with_s_and_underscore
dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case_prefixed_with_s_and_underscore.symbols = private_and_internal_static_fields
dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.symbols = public_and_protected_declarations
dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.symbols = static_readonly_declarations
dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.severity = suggestion
dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.style = pascal_case_prefixed_with_t
dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.symbols = type_parameters
dotnet_naming_style.camel_case.capitalization = camel_case
dotnet_naming_style.camel_case_prefixed_with_s_and_underscore.capitalization = camel_case
dotnet_naming_style.camel_case_prefixed_with_s_and_underscore.required_prefix = s_
dotnet_naming_style.camel_case_prefixed_with_underscore.capitalization = camel_case
dotnet_naming_style.camel_case_prefixed_with_underscore.required_prefix = _
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.pascal_case_prefixed_with_i.capitalization = pascal_case
dotnet_naming_style.pascal_case_prefixed_with_i.required_prefix = I
dotnet_naming_style.pascal_case_prefixed_with_t.capitalization = pascal_case
dotnet_naming_style.pascal_case_prefixed_with_t.required_prefix = T
dotnet_naming_style.pascal_case_suffixed_with_async.capitalization = pascal_case
dotnet_naming_style.pascal_case_suffixed_with_async.required_suffix = Async
dotnet_naming_symbols.async_members.required_modifiers = async
dotnet_naming_symbols.const_declarations.required_modifiers = const
dotnet_naming_symbols.interfaces.applicable_kinds = interface
dotnet_naming_symbols.parameters.applicable_kinds = parameter
dotnet_naming_symbols.private_and_internal_fields.applicable_accessibilities = private, internal
dotnet_naming_symbols.private_and_internal_fields.applicable_kinds = field
dotnet_naming_symbols.private_and_internal_static_fields.applicable_accessibilities = private, internal
dotnet_naming_symbols.private_and_internal_static_fields.applicable_kinds = field
dotnet_naming_symbols.private_and_internal_static_fields.required_modifiers = static
dotnet_naming_symbols.public_and_protected_declarations.applicable_accessibilities = public, protected
dotnet_naming_symbols.static_readonly_declarations.required_modifiers = static, readonly
dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = true
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_object_initializer = true:suggestion
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
dotnet_style_prefer_auto_properties = false:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_return = false:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_qualification_for_event = false:suggestion
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_readonly_field = true:suggestion
dotnet_style_require_accessibility_modifiers = always:suggestion

+ 26
- 0
.gitattributes View File

@@ -0,0 +1,26 @@
###############################################################################
# Default to Unix-style text files
###############################################################################
* text eol=lf

###############################################################################
# Treat code and markdown as Unix-style text files
###############################################################################
*.cs text eol=lf
*.csproj text eol=lf
*.md text eol=lf
*.props text eol=lf
*.targets text eol=lf

###############################################################################
# Treat Solution files as Windows text files
###############################################################################
*.sln text eol=crlf

###############################################################################
# Treat images as binary files
###############################################################################
*.png binary
*.ai binary



+ 17
- 0
.github/PULL_REQUEST_TEMPLATE.md View File

@@ -0,0 +1,17 @@
Thanks in advance for your contribution to Discord.Net!

Before opening a pull request, please consider the following:

Does your changeset adhere to the Contributing Guidelines?

Does your changeset address a specific issue or idea? If not, please
break your changes up into multiple requests.

Have your changes been previously discussed with other members
of the community? We prefer new features to be vetted through
an issue or a discussion in our Discord channel first; bug-fixes
and other small changes are generally fine without prior vetting.

Please remove this section, and include a summary of your changes
below.
---

+ 429
- 0
.gitignore View File

@@ -0,0 +1,429 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

##
## Visual studio for Mac
##


# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/

# Mac bundle stuff
*.dmg
*.app

# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
[Dd]esktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp

# Windows shortcuts
*.lnk

# JetBrains Rider
.idea/
*.sln.iml

##
## Visual Studio Code
##
.vscode/*

+ 82
- 0
Directory.Build.props View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Based on https://github.com/terrafx/terrafx/blob/master/Directory.Build.props -->
<!-- Copyright © Tanner Gooding and Contributors -->
<Project>

<!--
Directory.Build.props is automatically picked up and imported by
Microsoft.Common.props. This file needs to exist, even if empty so that
files in the parent directory tree, with the same name, are not imported
instead. The import fairly early and only Sdk.props will have been imported
beforehand. We also don't need to add ourselves to MSBuildAllProjects, as
that is done by the file that imports us.
-->

<!-- Default settings that are used by other settings -->
<PropertyGroup>
<BaseArtifactsPath>$(MSBuildThisFileDirectory)artifacts/</BaseArtifactsPath>
<BaseArtifactsPathSuffix>$(DiscordNetProjectCategory)/$(MSBuildProjectName)</BaseArtifactsPathSuffix>
<RepositoryUrl>https://github.com/discord-net/Discord.Net</RepositoryUrl>
</PropertyGroup>

<!-- Default settings that explicitly differ from the Sdk.props defaults -->
<PropertyGroup>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<BaseIntermediateOutputPath>$(BaseArtifactsPath)obj/$(BaseArtifactsPathSuffix)/</BaseIntermediateOutputPath>
<DebugType>embedded</DebugType>
<EnableDefaultNoneItems>false</EnableDefaultNoneItems>
<Nullable>enable</Nullable>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
</PropertyGroup>

<!-- Default settings that explicitly differ from the Sdk.targets defaults-->
<PropertyGroup>
<Authors>RogueException;FiniteReality;</Authors>
<BaseOutputPath>$(BaseArtifactsPath)bin/$(BaseArtifactsPathSuffix)/</BaseOutputPath>
<Company>Discord-Net</Company>
<PackageOutputPath Condition="'$(PlatformName)' == 'AnyCPU'">$(BaseArtifactsPath)pkg/$(Configuration)</PackageOutputPath>
<PackageOutputPath Condition="'$(PlatformName)' != 'AnyCPU'">$(BaseArtifactsPath)pkg/$(Configuration)</PackageOutputPath>
<Product>Discord.Net</Product>
<VersionPrefix>3.0.0</VersionPrefix>
<VersionSuffix>alpha</VersionSuffix>
<VersionSuffix Condition="'$(SYSTEM_PULLREQUEST_PULLREQUESTNUMBER)' != ''">pr$(SYSTEM_PULLREQUEST_PULLREQUESTNUMBER)</VersionSuffix>
</PropertyGroup>

<!-- Default settings that are otherwise undefined -->
<PropertyGroup>
<Copyright>Copyright © Discord.Net Contributors.</Copyright>
<Description>An asynchronous API wrapper for Discord.</Description>
<Features>strict</Features>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<HighEntropyVA>true</HighEntropyVA>
<LangVersion>preview</LangVersion>
<MinClientVersion>4.3</MinClientVersion>
<NeutralLanguage>en-US</NeutralLanguage>
<OverwriteReadOnlyFiles>true</OverwriteReadOnlyFiles>
<PackageIconUrl>https://github.com/Discord-Net/Discord.Net/raw/dev/docs/marketing/logo/PackageLogo.png</PackageIconUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl>
<RepositoryType>git</RepositoryType>
<RestoreSources>
https://api.nuget.org/v3/index.json
</RestoreSources>
<UseSharedCompilation>true</UseSharedCompilation>
</PropertyGroup>

<!-- Default settings for .NET projects that are otherwise undefined -->
<PropertyGroup Condition="'$(TargetRuntime)' != 'Native'">
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup>

<!-- Package references which are consumed by all .NET projects -->
<ItemGroup Condition="'$(TargetRuntime)' != 'Native'">
<PackageReference Include="Microsoft.Net.Compilers.Toolset" IsImplicitlyDefined="true" PrivateAssets="all" />
</ItemGroup>

</Project>

+ 29
- 0
Directory.Build.targets View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Based on https://github.com/terrafx/terrafx/blob/master/Directory.Build.props -->
<!-- Copyright © Tanner Gooding and Contributors -->
<Project>

<!--
Directory.Build.targets is automatically picked up and imported by
Microsoft.Common.targets. This file needs to exist, even if empty so that
files in the parent directory tree, with the same name, are not imported
instead. The import fairly late and most other props/targets will have been
imported beforehand. We also don't need to add ourselves to
MSBuildAllProjects, as that is done by the file that imports us.
-->

<!-- Settings that append the existing setting value -->
<PropertyGroup>
<DefineConstants>$(DefineConstants);$(OS)</DefineConstants>
<NoWarn>$(NoWarn);NU5105</NoWarn>
<PackageVersion Condition="'$(BUILD_BUILDNUMBER)' != ''">$(Version).$(BUILD_BUILDNUMBER)</PackageVersion>
</PropertyGroup>

<!-- Package versions for package references across all projects -->
<ItemGroup>
<PackageReference Update="Microsoft.Net.Compilers.Toolset" Version="3.6.0-2.final" />
<PackageReference Update="Microsoft.NET.Test.Sdk" Version="16.5.0" />
<PackageReference Update="Microsoft.SourceLink.GitHub" Version="1.0.0" />
</ItemGroup>

</Project>

+ 39
- 0
Discord.Net.sln View File

@@ -0,0 +1,39 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{381B0F15-BA2C-4E23-BE68-015462861AF0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net.Core", "src\Core\Discord.Net.Core.csproj", "{57A52C6A-337D-4165-A42D-94FAC87B2807}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Debug|Any CPU.Build.0 = Debug|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Debug|x64.ActiveCfg = Debug|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Debug|x64.Build.0 = Debug|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Debug|x86.ActiveCfg = Debug|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Debug|x86.Build.0 = Debug|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Release|Any CPU.ActiveCfg = Release|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Release|Any CPU.Build.0 = Release|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Release|x64.ActiveCfg = Release|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Release|x64.Build.0 = Release|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Release|x86.ActiveCfg = Release|Any CPU
{57A52C6A-337D-4165-A42D-94FAC87B2807}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{57A52C6A-337D-4165-A42D-94FAC87B2807} = {381B0F15-BA2C-4E23-BE68-015462861AF0}
EndGlobalSection
EndGlobal

+ 22
- 0
LICENSE View File

@@ -0,0 +1,22 @@
The MIT License (MIT)

Copyright (c) 2015-2019 Discord.Net Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


+ 245
- 0
docs/CHANGELOG.md View File

@@ -0,0 +1,245 @@
# Changelog

## [2.1.1] - 2019-06-08
### Fixed
- #994: Remainder parameters now ignore character escaping, as there is no reason to escape characters here (2e95c49)
- #1316: `Emote.Equals` now pays no respect to the Name property, since Discord's API does not care about an emote's name (abf3e90)
- #1317: `Emote.GetHashCode` now pays no respect to the Name property, see above (1b54883)
- #1323: Optionals will no longer claim to be specified when a reaction message was not cached (1cc5d73)
- Log messages sourcing from REST events will no longer be raised twice (c78a679)
- News embeds will be processed as `EmbedType.Unknown`, rather than throwing an error and dropping the message (d287ed1)

### Changed
- #1311: Members may now be disconnected from voice channels by passing `null` as `GuildUserProperties.Channel` (fc48c66)
- #1313: `IMessage.Tags` now includes the EveryoneRole on @everyone and @here mentions (1f55f01)
- #1320: The maximum value for setting slow-mode has been updated to 6 hours, per the new API limit (4433ca7)

### Misc
- This library's compatibility with Semantic Versioning has been clarified. Please see the README (4d7de17)
- The depency on System.Interactive.Async has been bumped to `3.2.0` (3e65e03)

## [2.1.0] - 2019-05-18
### Added
- #1236: Bulk deletes (for messages) may now be accessed via the `MessagesBulkDeleted` event (dec353e)
- #1240: OAuth applications utilizing the `guilds.join` scope may now add users to guilds through any client (1356ea9)
- #1255: Message and attachment spoilers may now be set or detected (f3b20b2)
- #1260: DiscordWebhookClient may be created from a Webhook URL (f2113c7)
- #1261: A `GetCategoryChannel` helper may now be used to retrieve category channels directly from socket guilds (e03c527)
- #1263: "user joined the guild" messages are now supported (00d3f5a)
- #1271: AuthorID may now be retrieved from message delete audit log entries (1ae4220)
- #1293: News Channels are now supported 📰 (9084c42)
- `ExclusiveBulkDelete` configuration setting can be used to control bulk delete event behavior (03e6401)

### Removed
- #1294: The `IGuildUser` overload of `EmbedBuilder.WithAuthor` no longer exists (b52b54d)

### Fixed
- #1256: Fetching audit logs no longer raises null reference exceptions when a webhook has been deleted (049b014)
- #1268: Null reference exceptions on `MESSAGE_CREATE` concerning partial member objects no longer occur (377622b)
- #1278: The token validator now internally pads tokens to the proper length (48b327b)
- #1292: Messages now properly initialize empty collections (b2ebc03)
- The `DiscordSocketRestClient` is now properly initialized (a44c13a)
- Exceptions in event handlers are now always logged (f6e3200)

### Changed
- #1305: Token validation will fail when tokens contain whitespace (bb61efa)

### Misc
- #1241: Added documentation samples for Webhooks (655a006)
- #1243: Happy new year 🎉 (0275f7d)
- #1257: Improved clarity in comments in the command samples (2473619)
- #1276: Documentation uses a relative path for the logo asset (b80f0e8)
- #1303: EmbedBuilder documentation now builds in the correct spot (51618e6)
- #1304: Updated documentation (4309550)
- CI for this project is now powered by Azure DevOps (this is not a sponsored message 🚀) (9b2bc18)
- IDisposableAnalyzers should now be a development dependency (8003ac8)

## [2.0.1] - 2019-01-04
### Fixed
- #1226: Only escape the closing quotation mark of non-remainder strings (65b8c09)
- Commands with async RunModes will now propagate exceptions up to CommandExecuted (497918e)

### Misc
- #1225: Commands sample no longer hooks the log event twice (552f34c)
- #1227: The logo on the docs index page should scale responsively (d39bf6e)
- #1230: Replaced precondition sample on docs (feed4fd)

## [2.0.0] - 2018-12-28
### Added

- #747: `CommandService` now has a `CommandExecuted` event (e991715)
- #765: Parameters may have a name specified via `NameAttribute` (9c81ab9)
- #773: Both socket clients inherit from `BaseSocketClient` (9b7afec)
- #785: Primitives now automatically load a NullableTypeReader (cb0ff78)
- #819: Support for Welcome Message channels (30e867a)
- #835: Emoji may now be managed from a bot (b4bf046)
- #843: Webhooks may now be managed from a bot (7b2ddd0)
- #863: An embed may be converted to an `EmbedBuilder` using the `.ToEmbedBuilder()` method (5218e6b)
- #877: Support for reading rich presences (34b4e5a)
- #888: Users may now opt-in to using a proxy (678a723)
- #906: API Analyzers to assist users when writing their bot (f69ef2a)
- #907: Full support for channel categories (030422f)
- #913: Animated emoji may be read and written (a19ff18)
- #915: Unused parameters may be discarded, rather than failing the command (5f46aef)
- #929: Standard EqualityComparers for use in LINQ operations with the library's entities (b5e7548)
- #934: Modules now contain an `OnModuleBuilding` method, which is invoked when the module is built (bb8ebc1)
- #952: Added 'All' permission set for categories (6d58796)
- #957: Ratelimit related objects now include request information (500f5f4)
- #962: Add `GetRecommendedShardCountAsync` (fc5e70c)
- #970: Add Spotify track support to user Activities (64b9cc7)
- #973: Added `GetDefaultAvatarUrl` to user (109f663)
- #978: Embeds can be attached alongside a file upload (e9f9b48)
- #984, #1089: `VoiceServerUpdate` events are now publically accessible (e775853, 48fed06)
- #996: Added `DeleteMessageAsync` to `IMessageChannel` (bc6009e)
- #1005: Added dedicated `TimeSpan` TypeReader which "doesn't suck" (b52af7a)
- #1009: Users can now specify the replacement behavior or default typereaders (6b7c6e9)
- #1020: Users can now specify parameters when creating channels (bf5275e)
- #1030: Added `IsDeprecated`, `IsCustom` properties to `VoiceRegion` (510f474)
- #1037: Added `SocketUser.MutualGuilds`, various extension methods to commands (637d9fc)
- #1043: `Discord.Color` is now compatible with `System.Drawing.Color` (c275e57)
- #1055: Added audit logs (39dffe8)
- #1056: Added `GetBanAsync` (97c8931)
- #1102: Added `GetJumpUrl()` to messages (afc3a9d)
- #1123: Commands can now accept named parameters (419c0a5)
- #1124: Preconditions can now set custom error messages (5677f23)
- #1126: `Color` now has equality (a2d8800)
- #1159: Guild channels can now by synced with their parent category (5ea1fb3)
- #1165: Bring Guild and Message models up to date with the API (d30d122)
- #1166: Added `GetVoiceRegionsAsync` to `IGuild` (00717cf)
- #1183: Added Add Guild Member endpoint for OAuth clients (8ef5f81)
- #1196: Channel position can now be specified when creating a channel (a64ab60)
- #1198: The Socket client can now access its underlying REST client (65afd37)
- #1213: Added `GuildEmote#CreatorId` (92bf836)
- 'html' variant added to the `EmbedType` enum (42c879c)
- Modules can now be nested in non-module classes (4edbd8d)
- Added `BanAsync` to guild members (1905fde)
- Added the permisison bit for priority speaker (c1d7818)
- All result types can use `FromError` (748e92b)
- Added support for reading/writing slow mode (97d17cf)
- Added markdown format for URLs (f005af3)
- Reactions can now be added to messages in bulk (5421df1)

### Fixed
- #742: `DiscordShardedClient#GetGuildFor` will now direct null guilds to Shard 0 (d5e9d6f)
- #743: Various issues with permissions and inheritance of permissions (f996338)
- #755: `IRole.Mention` will correctly tag the @everyone role (6b5a6e7)
- #768: `CreateGuildAsync` will include the icon stream (865080a)
- #866: Revised permissions constants and behavior (dec7cb2)
- #872: Bulk message deletion should no longer fail for incomplete batch sizes (804d918)
- #923: A null value should properly reset a user's nickname (227f61a)
- #938: The reconnect handler should no longer deadlock during Discord outages (73ac9d7)
- #941: Fix behavior of OverrideTypeReader (170a2e0)
- #945: Fix properties on SocketCategoryChannel (810f6d6)
- #959: Webhooks now use the correct parameter when assigning to the Avatar URL (8876597)
- #966: Correct the implementation of HasFlag and ResolveChannel in permissions (32ebdd5)
- #968: Add missing parameter in WebSocket4Net constructor (8537924)
- #981: Enforce a maximum value when parsing timestamps from Discord (bfaa6fc)
- #993: Null content will no longer null-ref on message sends/edits (55299ff)
- #1003: Fixed ordering of parameters in permissions classes (a06e212)
- #1010: EmbedBuilder no longer produces mutable embeds (2988b38)
- #1012: `Embed.Length` should now yield the correct results (a3ce80c)
- #1017: GetReactionUsersAsync includes query parameters (9b29c00)
- #1022: GetReactionUsersAsync is now correctly paginated (79811d0)
- #1023: Fix/update invite-related behaviors (7022149)
- #1031: Messages with no guild-specific data should no longer be lost (3631886)
- #1036: Fixed cases where `RetryMode.RetryRatelimit` were ignored (c618cb3)
- #1044: Populate the guild in `SocketWebhookUser` (6a7810b)
- #1048: The REST client will now create a full GuildUser object (033d312)
- #1049: Fixed null-ref in `GetShardIdFor` (7cfed7f)
- #1059: Include 'view channel' in voice channel's All permissions set (e764daf)
- #1083: Default type readers will now be properly replaced (4bc06a0)
- #1093: Fixed race condition in audio client authentication (322d46e)
- #1139: Fixed consistency in exceptions (9e9a11d)
- #1151: `GetReactionUsersAsync` now uses the correct pagination constant (c898325)
- #1163: Reaction ratelimits are now placed in the same bucket, treated correctly (5ea1fb3)
- #1186: Webhooks can now send files with embeds correctly (c1d5152)
- #1192: CommandExecuted no longer fires twice for RuntimeResults (10233f3)
- #1195: Channel Create audit log events properly deserialize (dca6c33)
- #1202: The UDP client should no longer be used after disposed (ccb16e4)
- #1203: The Audio client should no longer lock up on disconnect (2c93363)
- #1209: MessageUpdated should no longer pass a null after object (91e0f03)
- Ignore messages with no ID in bulk delete (676be40)
- No longer attempt to load generic types as modules (b1eaa44)
- No longer complain when a `PRESENCES_REPLACE` update is received (beb3d46)
- CommandExecuted will be raised on async exception failures (6260749)
- ExecuteResult now contains the entire exception, not an abridged message (f549da5)
- CommandExecuted will no longer be raised twice for exceptions (aec7105)
- The default WebSocket will now close correctly (ac389f5)

### Changed
- #731: `IUserMessage#GetReactionUsersAsync` now takes an `IEmote` instead of a `string` (5d7f2fc)
- #744: IAsyncEnumerable has been redesigned (5bbd9bb)
- #777: `IGuild#DefaultChannel` will now resolve the first accessible channel, per changes to Discord (1ffcd4b)
- #781: Attempting to add or remove a member's EveryoneRole will throw (506a6c9)
- #801: `EmbedBuilder` will no longer implicitly convert to `Embed`, you must build manually (94f7dd2)
- #804: Command-related tasks will have the 'async' suffix (14fbe40)
- #812: The WebSocket4Net provider has been bumped to version 0.15, allowing support for .NET Standard apps (e25054b)
- #829: DeleteMessagesAsync moved from IMessageChannel to ITextChannel (e00f17f)
- #853: WebSocket will now use `zlib-stream` compression (759db34)
- #874: The `ReadMessages` permission is moving to `ViewChannel` (edfbd05)
- #877: Refactored Games into Activities (34b4e5a)
- #943: Multiple types of quotation marks can now be parsed (thanks 🍎) (cee71ef)
- #955: The `GameParty` model will now use long values (178ea8d)
- #986: Expose the internal entity TypeReaders (660fec0)
- #992: Throw an exception when trying to modify someone else's message (d50fc3b)
- #998: Commands can specify their own `IgnoreExtraArgs` behavior (6d30100)
- #1033: The `ReadMessages` permission bit is now named `ViewChannel` (5f084ad)
- #1042: Content parameter of `SendMessageAsync` is now optional (0ba8b06)
- #1057: An audio channel's `ConnectAsync` now allows users to handle the voice connection elsewhere, such as in Lavalink (890904f)
- #1094: Overhauled invites, added vanity invite support (ffe994a)
- #1108: Reactions now use the undocumented 1/.25 ratelimit, making them 4x faster (6b21b11)
- #1128: Bot tokens will now be validated for common mishaps before use (2de6cef)
- #1140: Check the invite `maxAge` parameter before making the request (649a779)
- #1164: All command results will now be raised in `CommandExecuted` (10f67a8)
- #1171: Clients have been changed to properly make use of `IDisposable` (7366cd4)
- #1172: Invite related methods were moved from `IGuildChannel` to `INestedChannel` (a3f5e0b)
- #1200: HasPrefix extensions now check for null values first (46e2674)
- `IGuildChannel#Nsfw` moved to `ITextChannel`, now maps to the API property (608bc35)
- Preemptive ratelimits are now logged under verbose, rather than warning. (3c1e766)
- The default InviteAge when creating Invites is now 24 hours (9979a02)
- All parameters to `ReplyAsync` have been made optional (b38dca7)
- The socket client will now use additional fields to fill in member/guild information on messages (8fb2c71)
- The Audio Client now uses Voice WS v3 (9ba38d7)


### Removed
- #790: Redundant overloads for `AddField` removed from EmbedBuilder (479361b)
- #925: RPC is no longer being maintained nor packaged (b30af57)
- #958: Remove support for user tokens (2fd4f56)
- User logins (including selfbots) are no longer supported (fc5adca)

### Misc
- #786: Unit tests for the Color structure (22b969c)
- #828: We now include a contributing guide (cd82a0f)
- #876: We now include a standard editorconfig (5c8c784)
- #963: Docs now include a release version, build instructions (88e6244)
- #964: Fix documentation spelling of 'echoes' (fda19b5)
- #967: Unit test permissions (63e6704)
- #968: Bumped version of WebSocket4Net to 0.15.2 (8537924)
- #972: Include sample bots in the source repository (217ec34)
- #1046: We now support .NET Standard 2.0 (bbbac85)
- #1114: Various performance optimizations (82cfdff)
- #1149: The CI will now test on Ubuntu as well as Windows (674a0fc)
- #1161: The entire documentation has been rewritten, all core entities were docstringed (ff0fea9)
- #1175: Documentation changes in command samples (fb8dbca)
- #1177: Added documentation for sharded bots (00097d3)
- #1219: The project now has a logo! 🎉 (5750c3e)
- This project is now licensed to the Discord.Net contributors (710e182)
- Added templates for pull requests (f2ddf51)
- Fixed documentation layout for the logo (bafdce4)

## [1.0.2] - 2017-09-09
### Fixed

- Guilds utilizing Channel Categories will no longer crash bots on the `READY` event.

## [1.0.1] - 2017-07-05
### Fixed

- #732: Fixed parameter preconditions not being loaded from class-based modules (b6dcc9e)
- #726: Fixed CalculateScore throwing an ArgumentException for missing parameters (7597cf5)
- EmbedBuilder URI validation should no longer throw NullReferenceExceptions in certain edge cases (d89804d)
- Fixed module auto-detection for nested modules (d2afb06)

### Changed
- ShardedCommandContext now inherits from SocketCommandContext (8cd99be)

+ 62
- 0
docs/CONTRIBUTING.md View File

@@ -0,0 +1,62 @@
# Contributing

Discord.Net is an open-source project, and we appreciate any and all
contributions made by our community. However, please conform to the
following guidelines when possible:

## Development Cycle

We prefer all changes to the library to be discussed beforehand,
either in a GitHub issue, or in a discussion in our Discord channel
with library regulars or other contributors.

Issues that are tagged as "up for grabs" are free to be picked up by
any member of the community.

### Pull Requests

We prefer pull-requests that are descriptive of the changes being made
and highlight any potential benefits/drawbacks of the change, but these
types of write-ups are not required. See this [merge request](https://github.com/RogueException/Discord.Net/pull/793)
for an example of a well-written description.

## Semantic Versioning

This project follows [Semantic Versioning](http://semver.org/). When
writing changes to this project, it is recommended to write changes
that are SemVer compliant with the latest version of the library in
development.

The working release should be the latest build off of the `dev` branch,
but can also be found on the [development board](https://github.com/RogueException/Discord.Net/projects/1).

We follow the .NET Foundation's [Breaking Change Rules](https://github.com/dotnet/corefx/blob/master/Documentation/coding-guidelines/breaking-change-rules.md)
when determining the SemVer compliance of a change.

Obsoleting a method is considered a **minor** increment.

## Coding Style

We attempt to conform to the .NET Foundation's [Coding Style](https://github.com/dotnet/corefx/blob/master/Documentation/coding-guidelines/coding-style.md)
where possible.

As a general rule, follow the coding style already set in the file you
are editing, or look at a similar file if you are adding a new one.

### Documentation Style for Members

When creating a new public member, the member must be annotated with sufficient documentation. This should include the
following, but not limited to:

* `<summary>` summarizing the purpose of the method.
* `<param>` or `<typeparam>` explaining the parameter.
* `<return>` explaining the type of the returned member and what it is.
* `<exception>` if the method directly throws an exception.

The length of the documentation should also follow the ruler as suggested by our
[Visual Studio Code workspace](Discord.Net.code-workspace).

#### Recommended Reads

* [Official Microsoft Documentation](https://docs.microsoft.com)
* [Sandcastle User Manual](https://ewsoftware.github.io/XMLCommentsGuide/html/4268757F-CE8D-4E6D-8502-4F7F2E22DDA3.htm)

+ 55
- 0
docs/README.md View File

@@ -0,0 +1,55 @@
# Discord.Net #
[![Discord](https://discordapp.com/api/guilds/81384788765712384/widget.png)](https://discord.gg/discord-api)

An unofficial .NET library for the Discord API. (https://discordapp.com/)

## Installation ##

Our stable builds available from NuGet through the Discord.Net metapackage:
[Discord.Net](https://www.nuget.org/packages/Discord.Net/)

Unstable "nightly" builds are available through our MyGet feed:
`https://www.myget.org/F/discord-net/api/v3/index.json`


## Building ##

At minimum, .NET Core 2.1 is required to successfully build Discord.Net, but
.NET core 3.1 is recommended. You should install the appropriate tools and
components for your editor to open the Discord.Net solution file:
- The .NET Core workload for Visual Studio
- The C# build tools for Visual Studio Code
- The .NET Core SDK for command line

### Versioning ###

As a rule, Discord.Net attempts to follow
[Semantic Versioning](https://semver.org). This means `MAJOR.MINOR.PATCH`
versioning.

However, as Discord evolves and adds or changes existing endpoints, we may need
to add code to support these. To do this, we will increment the minor version
when adding new API surface to the library. To counter the inevitable breaking
changes, we have decided that our public interfaces should be for
*consumption only* - bot developers should not need to implement these
interfaces for normal code.

Additionally, as the Discord API changes, we may need to add, remove or change
parameters to certain methods. To ensure this breaks as little code as
possible, we will use the following approach to deprecate old APIs and redirect
users to new APIs, while retaining binary compatibility:

```cs
// OLD API
[Obsolete("This API has been superseded by GetUserAsync.", false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public ValueTask<IUser> GetUserAsync(ulong userId)
=> GetUserAsync(userId, "default");

// NEW API
public ValueTask<IUser> GetUserAsync(ulong userId,
string additionalParameter = "default");
```

These obsolete methods will be removed in the next major version, and will be
clearly documented in our change logs.

+ 1445
- 0
docs/marketing/logo/Logo.ai
File diff suppressed because it is too large
View File


BIN
docs/marketing/logo/PackageLogo.png View File

Before After
Width: 462  |  Height: 477  |  Size: 11 KiB

+ 1
- 0
docs/marketing/logo/SVG/Combinationmark White Background.svg View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 950.73 234.2"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#939;}</style></defs><title>Combinationmark White Background</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M245.7,234.2a4.94,4.94,0,0,1-3.73-1.57,5.07,5.07,0,0,1-1.54-3.74,5.24,5.24,0,0,1,1.54-3.8,5,5,0,0,1,3.73-1.57,5.15,5.15,0,0,1,3.81,1.57,5.31,5.31,0,0,1,1.57,3.8,5.36,5.36,0,0,1-5.38,5.31Z"/><path class="cls-1" d="M319.73,232.59h-9.68l-35.21-53.74a23.29,23.29,0,0,1-2.21-4.26h-.28a69.84,69.84,0,0,1,.38,9.29v48.71h-8v-68H275.1L309.25,218c1.44,2.23,2.35,3.74,2.76,4.55h.19a72.94,72.94,0,0,1-.47-10v-48h8Z"/><path class="cls-1" d="M373.73,232.59h-36v-68h35v7h-27v23h25v7h-25v24h28Z"/><path class="cls-1" d="M427.73,171.59h-20v62h-8v-62h-19v-7h47Z"/><path d="M311.83,8.59h-47.1V62.05l31,28.44V38.59h17.39c10.45,0,15.61,5.19,15.61,13.31V91c0,8.13-4.88,13.59-15.61,13.59H265.73v29h46.1c24.71.14,47.9-12.3,47.9-41.11V50.4C359.73,21.32,336.54,8.59,311.83,8.59Zm241.9,84.18V50.34c0-15.3,27.28-18.88,35.55-3.45l25.21-10.33c-9.78-21.91-28-28.38-43-28.38-24.52,0-48.77,14.32-48.77,42.16V92.77c0,28,24.25,42.16,48.22,42.16,15.43,0,33.89-7.71,44.09-27.69L588,94.7c-6.62,17.08-34.31,13-34.31-1.93ZM469.79,55.94c-9.62-2.1-16-5.58-16.46-11.58.56-14.5,22.73-14.92,35.7-1.11l20.5-15.9C496.7,11.59,482.2,7.41,467.14,7.41c-22.73,0-44.76,12.83-44.76,37.37,0,23.85,18.12,36.53,38.06,39.6,10.18,1.4,21.48,5.44,21.2,12.55-.84,13.39-28.17,12.69-40.58-2.51L421.4,113.11C433,128,448.73,135.7,463.51,135.7c22.73,0,48-13.25,49-37.37,1.39-30.68-20.64-38.35-42.67-42.39Zm-93.06,77.65h31V8.59h-31ZM903,8.59H856.73V62.05l31,28.44V38.59h16.39c10.45,0,15.61,5.19,15.61,13.31V91c0,8.13-4.88,13.59-15.61,13.59H856.73v29h46.1c24.71.14,47.9-12.3,47.9-41.11V50.4C950.87,21.32,927.68,8.59,903,8.59ZM676.09,7.18c-25.75,0-51.36,14.13-51.36,43V93c0,28.68,25.75,43,51.64,43s51.36-14.28,51.36-43V50.14C727.73,21.45,701.84,7.18,676.09,7.18Zm19.64,85.7c0,8.92-10,13.52-19.93,13.52s-20.07-4.46-20.07-13.52V50.23c0-9.2,9.76-14.08,19.51-14.08,10.18,0,20.49,4.46,20.49,14.08V92.88ZM839.35,50.37C838.65,21.24,819,9.59,793.58,9.59H743.73v125h32v-41h5.63l29,40h38.4L815.21,91C830.19,86.29,839.35,73.39,839.35,50.37Zm-45.5,16.22H775.73v-28h18.12c19.49,0,19.49,28,0,28Z"/><path class="cls-1" d="M42.28.1,186.2,13.67a22.18,22.18,0,0,1,19.93,24.21l-13.7,145.2a22.16,22.16,0,0,1-24.1,20L46.53,191.64l7.57-19.33-15,11.49L25,194.6,0,212.83,18.17,20.15A22.17,22.17,0,0,1,42.28.1Z"/><rect class="cls-2" x="88.38" y="-17.52" width="12.85" height="107.11" rx="4.91" transform="translate(49 126.52) rotate(-83.96)"/><rect class="cls-2" x="122.07" y="16.17" width="12.85" height="107.11" rx="4.91" transform="translate(45.64 190.18) rotate(-83.96)"/><rect class="cls-2" x="78.32" y="77.57" width="12.85" height="107.11" rx="4.91" transform="translate(-54.57 201.6) rotate(-83.96)"/><rect class="cls-2" x="118.83" y="46.87" width="12.85" height="107.11" rx="4.91" transform="translate(12.2 214.42) rotate(-83.96)"/></g></g></svg>

+ 1
- 0
docs/marketing/logo/SVG/Combinationmark White.svg View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 951.34 234.2"><defs><style>.cls-1{fill:#68217a;}.cls-2{fill:#fff;}.cls-3{fill:#939;}</style></defs><title>Combinationmark White</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M245.7,234.2a4.94,4.94,0,0,1-3.73-1.57,5.07,5.07,0,0,1-1.54-3.74,5.24,5.24,0,0,1,1.54-3.8,5,5,0,0,1,3.73-1.57,5.15,5.15,0,0,1,3.81,1.57,5.31,5.31,0,0,1,1.57,3.8,5.36,5.36,0,0,1-5.38,5.31Z"/><path class="cls-1" d="M320.34,233.26h-9.68l-35.21-54.67a23.56,23.56,0,0,1-2.21-4.33H273a72.21,72.21,0,0,1,.38,9.45v49.55h-8v-68h10.37l34.15,53.45c1.44,2.23,2.35,3.74,2.76,4.55h.19a71.32,71.32,0,0,1-.47-10v-48h8Z"/><path class="cls-1" d="M374.34,233.26h-36v-68h35v7h-27v23h25v7h-25v24h28Z"/><path class="cls-1" d="M427.34,172.26h-19v61h-8v-61h-20v-7h47Z"/><path class="cls-2" d="M311.44,9.26h-46.1V60.94l31,27.49V38.26h16.39c10.45,0,15.61,5.19,15.61,13.31v39.1c0,8.13-4.88,13.59-15.61,13.59H265.34v30h46.1c24.71.14,47.9-12.3,47.9-41.11V51.07C359.34,22,336.15,9.26,311.44,9.26Zm242.9,83.51V50.34c0-15.3,27.28-18.88,35.54-3.45L615.1,36.56c-9.78-21.91-28-28.38-43-28.38-24.52,0-48.77,14.32-48.77,42.16V92.77c0,28,24.25,42.16,48.22,42.16,15.43,0,33.89-7.71,44.09-27.69l-27-12.54c-6.61,17.08-34.3,13-34.3-1.93ZM469.79,55.94c-9.62-2.1-16-5.58-16.46-11.58.56-14.5,22.73-14.92,35.7-1.11l20.5-15.9C496.7,11.59,482.2,7.41,467.14,7.41c-22.73,0-44.76,12.83-44.76,37.37,0,23.85,18.12,36.53,38.06,39.6,10.18,1.4,21.48,5.44,21.2,12.55-.84,13.39-28.17,12.69-40.58-2.51L421.4,113.11C433,128,448.73,135.7,463.51,135.7c22.73,0,48-13.25,49-37.37,1.39-30.68-20.64-38.35-42.67-42.39Zm-93.45,78.32h31V9.26h-31Zm527.23-125H856.34V60.94l31,27.49V38.26H904c10.28,0,15.36,5.19,15.36,13.31v39.1c0,8.13-4.8,13.59-15.36,13.59H857.34v30h46.1c24.71.14,47.9-12.3,47.9-41.11V51.07C951.48,22,928.29,9.26,903.57,9.26ZM675.7,7.18c-25.75,0-51.36,14.13-51.36,43V93c0,28.68,25.75,43,51.64,43s51.36-14.28,51.36-43V50.14C727.34,21.45,701.45,7.18,675.7,7.18Zm20.64,85.7c0,8.92-10,13.52-19.93,13.52s-20.07-4.46-20.07-13.52V50.23c0-9.2,9.75-14.08,19.51-14.08,10.17,0,20.49,4.46,20.49,14.08V92.88ZM839.49,50.37C838.79,21,818.94,9.26,793.35,9.26h-50v125h32v-40H781l29,40h39L815.16,91.34C830.27,86.58,839.49,73.58,839.49,50.37Zm-46,16.89H775.34v-28h18.12c19.49,0,19.49,28,0,28Z"/><path class="cls-1" d="M42.28.1,186.2,13.67a22.18,22.18,0,0,1,19.93,24.21l-13.7,145.2a22.16,22.16,0,0,1-24.1,20L46.53,191.64l7.57-19.33-15,11.49L25,194.6,0,212.83,18.17,20.15A22.17,22.17,0,0,1,42.28.1Z"/><rect class="cls-3" x="88.38" y="-17.52" width="12.85" height="107.11" rx="4.91" transform="translate(49 126.52) rotate(-83.96)"/><rect class="cls-3" x="122.07" y="16.17" width="12.85" height="107.11" rx="4.91" transform="translate(45.64 190.18) rotate(-83.96)"/><rect class="cls-3" x="78.32" y="77.57" width="12.85" height="107.11" rx="4.91" transform="translate(-54.57 201.6) rotate(-83.96)"/><rect class="cls-3" x="118.83" y="46.87" width="12.85" height="107.11" rx="4.91" transform="translate(12.2 214.42) rotate(-83.96)"/></g></g></svg>

+ 1
- 0
docs/marketing/logo/SVG/Combinationmark.svg View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 951.34 234.2"><defs><style>.cls-1{fill:#68217a;}.cls-2{fill:#939;}</style></defs><title>Combinationmark</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M245.7,234.2a4.94,4.94,0,0,1-3.73-1.57,5.07,5.07,0,0,1-1.54-3.74,5.24,5.24,0,0,1,1.54-3.8,5,5,0,0,1,3.73-1.57,5.15,5.15,0,0,1,3.81,1.57,5.31,5.31,0,0,1,1.57,3.8,5.36,5.36,0,0,1-5.38,5.31Z"/><path class="cls-1" d="M320.34,233.15h-9.68l-35.21-54.67a23.88,23.88,0,0,1-2.21-4.33H273a72,72,0,0,1,.38,9.44v49.56h-8v-68h10.37l34.15,53.45c1.44,2.23,2.35,3.73,2.76,4.55h.19a71.49,71.49,0,0,1-.47-10v-48h8Z"/><path class="cls-1" d="M374.34,233.15h-36v-68h35v7h-27v23h25v7h-25v24h28Z"/><path class="cls-1" d="M427.34,172.15h-19v61h-8v-61h-20v-7h47Z"/><path d="M311.44,9.15h-46.1V60.83l31,27.48V38.15h16.39c10.45,0,15.61,5.18,15.61,13.31v39.1c0,8.12-4.88,13.59-15.61,13.59H265.34v30h46.1c24.71.14,47.9-12.31,47.9-41.11V51C359.34,21.87,336.15,9.15,311.44,9.15Zm242.9,83.62V50.34c0-15.3,27.28-18.88,35.54-3.45L615.1,36.56c-9.78-21.91-28-28.38-43-28.38-24.52,0-48.77,14.32-48.77,42.16V92.77c0,28,24.25,42.16,48.22,42.16,15.43,0,33.89-7.71,44.09-27.69l-27-12.54c-6.61,17.08-34.3,13-34.3-1.93ZM469.79,55.94c-9.62-2.1-16-5.58-16.46-11.58.56-14.5,22.73-14.92,35.7-1.11l20.5-15.9C496.7,11.59,482.2,7.41,467.14,7.41c-22.73,0-44.76,12.83-44.76,37.37,0,23.85,18.12,36.53,38.06,39.6,10.18,1.4,21.48,5.44,21.2,12.55-.84,13.39-28.17,12.69-40.58-2.51L421.4,113.11C433,128,448.73,135.7,463.51,135.7c22.73,0,48-13.25,49-37.37,1.39-30.68-20.64-38.35-42.67-42.39Zm-93.45,78.21h31V9.15h-31Zm527.23-125H856.34V60.83l31,27.48V38.15H904c10.28,0,15.36,5.18,15.36,13.31v39.1c0,8.12-4.8,13.59-15.36,13.59H857.34v30h46.1c24.71.14,47.9-12.31,47.9-41.11V51C951.48,21.87,928.29,9.15,903.57,9.15Zm-227.87-2c-25.75,0-51.36,14.13-51.36,43V93c0,28.68,25.75,43,51.64,43s51.36-14.28,51.36-43V50.14C727.34,21.45,701.45,7.18,675.7,7.18Zm20.64,85.7c0,8.92-10,13.52-19.93,13.52s-20.07-4.46-20.07-13.52V50.23c0-9.2,9.75-14.08,19.51-14.08,10.17,0,20.49,4.46,20.49,14.08V92.88ZM839.49,50.26c-.7-29.37-20.55-41.11-46.14-41.11h-50v125h32v-40H781l29,40h39L815.16,91.22C830.27,86.47,839.49,73.47,839.49,50.26Zm-46,16.89H775.34v-28h18.12c19.49,0,19.49,28,0,28Z"/><path class="cls-1" d="M42.28.1,186.2,13.67a22.18,22.18,0,0,1,19.93,24.21l-13.7,145.2a22.16,22.16,0,0,1-24.1,20L46.53,191.64l7.57-19.33-15,11.49L25,194.6,0,212.83,18.17,20.15A22.17,22.17,0,0,1,42.28.1Z"/><rect class="cls-2" x="88.38" y="-17.52" width="12.85" height="107.11" rx="4.91" transform="translate(49 126.52) rotate(-83.96)"/><rect class="cls-2" x="122.07" y="16.17" width="12.85" height="107.11" rx="4.91" transform="translate(45.64 190.18) rotate(-83.96)"/><rect class="cls-2" x="78.32" y="77.57" width="12.85" height="107.11" rx="4.91" transform="translate(-54.57 201.6) rotate(-83.96)"/><rect class="cls-2" x="118.83" y="46.87" width="12.85" height="107.11" rx="4.91" transform="translate(12.2 214.42) rotate(-83.96)"/></g></g></svg>

+ 1
- 0
docs/marketing/logo/SVG/Logomark Full Black.svg View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 265.74 274.24"><defs><style>.cls-1{fill:#939;}.cls-2{fill:#fff;}</style></defs><title>Logomark Full Black</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path d="M54.48.13,239.93,17.62A28.57,28.57,0,0,1,265.61,48.8L248,235.91a28.57,28.57,0,0,1-31.06,25.84L60,246.94,69.71,222l-19.27,14.8L32.23,250.75,0,274.24,23.42,26A28.56,28.56,0,0,1,54.48.13Z"/><rect class="cls-1" x="113.88" y="-7.74" width="16.56" height="138.01" rx="6.32" transform="translate(48.38 176.3) rotate(-83.96)"/><rect class="cls-1" x="157.3" y="35.68" width="16.56" height="138.01" rx="6.32" transform="translate(44.06 258.33) rotate(-83.96)"/><rect class="cls-1" x="100.92" y="114.79" width="16.56" height="138.01" rx="6.32" transform="translate(-85.07 273.05) rotate(-83.96)"/><rect class="cls-1" x="153.11" y="75.23" width="16.56" height="138.01" rx="6.32" transform="translate(0.97 289.56) rotate(-83.96)"/><path class="cls-2" d="M140,53.9H89v58.81L123,144V86.9h17.9c11.45,0,17.1,5.66,17.1,14.52v42.65c0,8.87-5.35,14.83-17.1,14.83H89v32h51c27.34.16,53-13.48,53-45.05V99.72C193,67.85,167.35,53.9,140,53.9Z"/></g></g></svg>

+ 1
- 0
docs/marketing/logo/SVG/Logomark Full Purple.svg View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 265.74 274.24"><defs><style>.cls-1{fill:#68217a;}.cls-2{fill:#939;}</style></defs><title>Logomark Full Purple</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M54.48.13,239.93,17.62A28.57,28.57,0,0,1,265.61,48.8L248,235.91a28.57,28.57,0,0,1-31.06,25.84L60,246.94,69.71,222l-19.27,14.8L32.23,250.75,0,274.24,23.42,26A28.56,28.56,0,0,1,54.48.13Z"/><rect class="cls-2" x="113.88" y="-7.74" width="16.56" height="138.01" rx="6.32" transform="translate(48.38 176.3) rotate(-83.96)"/><rect class="cls-2" x="157.3" y="35.68" width="16.56" height="138.01" rx="6.32" transform="translate(44.06 258.33) rotate(-83.96)"/><rect class="cls-2" x="100.92" y="114.79" width="16.56" height="138.01" rx="6.32" transform="translate(-85.07 273.05) rotate(-83.96)"/><rect class="cls-2" x="153.11" y="75.23" width="16.56" height="138.01" rx="6.32" transform="translate(0.97 289.56) rotate(-83.96)"/><path d="M140,53.9H89v58.81L123,144V86.9h17.9c11.45,0,17.1,5.66,17.1,14.52v42.65c0,8.87-5.35,14.83-17.1,14.83H89v32h51c27.34.16,53-13.48,53-45.05V99.72C193,67.85,167.35,53.9,140,53.9Z"/></g></g></svg>

+ 1
- 0
docs/marketing/logo/SVG/Logomark Purple.svg View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 265.74 274.24"><defs><style>.cls-1{fill:#68217a;}.cls-2{fill:#939;}</style></defs><title>Discord.Net Docs</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M54.48.13,239.93,17.62A28.57,28.57,0,0,1,265.61,48.8L248,235.91a28.57,28.57,0,0,1-31.06,25.84L60,246.94,69.71,222l-19.27,14.8L32.23,250.75,0,274.24,23.42,26A28.56,28.56,0,0,1,54.48.13Z"/><rect class="cls-2" x="113.88" y="-22.58" width="16.56" height="138.01" rx="6.32" transform="translate(63.14 163.03) rotate(-83.96)"/><rect class="cls-2" x="157.3" y="20.84" width="16.56" height="138.01" rx="6.32" transform="translate(58.81 245.05) rotate(-83.96)"/><rect class="cls-2" x="100.92" y="99.96" width="16.56" height="138.01" rx="6.32" transform="translate(-70.32 259.78) rotate(-83.96)"/><rect class="cls-2" x="153.11" y="60.4" width="16.56" height="138.01" rx="6.32" transform="translate(15.73 276.29) rotate(-83.96)"/></g></g></svg>

+ 1
- 0
docs/marketing/logo/SVG/Logomark White.svg View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 265.74 274.24"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#939;}</style></defs><title>Logomark White</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M54.48.13,239.93,17.62A28.57,28.57,0,0,1,265.61,48.8L248,235.91a28.57,28.57,0,0,1-31.06,25.84L60,246.94,69.71,222l-19.27,14.8L32.23,250.75,0,274.24,23.42,26A28.56,28.56,0,0,1,54.48.13Z"/><rect class="cls-2" x="113.88" y="-22.58" width="16.56" height="138.01" rx="6.32" transform="matrix(0.11, -0.99, 0.99, 0.11, 63.14, 163.03)"/><rect class="cls-2" x="157.3" y="20.84" width="16.56" height="138.01" rx="6.32" transform="translate(58.81 245.05) rotate(-83.96)"/><rect class="cls-2" x="100.92" y="99.96" width="16.56" height="138.01" rx="6.32" transform="translate(-70.32 259.78) rotate(-83.96)"/><rect class="cls-2" x="153.11" y="60.4" width="16.56" height="138.01" rx="6.32" transform="translate(15.73 276.29) rotate(-83.96)"/></g></g></svg>

+ 11
- 0
src/Core/Discord.Net.Core.csproj View File

@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<Description>The core components for Discord.Net.</Description>
</PropertyGroup>

<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>

</Project>

+ 31
- 0
src/Directory.Build.props View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Based on https://github.com/terrafx/terrafx/blob/master/Directory.Build.props -->
<!-- Copyright © Tanner Gooding and Contributors -->
<Project>

<!--
Directory.Build.props is automatically picked up and imported by
Microsoft.Common.props. This file needs to exist, even if empty so that
files in the parent directory tree, with the same name, are not imported
instead. The import fairly early and only Sdk.props will have been
imported beforehand. We also don't need to add ourselves to
MSBuildAllProjects, as that is done by the file that imports us.
-->

<PropertyGroup>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileDirectory)..\Directory.Build.props</MSBuildAllProjects>
<DiscordNetProjectCategory>src</DiscordNetProjectCategory>
</PropertyGroup>

<Import Project="$(MSBuildThisFileDirectory)..\Directory.Build.props" />

<ItemGroup>
<InternalsVisibleTo Include="$(MSBuildProjectName).UnitTests" PublicKey="$(AssemblyOriginatorPublicKey)" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" IsImplicitlyDefined="true" PrivateAssets="all" />
</ItemGroup>

</Project>

+ 57
- 0
src/Directory.Build.targets View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Based on https://github.com/terrafx/terrafx/blob/master/Directory.Build.props -->
<!-- Copyright © Tanner Gooding and Contributors -->
<Project>

<!--
Directory.Build.targets is automatically picked up and imported by
Microsoft.Common.targets. This file needs to exist, even if empty so that
files in the parent directory tree, with the same name, are not imported
instead. The import fairly late and most other props/targets will have
been imported beforehand. We also don't need to add ourselves to
MSBuildAllProjects, as that is done by the file that imports us.
-->

<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileDirectory)..\Directory.Build.targets</MSBuildAllProjects>
</PropertyGroup>

<Import Project="$(MSBuildThisFileDirectory)..\Directory.Build.targets" />

<PropertyGroup>
<GeneratedInternalsVisibleToFile Condition="'$(GeneratedInternalsVisibleToFile)' == ''">$(IntermediateOutputPath)$(MSBuildProjectName).InternalsVisibleTo$(DefaultLanguageSourceExtension)</GeneratedInternalsVisibleToFile>
</PropertyGroup>

<ItemDefinitionGroup>
<InternalsVisibleTo>
<Visible>false</Visible>
</InternalsVisibleTo>
</ItemDefinitionGroup>

<Target Name="GenerateInternalsVisibleTo"
BeforeTargets="CoreCompile"
DependsOnTargets="PrepareForBuild;CoreGenerateInternalsVisibleTo"
Condition="'@(InternalsVisibleTo)' != ''" />

<Target Name="CoreGenerateInternalsVisibleTo"
Condition="'$(Language)' == 'VB' or '$(Language)' == 'C#'"
Inputs="$(MSBuildAllProjects)"
Outputs="$(GeneratedInternalsVisibleToFile)">
<CreateItem Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute" AdditionalMetadata="_Parameter1=%(InternalsVisibleTo.Identity)" Condition="'%(InternalsVisibleTo.PublicKey)' == ''">
<Output TaskParameter="Include" ItemName="InternalsVisibleToAttribute" />
</CreateItem>
<CreateItem Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute" AdditionalMetadata="_Parameter1=%(InternalsVisibleTo.Identity), PublicKey=%(InternalsVisibleTo.PublicKey)" Condition="'%(InternalsVisibleTo.PublicKey)' != ''">
<Output TaskParameter="Include" ItemName="InternalsVisibleToAttribute" />
</CreateItem>

<WriteCodeFragment AssemblyAttributes="@(InternalsVisibleToAttribute)" Language="$(Language)" OutputFile="$(GeneratedInternalsVisibleToFile)">
<Output TaskParameter="OutputFile" ItemName="Compile" />
<Output TaskParameter="OutputFile" ItemName="FileWrites" />
</WriteCodeFragment>
</Target>

<!-- Empty target so that `dotnet test` will work on the solution -->
<!-- https://github.com/Microsoft/vstest/issues/411 -->
<Target Name="VSTest" />

</Project>

Loading…
Cancel
Save