From 125bcbee56bf40cf82abc7fdb502f8cbc18546cf Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Fri, 13 Sep 2019 17:22:45 -0400 Subject: migrate to new project file format --- .../StardewModdingAPI.Installer.csproj | 75 ++-- .../StardewModdingAPI.ModBuildConfig.csproj | 79 ++--- .../StardewModdingAPI.Mods.ConsoleCommands.csproj | 92 +---- .../StardewModdingAPI.Mods.SaveBackup.csproj | 63 +--- src/SMAPI.Tests/StardewModdingAPI.Tests.csproj | 74 +--- src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs | 44 +++ .../IManifestContentPackFor.cs | 12 + .../IManifestDependency.cs | 18 + .../ISemanticVersion.cs | 68 ++++ .../Properties/AssemblyInfo.cs | 4 + ...StardewModdingAPI.Toolkit.CoreInterfaces.csproj | 18 + .../Framework/Clients/WebApi/ModEntryModel.cs | 33 ++ .../Clients/WebApi/ModEntryVersionModel.cs | 31 ++ .../Clients/WebApi/ModExtendedMetadataModel.cs | 123 +++++++ .../Framework/Clients/WebApi/ModSeachModel.cs | 36 ++ .../Clients/WebApi/ModSearchEntryModel.cs | 34 ++ .../Framework/Clients/WebApi/WebApiClient.cs | 73 ++++ .../Framework/Clients/Wiki/WikiClient.cs | 237 +++++++++++++ .../Clients/Wiki/WikiCompatibilityInfo.cs | 24 ++ .../Clients/Wiki/WikiCompatibilityStatus.cs | 27 ++ .../Framework/Clients/Wiki/WikiModEntry.cs | 54 +++ .../Framework/Clients/Wiki/WikiModList.cs | 18 + .../Framework/ModData/MetadataModel.cs | 14 + .../Framework/ModData/ModDataField.cs | 82 +++++ .../Framework/ModData/ModDataFieldKey.cs | 18 + .../Framework/ModData/ModDataModel.cs | 127 +++++++ .../Framework/ModData/ModDataRecord.cs | 147 ++++++++ .../ModData/ModDataRecordVersionedFields.cs | 54 +++ src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs | 65 ++++ src/SMAPI.Toolkit/Framework/ModData/ModStatus.cs | 18 + src/SMAPI.Toolkit/Framework/ModData/ModWarning.cs | 36 ++ .../Framework/ModScanning/ModFolder.cs | 64 ++++ .../Framework/ModScanning/ModScanner.cs | 183 ++++++++++ .../Framework/UpdateData/ModRepositoryKey.cs | 21 ++ .../Framework/UpdateData/UpdateKey.cs | 73 ++++ src/SMAPI.Toolkit/ModToolkit.cs | 89 +++++ src/SMAPI.Toolkit/Properties/AssemblyInfo.cs | 7 + src/SMAPI.Toolkit/SemanticVersion.cs | 312 +++++++++++++++++ .../Converters/ManifestContentPackForConverter.cs | 50 +++ .../Converters/ManifestDependencyArrayConverter.cs | 60 ++++ .../Converters/SemanticVersionConverter.cs | 98 ++++++ .../Converters/SimpleReadOnlyConverter.cs | 76 ++++ .../Serialisation/InternalExtensions.cs | 21 ++ src/SMAPI.Toolkit/Serialisation/JsonHelper.cs | 136 ++++++++ src/SMAPI.Toolkit/Serialisation/Models/Manifest.cs | 74 ++++ .../Serialisation/Models/ManifestContentPackFor.cs | 15 + .../Serialisation/Models/ManifestDependency.cs | 35 ++ src/SMAPI.Toolkit/Serialisation/SParseException.cs | 17 + src/SMAPI.Toolkit/StardewModdingAPI.Toolkit.csproj | 28 ++ src/SMAPI.Toolkit/Utilities/FileUtilities.cs | 46 +++ src/SMAPI.Toolkit/Utilities/PathUtilities.cs | 85 +++++ src/SMAPI.Web/StardewModdingAPI.Web.csproj | 2 +- src/SMAPI.sln | 87 +++-- src/SMAPI/StardewModdingAPI.csproj | 381 ++------------------- .../IManifest.cs | 44 --- .../IManifestContentPackFor.cs | 12 - .../IManifestDependency.cs | 18 - .../ISemanticVersion.cs | 68 ---- .../Properties/AssemblyInfo.cs | 4 - ...StardewModdingAPI.Toolkit.CoreInterfaces.csproj | 18 - .../Framework/Clients/WebApi/ModEntryModel.cs | 33 -- .../Clients/WebApi/ModEntryVersionModel.cs | 31 -- .../Clients/WebApi/ModExtendedMetadataModel.cs | 123 ------- .../Framework/Clients/WebApi/ModSeachModel.cs | 36 -- .../Clients/WebApi/ModSearchEntryModel.cs | 34 -- .../Framework/Clients/WebApi/WebApiClient.cs | 73 ---- .../Framework/Clients/Wiki/WikiClient.cs | 237 ------------- .../Clients/Wiki/WikiCompatibilityInfo.cs | 24 -- .../Clients/Wiki/WikiCompatibilityStatus.cs | 27 -- .../Framework/Clients/Wiki/WikiModEntry.cs | 54 --- .../Framework/Clients/Wiki/WikiModList.cs | 18 - .../Framework/ModData/MetadataModel.cs | 14 - .../Framework/ModData/ModDataField.cs | 82 ----- .../Framework/ModData/ModDataFieldKey.cs | 18 - .../Framework/ModData/ModDataModel.cs | 127 ------- .../Framework/ModData/ModDataRecord.cs | 147 -------- .../ModData/ModDataRecordVersionedFields.cs | 54 --- .../Framework/ModData/ModDatabase.cs | 65 ---- .../Framework/ModData/ModStatus.cs | 18 - .../Framework/ModData/ModWarning.cs | 36 -- .../Framework/ModScanning/ModFolder.cs | 64 ---- .../Framework/ModScanning/ModScanner.cs | 183 ---------- .../Framework/UpdateData/ModRepositoryKey.cs | 21 -- .../Framework/UpdateData/UpdateKey.cs | 73 ---- src/StardewModdingAPI.Toolkit/ModToolkit.cs | 89 ----- .../Properties/AssemblyInfo.cs | 7 - src/StardewModdingAPI.Toolkit/SemanticVersion.cs | 312 ----------------- .../Converters/ManifestContentPackForConverter.cs | 50 --- .../Converters/ManifestDependencyArrayConverter.cs | 60 ---- .../Converters/SemanticVersionConverter.cs | 98 ------ .../Converters/SimpleReadOnlyConverter.cs | 76 ---- .../Serialisation/InternalExtensions.cs | 21 -- .../Serialisation/JsonHelper.cs | 136 -------- .../Serialisation/Models/Manifest.cs | 74 ---- .../Serialisation/Models/ManifestContentPackFor.cs | 15 - .../Serialisation/Models/ManifestDependency.cs | 35 -- .../Serialisation/SParseException.cs | 17 - .../StardewModdingAPI.Toolkit.csproj | 27 -- .../Utilities/FileUtilities.cs | 46 --- .../Utilities/PathUtilities.cs | 85 ----- 100 files changed, 3061 insertions(+), 3601 deletions(-) create mode 100644 src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs create mode 100644 src/SMAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs create mode 100644 src/SMAPI.Toolkit.CoreInterfaces/IManifestDependency.cs create mode 100644 src/SMAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs create mode 100644 src/SMAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs create mode 100644 src/SMAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj create mode 100644 src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs create mode 100644 src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/MetadataModel.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModDataModel.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModDatabase.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModStatus.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModData/ModWarning.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModScanning/ModFolder.cs create mode 100644 src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs create mode 100644 src/SMAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs create mode 100644 src/SMAPI.Toolkit/Framework/UpdateData/UpdateKey.cs create mode 100644 src/SMAPI.Toolkit/ModToolkit.cs create mode 100644 src/SMAPI.Toolkit/Properties/AssemblyInfo.cs create mode 100644 src/SMAPI.Toolkit/SemanticVersion.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/InternalExtensions.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/JsonHelper.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/Models/Manifest.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/Models/ManifestDependency.cs create mode 100644 src/SMAPI.Toolkit/Serialisation/SParseException.cs create mode 100644 src/SMAPI.Toolkit/StardewModdingAPI.Toolkit.csproj create mode 100644 src/SMAPI.Toolkit/Utilities/FileUtilities.cs create mode 100644 src/SMAPI.Toolkit/Utilities/PathUtilities.cs delete mode 100644 src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifest.cs delete mode 100644 src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs delete mode 100644 src/StardewModdingAPI.Toolkit.CoreInterfaces/IManifestDependency.cs delete mode 100644 src/StardewModdingAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs delete mode 100644 src/StardewModdingAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs delete mode 100644 src/StardewModdingAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityInfo.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiCompatibilityStatus.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/Clients/Wiki/WikiModList.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/MetadataModel.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataField.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataModel.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecord.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModDatabase.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModStatus.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModData/ModWarning.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModFolder.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/ModScanning/ModScanner.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/UpdateData/ModRepositoryKey.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Framework/UpdateData/UpdateKey.cs delete mode 100644 src/StardewModdingAPI.Toolkit/ModToolkit.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Properties/AssemblyInfo.cs delete mode 100644 src/StardewModdingAPI.Toolkit/SemanticVersion.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestContentPackForConverter.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/Converters/ManifestDependencyArrayConverter.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/Converters/SemanticVersionConverter.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/Converters/SimpleReadOnlyConverter.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/InternalExtensions.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/JsonHelper.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/Models/Manifest.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestContentPackFor.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/Models/ManifestDependency.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Serialisation/SParseException.cs delete mode 100644 src/StardewModdingAPI.Toolkit/StardewModdingAPI.Toolkit.csproj delete mode 100644 src/StardewModdingAPI.Toolkit/Utilities/FileUtilities.cs delete mode 100644 src/StardewModdingAPI.Toolkit/Utilities/PathUtilities.cs (limited to 'src') diff --git a/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj b/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj index 083044fb..ac64a774 100644 --- a/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj +++ b/src/SMAPI.Installer/StardewModdingAPI.Installer.csproj @@ -1,62 +1,32 @@ - - - + + - Debug - x86 - {443DDF81-6AAF-420A-A610-3459F37E5575} - Exe - Properties StardewModdingAPI.Installer StardewModdingAPI.Installer - v4.5 - 512 - true + net45 + false latest - - - x86 - true - full - false - $(SolutionDir)\..\bin\Debug\Installer - DEBUG;TRACE - prompt - 4 - - + Exe x86 - pdbonly - true - $(SolutionDir)\..\bin\Release\Installer - TRACE - prompt - 4 + $(SolutionDir)\..\bin\$(Configuration)\Installer + false + - - - - - - - Properties\GlobalAssemblyInfo.cs - - - - - - + + - - Always - + + - + + PreserveNewest + + PreserveNewest - + PreserveNewest @@ -67,14 +37,9 @@ PreserveNewest - - - {ea5cfd2e-9453-4d29-b80f-8e0ea23f4ac6} - StardewModdingAPI.Toolkit - - + - - \ No newline at end of file + + diff --git a/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj b/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj index 9118b043..f6cb4734 100644 --- a/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj +++ b/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj @@ -1,73 +1,34 @@ - - - + + - Debug - x86 - {EA4F1E80-743F-4A1D-9757-AE66904A196A} - Library - Properties StardewModdingAPI.ModBuildConfig StardewModdingAPI.ModBuildConfig - v4.5 - 512 + net45 + false latest + x86 + false - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\ - TRACE - prompt - 4 - - - - - - - - - + - - - - + + - - - Designer + + mod-build-config.md - - Designer - - - - + - - {d5cfd923-37f1-4bc3-9be8-e506e202ac28} - StardewModdingAPI.Toolkit.CoreInterfaces - - - {ea5cfd2e-9453-4d29-b80f-8e0ea23f4ac6} - StardewModdingAPI.Toolkit - + + + + + + - - - \ No newline at end of file + + diff --git a/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj b/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj index 2c958dbc..719a80e3 100644 --- a/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj +++ b/src/SMAPI.Mods.ConsoleCommands/StardewModdingAPI.Mods.ConsoleCommands.csproj @@ -1,93 +1,35 @@ - - - + + - Debug - x86 - {28480467-1A48-46A7-99F8-236D95225359} - Library - Properties StardewModdingAPI.Mods.ConsoleCommands ConsoleCommands - v4.5 - 512 + net45 + false latest - - - true - full - false - $(SolutionDir)\..\bin\Debug\Mods\ConsoleCommands\ - DEBUG;TRACE - prompt - 4 - x86 - false - true - - - pdbonly - true - $(SolutionDir)\..\bin\Release\Mods\ConsoleCommands\ - TRACE - prompt - 4 - false - true + $(SolutionDir)\..\bin\$(Configuration)\Mods\ConsoleCommands + false x86 + - - + + False + + Properties\GlobalAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {f1a573b0-f436-472c-ae29-0b91ea6b9f8f} - StardewModdingAPI - False - + - + PreserveNewest - + + - \ No newline at end of file + + diff --git a/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj b/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj index 56b6b7f4..3d378ca6 100644 --- a/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj +++ b/src/SMAPI.Mods.SaveBackup/StardewModdingAPI.Mods.SaveBackup.csproj @@ -1,62 +1,35 @@ - - - + + - Debug - x86 - {E272EB5D-8C57-417E-8E60-C1079D3F53C4} - Library - Properties StardewModdingAPI.Mods.SaveBackup SaveBackup - v4.5 - 512 + net45 + false latest + $(SolutionDir)\..\bin\$(Configuration)\Mods\SaveBackup + false + x86 - - true - full - false - $(SolutionDir)\..\bin\Debug\Mods\SaveBackup\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - $(SolutionDir)\..\bin\Release\Mods\SaveBackup\ - TRACE - prompt - 4 - + - + + False + + Properties\GlobalAssemblyInfo.cs - - + - + PreserveNewest - - - {f1a573b0-f436-472c-ae29-0b91ea6b9f8f} - StardewModdingAPI - False - - - {d5cfd923-37f1-4bc3-9be8-e506e202ac28} - StardewModdingAPI.Toolkit.CoreInterfaces - False - - - + + - \ No newline at end of file + + diff --git a/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj b/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj index 83bd92af..1cb2d1e6 100644 --- a/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj +++ b/src/SMAPI.Tests/StardewModdingAPI.Tests.csproj @@ -1,35 +1,20 @@ - - - + + - Debug - x86 - {36CCB19E-92EB-48C7-9615-98EEFD45109B} - Library - Properties StardewModdingAPI.Tests StardewModdingAPI.Tests - v4.5 - 512 + net45 + false latest + x86 - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - + + + + + + + @@ -39,42 +24,17 @@ - - - - + Properties\GlobalAssemblyInfo.cs - - - - - - - - - - - - - - {f1a573b0-f436-472c-ae29-0b91ea6b9f8f} - StardewModdingAPI - - - {d5cfd923-37f1-4bc3-9be8-e506e202ac28} - StardewModdingAPI.Toolkit.CoreInterfaces - - - {ea5cfd2e-9453-4d29-b80f-8e0ea23f4ac6} - StardewModdingAPI.Toolkit - + - + - \ No newline at end of file + + diff --git a/src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs b/src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs new file mode 100644 index 00000000..7375f005 --- /dev/null +++ b/src/SMAPI.Toolkit.CoreInterfaces/IManifest.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace StardewModdingAPI +{ + /// A manifest which describes a mod for SMAPI. + public interface IManifest + { + /********* + ** Accessors + *********/ + /// The mod name. + string Name { get; } + + /// A brief description of the mod. + string Description { get; } + + /// The mod author's name. + string Author { get; } + + /// The mod version. + ISemanticVersion Version { get; } + + /// The minimum SMAPI version required by this mod, if any. + ISemanticVersion MinimumApiVersion { get; } + + /// The unique mod ID. + string UniqueID { get; } + + /// The name of the DLL in the directory that has the Entry method. Mutually exclusive with . + string EntryDll { get; } + + /// The mod which will read this as a content pack. Mutually exclusive with . + IManifestContentPackFor ContentPackFor { get; } + + /// The other mods that must be loaded before this mod. + IManifestDependency[] Dependencies { get; } + + /// The namespaced mod IDs to query for updates (like Nexus:541). + string[] UpdateKeys { get; } + + /// Any manifest fields which didn't match a valid field. + IDictionary ExtraFields { get; } + } +} diff --git a/src/SMAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs b/src/SMAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs new file mode 100644 index 00000000..f05a3873 --- /dev/null +++ b/src/SMAPI.Toolkit.CoreInterfaces/IManifestContentPackFor.cs @@ -0,0 +1,12 @@ +namespace StardewModdingAPI +{ + /// Indicates which mod can read the content pack represented by the containing manifest. + public interface IManifestContentPackFor + { + /// The unique ID of the mod which can read this content pack. + string UniqueID { get; } + + /// The minimum required version (if any). + ISemanticVersion MinimumVersion { get; } + } +} diff --git a/src/SMAPI.Toolkit.CoreInterfaces/IManifestDependency.cs b/src/SMAPI.Toolkit.CoreInterfaces/IManifestDependency.cs new file mode 100644 index 00000000..e86cd1f4 --- /dev/null +++ b/src/SMAPI.Toolkit.CoreInterfaces/IManifestDependency.cs @@ -0,0 +1,18 @@ +namespace StardewModdingAPI +{ + /// A mod dependency listed in a mod manifest. + public interface IManifestDependency + { + /********* + ** Accessors + *********/ + /// The unique mod ID to require. + string UniqueID { get; } + + /// The minimum required version (if any). + ISemanticVersion MinimumVersion { get; } + + /// Whether the dependency must be installed to use the mod. + bool IsRequired { get; } + } +} diff --git a/src/SMAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs b/src/SMAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs new file mode 100644 index 00000000..0a6e5758 --- /dev/null +++ b/src/SMAPI.Toolkit.CoreInterfaces/ISemanticVersion.cs @@ -0,0 +1,68 @@ +using System; + +namespace StardewModdingAPI +{ + /// A semantic version with an optional release tag. + public interface ISemanticVersion : IComparable, IEquatable + { + /********* + ** Accessors + *********/ + /// The major version incremented for major API changes. + int MajorVersion { get; } + + /// The minor version incremented for backwards-compatible changes. + int MinorVersion { get; } + + /// The patch version for backwards-compatible bug fixes. + int PatchVersion { get; } + +#if !SMAPI_3_0_STRICT + /// An optional build tag. + [Obsolete("Use " + nameof(ISemanticVersion.PrereleaseTag) + " instead")] + string Build { get; } +#endif + + /// An optional prerelease tag. + string PrereleaseTag { get; } + + + /********* + ** Accessors + *********/ + /// Whether this is a pre-release version. + bool IsPrerelease(); + + /// Get whether this version is older than the specified version. + /// The version to compare with this instance. + bool IsOlderThan(ISemanticVersion other); + + /// Get whether this version is older than the specified version. + /// The version to compare with this instance. + /// The specified version is not a valid semantic version. + bool IsOlderThan(string other); + + /// Get whether this version is newer than the specified version. + /// The version to compare with this instance. + bool IsNewerThan(ISemanticVersion other); + + /// Get whether this version is newer than the specified version. + /// The version to compare with this instance. + /// The specified version is not a valid semantic version. + bool IsNewerThan(string other); + + /// Get whether this version is between two specified versions (inclusively). + /// The minimum version. + /// The maximum version. + bool IsBetween(ISemanticVersion min, ISemanticVersion max); + + /// Get whether this version is between two specified versions (inclusively). + /// The minimum version. + /// The maximum version. + /// One of the specified versions is not a valid semantic version. + bool IsBetween(string min, string max); + + /// Get a string representation of the version. + string ToString(); + } +} diff --git a/src/SMAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs b/src/SMAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a29ba6cf --- /dev/null +++ b/src/SMAPI.Toolkit.CoreInterfaces/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using System.Reflection; + +[assembly: AssemblyTitle("SMAPI.Toolkit.CoreInterfaces")] +[assembly: AssemblyDescription("Provides toolkit interfaces which are available to SMAPI mods.")] diff --git a/src/SMAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj b/src/SMAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj new file mode 100644 index 00000000..67adbd67 --- /dev/null +++ b/src/SMAPI.Toolkit.CoreInterfaces/StardewModdingAPI.Toolkit.CoreInterfaces.csproj @@ -0,0 +1,18 @@ + + + + net4.5;netstandard2.0 + StardewModdingAPI + false + ..\..\bin\$(Configuration)\SMAPI.Toolkit.CoreInterfaces + ..\..\bin\$(Configuration)\SMAPI.Toolkit.CoreInterfaces\$(TargetFramework)\StardewModdingAPI.Toolkit.CoreInterfaces.xml + latest + + + + + + + + + diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs new file mode 100644 index 00000000..8a9c0a25 --- /dev/null +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs @@ -0,0 +1,33 @@ +namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi +{ + /// Metadata about a mod. + public class ModEntryModel + { + /********* + ** Accessors + *********/ + /// The mod's unique ID (if known). + public string ID { get; set; } + + /// The main version. + public ModEntryVersionModel Main { get; set; } + + /// The latest optional version, if newer than . + public ModEntryVersionModel Optional { get; set; } + + /// The latest unofficial version, if newer than and . + public ModEntryVersionModel Unofficial { get; set; } + + /// The latest unofficial version for the current Stardew Valley or SMAPI beta, if any (see ). + public ModEntryVersionModel UnofficialForBeta { get; set; } + + /// Optional extended data which isn't needed for update checks. + public ModExtendedMetadataModel Metadata { get; set; } + + /// Whether a Stardew Valley or SMAPI beta which affects mod compatibility is in progress. If this is true, should be used for beta versions of SMAPI instead of . + public bool HasBetaInfo { get; set; } + + /// The errors that occurred while fetching update data. + public string[] Errors { get; set; } = new string[0]; + } +} diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs new file mode 100644 index 00000000..dadb8c10 --- /dev/null +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs @@ -0,0 +1,31 @@ +namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi +{ + /// Metadata about a version. + public class ModEntryVersionModel + { + /********* + ** Accessors + *********/ + /// The version number. + public ISemanticVersion Version { get; set; } + + /// The mod page URL. + public string Url { get; set; } + + + /********* + ** Public methods + *********/ + /// Construct an instance. + public ModEntryVersionModel() { } + + /// Construct an instance. + /// The version number. + /// The mod page URL. + public ModEntryVersionModel(ISemanticVersion version, string url) + { + this.Version = version; + this.Url = url; + } + } +} diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs new file mode 100644 index 00000000..989c18b0 --- /dev/null +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs @@ -0,0 +1,123 @@ +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using StardewModdingAPI.Toolkit.Framework.Clients.Wiki; +using StardewModdingAPI.Toolkit.Framework.ModData; + +namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi +{ + /// Extended metadata about a mod. + public class ModExtendedMetadataModel + { + /********* + ** Accessors + *********/ + /**** + ** Mod info + ****/ + /// The mod's unique ID. A mod may have multiple current IDs in rare cases (e.g. due to parallel releases or unofficial updates). + public string[] ID { get; set; } = new string[0]; + + /// The mod's display name. + public string Name { get; set; } + + /// The mod ID on Nexus. + public int? NexusID { get; set; } + + /// The mod ID in the Chucklefish mod repo. + public int? ChucklefishID { get; set; } + + /// The mod ID in the ModDrop mod repo. + public int? ModDropID { get; set; } + + /// The GitHub repository in the form 'owner/repo'. + public string GitHubRepo { get; set; } + + /// The URL to a non-GitHub source repo. + public string CustomSourceUrl { get; set; } + + /// The custom mod page URL (if applicable). + public string CustomUrl { get; set; } + + + /**** + ** Stable compatibility + ****/ + /// The compatibility status. + [JsonConverter(typeof(StringEnumConverter))] + public WikiCompatibilityStatus? CompatibilityStatus { get; set; } + + /// The human-readable summary of the compatibility status or workaround, without HTML formatitng. + public string CompatibilitySummary { get; set; } + + /// The game or SMAPI version which broke this mod, if applicable. + public string BrokeIn { get; set; } + + + /**** + ** Beta compatibility + ****/ + /// The compatibility status for the Stardew Valley beta (if any). + [JsonConverter(typeof(StringEnumConverter))] + public WikiCompatibilityStatus? BetaCompatibilityStatus { get; set; } + + /// The human-readable summary of the compatibility status or workaround for the Stardew Valley beta (if any), without HTML formatitng. + public string BetaCompatibilitySummary { get; set; } + + /// The beta game or SMAPI version which broke this mod, if applicable. + public string BetaBrokeIn { get; set; } + + + /********* + ** Public methods + *********/ + /// Construct an instance. + public ModExtendedMetadataModel() { } + + /// Construct an instance. + /// The mod metadata from the wiki (if available). + /// The mod metadata from SMAPI's internal DB (if available). + public ModExtendedMetadataModel(WikiModEntry wiki, ModDataRecord db) + { + // wiki data + if (wiki != null) + { + this.ID = wiki.ID; + this.Name = wiki.Name.FirstOrDefault(); + this.NexusID = wiki.NexusID; + this.ChucklefishID = wiki.ChucklefishID; + this.ModDropID = wiki.ModDropID; + this.GitHubRepo = wiki.GitHubRepo; + this.CustomSourceUrl = wiki.CustomSourceUrl; + this.CustomUrl = wiki.CustomUrl; + + this.CompatibilityStatus = wiki.Compatibility.Status; + this.CompatibilitySummary = wiki.Compatibility.Summary; + this.BrokeIn = wiki.Compatibility.BrokeIn; + + this.BetaCompatibilityStatus = wiki.BetaCompatibility?.Status; + this.BetaCompatibilitySummary = wiki.BetaCompatibility?.Summary; + this.BetaBrokeIn = wiki.BetaCompatibility?.BrokeIn; + } + + // internal DB data + if (db != null) + { + this.ID = this.ID.Union(db.FormerIDs).ToArray(); + this.Name = this.Name ?? db.DisplayName; + } + } + + /// Get update keys based on the metadata. + public IEnumerable GetUpdateKeys() + { + if (this.NexusID.HasValue) + yield return $"Nexus:{this.NexusID}"; + if (this.ChucklefishID.HasValue) + yield return $"Chucklefish:{this.ChucklefishID}"; + if (this.GitHubRepo != null) + yield return $"GitHub:{this.GitHubRepo}"; + } + } +} diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs new file mode 100644 index 00000000..e352e1cc --- /dev/null +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs @@ -0,0 +1,36 @@ +using System.Linq; + +namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi +{ + /// Specifies mods whose update-check info to fetch. + public class ModSearchModel + { + /********* + ** Accessors + *********/ + /// The mods for which to find data. + public ModSearchEntryModel[] Mods { get; set; } + + /// Whether to include extended metadata for each mod. + public bool IncludeExtendedMetadata { get; set; } + + + /********* + ** Public methods + *********/ + /// Construct an empty instance. + public ModSearchModel() + { + // needed for JSON deserialising + } + + /// Construct an instance. + /// The mods to search. + /// Whether to include extended metadata for each mod. + public ModSearchModel(ModSearchEntryModel[] mods, bool includeExtendedMetadata) + { + this.Mods = mods.ToArray(); + this.IncludeExtendedMetadata = includeExtendedMetadata; + } + } +} diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs new file mode 100644 index 00000000..bca47647 --- /dev/null +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs @@ -0,0 +1,34 @@ +namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi +{ + /// Specifies the identifiers for a mod to match. + public class ModSearchEntryModel + { + /********* + ** Accessors + *********/ + /// The unique mod ID. + public string ID { get; set; } + + /// The namespaced mod update keys (if available). + public string[] UpdateKeys { get; set; } + + + /********* + ** Public methods + *********/ + /// Construct an empty instance. + public ModSearchEntryModel() + { + // needed for JSON deserialising + } + + /// Construct an instance. + /// The unique mod ID. + /// The namespaced mod update keys (if available). + public ModSearchEntryModel(string id, string[] updateKeys) + { + this.ID = id; + this.UpdateKeys = updateKeys ?? new string[0]; + } + } +} diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs new file mode 100644 index 00000000..7c3df384 --- /dev/null +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using Newtonsoft.Json; +using StardewModdingAPI.Toolkit.Serialisation; + +namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi +{ + /// Provides methods for interacting with the SMAPI web API. + public class WebApiClient + { + /********* + ** Fields + *********/ + /// The base URL for the web API. + private readonly Uri BaseUrl; + + /// The API version number. + private readonly ISemanticVersion Version; + + /// The JSON serializer settings to use. + private readonly JsonSerializerSettings JsonSettings = new JsonHelper().JsonSettings; + + + /********* + ** Public methods + *********/ + /// Construct an instance. + /// The base URL for the web API. + /// The web API version. + public WebApiClient(string baseUrl, ISemanticVersion version) + { + this.BaseUrl = new Uri(baseUrl); + this.Version = version; + } + + /// Get metadata about a set of mods from the web API. + /// The mod keys for which to fetch the latest version. + /// Whether to include extended metadata for each mod. + public IDictionary GetModInfo(ModSearchEntryModel[] mods, bool includeExtendedMetadata = false) + { + return this.Post( + $"v{this.Version}/mods", + new ModSearchModel(mods, includeExtendedMetadata) + ).ToDictionary(p => p.ID); + } + + + /********* + ** Private methods + *********/ + /// Fetch the response from the backend API. + /// The body content type. + /// The expected response type. + /// The request URL, optionally excluding the base URL. + /// The body content to post. + private TResult Post(string url, TBody content) + { + // note: avoid HttpClient for Mac compatibility + using (WebClient client = new WebClient()) + { + Uri fullUrl = new Uri(this.BaseUrl, url); + string data = JsonConvert.SerializeObject(content); + + client.Headers["Content-Type"] = "application/json"; + client.Headers["User-Agent"] = $"SMAPI/{this.Version}"; + string response = client.UploadString(fullUrl, data); + return JsonConvert.DeserializeObject(response, this.JsonSettings); + } + } + } +} diff --git a/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs new file mode 100644 index 00000000..3e9b8ea6 --- /dev/null +++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs @@ -0,0 +1,237 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using HtmlAgilityPack; +using Pathoschild.Http.Client; + +namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki +{ + /// An HTTP client for fetching mod metadata from the wiki. + public class WikiClient : IDisposable + { + /********* + ** Fields + *********/ + /// The underlying HTTP client. + private readonly IClient Client; + + + /********* + ** Public methods + *********/ + /// Construct an instance. + /// The user agent for the wiki API. + /// The base URL for the wiki API. + public WikiClient(string userAgent, string baseUrl = "https://stardewvalleywiki.com/mediawiki/api.php") + { + this.Client = new FluentClient(baseUrl).SetUserAgent(userAgent); + } + + /// Fetch mods from the compatibility list. + public async Task FetchModsAsync() + { + // fetch HTML + ResponseModel response = await this.Client + .GetAsync("") + .WithArguments(new + { + action = "parse", + page = "Modding:Mod_compatibility", + format = "json" + }) + .As(); + string html = response.Parse.Text["*"]; + + // parse HTML + var doc = new HtmlDocument(); + doc.LoadHtml(html); + + // fetch game versions + string stableVersion = doc.DocumentNode.SelectSingleNode("div[@class='game-stable-version']")?.InnerText; + string betaVersion = doc.DocumentNode.SelectSingleNode("div[@class='game-beta-version']")?.InnerText; + if (betaVersion == stableVersion) + betaVersion = null; + + // find mod entries + HtmlNodeCollection modNodes = doc.DocumentNode.SelectNodes("table[@id='mod-list']//tr[@class='mod']"); + if (modNodes == null) + throw new InvalidOperationException("Can't parse wiki compatibility list, no mods found."); + + // parse + WikiModEntry[] mods = this.ParseEntries(modNodes).ToArray(); + return new WikiModList + { + StableVersion = stableVersion, + BetaVersion = betaVersion, + Mods = mods + }; + } + + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + public void Dispose() + { + this.Client?.Dispose(); + } + + + /********* + ** Private methods + *********/ + /// Parse valid mod compatibility entries. + /// The HTML compatibility entries. + private IEnumerable ParseEntries(IEnumerable nodes) + { + foreach (HtmlNode node in nodes) + { + // extract fields + string[] names = this.GetAttributeAsCsv(node, "data-name"); + string[] authors = this.GetAttributeAsCsv(node, "data-author"); + string[] ids = this.GetAttributeAsCsv(node, "data-id"); + string[] warnings = this.GetAttributeAsCsv(node, "data-warnings"); + int? nexusID = this.GetAttributeAsNullableInt(node, "data-nexus-id"); + int? chucklefishID = this.GetAttributeAsNullableInt(node, "data-cf-id"); + int? modDropID = this.GetAttributeAsNullableInt(node, "data-moddrop-id"); + string githubRepo = this.GetAttribute(node, "data-github"); + string customSourceUrl = this.GetAttribute(node, "data-custom-source"); + string customUrl = this.GetAttribute(node, "data-url"); + string anchor = this.GetAttribute(node, "id"); + string contentPackFor = this.GetAttribute(node, "data-content-pack-for"); + + // parse stable compatibility + WikiCompatibilityInfo compatibility = new WikiCompatibilityInfo + { + Status = this.GetAttributeAsEnum(node, "data-status") ?? WikiCompati