diff --git a/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs b/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs
index 73fcb4f5e5..85a1c6ddb5 100644
--- a/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs
+++ b/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs
@@ -12,7 +12,7 @@ public sealed partial class AdminMenuWindow : DefaultWindow
public AdminMenuWindow()
{
- MinSize = new Vector2(650, 250);
+ MinSize = new Vector2(650, 280);
Title = Loc.GetString("admin-menu-title");
RobustXamlLoader.Load(this);
MasterTabContainer.SetTabTitle((int) TabIndex.Admin, Loc.GetString("admin-menu-admin-tab"));
diff --git a/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml b/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml
index ee7ba4d34f..9e7da74111 100644
--- a/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml
+++ b/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml
@@ -27,6 +27,11 @@
+
+
+
+
diff --git a/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml.cs b/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml.cs
index c3bcf3ffa0..08ce1231ee 100644
--- a/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml.cs
+++ b/Content.Client/Administration/UI/Tabs/PanicBunkerTab/PanicBunkerTab.xaml.cs
@@ -1,7 +1,9 @@
using Content.Shared.Administration.Events;
+using Content.Shared.CCVar;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Configuration;
using Robust.Shared.Console;
namespace Content.Client.Administration.UI.Tabs.PanicBunkerTab;
@@ -10,9 +12,13 @@ namespace Content.Client.Administration.UI.Tabs.PanicBunkerTab;
public sealed partial class PanicBunkerTab : Control
{
[Dependency] private readonly IConsoleHost _console = default!;
+ [Dependency] private readonly IConfigurationManager _cfg = default!;
private string _minAccountAge;
private string _minOverallMinutes;
+ // CrystallEdge suspicious activity warning system
+ private List _suspiciousWarningLevelSelections = [];
+ private string _currentSuspiciousWarningLevel = string.Empty;
public PanicBunkerTab()
{
@@ -28,6 +34,21 @@ public sealed partial class PanicBunkerTab : Control
MinOverallMinutes.OnTextEntered += args => SendMinOverallMinutes(args.Text);
MinOverallMinutes.OnFocusExit += args => SendMinOverallMinutes(args.Text);
_minOverallMinutes = MinOverallMinutes.Text;
+
+ // CrystallEdge suspicious activity warning system
+ foreach (var type in Enum.GetValues())
+ {
+ _suspiciousWarningLevelSelections.Add(type);
+ SuspiciousWarningLevel.AddItem(GetLocalizedEnumValue(type));
+ }
+
+ UpdateSuspiciousWarningLevel();
+
+ SuspiciousWarningLevel.OnItemSelected += ev =>
+ {
+ SuspiciousWarningLevel.SelectId(ev.Id);
+ SendSuspiciousWarningLevel(_suspiciousWarningLevelSelections[ev.Id]);
+ };
}
private void SendMinAccountAge(string text)
@@ -74,4 +95,43 @@ public sealed partial class PanicBunkerTab : Control
MinOverallMinutes.Text = status.MinOverallMinutes.ToString();
_minOverallMinutes = MinOverallMinutes.Text;
}
+
+ // CrystallEdge suspicious activity warning system
+ private enum SuspiciousWarningLevelSelection
+ {
+ Disabled,
+ Low,
+ Medium,
+ High,
+ }
+
+ private string GetLocalizedEnumValue(SuspiciousWarningLevelSelection selection)
+ {
+ return selection switch
+ {
+ SuspiciousWarningLevelSelection.Disabled => Loc.GetString("cp14-admin-ui-suspicious-warning-level-disabled"),
+ SuspiciousWarningLevelSelection.Low => Loc.GetString("cp14-admin-ui-suspicious-warning-level-low"),
+ SuspiciousWarningLevelSelection.Medium => Loc.GetString("cp14-admin-ui-suspicious-warning-level-medium"),
+ SuspiciousWarningLevelSelection.High => Loc.GetString("cp14-admin-ui-suspicious-warning-level-high"),
+ _ => throw new ArgumentOutOfRangeException(nameof(selection), selection, null),
+ };
+ }
+
+ private void UpdateSuspiciousWarningLevel()
+ {
+ _currentSuspiciousWarningLevel = _cfg.GetCVar(CCVars.SuspiciousAccountsWarningLevel);
+ if (!Enum.TryParse(_currentSuspiciousWarningLevel, true, out SuspiciousWarningLevelSelection currentSuspiciousWarningSelection))
+ {
+ throw new ArgumentOutOfRangeException(nameof(_currentSuspiciousWarningLevel),
+ _currentSuspiciousWarningLevel,
+ null);
+ }
+
+ SuspiciousWarningLevel.SelectId((int)currentSuspiciousWarningSelection);
+ }
+
+ private void SendSuspiciousWarningLevel(SuspiciousWarningLevelSelection selection)
+ {
+ _console.ExecuteCommand($"cp14.suspicious-warning-level {Enum.GetName(selection)}");
+ }
}
diff --git a/Content.Server/_CP14/Administration/Commands/SuspiciousLevelCommand.cs b/Content.Server/_CP14/Administration/Commands/SuspiciousLevelCommand.cs
new file mode 100644
index 0000000000..8324c50ffc
--- /dev/null
+++ b/Content.Server/_CP14/Administration/Commands/SuspiciousLevelCommand.cs
@@ -0,0 +1,40 @@
+using Content.Server.Administration;
+using Content.Shared.Administration;
+using Content.Shared.CCVar;
+using Robust.Shared.Configuration;
+using Robust.Shared.Console;
+
+namespace Content.Server._CP14.Administration.Commands;
+
+[AdminCommand(AdminFlags.Server)]
+public sealed class SuspiciousLevelCommand : LocalizedCommands
+{
+ [Dependency] private readonly IConfigurationManager _cfg = default!;
+
+ public override string Command => "cp14.suspicious-warning-level";
+
+ public override void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (args.Length == 0)
+ {
+ var level = _cfg.GetCVar(CCVars.SuspiciousAccountsWarningLevel);
+ shell.WriteLine(Loc.GetString("cp14-suspicious-warning-level-command-current", ("level", level)));
+ }
+
+ if (args.Length > 1)
+ {
+ shell.WriteError(Loc.GetString("shell-need-between-arguments",("lower", 0), ("upper", 1)));
+ return;
+ }
+
+ List possibleLevels = ["disabled", "low", "medium", "high"];
+ if (!possibleLevels.Contains(args[0].ToLower()))
+ {
+ shell.WriteError(Loc.GetString("cp14-suspicious-warning-level-command-error"));
+ return;
+ }
+
+ _cfg.SetCVar(CCVars.SuspiciousAccountsWarningLevel, args[0]);
+ shell.WriteLine(Loc.GetString("cp14-suspicious-warning-level-command-set", ("level", args[0])));
+ }
+}
diff --git a/Content.Server/_CP14/Discord/DiscordAuthManager.cs b/Content.Server/_CP14/Discord/DiscordAuthManager.cs
index b47862e637..ef00e9b9d9 100644
--- a/Content.Server/_CP14/Discord/DiscordAuthManager.cs
+++ b/Content.Server/_CP14/Discord/DiscordAuthManager.cs
@@ -10,7 +10,6 @@ using Content.Server.Database;
using Content.Shared._CP14.Discord;
using Content.Shared.CCVar;
using Robust.Server.Player;
-using Robust.Shared;
using Robust.Shared.Configuration;
using Robust.Shared.Enums;
using Robust.Shared.Network;
@@ -178,9 +177,11 @@ public sealed class DiscordAuthManager
switch (_suspiciousAccountsWarningLevel)
{
case "medium":
+ {
if (_panicBunkerEnabled)
{
- var errorMessage = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String("RXJyb3IgMjcwMQ=="));
+ var errorMessage =
+ System.Text.Encoding.UTF8.GetString(Convert.FromBase64String("RXJyb3IgMjcwMQ=="));
if (_panicBunkerShowReason)
{
errorMessage = "Panic bunker enabled";
@@ -189,16 +190,20 @@ public sealed class DiscordAuthManager
errorMessage = _panicBunkerCustomReason;
}
}
- return new AuthData { Verified = false, ErrorMessage = errorMessage };
- }
- break;
+ return new AuthData { Verified = false, ErrorMessage = errorMessage };
+ }
+
+ break;
+ }
case "high":
+ {
return new AuthData
{
Verified = false,
ErrorMessage = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String("RXJyb3IgMjcwMQ=="))
};
+ }
}
return new AuthData { Verified = true, Suspicious = isSuspicious };
diff --git a/Content.Shared/_CP14/CCvar/CCvars.CP14DiscordAuth.cs b/Content.Shared/_CP14/CCvar/CCvars.CP14DiscordAuth.cs
index f9d8c32521..1f6855e661 100644
--- a/Content.Shared/_CP14/CCvar/CCvars.CP14DiscordAuth.cs
+++ b/Content.Shared/_CP14/CCvar/CCvars.CP14DiscordAuth.cs
@@ -14,5 +14,5 @@ public sealed partial class CCVars
CVarDef.Create("cp14.discord_auth_token", "token", CVar.SERVERONLY | CVar.CONFIDENTIAL);
public static readonly CVarDef SuspiciousAccountsWarningLevel =
- CVarDef.Create("cp14.suspicious_accounts_warning_level", "disabled", CVar.SERVERONLY, "Can be: disabled, low, medium, high");
+ CVarDef.Create("cp14.suspicious_accounts_warning_level", "disabled", CVar.SERVER, "Can be: disabled, low, medium, high");
}
diff --git a/Resources/Locale/en-US/_CP14/administration/commands/suspiciouswarninglevel.ftl b/Resources/Locale/en-US/_CP14/administration/commands/suspiciouswarninglevel.ftl
new file mode 100644
index 0000000000..4e733f11d9
--- /dev/null
+++ b/Resources/Locale/en-US/_CP14/administration/commands/suspiciouswarninglevel.ftl
@@ -0,0 +1,3 @@
+cp14-suspicious-warning-level-command-error = Warning level can be only disabled, low, medium or high
+cp14-suspicious-warning-level-command-current = Current warning level is {$level}
+cp14-suspicious-warning-level-command-set = Warning level set to {$level}
\ No newline at end of file
diff --git a/Resources/Locale/en-US/_CP14/administration/ui/tabs/suspicious.ftl b/Resources/Locale/en-US/_CP14/administration/ui/tabs/suspicious.ftl
new file mode 100644
index 0000000000..5b273fafd8
--- /dev/null
+++ b/Resources/Locale/en-US/_CP14/administration/ui/tabs/suspicious.ftl
@@ -0,0 +1,6 @@
+cp14-admin-ui-suspicious-warning-level-setting = Warning level
+cp14-admin-ui-suspicious-warning-level-setting-desc = Level of response to players with suspicious discord accounts
+cp14-admin-ui-suspicious-warning-level-disabled = Disabled
+cp14-admin-ui-suspicious-warning-level-low = Low
+cp14-admin-ui-suspicious-warning-level-medium = Medium
+cp14-admin-ui-suspicious-warning-level-high = High
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/_CP14/administration/commands/suspiciouswarninglevel.ftl b/Resources/Locale/ru-RU/_CP14/administration/commands/suspiciouswarninglevel.ftl
new file mode 100644
index 0000000000..b38881a52f
--- /dev/null
+++ b/Resources/Locale/ru-RU/_CP14/administration/commands/suspiciouswarninglevel.ftl
@@ -0,0 +1,3 @@
+cp14-suspicious-warning-level-command-error = Уровень тревоги может быть только disabled, low, medium или high
+cp14-suspicious-warning-level-command-current = Текущий уровень тревоги {$level}
+cp14-suspicious-warning-level-command-set = Уровень тревоги установлен на {$level}
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/administration/ui/tabs/suspicious.ftl b/Resources/Locale/ru-RU/administration/ui/tabs/suspicious.ftl
new file mode 100644
index 0000000000..7e5c266af5
--- /dev/null
+++ b/Resources/Locale/ru-RU/administration/ui/tabs/suspicious.ftl
@@ -0,0 +1,6 @@
+cp14-admin-ui-suspicious-warning-level-setting = Уровень тревоги
+cp14-admin-ui-suspicious-warning-level-setting-desc = Уровень реакции на игроков с подозрительными дискорд аккаунтами
+cp14-admin-ui-suspicious-warning-level-disabled = Нет
+cp14-admin-ui-suspicious-warning-level-low = Низкий
+cp14-admin-ui-suspicious-warning-level-medium = Средний
+cp14-admin-ui-suspicious-warning-level-high = Высокий
\ No newline at end of file