diff --git a/DisCatSharp.ThirdPartyLookups/DisCatSharp.ThirdPartyLookups.csproj b/DisCatSharp.ThirdPartyLookups/DisCatSharp.ThirdPartyLookups.csproj new file mode 100644 index 000000000..bbfbcff33 --- /dev/null +++ b/DisCatSharp.ThirdPartyLookups/DisCatSharp.ThirdPartyLookups.csproj @@ -0,0 +1,17 @@ + + + + net6.0 + disable + enable + DisCatSharp.ThirdPartyLookups + DisCatSharp.ThirdPartyLookups + True + True + + + + + + + diff --git a/DisCatSharp.ThirdPartyLookups/DiscordClientExtensions.cs b/DisCatSharp.ThirdPartyLookups/DiscordClientExtensions.cs new file mode 100644 index 000000000..9879b5b51 --- /dev/null +++ b/DisCatSharp.ThirdPartyLookups/DiscordClientExtensions.cs @@ -0,0 +1,46 @@ +// This file is part of the DisCatSharp project, based off DSharpPlus. +// +// Copyright (c) 2021-2022 AITSYS +// +// 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. + +using System; + +namespace DisCatSharp.ThirdPartyLookups; + +/// +/// The discord client extensions. +/// +public static class DiscordClientExtensions +{ + /// + /// Creates a new Third Party Lookup client with specified settings. + /// + /// Discord client to create Lavalink instance for. + /// Lavalink client instance. + public static ThirdPartyLookupExtension UseThirdPartyLookup(this DiscordClient client) + { + if (client.GetExtension() != null) + throw new InvalidOperationException("Third Party Lookup is already enabled for that client."); + + var tp = new ThirdPartyLookupExtension(); + client.AddExtension(tp); + return tp; + } +} diff --git a/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6Guild.cs b/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6Guild.cs new file mode 100644 index 000000000..c4ba100a6 --- /dev/null +++ b/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6Guild.cs @@ -0,0 +1,98 @@ +// This file is part of the DisCatSharp project, based off DSharpPlus. +// +// Copyright (c) 2021-2022 AITSYS +// +// 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. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using DisCatSharp.Enums; +using DisCatSharp.Net; + +using Newtonsoft.Json; + +namespace DisCatSharp.ThirdPartyLookups.Entities; + +/// +/// A guild represented by Mee6. +/// +public class Mee6Guild +{ + /// + /// The id of this guild. + /// + [JsonProperty("id")] + internal string? _Id { get; set; } + + /// + /// The id of this guild. + /// + [JsonIgnore] + public ulong Id => Convert.ToUInt64(this._Id); + + /// + /// The name of this guild. + /// + [JsonProperty("name")] + public string? Name { get; internal set; } + + /// + /// The icon hash of this guild. + /// + [JsonProperty("icon")] + public string? IconHash { get; internal set; } + + /// + /// The url of the icon of this guild. + /// + [JsonIgnore] + public string? IconUrl + => !string.IsNullOrWhiteSpace(this.IconHash) ? $"{DiscordDomain.GetDomain(CoreDomain.DiscordCdn).Url}{Endpoints.ICONS}/{this.Id.ToString(CultureInfo.InvariantCulture)}/{this.IconHash}.{(this.IconHash.StartsWith("a_") ? "gif" : "png")}?size=1024" : null; + + /// + /// Whether this guild allows people to join through the mee6 leaderboard. + /// + [JsonProperty("invite_leaderboard")] + public bool InviteLeaderboad { get; internal set; } + + /// + /// An url to the guild's public leaderboard. + /// + [JsonProperty("leaderboard_url")] + public string? LeaderboardUrl { get; internal set; } + + /// + /// Whether the guild has access to premium features of Mee6. + /// + [JsonProperty("premium")] + public bool IsPremium { get; internal set; } + + /// + /// Unknown, for now. Might be unused. + /// + [JsonProperty("allow_join")] + public bool AllowJoin { get; internal set; } + + internal Mee6Guild() { } +} diff --git a/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6Leaderboard.cs b/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6Leaderboard.cs new file mode 100644 index 000000000..8427b5ee8 --- /dev/null +++ b/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6Leaderboard.cs @@ -0,0 +1,111 @@ +// This file is part of the DisCatSharp project, based off DSharpPlus. +// +// Copyright (c) 2021-2022 AITSYS +// +// 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. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Newtonsoft.Json; + +namespace DisCatSharp.ThirdPartyLookups.Entities; + +/// +/// A Mee6 Leaderboard. +/// +public class Mee6Leaderboard +{ + /// + /// Gets the guild. + /// + [JsonProperty("guild")] + public Mee6Guild? Guild { get; internal set; } + + /// + /// Gets the country this guild is set to. + /// + [JsonProperty("country")] + public string? Country { get; internal set; } + + /// + /// Whether Mee6 is an Administrator on this guild. + /// + [JsonProperty("admin")] + public bool? IsAdmin { get; internal set; } + + /// + /// Gets a list of users. + /// + [JsonProperty("players")] + public Mee6User[]? Users { get; internal set; } + + /// + /// Gets the role rewards you can achieve on this server. + /// + [JsonProperty("role_rewards")] + public object[]? RoleRewards { get; internal set; } + + /// + /// Gets how much experience you get per message on this guild. + /// + [JsonProperty("xp_per_message")] + public int[]? ExperiencePerMessage { get; internal set; } + + /// + /// Gets the rate at which you gain experience on this guild. + /// + [JsonProperty("xp_rate")] + public float? ExperienceRate { get; internal set; } + + /// + /// Gets the leaderboard page that has been fetched. + /// + [JsonProperty("page")] + public int? Page { get; internal set; } + + + + /// + /// Unknown + /// + [JsonProperty("is_member")] + public bool? IsMember { get; internal set; } + + /// + /// Unknown + /// + [JsonProperty("user_guild_settings")] + public object? UserGuildSettings { get; internal set; } + + /// + /// Unknown + /// + [JsonProperty("player")] + public object? Player { get; internal set; } + + /// + /// Unknown + /// + [JsonProperty("banner_url")] + public string? BannerUrl { get; internal set; } +} diff --git a/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6User.cs b/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6User.cs new file mode 100644 index 000000000..be539c099 --- /dev/null +++ b/DisCatSharp.ThirdPartyLookups/Entities/Mee6 Leaderboard/Mee6User.cs @@ -0,0 +1,102 @@ +// This file is part of the DisCatSharp project, based off DSharpPlus. +// +// Copyright (c) 2021-2022 AITSYS +// +// 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. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Newtonsoft.Json; + +namespace DisCatSharp.ThirdPartyLookups.Entities; + +/// +/// A user represented in a Mee6 Leaderboard. +/// +public class Mee6User +{ + /// + /// The id of this guild. + /// + [JsonProperty("id")] + internal string? _Id { get; set; } + + /// + /// The id of this guild. + /// + [JsonIgnore] + public ulong Id => Convert.ToUInt64(this._Id); + + /// + /// The username of this user. + /// + [JsonProperty("username")] + public string? Username { get; set; } + + /// + /// The discriminator of this user. + /// + [JsonProperty("discriminator")] + public string? Discriminator { get; set; } + + /// + /// The username and discriminator combined. E.g. User#0001 + /// + public string UsernameWithDiscriminator => $"{this.Username}#{this.Discriminator}"; + + /// + /// The hash of the users' avatar. + /// + [JsonProperty("avatar")] + public string? AvatarHash { get; set; } + + /// + /// The id of the guild this user belongs to. + /// + [JsonProperty("guild_id")] + public string? GuildId { get; set; } + + /// + /// How many messages the user wrote. + /// + [JsonProperty("message_count")] + public int? MessageCount { get; set; } + + /// + /// The current level of this user. + /// + [JsonProperty("level")] + public int? Level { get; set; } + + /// + /// The current experience of this user. + /// + [JsonProperty("xp")] + public int? Experience { get; set; } + + /// + /// Detailed information about the users' experience. + /// + [JsonProperty("detailed_xp")] + public int[]? DetailedExperience { get; set; } +} diff --git a/DisCatSharp.ThirdPartyLookups/Exceptions/NotFoundException.cs b/DisCatSharp.ThirdPartyLookups/Exceptions/NotFoundException.cs new file mode 100644 index 000000000..81457ed79 --- /dev/null +++ b/DisCatSharp.ThirdPartyLookups/Exceptions/NotFoundException.cs @@ -0,0 +1,10 @@ +using System; + +namespace DisCatSharp.ThirdPartyLookups.Exceptions; + +internal class NotFoundException : Exception +{ + public NotFoundException(string message = "") : base(message) + { + } +} diff --git a/DisCatSharp.ThirdPartyLookups/ThirdPartyLookupExtension.cs b/DisCatSharp.ThirdPartyLookups/ThirdPartyLookupExtension.cs new file mode 100644 index 000000000..e45483c1b --- /dev/null +++ b/DisCatSharp.ThirdPartyLookups/ThirdPartyLookupExtension.cs @@ -0,0 +1,89 @@ +// This file is part of the DisCatSharp project, based off DSharpPlus. +// +// Copyright (c) 2021-2022 AITSYS +// +// 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. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +using DisCatSharp.Entities; +using DisCatSharp.ThirdPartyLookups.Entities; +using DisCatSharp.ThirdPartyLookups.Exceptions; + +using Newtonsoft.Json; + +namespace DisCatSharp.ThirdPartyLookups; + +/// +/// The third party lookup extension. +/// +public class ThirdPartyLookupExtension : BaseExtension +{ + /// + /// DO NOT USE THIS MANUALLY. + /// + /// DO NOT USE THIS MANUALLY. + /// + protected override void Setup(DiscordClient client) + { + if (this.Client != null) + throw new InvalidOperationException("What did I tell you?"); + + this.Client = client; + } + + /// + /// Gets a mee6 leaderboard based of a DiscordGuild. + /// + /// The guild to fetch. + /// + /// Thrown if no guild id was provided. + /// Thrown if the guild was not found. + public async Task GetMee6Leaderboard(DiscordGuild Guild) + => await this.GetMee6Leaderboard(Guild.Id); + + /// + /// Gets a mee6 leaderboard based of a guild id. + /// + /// The guild id to fetch. + /// + /// Thrown if no guild id was provided. + /// Thrown if the guild was not found. + public async Task GetMee6Leaderboard(ulong GuildId) + { + if (GuildId == 0) + throw new ArgumentException("Please provide a valid guild id."); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Add("User-Agent", $"DisCatSharp.ThirdPartyLookups"); + client.DefaultRequestHeaders.Add("Accept", "application/json"); + client.DefaultRequestHeaders.Add("Content-Type", "application/json"); + + var response = await client.GetAsync($"https://mee6.xyz/api/plugins/levels/leaderboard/{GuildId}"); + var mee6 = JsonConvert.DeserializeObject(await response.EnsureSuccessStatusCode().Content.ReadAsStringAsync()); + + return mee6 is null ? throw new NotFoundException() : mee6; + } +} diff --git a/DisCatSharp.sln b/DisCatSharp.sln index 0aba3f024..188edb967 100644 --- a/DisCatSharp.sln +++ b/DisCatSharp.sln @@ -1,151 +1,153 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.1.31911.260 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp", "DisCatSharp\DisCatSharp.csproj", "{EB3D8310-DFAD-4295-97F9-82E253647583}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.VoiceNext", "DisCatSharp.VoiceNext\DisCatSharp.VoiceNext.csproj", "{FB6B9EE9-65FB-4DFB-8D51-06F0BE6C1BA5}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4255B64D-92EC-46B3-BC3B-ED2C3A8073EE}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig .gitattributes = .gitattributes .gitignore = .gitignore BUILDING.md = BUILDING.md CODE_OF_CONDUCT.md = CODE_OF_CONDUCT.md CONTRIBUTING.md = CONTRIBUTING.md LICENSE.md = LICENSE.md README.md = README.md SECURITY.md = SECURITY.md EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.CommandsNext", "DisCatSharp.CommandsNext\DisCatSharp.CommandsNext.csproj", "{C8ED55FB-E028-468D-955F-1534C20274EF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Interactivity", "DisCatSharp.Interactivity\DisCatSharp.Interactivity.csproj", "{DD32BEC3-0189-479F-86DC-CCF95E5634A9}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F953F5D0-F0C9-41E6-ADBF-60A76D295899}" ProjectSection(SolutionItems) = preProject .nuget\NuGet.config = .nuget\NuGet.config EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build Items", "Build Items", "{84464D70-687B-40A8-836D-C4F737698969}" ProjectSection(SolutionItems) = preProject appveyor.yml = appveyor.yml .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml .github\dependabot.yml = .github\dependabot.yml DisCatSharp.targets = DisCatSharp.targets docs-oneclick-rebuild.ps1 = docs-oneclick-rebuild.ps1 .github\workflows\docs.yml = .github\workflows\docs.yml .github\workflows\dotnet.yml = .github\workflows\dotnet.yml Library.targets = Library.targets NuGet.targets = NuGet.targets oneclick-rebuild.ps1 = oneclick-rebuild.ps1 Package.targets = Package.targets rebuild-all.ps1 = rebuild-all.ps1 rebuild-docs.ps1 = rebuild-docs.ps1 rebuild-lib.ps1 = rebuild-lib.ps1 Version.targets = Version.targets EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{430C28D8-5F85-4D6E-AA68-211549435245}" ProjectSection(SolutionItems) = preProject .github\ISSUE_TEMPLATE\bug_report.md = .github\ISSUE_TEMPLATE\bug_report.md .github\CODEOWNERS = .github\CODEOWNERS .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml .github\workflows\docs-preview.yml = .github\workflows\docs-preview.yml .github\workflows\docs.yml = .github\workflows\docs.yml .github\workflows\dotnet.yml = .github\workflows\dotnet.yml .github\ISSUE_TEMPLATE\feature_request.md = .github\ISSUE_TEMPLATE\feature_request.md .github\FUNDING.yml = .github\FUNDING.yml .github\pull_request_template.md = .github\pull_request_template.md EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Lavalink", "DisCatSharp.Lavalink\DisCatSharp.Lavalink.csproj", "{A8B8FB09-C6AF-4F28-89B8-B53EE0DCE6E5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.VoiceNext.Natives", "DisCatSharp.VoiceNext.Natives\DisCatSharp.VoiceNext.Natives.csproj", "{BEC47B41-71E4-41D1-A4F9-BB7C56A1B82B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Common", "DisCatSharp.Common\DisCatSharp.Common.csproj", "{CD84A5C7-C7FF-48CA-B23D-FA726CF80E09}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.ApplicationCommands", "DisCatSharp.ApplicationCommands\DisCatSharp.ApplicationCommands.csproj", "{AD530FD0-523C-4DE7-9AF6-B9A3785492C2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Configuration", "DisCatSharp.Configuration\DisCatSharp.Configuration.csproj", "{603287D3-1EF2-47F1-A611-C7F25869DE14}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Configuration.Tests", "DisCatSharp.Configuration.Tests\DisCatSharp.Configuration.Tests.csproj", "{E15E88B4-63AD-42DE-B685-D31697C62194}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Hosting", "DisCatSharp.Hosting\DisCatSharp.Hosting.csproj", "{72CCE5D5-926B-432A-876A-065FA2BC9B7B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Hosting.Tests", "DisCatSharp.Hosting.Tests\DisCatSharp.Hosting.Tests.csproj", "{D02B598A-F0C9-4A8C-B8DE-7C0BAC8C9B94}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Hosting.DependencyInjection", "DisCatSharp.Hosting.DependencyInjection\DisCatSharp.Hosting.DependencyInjection.csproj", "{2D67D1DD-E5B2-40C7-80E2-54D63730E7F0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DisCatSharp.ThirdPartyLookups", "DisCatSharp.ThirdPartyLookups\DisCatSharp.ThirdPartyLookups.csproj", "{E91BD01A-3E35-4091-A0A5-0045DBD02A16}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EB3D8310-DFAD-4295-97F9-82E253647583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EB3D8310-DFAD-4295-97F9-82E253647583}.Debug|Any CPU.Build.0 = Debug|Any CPU {EB3D8310-DFAD-4295-97F9-82E253647583}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB3D8310-DFAD-4295-97F9-82E253647583}.Release|Any CPU.Build.0 = Release|Any CPU {FB6B9EE9-65FB-4DFB-8D51-06F0BE6C1BA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB6B9EE9-65FB-4DFB-8D51-06F0BE6C1BA5}.Debug|Any CPU.Build.0 = Debug|Any CPU {FB6B9EE9-65FB-4DFB-8D51-06F0BE6C1BA5}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB6B9EE9-65FB-4DFB-8D51-06F0BE6C1BA5}.Release|Any CPU.Build.0 = Release|Any CPU {C8ED55FB-E028-468D-955F-1534C20274EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C8ED55FB-E028-468D-955F-1534C20274EF}.Debug|Any CPU.Build.0 = Debug|Any CPU {C8ED55FB-E028-468D-955F-1534C20274EF}.Release|Any CPU.ActiveCfg = Release|Any CPU {C8ED55FB-E028-468D-955F-1534C20274EF}.Release|Any CPU.Build.0 = Release|Any CPU {DD32BEC3-0189-479F-86DC-CCF95E5634A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DD32BEC3-0189-479F-86DC-CCF95E5634A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {DD32BEC3-0189-479F-86DC-CCF95E5634A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {DD32BEC3-0189-479F-86DC-CCF95E5634A9}.Release|Any CPU.Build.0 = Release|Any CPU {A8B8FB09-C6AF-4F28-89B8-B53EE0DCE6E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A8B8FB09-C6AF-4F28-89B8-B53EE0DCE6E5}.Debug|Any CPU.Build.0 = Debug|Any CPU {A8B8FB09-C6AF-4F28-89B8-B53EE0DCE6E5}.Release|Any CPU.ActiveCfg = Release|Any CPU {A8B8FB09-C6AF-4F28-89B8-B53EE0DCE6E5}.Release|Any CPU.Build.0 = Release|Any CPU {BEC47B41-71E4-41D1-A4F9-BB7C56A1B82B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEC47B41-71E4-41D1-A4F9-BB7C56A1B82B}.Debug|Any CPU.Build.0 = Debug|Any CPU {BEC47B41-71E4-41D1-A4F9-BB7C56A1B82B}.Release|Any CPU.ActiveCfg = Release|Any CPU {BEC47B41-71E4-41D1-A4F9-BB7C56A1B82B}.Release|Any CPU.Build.0 = Release|Any CPU {CD84A5C7-C7FF-48CA-B23D-FA726CF80E09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CD84A5C7-C7FF-48CA-B23D-FA726CF80E09}.Debug|Any CPU.Build.0 = Debug|Any CPU {CD84A5C7-C7FF-48CA-B23D-FA726CF80E09}.Release|Any CPU.ActiveCfg = Release|Any CPU {CD84A5C7-C7FF-48CA-B23D-FA726CF80E09}.Release|Any CPU.Build.0 = Release|Any CPU {AD530FD0-523C-4DE7-9AF6-B9A3785492C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD530FD0-523C-4DE7-9AF6-B9A3785492C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD530FD0-523C-4DE7-9AF6-B9A3785492C2}.Release|Any CPU.ActiveCfg = Release|Any CPU {AD530FD0-523C-4DE7-9AF6-B9A3785492C2}.Release|Any CPU.Build.0 = Release|Any CPU {603287D3-1EF2-47F1-A611-C7F25869DE14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {603287D3-1EF2-47F1-A611-C7F25869DE14}.Debug|Any CPU.Build.0 = Debug|Any CPU {603287D3-1EF2-47F1-A611-C7F25869DE14}.Release|Any CPU.ActiveCfg = Release|Any CPU {603287D3-1EF2-47F1-A611-C7F25869DE14}.Release|Any CPU.Build.0 = Release|Any CPU {E15E88B4-63AD-42DE-B685-D31697C62194}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E15E88B4-63AD-42DE-B685-D31697C62194}.Debug|Any CPU.Build.0 = Debug|Any CPU {E15E88B4-63AD-42DE-B685-D31697C62194}.Release|Any CPU.ActiveCfg = Release|Any CPU {E15E88B4-63AD-42DE-B685-D31697C62194}.Release|Any CPU.Build.0 = Release|Any CPU {72CCE5D5-926B-432A-876A-065FA2BC9B7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72CCE5D5-926B-432A-876A-065FA2BC9B7B}.Debug|Any CPU.Build.0 = Debug|Any CPU {72CCE5D5-926B-432A-876A-065FA2BC9B7B}.Release|Any CPU.ActiveCfg = Release|Any CPU {72CCE5D5-926B-432A-876A-065FA2BC9B7B}.Release|Any CPU.Build.0 = Release|Any CPU {D02B598A-F0C9-4A8C-B8DE-7C0BAC8C9B94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D02B598A-F0C9-4A8C-B8DE-7C0BAC8C9B94}.Debug|Any CPU.Build.0 = Debug|Any CPU {D02B598A-F0C9-4A8C-B8DE-7C0BAC8C9B94}.Release|Any CPU.ActiveCfg = Release|Any CPU {D02B598A-F0C9-4A8C-B8DE-7C0BAC8C9B94}.Release|Any CPU.Build.0 = Release|Any CPU {2D67D1DD-E5B2-40C7-80E2-54D63730E7F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D67D1DD-E5B2-40C7-80E2-54D63730E7F0}.Debug|Any CPU.Build.0 = Debug|Any CPU {2D67D1DD-E5B2-40C7-80E2-54D63730E7F0}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D67D1DD-E5B2-40C7-80E2-54D63730E7F0}.Release|Any CPU.Build.0 = Release|Any CPU - {1407FAE8-DAC1-4E89-AA15-4E4592CCC8A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1407FAE8-DAC1-4E89-AA15-4E4592CCC8A0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1407FAE8-DAC1-4E89-AA15-4E4592CCC8A0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1407FAE8-DAC1-4E89-AA15-4E4592CCC8A0}.Release|Any CPU.Build.0 = Release|Any CPU + {E91BD01A-3E35-4091-A0A5-0045DBD02A16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E91BD01A-3E35-4091-A0A5-0045DBD02A16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E91BD01A-3E35-4091-A0A5-0045DBD02A16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E91BD01A-3E35-4091-A0A5-0045DBD02A16}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {23F3A981-51B8-4285-A38C-3267F1D25FE7} EndGlobalSection EndGlobal