Show rules on first connection (#5715)

* Implement showing rules on first connection

* Clean up RulesManager

* Change changelog and rules unread to use CVars

* Fix missing change

* Rename InfoWindow to RulesAndInfoWindow

* Change default server.id to unknown

* Fix invalid file contents and getting CVar
This commit is contained in:
ShadowCommander
2021-12-09 14:22:49 -08:00
committed by GitHub
parent ceca68236c
commit b3a4e3f557
9 changed files with 102 additions and 17 deletions

View File

@@ -15,13 +15,14 @@ using static Robust.Client.UserInterface.Controls.BoxContainer;
namespace Content.Client.Info
{
public sealed class InfoWindow : SS14Window
public sealed class RulesAndInfoWindow : SS14Window
{
[Dependency] private readonly RulesManager _rulesManager = default!;
[Dependency] private readonly IResourceCache _resourceManager = default!;
private OptionsMenu optionsMenu;
public InfoWindow()
public RulesAndInfoWindow()
{
IoCManager.InjectDependencies(this);
@@ -163,6 +164,13 @@ namespace Content.Client.Info
optionsMenu.OpenCentered();
}
protected override void Opened()
{
base.Opened();
_rulesManager.SaveLastReadTime();
}
private static IEnumerable<string> Lines(TextReader reader)
{
while (true)

View File

@@ -0,0 +1,55 @@
using System;
using System.Globalization;
using System.IO;
using Content.Client.HUD;
using Content.Shared.CCVar;
using Robust.Shared.Configuration;
using Robust.Shared.ContentPack;
using Robust.Shared.IoC;
using Robust.Shared.Network;
using Robust.Shared.Utility;
namespace Content.Client.Info;
public sealed class RulesManager
{
[Dependency] private readonly IClientNetManager _clientNetManager = default!;
[Dependency] private readonly IResourceManager _resource = default!;
[Dependency] private readonly IConfigurationManager _configManager = default!;
public event Action? OpenRulesAndInfoWindow;
private void OnConnectStateChanged(ClientConnectionState state)
{
if (state != ClientConnectionState.Connected)
return;
var path = new ResourcePath($"/rules_last_seen_{_configManager.GetCVar(CCVars.ServerId)}");
var showRules = true;
if (_resource.UserData.Exists(path)
&& DateTime.TryParse(_resource.UserData.ReadAllText(path), null, DateTimeStyles.AssumeUniversal,
out var lastReadTime))
showRules = lastReadTime < DateTime.UtcNow - TimeSpan.FromDays(60);
else
SaveLastReadTime();
if (showRules)
OpenRulesAndInfoWindow?.Invoke();
}
/// <summary>
/// Ran when the user opens ("read") the rules, stores the new ID to disk.
/// </summary>
public void SaveLastReadTime()
{
using var file = _resource.UserData.Create(new ResourcePath($"/rules_last_seen_{_configManager.GetCVar(CCVars.ServerId)}"));
using var sw = new StreamWriter(file);
sw.Write(DateTime.UtcNow.ToUniversalTime());
}
public void Initialize()
{
_clientNetManager.ClientConnectStateChanged += OnConnectStateChanged;
}
}

View File

@@ -32,7 +32,7 @@ namespace Content.Client.Info
var uriOpener = IoCManager.Resolve<IUriOpener>();
var rulesButton = new Button() { Text = Loc.GetString("server-info-rules-button") };
rulesButton.OnPressed += args => new InfoWindow().Open();
rulesButton.OnPressed += args => new RulesAndInfoWindow().Open();
var discordButton = new Button {Text = Loc.GetString("server-info-discord-button") };
discordButton.OnPressed += args => uriOpener.OpenUri(UILinks.Discord);