Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add new command AdminToggle #785

Merged
merged 28 commits into from
Nov 16, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
0ab9dd4
add new command AdminToggle
Schrodinger71 Nov 13, 2024
52617ac
Логируем tippy
Schrodinger71 Nov 13, 2024
d77b214
улучшаем HideGhostWarp
Schrodinger71 Nov 14, 2024
2e6014d
Закрепляем Пермиссион права
Schrodinger71 Nov 14, 2024
b8e8c63
1984
Schrodinger71 Nov 14, 2024
d6c3040
С пермиссион не забанить..
Schrodinger71 Nov 14, 2024
228cf6c
Merge branch 'master' into new_admin_comand
Schrodinger71 Nov 14, 2024
b87c61a
ттут не надо
Schrodinger71 Nov 14, 2024
137d5ec
Merge branch 'new_admin_comand' of https://github.com/Schrodinger71/D…
Schrodinger71 Nov 14, 2024
47efd12
логирование на ghostkick
Schrodinger71 Nov 14, 2024
65057f3
comment
Schrodinger71 Nov 14, 2024
64646ef
фиксы
Schrodinger71 Nov 15, 2024
dbcf9d1
фиксы бана
Schrodinger71 Nov 15, 2024
5fdac4a
Merge branch 'master' into new_admin_comand
Schrodinger71 Nov 15, 2024
5ace881
wsw
Schrodinger71 Nov 15, 2024
84d803a
правки
Schrodinger71 Nov 15, 2024
acf1c0e
Merge branch 'new_admin_comand' of https://github.com/Schrodinger71/D…
Schrodinger71 Nov 15, 2024
0d616e3
Update BanPanelEui.cs
Schrodinger71 Nov 15, 2024
8b21ce9
fix?
Schrodinger71 Nov 15, 2024
b76814b
Merge branch 'new_admin_comand' of https://github.com/Schrodinger71/D…
Schrodinger71 Nov 15, 2024
d107736
ну?
Schrodinger71 Nov 15, 2024
bddfb46
тьфу
Schrodinger71 Nov 15, 2024
a89007d
так?
Schrodinger71 Nov 15, 2024
b0c8960
ы
Schrodinger71 Nov 16, 2024
fcf3fa3
ну давай?
Schrodinger71 Nov 16, 2024
a079231
syka
Schrodinger71 Nov 16, 2024
06f9dc7
И?
Schrodinger71 Nov 16, 2024
9c4f48b
финальная чистка кода, от комментариев и лишних юсингов
Schrodinger71 Nov 16, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions Content.Client/UserInterface/Systems/Info/InfoUIController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ public override void Initialize()
_netManager.RegisterNetMessage<RulesAcceptedMessage>();
_netManager.RegisterNetMessage<SendRulesInformationMessage>(OnRulesInformationMessage);

_consoleHost.RegisterCommand("fuckrules",
"",
"",
(_, _, _) =>
{
OnAcceptPressed();
});
// _consoleHost.RegisterCommand("fuckrules", // ADT COmment
// "",
// "",
// (_, _, _) =>
// {
// OnAcceptPressed();
// });
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Требуется добавить комментарии ADT-Tweak

Отключение команды "fuckrules" соответствует целям PR. Однако, согласно руководству по кодированию, изменения вне папок /ADT/ должны быть обрамлены специальными комментариями.

Примените следующие изменения:

+        // ADT-Tweak-Start
         // _consoleHost.RegisterCommand("fuckrules", // ADT COmment
         //     "",
         //     "",
         //     (_, _, _) =>
         // {
         //     OnAcceptPressed();
         // });
+        // ADT-Tweak-End
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// _consoleHost.RegisterCommand("fuckrules", // ADT COmment
// "",
// "",
// (_, _, _) =>
// {
// OnAcceptPressed();
// });
// ADT-Tweak-Start
// _consoleHost.RegisterCommand("fuckrules", // ADT COmment
// "",
// "",
// (_, _, _) =>
// {
// OnAcceptPressed();
// });
// ADT-Tweak-End

}

private void OnRulesInformationMessage(SendRulesInformationMessage message)
Expand Down
75 changes: 75 additions & 0 deletions Content.Server/ADT/Administration/Commands/AdminToggleCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using Content.Server.Administration.Managers;
using Content.Shared.Administration;
using Robust.Shared.Console;
using Content.Server.Administration;
using Robust.Server.Player;
using System.Linq;

namespace Content.Server.ADT.Administration.Commands;


[AdminCommand(AdminFlags.Permissions)]
public sealed class AdminToggleCommand : LocalizedCommands
{
[Dependency] private readonly IPlayerLocator _locator = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
public override string Command => "admin_toggle";

public override async void Execute(IConsoleShell shell, string argStr, string[] args)
{
if (args.Length != 2)
{
shell.WriteLine("Error: invalid arguments!");
return;
}

var target = args[0];
var located = await _locator.LookupIdByNameOrIdAsync(target);
if (located == null)
{
shell.WriteError(Loc.GetString("cmd-admin_toggle-error-args"));
return;
}

if (!_playerManager.TryGetSessionById(located.UserId, out var targetSession))
{
shell.WriteLine("Not session it's player!");
return;
}

if (targetSession == null)
return;

var mgr = IoCManager.Resolve<IAdminManager>();
if (args[1] == "deadmin")
{
mgr.DeAdmin(targetSession);
}
else if (args[1] == "readmin" && !(mgr.GetAdminData(targetSession, includeDeAdmin: true) == null))
{
mgr.ReAdmin(targetSession);
}
}
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved

public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
{
if (args.Length == 1)
{
var options = _playerManager.Sessions.Select(c => c.Name).OrderBy(c => c).ToArray();
return CompletionResult.FromHintOptions(
options,
LocalizationManager.GetString("cmd-ban-hint"));
}
if (args.Length == 2)
{
var durations = new CompletionOption[]
{
new("deadmin", LocalizationManager.GetString("cmd-admin_toggle-deadmin")),
new("readmin", LocalizationManager.GetString("cmd-admin_toggle-readmin")),
};
return CompletionResult.FromHintOptions(durations, LocalizationManager.GetString("cmd-admin_toggle-hint-duration"));
}
return CompletionResult.Empty;
}
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
}

11 changes: 9 additions & 2 deletions Content.Server/ADT/Administration/Commands/KickHideCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Robust.Shared.Console;
using Content.Server.GhostKick;
using Content.Server.Administration;
using Content.Server.Administration.Managers;

namespace Content.Server.ADT.Administration.Commands;

Expand All @@ -16,6 +17,7 @@ public sealed class KickHideCommand : LocalizedCommands
[Dependency] private readonly IPlayerLocator _locator = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly GhostKickManager _ghostKickManager = default!;
[Dependency] private readonly IAdminManager _adminManager = default!;
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved

public override string Command => "kick_hide";

Expand All @@ -36,8 +38,13 @@ public override async void Execute(IConsoleShell shell, string argStr, string[]
return;
}

var targetSession = _playerManager.GetSessionById(located.UserId);
_ghostKickManager.DoDisconnect(targetSession.Channel, "Smitten.");
var players = IoCManager.Resolve<IPlayerManager>();
if (!players.TryGetSessionByUsername(target, out var player))
{
shell.WriteError($"Unable to find player: '{target}'.");
return;
}
_ghostKickManager.DoDisconnect(player.Channel, "Smitten.");
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
}

public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
Expand Down
8 changes: 4 additions & 4 deletions Content.Server/Administration/Managers/AdminManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,10 @@ public void Stealth(ICommonSession session)
var playerData = session.ContentData()!;
playerData.Stealthed = true;
reg.Data.Stealth = true;

_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)), AdminFlags.Stealth);
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-enable-stealth", ("stealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
// ADT Tweak commented
// _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
// _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)), AdminFlags.Stealth);
// _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-enable-stealth", ("stealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Добавьте маркеры ADT-Tweak

Согласно правилам кодирования, изменения вне папок ADT должны быть обрамлены маркерами ADT-Tweak.

Примените следующие изменения:

+            // ADT-Tweak-Start
             // ADT Tweak commented
             // _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
             // _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)), AdminFlags.Stealth);
             // _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-enable-stealth", ("stealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
+            // ADT-Tweak-End
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// ADT Tweak commented
// _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
// _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)), AdminFlags.Stealth);
// _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-enable-stealth", ("stealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
// ADT-Tweak-Start
// ADT Tweak commented
// _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
// _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-de-admin-message", ("exAdminName", session.Name)), AdminFlags.Stealth);
// _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-enable-stealth", ("stealthAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
// ADT-Tweak-End

}

public void UnStealth(ICommonSession session)
Expand Down
9 changes: 9 additions & 0 deletions Content.Server/Administration/Managers/BanManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Content.Shared.Administration;

namespace Content.Server.Administration.Managers;

Expand All @@ -39,6 +40,7 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly ITaskManager _taskManager = default!;
[Dependency] private readonly UserDbDataManager _userDbData = default!;
[Dependency] private readonly IAdminManager _adminManager = default!;

private ISawmill _sawmill = default!;

Expand Down Expand Up @@ -134,6 +136,13 @@ public void Restart()
#region Server Bans
public async void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, uint? minutes, NoteSeverity severity, string reason)
{
// ADT-Tweak-Start
if (targetUsername != null && _playerManager.TryGetSessionByUsername(targetUsername, out var player))
{
if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
return;
}
// ADT-Tweak-End
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Необходимо добавить логирование при попытке бана администратора

Текущая реализация тихо прерывает выполнение при попытке забанить пользователя с флагом Permissions. Рекомендуется добавить логирование такой попытки для целей аудита.

Предлагаемые изменения:

 // ADT-Tweak-Start
 if (targetUsername != null && _playerManager.TryGetSessionByUsername(targetUsername, out var player))
 {
     if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
+    {
+        _sawmill.Warning($"Attempted to ban user {targetUsername} with Permissions flag by {banningAdmin}");
         return;
+    }
 }
 // ADT-Tweak-End
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// ADT-Tweak-Start
if (targetUsername != null && _playerManager.TryGetSessionByUsername(targetUsername, out var player))
{
if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
return;
}
// ADT-Tweak-End
// ADT-Tweak-Start
if (targetUsername != null && _playerManager.TryGetSessionByUsername(targetUsername, out var player))
{
if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
{
_sawmill.Warning($"Attempted to ban user {targetUsername} with Permissions flag by {banningAdmin}");
return;
}
}
// ADT-Tweak-End

DateTimeOffset? expires = null;
if (minutes > 0)
{
Expand Down
2 changes: 1 addition & 1 deletion Content.Server/Ghost/GhostSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
using System.Linq;
using System.Numerics;
using Content.Shared.ADT.OnGhostAttemtpDamage;
using Content.Server.ADT.Ghost;
using Content.Shared.ADT.Ghost;

namespace Content.Server.Ghost
{
Expand Down
18 changes: 17 additions & 1 deletion Content.Server/GhostKick/GhostKickManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
using Robust.Shared.Console;
using Robust.Shared.Network;
using Robust.Shared.Timing;
using Content.Server.Administration.Managers;
using Content.Server.Administration.Logs;
using Content.Shared.Database;

namespace Content.Server.GhostKick;

Expand Down Expand Up @@ -47,6 +50,8 @@ public void DoDisconnect(INetChannel channel, string reason)
[AdminCommand(AdminFlags.Moderator)]
public sealed class GhostKickCommand : IConsoleCommand
{
[Dependency] private readonly IAdminManager _adminManager = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
public string Command => "ghostkick";
public string Description => "Kick a client from the server as if their network just dropped.";
public string Help => "Usage: ghostkick <Player> [Reason]";
Expand All @@ -70,7 +75,18 @@ public void Execute(IConsoleShell shell, string argStr, string[] args)
shell.WriteError($"Unable to find player: '{playerName}'.");
return;
}

// ADT-Tweak-start
if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
{
shell.WriteError($"You not permission for kick '{playerName}'.");
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
return;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Исправьте грамматику в сообщении об ошибке

Текущее сообщение содержит грамматические ошибки.

Предлагаю следующие изменения:

-            shell.WriteError($"You not permission for kick '{playerName}'.");
+            shell.WriteError($"У вас нет прав для кика пользователя '{playerName}'.");
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
{
shell.WriteError($"You not permission for kick '{playerName}'.");
return;
}
if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
{
shell.WriteError($"У вас нет прав для кика пользователя '{playerName}'.");
return;
}

_adminLogger.Add(
LogType.AdminMessage,
LogImpact.Low,
$"[АДМИНАБУЗ] {shell.Player?.Name} used the command ghostkick on '{playerName}'."
);
// ADT-Tweak-end
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Обнаружено некорректное использование проверки прав

Проверка AdminFlags.Permissions в файле GhostKickManager.cs используется неправильно - она запрещает действие при наличии прав вместо их требования. Это противоречит логике работы других административных команд в кодовой базе.

  • В файле Content.Server/GhostKick/GhostKickManager.cs проверка прав должна быть инвертирована:
if (!_adminManager.HasAdminFlag(player, AdminFlags.Permissions))
{
    shell.WriteError($"You not permission for kick '{playerName}'.");
    return;
}
🔗 Analysis chain

Проверьте согласованность проверок прав

Необходимо убедиться, что аналогичные административные команды используют согласованный подход к проверке прав.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск похожих административных команд и их проверок прав
ast-grep --pattern 'AdminCommand(AdminFlags.$_)
public sealed class $_Command : IConsoleCommand
{
  $$$
  _adminManager.HasAdminFlag($_, AdminFlags.$_)
  $$$
}'

Length of output: 162


Script:

#!/bin/bash
# Search for admin command classes and their permission checks
rg -U "AdminCommand.*AdminFlags\." -A 5

# Search for HasAdminFlag usage patterns
rg "_adminManager\.HasAdminFlag" -A 2 -B 2

# Search for other ghost-related commands
rg "class.*Command.*ghost" -A 5

Length of output: 139095


Script:

#!/bin/bash
# Search for ghost-related commands and their permission checks
rg -U "class.*GhostKick.*Command" -A 10 -B 2

# Search for similar permission checks in admin commands
rg "HasAdminFlag.*Permissions" -A 2 -B 2

# Search for admin flag declarations
rg "AdminFlags\.Permissions" -A 2 -B 2

Length of output: 6731

ghostKick.DoDisconnect(player.Channel, reason);
}
}
7 changes: 7 additions & 0 deletions Content.Server/Info/ShowRulesCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Robust.Shared.Configuration;
using Robust.Shared.Console;
using Robust.Shared.Network;
using Content.Server.Administration.Managers;

namespace Content.Server.Info;

Expand All @@ -15,6 +16,7 @@ public sealed class ShowRulesCommand : IConsoleCommand
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly IConfigurationManager _configuration = default!;
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IAdminManager _adminManager = default!;

public string Command => "showrules";
public string Description => "Opens the rules popup for the specified player.";
Expand Down Expand Up @@ -57,6 +59,11 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args)
return;
}

if (_adminManager.HasAdminFlag(player, AdminFlags.Permissions)) // ADT-Tweak
{
shell.WriteError($"You not permission for showrule '{target}'.");
return;
}
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
var coreRules = _configuration.GetCVar(CCVars.RulesFile);
var message = new SendRulesInformationMessage { PopupTime = seconds, CoreRules = coreRules, ShouldShowRules = true};
_net.ServerSendMessage(message, player.Channel);
Expand Down
10 changes: 10 additions & 0 deletions Content.Server/Tips/TipsSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
using Content.Server.Administration.Logs;
using Content.Shared.Database;

namespace Content.Server.Tips;

Expand All @@ -28,6 +30,7 @@ public sealed class TipsSystem : EntitySystem
[Dependency] private readonly GameTicker _ticker = default!;
[Dependency] private readonly IConsoleHost _conHost = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;

private bool _tipsEnabled;
private float _tipTimeOutOfRound;
Expand Down Expand Up @@ -82,6 +85,13 @@ private void SendTippy(IConsoleShell shell, string argstr, string[] args)
return;
}

// ADT-Tweak-Start Логируем сообщение
_adminLogger.Add(
LogType.AdminMessage,
LogImpact.Low,
$"[АДМИНАБУЗ] {shell.Player?.Name} used the command tippy or tip."
);
// ADT-Tweak-End
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
ActorComponent? actor = null;
if (args[0] != "all")
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
namespace Content.Server.ADT.Ghost;
namespace Content.Shared.ADT.Ghost;

/// <summary>
/// Author: Schrodinger71, помогал _kote(Котька)
/// Вешаем на сущность, и к ней нельзя будет тепнуться через "Телепорт призрака".
/// </summary>
[RegisterComponent]
Expand Down
10 changes: 10 additions & 0 deletions Content.Shared/Follower/FollowerSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
using Robust.Shared.Physics.Systems;
using Robust.Shared.Player;
using Robust.Shared.Utility;
using Content.Shared.ADT.Ghost;
using Robust.Shared.Spawners;

namespace Content.Shared.Follower;

Expand Down Expand Up @@ -149,6 +151,14 @@ private void OnFollowedTerminating(EntityUid uid, FollowedComponent component, r
/// <param name="entity">The entity to be followed</param>
public void StartFollowingEntity(EntityUid follower, EntityUid entity)
{
// ADT-Tweak-Start: Улучшаем смысл компонента
if (HasComp<HideGhostWarpComponent>(entity))
{
var despawn = EnsureComp<TimedDespawnComponent>(follower);
despawn.Lifetime = 0.1f;
return;
}
// ADT-Tweak-End
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
// No recursion for you
var targetXform = Transform(entity);
while (targetXform.ParentUid.IsValid())
Expand Down
8 changes: 8 additions & 0 deletions Resources/Locale/ru-RU/ADT/administration/commands.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,11 @@ echo_chat-speak-help = Использовать обычную разговор
echo_chat-emote-help = Использовать чат эмоций
echo_chat-whisper-help = Использование чата шёпотом

## Команда: admin_toggle
cmd-admin_toggle-desc = Вводит в деадмин или реадмин указанного пользователя.
cmd-admin_toggle-help = Использование: admin_toggle <userName> <readmin/deadmin>
cmd-admin_toggle-hint-duration = Значение
Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
cmd-admin_toggle-readmin = Вернуть права админу.
cmd-admin_toggle-deadmin = Ввести в деадмин.
cmd-admin_toggle-error-args = Указанный пользователь не найден.

Schrodinger71 marked this conversation as resolved.
Show resolved Hide resolved
Loading