diff --git a/CHANGELOG.md b/CHANGELOG.md
index 06c7725261..6083fd7e76 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,7 @@ All notable changes to this project will be documented in this file.
- [Build] Linux: Improve desktop entries (#4092 by: mmvanheusden; reviewed: HebaruSan)
- [ConsoleUI] Install from .ckan file option for ConsoleUI (#4103 by: HebaruSan)
- [Build] Support icons from libraries for deb and rpm (#4104 by: HebaruSan)
+- [Multiple] Store GitHub Discussions links and display in UIs (#4111 by: HebaruSan)
### Bugfixes
diff --git a/CKAN.schema b/CKAN.schema
index a3b98e4153..695ef63f17 100644
--- a/CKAN.schema
+++ b/CKAN.schema
@@ -201,6 +201,11 @@
"type" : "string",
"format" : "uri"
},
+ "discussions" : {
+ "description" : "Mod discussions",
+ "type" : "string",
+ "format" : "uri"
+ },
"license" : {
"description" : "Mod license",
"type" : "string",
diff --git a/Cmdline/Action/Show.cs b/Cmdline/Action/Show.cs
index 23ac4e0845..bfbd12c05e 100644
--- a/Cmdline/Action/Show.cs
+++ b/Cmdline/Action/Show.cs
@@ -281,6 +281,11 @@ private int ShowMod(CkanModule module, ShowOptions opts)
user.RaiseMessage(Properties.Resources.ShowBugTracker,
Net.NormalizeUri(module.resources.bugtracker.ToString()));
}
+ if (module.resources.discussions != null)
+ {
+ user.RaiseMessage(Properties.Resources.ShowDiscussions,
+ Net.NormalizeUri(module.resources.discussions.ToString()));
+ }
if (module.resources.curse != null)
{
user.RaiseMessage(Properties.Resources.ShowCurse,
diff --git a/Cmdline/Properties/Resources.resx b/Cmdline/Properties/Resources.resx
index de8b154718..92be68fcb9 100644
--- a/Cmdline/Properties/Resources.resx
+++ b/Cmdline/Properties/Resources.resx
@@ -349,6 +349,7 @@ Try `ckan list` for a list of installed mods.
SpaceDock: {0}
Repository: {0}
Bug tracker: {0}
+ Discussions: {0}
Curse: {0}
Store: {0}
Steam store: {0}
diff --git a/ConsoleUI/ModInfoScreen.cs b/ConsoleUI/ModInfoScreen.cs
index b81707930c..a8370035dc 100644
--- a/ConsoleUI/ModInfoScreen.cs
+++ b/ConsoleUI/ModInfoScreen.cs
@@ -150,6 +150,13 @@ public ModInfoScreen(GameInstanceManager mgr, Registry registry, ChangePlan cp,
th => LaunchURL(th, mod.resources.bugtracker)
));
}
+ if (mod.resources.discussions != null) {
+ opts.Add(new ConsoleMenuOption(
+ Properties.Resources.ModInfoDiscussions, "", Properties.Resources.ModInfoDiscussionsTip,
+ true,
+ th => LaunchURL(th, mod.resources.discussions)
+ ));
+ }
if (mod.resources.spacedock != null) {
opts.Add(new ConsoleMenuOption(
Properties.Resources.ModInfoSpaceDock, "", Properties.Resources.ModInfoSpaceDockTip,
diff --git a/ConsoleUI/Properties/Resources.resx b/ConsoleUI/Properties/Resources.resx
index d8aed13430..5e37fb506b 100644
--- a/ConsoleUI/Properties/Resources.resx
+++ b/ConsoleUI/Properties/Resources.resx
@@ -262,6 +262,8 @@ If you uninstall it, CKAN will not be able to re-install it.
Open the repository URL in a browser
Bugtracker
Open the bug tracker URL in a browser
+ Discussions
+ Open the discussions URL in a browser
SpaceDock
Open the SpaceDock URL in a browser
Curse
diff --git a/Core/Exporters/DelimeterSeparatedValueExporter.cs b/Core/Exporters/DelimeterSeparatedValueExporter.cs
index 66cd5e1acf..c172d7cb80 100644
--- a/Core/Exporters/DelimeterSeparatedValueExporter.cs
+++ b/Core/Exporters/DelimeterSeparatedValueExporter.cs
@@ -50,6 +50,7 @@ public void Export(IRegistryQuerier registry, Stream stream)
"repository",
"homepage",
"bugtracker",
+ "discussions",
"spacedock",
"curse");
@@ -74,6 +75,7 @@ public void Export(IRegistryQuerier registry, Stream stream)
WriteRepository(mod.Module.resources),
WriteHomepage(mod.Module.resources),
WriteBugtracker(mod.Module.resources),
+ WriteDiscussions(mod.Module.resources),
WriteSpaceDock(mod.Module.resources),
WriteCurse(mod.Module.resources));
}
@@ -100,6 +102,11 @@ private string WriteBugtracker(ResourcesDescriptor resources)
? QuoteIfNecessary(resources.bugtracker.ToString())
: string.Empty;
+ private string WriteDiscussions(ResourcesDescriptor resources)
+ => resources != null && resources.discussions != null
+ ? QuoteIfNecessary(resources.discussions.ToString())
+ : string.Empty;
+
private string WriteSpaceDock(ResourcesDescriptor resources)
=> resources != null && resources.spacedock != null
? QuoteIfNecessary(resources.spacedock.ToString())
diff --git a/Core/Types/ResourcesDescriptor.cs b/Core/Types/ResourcesDescriptor.cs
index 4c2ec9b684..2fa01a95e5 100644
--- a/Core/Types/ResourcesDescriptor.cs
+++ b/Core/Types/ResourcesDescriptor.cs
@@ -26,35 +26,39 @@ public class ResourcesDescriptor
[JsonConverter(typeof(JsonIgnoreBadUrlConverter))]
public Uri bugtracker;
- [JsonProperty("ci", Order = 6, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("discussions", Order = 6, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonConverter(typeof(JsonIgnoreBadUrlConverter))]
+ public Uri discussions;
+
+ [JsonProperty("ci", Order = 7, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonIgnoreBadUrlConverter))]
public Uri ci;
- [JsonProperty("license", Order = 7, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("license", Order = 8, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonIgnoreBadUrlConverter))]
public Uri license;
- [JsonProperty("manual", Order = 8, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("manual", Order = 9, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonIgnoreBadUrlConverter))]
public Uri manual;
- [JsonProperty("metanetkan", Order = 9, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("metanetkan", Order = 10, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonOldResourceUrlConverter))]
public Uri metanetkan;
- [JsonProperty("remote-avc", Order = 10, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("remote-avc", Order = 11, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonOldResourceUrlConverter))]
public Uri remoteAvc;
- [JsonProperty("remote-swinfo", Order = 11, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("remote-swinfo", Order = 12, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonOldResourceUrlConverter))]
public Uri remoteSWInfo;
- [JsonProperty("store", Order = 12, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("store", Order = 13, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonOldResourceUrlConverter))]
public Uri store;
- [JsonProperty("steamstore", Order = 13, NullValueHandling = NullValueHandling.Ignore)]
+ [JsonProperty("steamstore", Order = 14, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(JsonOldResourceUrlConverter))]
public Uri steamstore;
}
diff --git a/GUI/Controls/ModInfoTabs/Metadata.cs b/GUI/Controls/ModInfoTabs/Metadata.cs
index ef9fbcc63b..d12866c33d 100644
--- a/GUI/Controls/ModInfoTabs/Metadata.cs
+++ b/GUI/Controls/ModInfoTabs/Metadata.cs
@@ -78,6 +78,7 @@ public void UpdateModInfo(GUIMod gui_module)
AddResourceLink(Properties.Resources.ModInfoCurseLabel, res.curse);
AddResourceLink(Properties.Resources.ModInfoRepositoryLabel, res.repository);
AddResourceLink(Properties.Resources.ModInfoBugTrackerLabel, res.bugtracker);
+ AddResourceLink(Properties.Resources.ModInfoDiscussionsLabel, res.discussions);
AddResourceLink(Properties.Resources.ModInfoContinuousIntegrationLabel, res.ci);
AddResourceLink(Properties.Resources.ModInfoLicenseLabel, res.license);
AddResourceLink(Properties.Resources.ModInfoManualLabel, res.manual);
diff --git a/GUI/Properties/Resources.resx b/GUI/Properties/Resources.resx
index d502b0bb41..81dc61781d 100644
--- a/GUI/Properties/Resources.resx
+++ b/GUI/Properties/Resources.resx
@@ -280,6 +280,7 @@ If you suspect a bug in the client: https://github.com/KSP-CKAN/CKAN/issues/new/
Curse:
Repository:
Bug tracker:
+ Discussions:
Continuous integration:
Licence:
Manual:
diff --git a/Netkan/Sources/Github/GithubRepo.cs b/Netkan/Sources/Github/GithubRepo.cs
index cbc6e62b79..b69ab463b1 100644
--- a/Netkan/Sources/Github/GithubRepo.cs
+++ b/Netkan/Sources/Github/GithubRepo.cs
@@ -34,6 +34,9 @@ public sealed class GithubRepo
[JsonProperty("has_issues")]
public bool HasIssues { get; set; }
+ [JsonProperty("has_discussions")]
+ public bool HasDiscussions { get; set; }
+
[JsonProperty("archived")]
public bool Archived { get; set; }
}
diff --git a/Netkan/Transformers/GithubTransformer.cs b/Netkan/Transformers/GithubTransformer.cs
index 00582dd384..5c4788d6ef 100644
--- a/Netkan/Transformers/GithubTransformer.cs
+++ b/Netkan/Transformers/GithubTransformer.cs
@@ -154,18 +154,9 @@ private Metadata TransformOne(
{
json["resources"] = new JObject();
}
-
- var resourcesJson = (JObject)json["resources"];
-
- if (!string.IsNullOrWhiteSpace(ghRepo.Homepage))
+ if (json["resources"] is JObject resourcesJson)
{
- resourcesJson.SafeAdd("homepage", ghRepo.Homepage);
- }
-
- resourcesJson.SafeAdd("repository", ghRepo.HtmlUrl);
- if (ghRepo.HasIssues)
- {
- resourcesJson.SafeAdd("bugtracker", $"{ghRepo.HtmlUrl}/issues");
+ SetRepoResources(ghRepo, resourcesJson);
}
if (ghRelease != null)
@@ -219,6 +210,23 @@ private Metadata TransformOne(
}
}
+ public static void SetRepoResources(GithubRepo repo, JObject resources)
+ {
+ resources.SafeAdd("repository", repo.HtmlUrl);
+ if (!string.IsNullOrWhiteSpace(repo.Homepage))
+ {
+ resources.SafeAdd("homepage", repo.Homepage);
+ }
+ if (repo.HasIssues)
+ {
+ resources.SafeAdd("bugtracker", $"{repo.HtmlUrl}/issues");
+ }
+ if (repo.HasDiscussions)
+ {
+ resources.SafeAdd("discussions", $"{repo.HtmlUrl}/discussions");
+ }
+ }
+
private JToken getAuthors(GithubRepo repo, GithubRelease release)
{
// Start with the user that published the release
diff --git a/Netkan/Transformers/SpacedockTransformer.cs b/Netkan/Transformers/SpacedockTransformer.cs
index 2759feb1c8..a3d3106210 100644
--- a/Netkan/Transformers/SpacedockTransformer.cs
+++ b/Netkan/Transformers/SpacedockTransformer.cs
@@ -152,17 +152,7 @@ private Metadata TransformOne(Metadata metadata, JObject json, SpacedockMod sdMo
$"#/ckan/github/{owner}/{repo}", false, false
));
- if (sdMod.source_code != repoInfo.HtmlUrl)
- {
- TryAddResourceURL(metadata.Identifier, resourcesJson, "repository", repoInfo.HtmlUrl);
- }
- // Fall back to homepage from GitHub
- TryAddResourceURL(metadata.Identifier, resourcesJson, "homepage", repoInfo.Homepage);
- if (repoInfo.HasIssues)
- {
- // Set bugtracker if repo has issues list
- TryAddResourceURL(metadata.Identifier, resourcesJson, "bugtracker", $"{repoInfo.HtmlUrl}/issues");
- }
+ GithubTransformer.SetRepoResources(repoInfo, resourcesJson);
if (repoInfo.Archived)
{
Log.Warn("Repo is archived, consider freezing");
diff --git a/Spec.md b/Spec.md
index 192c017cde..d11d7f9a22 100644
--- a/Spec.md
+++ b/Spec.md
@@ -640,6 +640,7 @@ are described. Unless specified otherwise, these are URLs:
- `homepage` : The preferred landing page for the mod.
- `bugtracker` : The mod's bugtracker if it exists.
+- `discussions` : The mod's discussions page if it exists.
- `license` : The mod's license.
- `repository` : The repository where the module source can be found.
- `ci` : (**v1.6**) Continuous Integration (e.g. Jenkins) Server where the module is being built. `x_ci` is an alias used in netkan.