-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlayerPreferenceService.cs
More file actions
156 lines (133 loc) · 4.79 KB
/
Copy pathPlayerPreferenceService.cs
File metadata and controls
156 lines (133 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using System.Collections.Concurrent;
using CounterStrikeSharp.API.Core;
using PlayerSettings;
namespace EntBossHP
{
public sealed class PlayerPreferenceService(
Func<ISettingsApi?> settingsApiProvider,
bool hudEnabledByDefault,
Func<CCSPlayerController, ulong?>? steamIdProvider = null)
{
public const string HudEnabledSettingName = "entbosshp.hud_enabled";
private const string EnabledValue = "1";
private const string DisabledValue = "0";
private readonly ConcurrentDictionary<(ulong SteamId, string SettingName), string> _runtimeValues = new();
private readonly Func<CCSPlayerController, ulong?> _steamIdProvider = steamIdProvider ?? TryGetSteamId;
public bool IsHudEnabled(CCSPlayerController player)
{
return GetBoolean(player, HudEnabledSettingName, hudEnabledByDefault);
}
public bool ToggleHud(CCSPlayerController player)
{
var enabled = !IsHudEnabled(player);
SetHudEnabled(player, enabled);
return enabled;
}
public void SetHudEnabled(CCSPlayerController player, bool enabled)
{
SetBoolean(player, HudEnabledSettingName, enabled);
}
private bool GetBoolean(CCSPlayerController player, string settingName, bool defaultValue)
{
if (TryGetRuntimeValue(player, settingName, out var runtimeValue))
return ParseBoolean(runtimeValue, defaultValue);
var settingsApi = GetSettingsApi();
if (settingsApi is null)
return defaultValue;
try
{
var storedValue = settingsApi.GetPlayerSettingsValue(player, settingName, ToStoredValue(defaultValue));
return ParseBoolean(storedValue, defaultValue);
}
catch (Exception)
{
return defaultValue;
}
}
private void SetBoolean(CCSPlayerController player, string settingName, bool enabled)
{
var storedValue = ToStoredValue(enabled);
SetRuntimeValue(player, settingName, storedValue);
try
{
GetSettingsApi()?.SetPlayerSettingsValue(player, settingName, storedValue);
}
catch (Exception)
{
}
}
private ISettingsApi? GetSettingsApi()
{
ISettingsApi? settingsApi;
try
{
settingsApi = settingsApiProvider();
}
catch (KeyNotFoundException)
{
return null;
}
catch (InvalidOperationException)
{
return null;
}
if (settingsApi is null)
return null;
return settingsApi;
}
private static string ToStoredValue(bool enabled)
{
return enabled ? EnabledValue : DisabledValue;
}
private bool TryGetRuntimeValue(CCSPlayerController player, string settingName, out string value)
{
var steamId = GetSteamId(player);
if (steamId is not { } resolvedSteamId)
{
value = "";
return false;
}
return _runtimeValues.TryGetValue((resolvedSteamId, settingName), out value!);
}
private void SetRuntimeValue(CCSPlayerController player, string settingName, string value)
{
var steamId = GetSteamId(player);
if (steamId is { } resolvedSteamId)
_runtimeValues[(resolvedSteamId, settingName)] = value;
}
private ulong? GetSteamId(CCSPlayerController player)
{
try
{
return _steamIdProvider(player);
}
catch (Exception)
{
return null;
}
}
private static ulong? TryGetSteamId(CCSPlayerController player)
{
if (player is null || !player.IsValid)
return null;
var steamId64 = player.AuthorizedSteamID?.SteamId64;
if (steamId64 is null or <= 76561197960265728UL) return null;
return steamId64;
}
private static bool ParseBoolean(string? value, bool defaultValue)
{
if (string.IsNullOrWhiteSpace(value))
return defaultValue;
return value.Trim().ToLowerInvariant() switch
{
"1" or "true" or "yes" or "on" => true,
"0" or "false" or "no" or "off" => false,
_ => defaultValue
};
}
public void Remove(ulong steamId64)
{
_runtimeValues.TryRemove((steamId64, HudEnabledSettingName), out _);
}
}
}