Launcher info links. (#12781)
This commit is contained in:
committed by
GitHub
parent
083ef009d6
commit
a6045e4538
@@ -1,6 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Client.Links;
|
|
||||||
using Content.Client.Stylesheets;
|
using Content.Client.Stylesheets;
|
||||||
using Content.Shared.CCVar;
|
using Content.Shared.CCVar;
|
||||||
using Robust.Client.AutoGenerated;
|
using Robust.Client.AutoGenerated;
|
||||||
@@ -68,7 +67,8 @@ namespace Content.Client.Credits
|
|||||||
|
|
||||||
// Do not show "become a patron" button on Steam builds
|
// Do not show "become a patron" button on Steam builds
|
||||||
// since Patreon violates Valve's rules about alternative storefronts.
|
// since Patreon violates Valve's rules about alternative storefronts.
|
||||||
if (!_cfg.GetCVar(CCVars.BrandingSteam))
|
var linkPatreon = _cfg.GetCVar(CCVars.InfoLinksPatreon);
|
||||||
|
if (!_cfg.GetCVar(CCVars.BrandingSteam) && linkPatreon != "")
|
||||||
{
|
{
|
||||||
Button patronButton;
|
Button patronButton;
|
||||||
patronsContainer.AddChild(patronButton = new Button
|
patronsContainer.AddChild(patronButton = new Button
|
||||||
@@ -78,7 +78,7 @@ namespace Content.Client.Credits
|
|||||||
});
|
});
|
||||||
|
|
||||||
patronButton.OnPressed +=
|
patronButton.OnPressed +=
|
||||||
_ => IoCManager.Resolve<IUriOpener>().OpenUri(UILinks.Patreon);
|
_ => IoCManager.Resolve<IUriOpener>().OpenUri(linkPatreon);
|
||||||
}
|
}
|
||||||
|
|
||||||
var first = true;
|
var first = true;
|
||||||
@@ -158,8 +158,13 @@ namespace Content.Client.Credits
|
|||||||
AddSection(Loc.GetString("credits-window-original-remake-team-section-title"), "OriginalRemake.txt");
|
AddSection(Loc.GetString("credits-window-original-remake-team-section-title"), "OriginalRemake.txt");
|
||||||
AddSection(Loc.GetString("credits-window-special-thanks-section-title"), "SpecialThanks.txt", true);
|
AddSection(Loc.GetString("credits-window-special-thanks-section-title"), "SpecialThanks.txt", true);
|
||||||
|
|
||||||
|
var linkGithub = _cfg.GetCVar(CCVars.InfoLinksGithub);
|
||||||
|
|
||||||
contributeButton.OnPressed += _ =>
|
contributeButton.OnPressed += _ =>
|
||||||
IoCManager.Resolve<IUriOpener>().OpenUri(UILinks.GitHub);
|
IoCManager.Resolve<IUriOpener>().OpenUri(linkGithub);
|
||||||
|
|
||||||
|
if (linkGithub == "")
|
||||||
|
contributeButton.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class PatronEntry
|
private sealed class PatronEntry
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
using Content.Client.Changelog;
|
using Content.Client.Changelog;
|
||||||
using Content.Client.Credits;
|
using Content.Client.Credits;
|
||||||
using Content.Client.Links;
|
using Content.Shared.CCVar;
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Localization;
|
using Robust.Shared.Localization;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
@@ -19,13 +20,18 @@ namespace Content.Client.Info
|
|||||||
AddChild(buttons);
|
AddChild(buttons);
|
||||||
|
|
||||||
var uriOpener = IoCManager.Resolve<IUriOpener>();
|
var uriOpener = IoCManager.Resolve<IUriOpener>();
|
||||||
|
var cfg = IoCManager.Resolve<IConfigurationManager>();
|
||||||
|
|
||||||
var reportButton = new Button {Text = Loc.GetString("server-info-report-button")};
|
var bugReport = cfg.GetCVar(CCVars.InfoLinksBugReport);
|
||||||
reportButton.OnPressed += args => uriOpener.OpenUri(UILinks.BugReport);
|
if (bugReport != "")
|
||||||
|
{
|
||||||
|
var reportButton = new Button {Text = Loc.GetString("server-info-report-button")};
|
||||||
|
reportButton.OnPressed += args => uriOpener.OpenUri(bugReport);
|
||||||
|
buttons.AddChild(reportButton);
|
||||||
|
}
|
||||||
|
|
||||||
var creditsButton = new Button {Text = Loc.GetString("server-info-credits-button")};
|
var creditsButton = new Button {Text = Loc.GetString("server-info-credits-button")};
|
||||||
creditsButton.OnPressed += args => new CreditsWindow().Open();
|
creditsButton.OnPressed += args => new CreditsWindow().Open();
|
||||||
buttons.AddChild(reportButton);
|
|
||||||
buttons.AddChild(creditsButton);
|
buttons.AddChild(creditsButton);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
using Content.Client.Changelog;
|
using Content.Client.Changelog;
|
||||||
using Content.Client.Credits;
|
using Content.Client.Credits;
|
||||||
using Content.Client.Links;
|
|
||||||
using Content.Client.UserInterface.Systems.EscapeMenu;
|
using Content.Client.UserInterface.Systems.EscapeMenu;
|
||||||
|
using Content.Shared.CCVar;
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Localization;
|
using Robust.Shared.Localization;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
@@ -21,25 +22,31 @@ namespace Content.Client.Info
|
|||||||
AddChild(buttons);
|
AddChild(buttons);
|
||||||
|
|
||||||
var uriOpener = IoCManager.Resolve<IUriOpener>();
|
var uriOpener = IoCManager.Resolve<IUriOpener>();
|
||||||
|
var cfg = IoCManager.Resolve<IConfigurationManager>();
|
||||||
|
|
||||||
var rulesButton = new Button() {Text = Loc.GetString("server-info-rules-button")};
|
var rulesButton = new Button() {Text = Loc.GetString("server-info-rules-button")};
|
||||||
rulesButton.OnPressed += args => new RulesAndInfoWindow().Open();
|
rulesButton.OnPressed += args => new RulesAndInfoWindow().Open();
|
||||||
|
buttons.AddChild(rulesButton);
|
||||||
|
|
||||||
var discordButton = new Button {Text = Loc.GetString("server-info-discord-button")};
|
AddInfoButton("server-info-discord-button", CCVars.InfoLinksDiscord);
|
||||||
discordButton.OnPressed += args => uriOpener.OpenUri(UILinks.Discord);
|
AddInfoButton("server-info-website-button", CCVars.InfoLinksWebsite);
|
||||||
|
AddInfoButton("server-info-wiki-button", CCVars.InfoLinksWiki);
|
||||||
|
AddInfoButton("server-info-forum-button", CCVars.InfoLinksForum);
|
||||||
|
|
||||||
var websiteButton = new Button {Text = Loc.GetString("server-info-website-button")};
|
|
||||||
websiteButton.OnPressed += args => uriOpener.OpenUri(UILinks.Website);
|
|
||||||
|
|
||||||
var wikiButton = new Button {Text = Loc.GetString("server-info-wiki-button")};
|
|
||||||
wikiButton.OnPressed += args => uriOpener.OpenUri(UILinks.Wiki);
|
|
||||||
var changelogButton = new ChangelogButton();
|
var changelogButton = new ChangelogButton();
|
||||||
changelogButton.OnPressed += args => UserInterfaceManager.GetUIController<ChangelogUIController>().ToggleWindow();
|
changelogButton.OnPressed += args => UserInterfaceManager.GetUIController<ChangelogUIController>().ToggleWindow();
|
||||||
buttons.AddChild(changelogButton);
|
buttons.AddChild(changelogButton);
|
||||||
buttons.AddChild(rulesButton);
|
|
||||||
buttons.AddChild(discordButton);
|
void AddInfoButton(string loc, CVarDef<string> cVar)
|
||||||
buttons.AddChild(websiteButton);
|
{
|
||||||
buttons.AddChild(wikiButton);
|
var link = cfg.GetCVar(cVar);
|
||||||
|
if (link == "")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var button = new Button { Text = Loc.GetString(loc) };
|
||||||
|
button.OnPressed += _ => uriOpener.OpenUri(link);
|
||||||
|
buttons.AddChild(button);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using Content.Client.Changelog;
|
using Content.Client.Changelog;
|
||||||
using Content.Client.Credits;
|
using Content.Client.Credits;
|
||||||
using Content.Client.Links;
|
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
namespace Content.Client.Links
|
|
||||||
{
|
|
||||||
public static class UILinks
|
|
||||||
{
|
|
||||||
public const string GitHub = "https://github.com/space-wizards/space-station-14/";
|
|
||||||
public const string Patreon = "https://www.patreon.com/spacestation14";
|
|
||||||
|
|
||||||
public const string Discord = "https://discord.ss14.io/";
|
|
||||||
public const string BugReport = "https://github.com/space-wizards/space-station-14/issues/new/choose";
|
|
||||||
public const string Website = "https://spacestation14.io";
|
|
||||||
public const string Wiki = "https://wiki.spacestation14.io";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
using Content.Client.Gameplay;
|
using Content.Client.Gameplay;
|
||||||
using Content.Client.Info;
|
using Content.Client.Info;
|
||||||
using Content.Client.Links;
|
|
||||||
using Content.Client.UserInterface.Controls;
|
using Content.Client.UserInterface.Controls;
|
||||||
using Content.Client.UserInterface.Systems.Info;
|
using Content.Client.UserInterface.Systems.Info;
|
||||||
|
using Content.Shared.CCVar;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Robust.Client.Console;
|
using Robust.Client.Console;
|
||||||
using Robust.Client.Input;
|
using Robust.Client.Input;
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controllers;
|
using Robust.Client.UserInterface.Controllers;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
using Robust.Shared.Input;
|
using Robust.Shared.Input;
|
||||||
using Robust.Shared.Input.Binding;
|
using Robust.Shared.Input.Binding;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
@@ -20,6 +21,7 @@ public sealed class EscapeUIController : UIController, IOnStateEntered<GameplayS
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IClientConsoleHost _console = default!;
|
[Dependency] private readonly IClientConsoleHost _console = default!;
|
||||||
[Dependency] private readonly IUriOpener _uri = default!;
|
[Dependency] private readonly IUriOpener _uri = default!;
|
||||||
|
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||||
[Dependency] private readonly ChangelogUIController _changelog = default!;
|
[Dependency] private readonly ChangelogUIController _changelog = default!;
|
||||||
[Dependency] private readonly InfoUIController _info = default!;
|
[Dependency] private readonly InfoUIController _info = default!;
|
||||||
[Dependency] private readonly OptionsUIController _options = default!;
|
[Dependency] private readonly OptionsUIController _options = default!;
|
||||||
@@ -93,9 +95,12 @@ public sealed class EscapeUIController : UIController, IOnStateEntered<GameplayS
|
|||||||
|
|
||||||
_escapeWindow.WikiButton.OnPressed += _ =>
|
_escapeWindow.WikiButton.OnPressed += _ =>
|
||||||
{
|
{
|
||||||
_uri.OpenUri(UILinks.Wiki);
|
_uri.OpenUri(_cfg.GetCVar(CCVars.InfoLinksWiki));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Hide wiki button if we don't have a link for it.
|
||||||
|
_escapeWindow.WikiButton.Visible = _cfg.GetCVar(CCVars.InfoLinksWiki) != "";
|
||||||
|
|
||||||
CommandBinds.Builder
|
CommandBinds.Builder
|
||||||
.Bind(EngineKeyFunctions.EscapeMenu,
|
.Bind(EngineKeyFunctions.EscapeMenu,
|
||||||
InputCmdHandler.FromDelegate(_ => ToggleWindow()))
|
InputCmdHandler.FromDelegate(_ => ToggleWindow()))
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ using Content.Server.Maps;
|
|||||||
using Content.Server.NodeContainer.NodeGroups;
|
using Content.Server.NodeContainer.NodeGroups;
|
||||||
using Content.Server.Players.PlayTimeTracking;
|
using Content.Server.Players.PlayTimeTracking;
|
||||||
using Content.Server.Preferences.Managers;
|
using Content.Server.Preferences.Managers;
|
||||||
|
using Content.Server.ServerInfo;
|
||||||
using Content.Server.ServerUpdates;
|
using Content.Server.ServerUpdates;
|
||||||
using Content.Server.Voting.Managers;
|
using Content.Server.Voting.Managers;
|
||||||
using Content.Shared.Administration;
|
using Content.Shared.Administration;
|
||||||
@@ -96,6 +97,7 @@ namespace Content.Server.Entry
|
|||||||
IoCManager.Resolve<IGamePrototypeLoadManager>().Initialize();
|
IoCManager.Resolve<IGamePrototypeLoadManager>().Initialize();
|
||||||
IoCManager.Resolve<NetworkResourceManager>().Initialize();
|
IoCManager.Resolve<NetworkResourceManager>().Initialize();
|
||||||
IoCManager.Resolve<GhostKickManager>().Initialize();
|
IoCManager.Resolve<GhostKickManager>().Initialize();
|
||||||
|
IoCManager.Resolve<ServerInfoManager>().Initialize();
|
||||||
|
|
||||||
_voteManager.Initialize();
|
_voteManager.Initialize();
|
||||||
_updateManager.Initialize();
|
_updateManager.Initialize();
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ using Content.Server.Objectives;
|
|||||||
using Content.Server.Objectives.Interfaces;
|
using Content.Server.Objectives.Interfaces;
|
||||||
using Content.Server.Players.PlayTimeTracking;
|
using Content.Server.Players.PlayTimeTracking;
|
||||||
using Content.Server.Preferences.Managers;
|
using Content.Server.Preferences.Managers;
|
||||||
|
using Content.Server.ServerInfo;
|
||||||
using Content.Server.ServerUpdates;
|
using Content.Server.ServerUpdates;
|
||||||
using Content.Server.Voting.Managers;
|
using Content.Server.Voting.Managers;
|
||||||
using Content.Shared.Administration;
|
using Content.Shared.Administration;
|
||||||
@@ -55,6 +56,7 @@ namespace Content.Server.IoC
|
|||||||
IoCManager.Register<IAdminLogManager, AdminLogManager>();
|
IoCManager.Register<IAdminLogManager, AdminLogManager>();
|
||||||
IoCManager.Register<PlayTimeTrackingManager>();
|
IoCManager.Register<PlayTimeTrackingManager>();
|
||||||
IoCManager.Register<UserDbDataManager>();
|
IoCManager.Register<UserDbDataManager>();
|
||||||
|
IoCManager.Register<ServerInfoManager>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
44
Content.Server/ServerInfo/ServerInfoManager.cs
Normal file
44
Content.Server/ServerInfo/ServerInfoManager.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
using System.Text.Json.Nodes;
|
||||||
|
using Content.Shared.CCVar;
|
||||||
|
using Robust.Server.ServerStatus;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
|
|
||||||
|
namespace Content.Server.ServerInfo;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds additional data like info links to the server info endpoint
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ServerInfoManager
|
||||||
|
{
|
||||||
|
private static readonly (CVarDef<string> cVar, string icon, string name)[] Vars =
|
||||||
|
{
|
||||||
|
// @formatter:off
|
||||||
|
(CCVars.InfoLinksDiscord, "discord", "info-link-discord"),
|
||||||
|
(CCVars.InfoLinksForum, "forum", "info-link-forum"),
|
||||||
|
(CCVars.InfoLinksGithub, "github", "info-link-github"),
|
||||||
|
(CCVars.InfoLinksWebsite, "web", "info-link-website"),
|
||||||
|
(CCVars.InfoLinksWiki, "wiki", "info-link-wiki")
|
||||||
|
// @formatter:on
|
||||||
|
};
|
||||||
|
|
||||||
|
[Dependency] private readonly IStatusHost _statusHost = default!;
|
||||||
|
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||||
|
[Dependency] private readonly ILocalizationManager _loc = default!;
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
_statusHost.OnInfoRequest += OnInfoRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInfoRequest(JsonNode json)
|
||||||
|
{
|
||||||
|
foreach (var (cVar, icon, name) in Vars)
|
||||||
|
{
|
||||||
|
var url = _cfg.GetCVar(cVar);
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
StatusHostHelpers.AddLink(json, _loc.GetString(name), url, icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1348,5 +1348,51 @@ namespace Content.Shared.CCVar
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly CVarDef<float>
|
public static readonly CVarDef<float>
|
||||||
PlayTimeSaveInterval = CVarDef.Create("playtime.save_interval", 900f, CVar.SERVERONLY);
|
PlayTimeSaveInterval = CVarDef.Create("playtime.save_interval", 900f, CVar.SERVERONLY);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* INFOLINKS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link to Discord server to show in the launcher.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<string> InfoLinksDiscord =
|
||||||
|
CVarDef.Create("infolinks.discord", "", CVar.SERVER | CVar.REPLICATED);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link to website to show in the launcher.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<string> InfoLinksForum =
|
||||||
|
CVarDef.Create("infolinks.forum", "", CVar.SERVER | CVar.REPLICATED);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link to GitHub page to show in the launcher.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<string> InfoLinksGithub =
|
||||||
|
CVarDef.Create("infolinks.github", "", CVar.SERVER | CVar.REPLICATED);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link to website to show in the launcher.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<string> InfoLinksWebsite =
|
||||||
|
CVarDef.Create("infolinks.website", "", CVar.SERVER | CVar.REPLICATED);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link to wiki to show in the launcher.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<string> InfoLinksWiki =
|
||||||
|
CVarDef.Create("infolinks.wiki", "", CVar.SERVER | CVar.REPLICATED);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link to Patreon. Not shown in the launcher currently.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<string> InfoLinksPatreon =
|
||||||
|
CVarDef.Create("infolinks.patreon", "", CVar.SERVER | CVar.REPLICATED);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link to the bug report form.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<string> InfoLinksBugReport =
|
||||||
|
CVarDef.Create("infolinks.bug_report", "", CVar.SERVER | CVar.REPLICATED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,5 +2,6 @@ server-info-rules-button = Rules
|
|||||||
server-info-discord-button = Discord
|
server-info-discord-button = Discord
|
||||||
server-info-website-button = Website
|
server-info-website-button = Website
|
||||||
server-info-wiki-button = Wiki
|
server-info-wiki-button = Wiki
|
||||||
|
server-info-forum-button = Forum
|
||||||
server-info-report-button = Report Bugs
|
server-info-report-button = Report Bugs
|
||||||
server-info-credits-button = Credits
|
server-info-credits-button = Credits
|
||||||
|
|||||||
7
Resources/Locale/en-US/server-info/info-links.ftl
Normal file
7
Resources/Locale/en-US/server-info/info-links.ftl
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
### Strings for link buttons shown in the launcher's server description.
|
||||||
|
|
||||||
|
info-link-discord = Discord
|
||||||
|
info-link-forum = Forum
|
||||||
|
info-link-github = GitHub
|
||||||
|
info-link-website = Website
|
||||||
|
info-link-wiki = Wiki
|
||||||
Reference in New Issue
Block a user