-
Notifications
You must be signed in to change notification settings - Fork 34
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
[Fix] TTS 3: Враг в отражении #138
Conversation
Warning Rate limit exceeded@Spatison has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 21 minutes and 36 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. WalkthroughВ этом пулл-запросе внесены значительные изменения в систему управления чатом и функциональность текстового синтеза речи (TTS). Основные изменения включают добавление новых классов и интерфейсов, улучшение управления зависимостями и внедрение системы ограничения частоты действий для игроков. Также обновлены методы для обработки сообщений и уведомлений, а также добавлены новые конфигурационные переменные, связанные с TTS и административными функциями. Эти изменения направлены на улучшение управления взаимодействиями игроков и обработку сообщений в игровом окружении. Changes
Suggested labels
Suggested reviewers
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 23
🧹 Outside diff range and nitpick comments (31)
Content.Shared/Players/RateLimiting/RateLimitRegistration.cs (3)
39-39
: Исправьте опечатку в комментарииВ строке 39 присутствует опечатка: лишнее слово "there". Это приводит к некорректному построению предложения.
Примените следующий дифф для исправления опечатки:
-/// If the cvar is set to 0, there every breach will be reported. +/// If the cvar is set to 0, every breach will be reported.
17-59
: Добавьте валидацию параметров в конструктореСогласно комментариям, если задан
CVarAdminAnnounceDelay
, то должен быть задан иAdminAnnounceAction
, и наоборот. Рекомендуется добавить проверки в конструкторе, чтобы гарантировать корректность переданных параметров.Пример кода для добавления проверок:
public RateLimitRegistration(...) { // Инициализация свойств CVarLimitPeriodLength = cVarLimitPeriodLength; CVarLimitCount = cVarLimitCount; PlayerLimitedAction = playerLimitedAction; CVarAdminAnnounceDelay = cVarAdminAnnounceDelay; AdminAnnounceAction = adminAnnounceAction; AdminLogType = adminLogType; // Добавление проверок if (CVarAdminAnnounceDelay != null && AdminAnnounceAction == null) { throw new ArgumentException("Если задан CVarAdminAnnounceDelay, должен быть задан и AdminAnnounceAction."); } if (AdminAnnounceAction != null && CVarAdminAnnounceDelay == null) { throw new ArgumentException("Если задан AdminAnnounceAction, должен быть задан и CVarAdminAnnounceDelay."); } }
65-76
: Явно задайте значения для членов перечисления RateLimitStatusДля повышения ясности и предотвращения возможных ошибок рекомендуется явно указать значения элементов перечисления
RateLimitStatus
.Примените следующий дифф:
public enum RateLimitStatus : byte { /// <summary> /// The action was not blocked by the rate limit. /// </summary> - Allowed, + Allowed = 0, /// <summary> /// The action was blocked by the rate limit. /// </summary> - Blocked, + Blocked = 1 }Content.Shared/Chat/ISharedChatManager.cs (1)
5-7
: Добавьте документацию к методам интерфейсаРекомендуется добавить XML-документацию к каждому методу для улучшения читаемости и поддержки кода.
Предлагаемые изменения:
public interface ISharedChatManager { + /// <summary> + /// Инициализирует менеджер чата. + /// </summary> void Initialize(); + + /// <summary> + /// Отправляет административное оповещение всем игрокам. + /// </summary> + /// <param name="message">Текст оповещения</param> void SendAdminAlert(string message); + + /// <summary> + /// Отправляет административное оповещение конкретному игроку. + /// </summary> + /// <param name="player">Идентификатор игрока</param> + /// <param name="message">Текст оповещения</param> void SendAdminAlert(EntityUid player, string message); }Content.Server/_White/TTS/TTSSystem.cs (1)
71-82
: Оптимизируйте обработку шепота в методеOnEntitySpoke
В логике обработки шепота есть повторяющиеся проверки и вызовы. Рекомендуется упростить условные конструкции для повышения читабельности и эффективности кода.
Content.Server/_White/TTS/TTSSystem.Sanitize.cs (2)
16-27
: Улучшите регулярные выражения в методеSanitize
Объедините регулярные выражения или используйте предкомпилированные
Regex
, чтобы повысить производительность методаSanitize
. Также убедитесь, что все специальные символы корректно обрабатываются.
189-255
: Оптимизируйте конвертацию чисел в словаМетоды в классе
NumberConverter
могут быть оптимизированы для повышения эффективности. Рассмотрите возможность использования существующих библиотек или алгоритмов для конвертации чисел в текст.Content.Server/_White/TTS/TTSManagerExtension.cs (1)
196-200
: Улучшите генерацию ключа кеша с учетом регистра эффектаПри генерации ключа кеша рекомендуется нормализовать эффект и другие параметры, например, привести к нижнему регистру, чтобы избежать коллизий из-за различий в регистре символов.
Content.Server/Chat/Managers/ChatManager.cs (2)
29-35
: Избегайте использования статических словарей для данных патроновИспользование статического словаря
PatronOocColors
может привести к проблемам при расширении функциональности. Рекомендуется вынести эти данные в конфигурационные файлы или базы данных для упрощения управления и обновления.
283-290
: Оптимизируйте отправку сообщений администраторамВ методе
SendAdminChat
можно оптимизировать цикл отправки сообщений, используя групповые операции или фильтры, чтобы повысить производительность при отправке сообщений большому количеству администраторов.Content.Server/Administration/Systems/BwoinkSystem.cs (3)
58-60
: Рассмотрите возможность использования отдельного класса или структуры вместо сложного кортежа.Использование кортежей с большим количеством полей может снизить читаемость кода. Создание отдельного класса или структуры для хранения данных
_relayMessages
улучшит понимание и поддержку кода.
133-135
: Рассмотрите возможность вынесения значения тайм-аута в константу или конфигурацию.Вместо использования жестко заданного значения
5
минут, рекомендуется вынести это значение в константу или сделать настройкой, чтобы упростить изменение тайм-аута в будущем.
721-726
: Убедитесь в единообразии форматирования сообщений в методеGenerateAHelpMessage
.Когда
parameters.Icon
не равноnull
, двоеточие послеparameters.Username
опускается. Для согласованности стиля рекомендуется добавить двоеточие в обоих случаях.Content.Client/Chat/Managers/IChatManager.cs (1)
Line range hint
9-12
: Улучшить документацию методаТекущая документация содержит нестандартный префикс "Nyano" и неполное описание функциональности.
Предлагаю следующее изменение:
- /// <summary> - /// Nyano - Summary:. Will refresh perms. - /// </summary> + /// <summary> + /// Обновляет разрешения чата для текущего пользователя. + /// </summary>Content.Shared/_White/TTS/TTSVoicePrototype.cs (1)
26-29
: Уточните документациюКомментарий к свойству
RoundStart
может быть более информативным. Рекомендуется указать точное влияние этого параметра на доступность голоса в редакторе персонажа.Content.Server/_White/Chat/Systems/AnnouncementSpokeEvent.cs (1)
27-27
: Удалите лишнюю пустую строкуВ классе
RadioSpokeEvent
присутствует лишняя пустая строка.Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs (1)
20-30
: Улучшите обработку ошибок и локализациюВ методе
OnChangeVoice
:
- Отсутствует явное сообщение об ошибке при неверном voice ID
- Строка для popup-сообщения захардкожена
Рекомендуемые изменения:
private void OnChangeVoice(Entity<VoiceMaskComponent> entity, ref VoiceMaskChangeVoiceMessage msg) { if (msg.Voice is { } id && !_proto.HasIndex<TTSVoicePrototype>(id)) + { + _popupSystem.PopupEntity(Loc.GetString("voice-mask-voice-invalid"), entity); return; + } entity.Comp.VoiceId = msg.Voice; _popupSystem.PopupEntity(Loc.GetString("voice-mask-voice-popup-success"), entity); UpdateUI(entity); }Content.Server/_White/TTS/TTSSystem.RateLimit.cs (1)
17-25
: Добавьте документацию и улучшите обработку ошибок регистрацииМетод
RegisterRateLimits
не имеет документации и не обрабатывает потенциальные ошибки при регистрации.Предлагаемые улучшения:
+/// <summary> +/// Регистрирует ограничения частоты использования TTS. +/// Использует параметры из WhiteCVars для настройки периода и количества. +/// </summary> private void RegisterRateLimits() { + try + { _rateLimitManager.Register(RateLimitKey, new RateLimitRegistration( WhiteCVars.TTSRateLimitPeriod, WhiteCVars.TTSRateLimitCount, RateLimitPlayerLimited) ); + } + catch (Exception e) + { + Logger.ErrorS("tts", e, "Ошибка при регистрации ограничений TTS"); + } }Content.Server/_White/TTS/TTSSystem.Cache.cs (1)
1-37
: Рассмотрите добавление механизма очистки кэшаТекущая реализация не предусматривает механизм очистки устаревших файлов кэша, что может привести к неконтролируемому росту размера кэша.
Рекомендуется добавить:
- Механизм отслеживания времени последнего использования файлов кэша
- Периодическую очистку неиспользуемых файлов
- Ограничение общего размера кэша
Могу помочь с реализацией этих улучшений, если потребуется.
Content.Shared/_White/TTS/TTSSerializable.cs (3)
6-10
: Добавьте документацию для перечисленияРекомендуется добавить XML-документацию для
VoiceRequestType
и его значений для улучшения понимания кода.+/// <summary> +/// Определяет тип запроса голоса в системе TTS +/// </summary> public enum VoiceRequestType { + /// <summary> + /// Нет запроса + /// </summary> None, + /// <summary> + /// Предварительное прослушивание голоса + /// </summary> Preview }
36-40
: Несогласованность в реализации свойстваВ классе
VoiceMaskChangeVoiceMessage
свойствоVoice
реализовано как поле, в то время как в других классах используются автосвойства. Рекомендуется привести к единому стилю.public sealed class VoiceMaskChangeVoiceMessage(string voice) : BoundUserInterfaceMessage { - public string Voice = voice; + public string Voice { get; } = voice; }
12-19
: Рассмотрите оптимизацию работы с аудиоданнымиВ классе
PlayTTSEvent
массив байтовData
может потреблять значительный объем памяти. Рекомендуется рассмотреть возможность использования потоковой передачи данных или ограничения размера буфера.Content.Client/_White/TTS/HumanoidProfileEditor.TTS.cs (3)
60-65
: Оптимизируйте проверку на nullВ методе
PlayPreviewTTS
можно использовать паттерн guard clause для более чистого кода.private void PlayPreviewTTS() { - if (Profile is null) - return; + if (Profile is not null) + _entManager.System<TTSSystem>().RequestGlobalTTS(VoiceRequestType.Preview, Profile.Voice); - _entManager.System<TTSSystem>().RequestGlobalTTS(VoiceRequestType.Preview,Profile.Voice); }
16-20
: Оптимизируйте инициализацию списка голосовРекомендуется вынести фильтрацию и сортировку голосов в отдельный метод для улучшения читаемости и поддерживаемости кода.
+private List<TTSVoicePrototype> GetSortedVoiceList() +{ + return _prototypeManager + .EnumeratePrototypes<TTSVoicePrototype>() + .Where(o => o.RoundStart) + .OrderBy(o => Loc.GetString(o.Name)) + .ToList(); +} private void InitializeVoice() { - _voiceList = _prototypeManager - .EnumeratePrototypes<TTSVoicePrototype>() - .Where(o => o.RoundStart) - .OrderBy(o => Loc.GetString(o.Name)) - .ToList(); + _voiceList = GetSortedVoiceList();
53-57
: Упростите логику выбора голосаТекущая реализация выбора голоса может быть упрощена для лучшей читаемости.
-if (!VoiceButton.TrySelectId(voiceChoiceId) && - VoiceButton.TrySelectId(firstVoiceChoiceId)) -{ - SetVoice(_voiceList[firstVoiceChoiceId].ID); -} +var selectedId = VoiceButton.TrySelectId(voiceChoiceId) ? voiceChoiceId : + VoiceButton.TrySelectId(firstVoiceChoiceId) ? firstVoiceChoiceId : -1; + +if (selectedId != -1) + SetVoice(_voiceList[selectedId].ID);Content.Server/_White/TTS/TTSSystem.Announce.cs (1)
14-16
: Магические числа в условиях проверкиКонстанта
MaxMessageChars * 2
должна быть вынесена в отдельную именованную константу для улучшения читаемости и поддерживаемости кода.+private const int MaxAnnouncementChars = MaxMessageChars * 2; + if (!_isEnabled || - args.Message.Length > MaxMessageChars * 2 || + args.Message.Length > MaxAnnouncementChars || !_prototypeManager.TryIndex<TTSVoicePrototype>(_voiceId, out var protoVoice))Content.Shared/_White/CVars.cs (1)
80-86
: Период ограничения частоты TTSЗначение по умолчанию в 2 секунды для периода ограничения может быть недостаточным для комфортного использования.
Рекомендуется увеличить значение по умолчанию до 5-10 секунд для лучшего пользовательского опыта:
- CVarDef.Create("tts.rate_limit_period", 2f, CVar.SERVERONLY); + CVarDef.Create("tts.rate_limit_period", 5f, CVar.SERVERONLY);Content.Client/Chat/Managers/ChatManager.cs (3)
70-74
: Необходимо реализовать разделение команд radio и sayTODO комментарий указывает на необходимость разделения команд. Это может привести к проблемам с поддержкой кода в будущем.
Хотите, чтобы я помог реализовать разделение этих команд или создал issue для отслеживания этой задачи?
80-83
: Добавьте документацию для телепатической связиРекомендуется добавить XML-документацию, описывающую:
- Условия использования телепатической связи
- Ограничения и особенности работы
- Взаимодействие с другими системами
90-94
: Рассмотрите использование событий для обновления разрешенийТекущая реализация использует прямой вызов события. Рекомендуется рассмотреть использование системы событий Robust.Server для лучшей масштабируемости.
Content.Shared/Chat/SharedChatSystem.cs (1)
27-31
: Константы голосовой связи выглядят логично!Значения и реализация выглядят правильными. Предлагаю добавить XML-документацию для улучшения читаемости кода:
// WD EDIT START - public const int VoiceRange = 10; // how far voice goes in world units - public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units - public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units + /// <summary> + /// Максимальная дистанция распространения обычной речи в игровых единицах + /// </summary> + public const int VoiceRange = 10; + + /// <summary> + /// Дистанция, на которой шёпот остается разборчивым, в игровых единицах + /// </summary> + public const int WhisperClearRange = 2; + + /// <summary> + /// Максимальная дистанция распространения шёпота в игровых единицах + /// </summary> + public const int WhisperMuffledRange = 5;
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (44)
Content.Client/Chat/Managers/ChatManager.cs
(1 hunks)Content.Client/Chat/Managers/IChatManager.cs
(1 hunks)Content.Client/IoC/ClientContentIoC.cs
(3 hunks)Content.Client/Players/RateLimiting/PlayerRateLimitManager.cs
(1 hunks)Content.Client/_White/TTS/AnnounceTTSSystem.cs
(1 hunks)Content.Client/_White/TTS/HumanoidProfileEditor.TTS.cs
(2 hunks)Content.Client/_White/TTS/TTSManager.cs
(1 hunks)Content.Client/_White/TTS/TTSSystem.cs
(0 hunks)Content.IntegrationTests/PoolManager.Cvars.cs
(1 hunks)Content.Server/Administration/Systems/BwoinkSystem.cs
(23 hunks)Content.Server/Chat/Managers/ChatManager.RateLimit.cs
(1 hunks)Content.Server/Chat/Managers/ChatManager.cs
(1 hunks)Content.Server/Chat/Managers/IChatManager.cs
(4 hunks)Content.Server/Chat/Systems/ChatSystem.cs
(1 hunks)Content.Server/IoC/ServerContentIoC.cs
(3 hunks)Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs
(1 hunks)Content.Server/VoiceMask/VoiceMaskComponent.cs
(2 hunks)Content.Server/VoiceMask/VoiceMaskSystem.cs
(1 hunks)Content.Server/_White/Chat/Systems/AnnouncementSpokeEvent.cs
(1 hunks)Content.Server/_White/TTS/TTSManager.cs
(2 hunks)Content.Server/_White/TTS/TTSManagerExtension.cs
(1 hunks)Content.Server/_White/TTS/TTSSystem.Announce.cs
(1 hunks)Content.Server/_White/TTS/TTSSystem.Cache.cs
(1 hunks)Content.Server/_White/TTS/TTSSystem.Preview.cs
(1 hunks)Content.Server/_White/TTS/TTSSystem.RateLimit.cs
(1 hunks)Content.Server/_White/TTS/TTSSystem.SSML.cs
(1 hunks)Content.Server/_White/TTS/TTSSystem.Sanitize.cs
(2 hunks)Content.Server/_White/TTS/TTSSystem.cs
(2 hunks)Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs
(1 hunks)Content.Shared/CCVar/CCVars.cs
(4 hunks)Content.Shared/Chat/ISharedChatManager.cs
(1 hunks)Content.Shared/Chat/SharedChatSystem.cs
(1 hunks)Content.Shared/Interaction/SharedInteractionSystem.cs
(8 hunks)Content.Shared/Players/RateLimiting/RateLimitRegistration.cs
(1 hunks)Content.Shared/Players/RateLimiting/SharedPlayerRateLimitManager.cs
(1 hunks)Content.Shared/_White/CVars.cs
(1 hunks)Content.Shared/_White/TTS/Events/PlayTTSEvent.cs
(0 hunks)Content.Shared/_White/TTS/Events/RequestTTSEvent.cs
(0 hunks)Content.Shared/_White/TTS/MsgRequestTTS.cs
(0 hunks)Content.Shared/_White/TTS/TTSComponent.cs
(1 hunks)Content.Shared/_White/TTS/TTSPitchRateSystem.cs
(0 hunks)Content.Shared/_White/TTS/TTSSerializable.cs
(1 hunks)Content.Shared/_White/TTS/TTSVoicePrototype.cs
(1 hunks)Resources/Locale/en-US/interaction/interaction-system.ftl
(1 hunks)
💤 Files with no reviewable changes (5)
- Content.Shared/_White/TTS/Events/RequestTTSEvent.cs
- Content.Shared/_White/TTS/Events/PlayTTSEvent.cs
- Content.Shared/_White/TTS/MsgRequestTTS.cs
- Content.Shared/_White/TTS/TTSPitchRateSystem.cs
- Content.Client/_White/TTS/TTSSystem.cs
🔇 Additional comments (70)
Content.Shared/Players/RateLimiting/RateLimitRegistration.cs (1)
10-16
:
Исправьте объявление класса RateLimitRegistration
Класс RateLimitRegistration
использует недопустимый синтаксис объявления для класса в C#. В текущей версии C# классы не могут принимать параметры непосредственно в объявлении. Рекомендуется либо использовать record
, если необходим неизменяемый тип данных, либо перенести параметры в конструктор класса.
Примените следующий дифф для исправления синтаксиса:
Вариант 1 (если необходим неизменяемый тип): изменить класс на record
:
-public sealed class RateLimitRegistration(
+public sealed record RateLimitRegistration(
Вариант 2: перенести параметры в конструктор класса:
-public sealed class RateLimitRegistration(
- CVarDef<float> cVarLimitPeriodLength,
- CVarDef<int> cVarLimitCount,
- Action<ICommonSession>? playerLimitedAction,
- CVarDef<int>? cVarAdminAnnounceDelay = null,
- Action<ICommonSession>? adminAnnounceAction = null,
- LogType adminLogType = LogType.RateLimited)
+public sealed class RateLimitRegistration
{
+ public RateLimitRegistration(
+ CVarDef<float> cVarLimitPeriodLength,
+ CVarDef<int> cVarLimitCount,
+ Action<ICommonSession>? playerLimitedAction,
+ CVarDef<int>? cVarAdminAnnounceDelay = null,
+ Action<ICommonSession>? adminAnnounceAction = null,
+ LogType adminLogType = LogType.RateLimited)
+ {
+ CVarLimitPeriodLength = cVarLimitPeriodLength;
+ CVarLimitCount = cVarLimitCount;
+ PlayerLimitedAction = playerLimitedAction;
+ CVarAdminAnnounceDelay = cVarAdminAnnounceDelay;
+ AdminAnnounceAction = adminAnnounceAction;
+ AdminLogType = adminLogType;
+ }
Likely invalid or redundant comment.
Content.Shared/Chat/ISharedChatManager.cs (2)
1-4
: Проверьте соответствие интерфейса целям PR
Интерфейс ISharedChatManager
определен как общий (shared) компонент системы чата, но в описании PR упоминается изменение системы TTS. Рекомендуется уточнить, как этот интерфейс связан с новой системой TTS.
✅ Verification successful
Let me analyze the results. I can see that:
- There are TTS-related files in
Content.Server/_White/TTS/
directory - The
ISharedChatManager
is used by both client and server implementations - The interface is part of the chat system infrastructure that could be used by TTS
Let me verify the relationship between chat and TTS systems:
Based on the findings, I can now generate the final response:
Интерфейс корректно интегрирован с новой системой TTS
Анализ показал, что ISharedChatManager
является частью инфраструктуры чата, которая используется новой системой TTS (TTSSystem
). Система TTS имеет зависимость от менеджера чата и правильно интегрирована в общую архитектуру. Изменения соответствуют целям PR по обновлению системы TTS.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Описание: Поиск связанных с TTS компонентов в кодовой базе
# Поиск файлов, связанных с TTS
rg -l "TTS|TextToSpeech|Speech"
# Поиск использования ISharedChatManager
rg -A 5 "ISharedChatManager"
Length of output: 19465
Script:
# Check if TTS systems use chat manager
rg -A 5 "ChatManager|ISharedChatManager" Content.Server/_White/TTS/
# Check implementation of ISharedChatManager
ast-grep --pattern 'class $_ : ISharedChatManager { $$$ }'
Length of output: 582
6-7
: Рассмотрите добавление обработки ошибок
Методы SendAdminAlert
могут столкнуться с различными ошибками (например, недействительный EntityUid или пустое сообщение). Рекомендуется определить, как эти случаи должны обрабатываться.
Content.Server/Chat/Managers/ChatManager.RateLimit.cs (3)
24-27
: Метод RateLimitPlayerLimited корректно уведомляет игрока о превышении лимита.
Метод отправляет игроку сообщение о том, что он превышил лимит отправки сообщений, что соответствует ожидаемой функциональности.
29-32
: Метод RateLimitAlertAdmins корректно уведомляет администраторов о превышении лимита игроком.
Метод отправляет уведомление администраторам с указанием имени игрока, превысившего лимит, что позволяет администраторам своевременно реагировать.
10-10
: Константа RateLimitKey правильно определена и используется.
Константа RateLimitKey
используется для идентификации категории ограничения скорости и обеспечивает согласованность в коде.
Content.Shared/Players/RateLimiting/SharedPlayerRateLimitManager.cs (2)
24-37
: Метод CountAction корректно объявлен для учета действий игрока.
Абстрактный метод обеспечивает интерфейс для учета и проверки действий игрока в соответствии с зарегистрированными ограничениями скорости.
39-55
: Метод Register корректно объявлен для регистрации новых категорий ограничений.
Метод позволяет регистрировать новые категории ограничений, гарантируя уникальность ключей и правильную настройку параметров ограничения.
Content.Client/_White/TTS/TTSManager.cs (5)
43-51
: Метод Initialize корректно инициализирует систему TTS.
Метод устанавливает необходимые зависимости, добавляет контентный корень для ресурсов TTS и подписывается на события изменения конфигурации и сетевые события воспроизведения TTS.
58-63
: Метод Shutdown корректно освобождает ресурсы системы TTS.
Метод отписывается от событий изменения конфигурации и очищает контентный корень, предотвращая потенциальные утечки ресурсов.
75-101
: Метод OnPlayTTS корректно обрабатывает воспроизведение TTS аудио.
Метод загружает аудиоданные, настраивает параметры звука и воспроизводит аудио либо от имени сущности, либо глобально, в зависимости от наличия SourceUid
.
103-113
: Метод AdjustVolume корректно регулирует громкость в зависимости от того, является ли речь шепотом.
Громкость уменьшается на значение WhisperFade
, если параметр isWhisper
установлен в true
, обеспечивая реалистичность звучания шепота.
115-117
: Метод AdjustDistance корректно устанавливает максимальную дистанцию звука.
Метод возвращает разные значения максимальной дистанции в зависимости от параметра isWhisper
, что отражает ограничения слышимости шепота по сравнению с обычной речью.
Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs (4)
24-70
: Метод CountAction успешно реализует логику учета и ограничения действий игроков.
Метод учитывает действия игроков, обрабатывает периоды ограничения, обновляет счетчики и уведомляет игроков и администраторов при превышении лимитов, обеспечивая надежную работу системы ограничений.
72-106
: Метод Register корректно регистрирует новые категории ограничений и обрабатывает настройки конфигурации.
Метод проверяет уникальность ключей, подписывается на изменения конфигурации и обеспечивает правильную настройку параметров ограничения и уведомлений.
108-111
: Метод Initialize корректно инициализирует менеджер ограничений при запуске сервера.
Подписка на события изменения статуса игроков позволяет своевременно очищать данные ограничений для отключенных игроков.
113-117
: Метод PlayerManagerOnPlayerStatusChanged корректно обрабатывает отключение игроков.
При изменении статуса игрока на Disconnected
, данные его ограничений удаляются, предотвращая накопление ненужной информации.
Content.Client/_White/TTS/AnnounceTTSSystem.cs (2)
85-106
: Метод OnAnnounceTTSPlay корректно обрабатывает запросы на воспроизведение объявлений TTS.
Метод проверяет наличие аудиофайла, создает аудиопотоки для объявления и дополнительного TTS-аудио, добавляя их в очередь воспроизведения.
165-193
: Класс TTSAudioStream корректно управляет аудиопотоками и ресурсами.
Класс отвечает за создание, воспроизведение и очистку аудиопотоков, обеспечивая безопасное удаление временных файлов и остановку потоков при необходимости.
Content.Server/_White/TTS/TTSManager.cs (1)
53-59
: Проверьте настройку обработчиков изменений конфигурации
Обработчики изменений конфигурации _cfg.OnValueChanged
настроены корректно, однако стоит убедиться, что они правильно отписываются при завершении работы, чтобы избежать возможных утечек памяти.
Content.Server/_White/TTS/TTSSystem.cs (1)
44-48
: Назначьте случайный голос при инициализации компонента TTS
Код корректно присваивает случайный голос из прототипов TTSVoicePrototype
, если VoicePrototypeId
не задан. Убедитесь, что прототипы голосов загружены и доступны в менеджере прототипов.
Content.Server/Chat/Managers/ChatManager.cs (2)
208-216
: Добавьте проверку прав доступа перед отправкой сообщения OOC
В методе TrySendOOCMessage
следует добавить проверку, имеет ли игрок право отправлять сообщения определенного типа, особенно для административных сообщений.
248-260
: Убедитесь в корректности отображения цвета для патронов
Код для настройки цвета сообщений патронов корректен, но убедитесь, что сервер поддерживает данные цвета и что они правильно отображаются у клиентов.
Content.Server/Administration/Systems/BwoinkSystem.cs (8)
10-18
: Новые зависимости импортированы корректно.
Добавлены необходимые using
директивы для новых функциональностей.
34-35
: Константа RateLimitKey
добавлена корректно.
Использование константы улучшает читаемость и поддерживаемость кода.
44-45
: Новые зависимости внедрены корректно.
Добавлены необходимые зависимости _dbManager
и _rateLimit
для работы с базой данных и ограничения частоты действий.
80-80
: Добавление словаря _activeConversations
выполнено корректно.
Словарь для отслеживания активных бесед необходим для новой функциональности.
91-99
: Инициализация defaultParams
и вычисление _maxAdditionalChars
выполнены корректно.
Код корректно создает параметры по умолчанию для сообщения помощи и вычисляет максимальную дополнительную длину сообщения.
104-105
: Очистка _activeConversations
при перезапуске раунда реализована корректно.
Подписка на RoundRestartCleanupEvent
для очистки активных бесед позволяет предотвратить накопление неактуальных данных.
106-112
: Регистрация ограничения частоты действий выполнена корректно.
Код правильно регистрирует ограничение частоты сообщений с использованием заданных параметров и колбека PlayerRateLimitedAction
.
114-117
: Обработчик PlayerRateLimitedAction
реализован корректно.
Метод отправляет пользователю соответствующее сообщение при достижении лимита частоты действий.
Content.Client/Chat/Managers/IChatManager.cs (1)
5-5
: Одобрено наследование от ISharedChatManager
Наследование от ISharedChatManager улучшает организацию кода и позволяет разделить общую функциональность чата.
Content.Shared/_White/TTS/TTSComponent.cs (2)
6-9
: Хорошая документация компонента
Добавленная документация четко описывает назначение компонента TTS.
13-18
: Проверить обработку null значений
Свойство VoicePrototypeId
теперь может быть null. Необходимо убедиться, что все системы, использующие это свойство, корректно обрабатывают null значения.
✅ Verification successful
Проверка обработки null значений завершена успешно
Анализ кода показывает, что все места использования VoicePrototypeId
корректно обрабатывают null значения:
- В
TTSSystem.OnTtsInitialized
есть явная проверка на null с установкой случайного значения - В
TTSSystem.OnEntitySpoke
присутствует проверкаvoiceId == null
в условиях выхода из метода - Других прямых обращений к этому свойству в кодовой базе не обнаружено
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск использования VoicePrototypeId без проверки на null
ast-grep --pattern 'VoicePrototypeId.$$$'
Length of output: 43
Script:
#!/bin/bash
# Поиск использования VoicePrototypeId в коде
rg "VoicePrototypeId" -A 3 -B 3
Length of output: 1609
Script:
#!/bin/bash
# Поиск файлов с TTSComponent
fd "TTSComponent" --type f
Length of output: 68
Script:
#!/bin/bash
# Поиск использования TTSComponent
rg "TTSComponent" -A 3 -B 3
Length of output: 2749
Content.Server/_White/TTS/TTSSystem.SSML.cs (1)
16-22
: Флаги определены корректно
Правильное использование атрибута [Flags]
и побитовых операций для определения признаков звука.
Content.Shared/_White/TTS/TTSVoicePrototype.cs (1)
19-20
: Проверьте инициализацию обязательного поля
Свойство Sex
помечено как обязательное (required: true
), но инициализируется значением по умолчанию default!
. Это может привести к проблемам во время выполнения, если значение не будет установлено при десериализации.
Давайте проверим использование этого прототипа:
✅ Verification successful
Инициализация обязательного поля Sex
безопасна
Проверка показала, что поле Sex
корректно указывается во всех определениях TTS голосов в файле конфигурации. Все прототипы имеют явно заданное значение sex
одним из допустимых значений: Male
, Female
или Unsexed
. Инициализация значением по умолчанию в классе TTSVoicePrototype
не представляет проблемы, так как это поле всегда заполняется при десериализации из YAML-файла.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Описание: Поиск файлов прототипов TTS голосов
# Ожидаемый результат: Файлы с определениями голосов, где должно быть указано значение для Sex
rg -g "*.yml" -g "*.yaml" "ttsVoice" -A 5
Length of output: 21005
Content.Server/VoiceMask/VoiceMaskComponent.cs (1)
36-40
: Корректное добавление поля для TTS интеграции
Поле VoiceId
правильно аннотировано и имеет разумное значение по умолчанию. Интеграция с системой TTS выполнена корректно.
Content.Client/IoC/ClientContentIoC.cs (1)
37-37
: Корректная регистрация новых сервисов
Регистрация новых сервисов выполнена правильно, соблюдая принципы инверсии зависимостей.
Also applies to: 56-57
Content.Server/_White/TTS/TTSSystem.Preview.cs (1)
29-31
:
Проблемы безопасности требуют технического решения
Комментарий указывает на потенциальные проблемы с DDoS. Рекомендуется:
- Реализовать более строгие ограничения на частоту запросов
- Добавить мониторинг подозрительной активности
- Внедрить механизм временной блокировки при превышении лимитов
Content.Server/Chat/Managers/IChatManager.cs (3)
4-4
: Добавление зависимости для ограничения частоты действий
Добавление Content.Shared.Players.RateLimiting
согласуется с новой системой ограничения частоты действий.
39-39
: Изменение типа параметра в DeleteMessagesBy
Изменение с ICommonSession
на NetUserId
улучшает точность идентификации пользователя при удалении сообщений.
50-50
: Улучшение обработки ограничений частоты действий
Изменение возвращаемого типа с bool
на RateLimitStatus
предоставляет более детальную информацию о статусе ограничения.
✅ Verification successful
Подтверждено изменение возвращаемого типа для улучшения обработки ограничений
Изменение с bool
на RateLimitStatus
действительно улучшает информативность API, позволяя получать более детальную информацию о статусе ограничения. Это подтверждается:
- Определением
RateLimitStatus
как перечисления, начинающегося со значенияAllowed
- Корректным использованием нового типа в существующем коде:
ChatManager.cs
TTSSystem.Preview.cs
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка использования RateLimitStatus в кодовой базе
ast-grep --pattern 'RateLimitStatus $_ = $_'
Length of output: 46
Script:
#!/bin/bash
# Поиск определения и использования RateLimitStatus
rg -l "RateLimitStatus"
# Поиск мест, где используется HandleRateLimit
rg "HandleRateLimit" -A 2
# Поиск определения RateLimitStatus
ast-grep --pattern 'enum RateLimitStatus'
Length of output: 65741
Script:
#!/bin/bash
# Поиск определения RateLimitStatus
rg -A 5 "enum RateLimitStatus"
# Поиск использования HandleRateLimit с возвращаемым значением
rg -A 2 "HandleRateLimit.*RateLimitStatus"
# Поиск мест, где проверяется результат HandleRateLimit
rg "HandleRateLimit.*!= RateLimitStatus\.Allowed"
Length of output: 1325
Content.IntegrationTests/PoolManager.Cvars.cs (1)
39-40
: Настройка тестовых параметров ограничения частоты взаимодействий
Добавленные параметры корректно настраивают среду тестирования:
- Большое значение
InteractionRateLimitCount
(9999999) предотвращает ложные срабатывания ограничений - Малый период
InteractionRateLimitPeriod
(0.1) обеспечивает быстрое обновление счетчиков
✅ Verification successful
Let me gather more context about the rate limiting implementation to ensure these test values are appropriate.
Параметры ограничения частоты взаимодействий корректно настроены для тестовой среды
Установленные значения в тестовой конфигурации обоснованы:
- Значение 9999999 для
InteractionRateLimitCount
и период 0.1 секунд дляInteractionRateLimitPeriod
эффективно отключают ограничения в тестовой среде - Это необходимо для корректной работы интеграционных тестов, так как система ограничения частоты взаимодействий активна в
SharedInteractionSystem
- Данные параметры не влияют на производственную среду, так как используются только в контексте тестов
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка использования этих параметров в тестах
rg "InteractionRateLimit(Count|Period)" -t cs
Length of output: 946
Script:
#!/bin/bash
# Check the rate limiting implementation details
ast-grep --pattern 'class SharedInteractionSystem {
$$$
RateLimitRegistration($_) {
$$$
}
$$$
}'
Length of output: 110
Script:
#!/bin/bash
# Check for any rate limit related tests
rg "test.*ratelimit" -i -t cs
Length of output: 31
Script:
#!/bin/bash
# Get the default values from CCVars
ast-grep --pattern 'CVarDef<$_> InteractionRateLimit$_ = new($_)'
Length of output: 67
Script:
#!/bin/bash
# Let's try a different pattern to get the default values
rg "InteractionRateLimit.*=.*new" -t cs Content.Shared/CCVar/CCVars.cs -A 2
# And check the actual rate limiting implementation
rg "RateLimitRegistration" -t cs Content.Shared/Interaction/SharedInteractionSystem.cs -A 5 -B 5
Length of output: 681
Content.Shared/_White/CVars.cs (2)
73-78
: Добавление конфигурации голоса для объявлений
Корректно определена конфигурация для идентификатора голоса системы объявлений с разумным значением по умолчанию "Announcer".
88-93
: Количество TTS сообщений в период
Ограничение в 3 сообщения за период выглядит разумным для предотвращения спама, но требует проверки в реальных условиях.
✅ Verification successful
Ограничение в 3 TTS сообщения реализовано корректно
Реализация использует стандартную систему ограничений с корректной обработкой превышения лимита:
- Регистрация ограничения через PlayerRateLimitManager
- Уведомление игрока при достижении лимита
- Проверка лимита перед каждым действием
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка использования параметров ограничения TTS
rg "TTSRateLimit(Count|Period)" -t cs
Length of output: 415
Script:
#!/bin/bash
# Проверяем реализацию использования TTSRateLimit
ast-grep --pattern 'TTSRateLimit' Content.Server/_White/TTS/TTSSystem.RateLimit.cs
Length of output: 82
Script:
#!/bin/bash
# Проверяем содержимое файла с реализацией ограничений TTS
cat Content.Server/_White/TTS/TTSSystem.RateLimit.cs
Length of output: 1170
Content.Server/IoC/ServerContentIoC.cs (1)
73-74
: Проверьте порядок регистрации зависимостей
Убедитесь, что PlayerRateLimitManager
регистрируется после всех необходимых зависимостей. Рекомендуется группировать связанные регистрации вместе.
✅ Verification successful
Let me analyze the dependencies and generate additional verification scripts to check the initialization order.
Порядок регистрации зависимостей корректный
На основе анализа кода можно сделать вывод, что регистрация PlayerRateLimitManager
выполняется в правильном порядке:
- Все базовые сервисы, от которых зависит
PlayerRateLimitManager
(IAdminLog, IGameTiming, IConfigurationManager, IPlayerManager), регистрируются ранее в процессе инициализации IoC - Регистрация конкретной реализации и интерфейса выполнена последовательно
- Компоненты, использующие
PlayerRateLimitManager
, регистрируются после него
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка зависимостей PlayerRateLimitManager
rg -l "PlayerRateLimitManager" | xargs rg "Dependency"
Length of output: 6067
Script:
#!/bin/bash
# Проверяем инициализацию зависимостей PlayerRateLimitManager
ast-grep --pattern 'Initialize()
{
$$$
}' Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs
# Проверяем порядок регистрации компонентов в IoC
rg -A 5 -B 5 "Register<PlayerRateLimitManager>" Content.Server/IoC/ServerContentIoC.cs
Length of output: 656
Content.Server/VoiceMask/VoiceMaskSystem.cs (2)
33-34
:
Требуется реализация метода InitializeTTS()
Вызов метода InitializeTTS()
добавлен, но его реализация отсутствует в предоставленном коде. Это может привести к ошибкам во время выполнения.
✅ Verification successful
Метод InitializeTTS() реализован корректно
Реализация метода InitializeTTS()
найдена в файле Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs
. Метод содержит необходимую логику для обработки событий, связанных с системой TTS (Text-to-Speech). Проблем с реализацией не обнаружено.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск реализации InitializeTTS
rg -p "InitializeTTS" --type cs
Length of output: 199
Script:
#!/bin/bash
# Проверим реализацию метода InitializeTTS
ast-grep --pattern 'private void InitializeTTS() { $$$ }' Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs
Length of output: 108
Script:
#!/bin/bash
# Посмотрим содержимое файла с реализацией TTS
cat Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs
Length of output: 1036
32-34
: Проверьте порядок инициализации
Убедитесь, что вызов InitializeTTS()
происходит после инициализации всех необходимых зависимостей. Рекомендуется добавить комментарий, объясняющий причину размещения этого вызова в конце метода Initialize.
✅ Verification successful
Let me gather more information about the initialization order and dependencies.
Let me try a different approach to gather the initialization information.
Let me check one more thing about the TTS dependencies.
Порядок инициализации корректен
На основе анализа кода можно сделать вывод, что вызов InitializeTTS()
безопасен в текущем месте, так как:
- Метод
InitializeTTS()
только подписывается на событияTransformSpeakerVoiceEvent
иVoiceMaskChangeVoiceMessage
- Все необходимые зависимости системы (
SharedUserInterfaceSystem
,SharedPopupSystem
,ISharedAdminLogManager
,IPrototypeManager
) уже внедрены через атрибут[Dependency]
и доступны к моменту вызова
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск зависимостей TTS системы
rg -p "TTSSystem|TTSManager" --type cs | rg "\[Dependency\]" -B 2 -A 2
Length of output: 414
Script:
#!/bin/bash
# Check TTSSystem initialization and dependencies
ast-grep --pattern 'class TTSSystem : EntitySystem {
$$$
Initialize() {
$$$
}
$$$
}'
# Check VoiceMaskSystem initialization and dependencies
ast-grep --pattern 'class VoiceMaskSystem {
$$$
Initialize() {
$$$
}
$$$
}'
# Look for InitializeTTS implementation
rg "InitializeTTS" -A 5 --type cs
Length of output: 188
Script:
#!/bin/bash
# Search for VoiceMaskSystem initialization and TTS related code
rg "InitializeTTS|VoiceMaskSystem" -B 2 -A 5 --type cs
# Look for TTS system dependencies and initialization
rg "TTSSystem.*Initialize" -A 10 --type cs
# Check if VoiceMaskSystem has any TTS-related dependencies
rg "\[Dependency\].*TTS" -B 2 -A 2 Content.Server/VoiceMask/VoiceMaskSystem.cs
Length of output: 2512
Script:
#!/bin/bash
# Check TTS dependencies in VoiceMaskSystem
rg "\[Dependency\]" -B 1 -A 1 Content.Server/_White/TTS/VoiceMaskSystem.TTS.cs
# Check if TTSSystem is injected into VoiceMaskSystem
rg "TTSSystem.*=.*default" Content.Server/VoiceMask/VoiceMaskSystem.cs
Length of output: 153
Content.Shared/Chat/SharedChatSystem.cs (2)
Line range hint 82-92
: Улучшена логика кэширования радиоканалов!
Очистка словаря перед повторным заполнением и проверка на дубликаты ключей - правильное решение. Это предотвращает:
- Накопление устаревших записей
- Конфликты ключей каналов
- Утечки памяти при перезагрузке прототипов
27-31
: Проверить использование констант в связанных системах
Необходимо убедиться, что новые константы корректно используются в системах обработки голосовой связи.
✅ Verification successful
Константы голосовой связи корректно используются в системе
Проверка показала, что константы VoiceRange
, WhisperClearRange
и WhisperMuffledRange
правильно интегрированы в следующих ключевых системах:
- Основная система чата (
ChatSystem.cs
) использует все три константы для определения дальности голосовой связи - Система прослушивания (
ListeningSystem.cs
) корректно обрабатывает шёпот с учетомWhisperClearRange
- TTS система (
TTSSystem.cs
,TTSManager.cs
) учитывает все константы для определения дальности звука - Система микрофонов камер наблюдения (
SurveillanceCameraMicrophoneSystem.cs
) корректно используетVoiceRange
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск использования констант голосовой связи
echo "Поиск использования VoiceRange:"
rg "VoiceRange" --type cs
echo -e "\nПоиск использования WhisperClearRange:"
rg "WhisperClearRange" --type cs
echo -e "\nПоиск использования WhisperMuffledRange:"
rg "WhisperMuffledRange" --type cs
# Поиск потенциальных мест, где константы должны использоваться
echo -e "\nПоиск потенциальных мест использования:"
rg "voice.*range|whisper.*range|chat.*range" --type cs -i
Length of output: 15109
Content.Server/Chat/Systems/ChatSystem.cs (5)
24-24
: Добавлено пространство имен для ограничения скорости игроков
Было добавлено пространство имен Content.Shared.Players.RateLimiting
, что указывает на использование функционала ограничения скорости игроков в этом классе. Убедитесь, что все зависимости корректно настроены и используются в коде.
Line range hint 105-106
: Добавлен параметр languageOverride
в метод
В метод TrySendInGameICMessage
добавлен новый параметр LanguagePrototype? languageOverride = null
. Пожалуйста, убедитесь, что все вызовы этого метода обновлены и передают корректное значение для этого параметра, чтобы избежать возможных ошибок во время выполнения.
Line range hint 233-235
: Добавлена обработка телепатического чата
Добавлен новый тип чата InGameICChatType.Telepathic
, обрабатываемый в случае Telepathic
. Метод _telepath.SendTelepathicChat
вызывается для отправки телепатических сообщений. Убедитесь, что этот метод реализован корректно и телепатический чат функционирует согласно ожиданиям.
Line range hint 371-378
: Использование languageOverride
при определении языка
Добавлено использование параметра languageOverride
при определении языка сообщения:
-var language = _language.GetLanguage(source);
+var language = languageOverride ?? _language.GetLanguage(source);
Убедитесь, что логика выбора языка корректна и не приводит к неожиданному поведению при передаче languageOverride
.
Line range hint 545-546
: Добавлен параметр LanguagePrototype language
в методы обертки сообщений
В методы WrapPublicMessage
, WrapWhisperMessage
и WrapMessage
добавлен параметр LanguagePrototype? language
. Убедитесь, что переданный язык используется корректно при формировании сообщений и что это изменение совместимо с существующим функционалом.
Content.Shared/Interaction/SharedInteractionSystem.cs (8)
5-6
: Добавлены пространства имен для настроек и чата
Добавлены using Content.Shared.CCVar;
и using Content.Shared.Chat;
для использования конфигурационных переменных и функционала чата в системе взаимодействия.
21-21
: Добавлено пространство имен для ограничения скорости игроков
Добавлено using Content.Shared.Players.RateLimiting;
для использования механизма ограничения скорости взаимодействий игроков.
30-30
: Добавлена зависимость на конфигурационный менеджер
Добавлено using Robust.Shared.Configuration;
для доступа к настройкам конфигурации в системе взаимодействия.
72-74
: Добавлены новые зависимости
В класс SharedInteractionSystem
добавлены следующие зависимости:
SharedPlayerRateLimitManager _rateLimit
IConfigurationManager _cfg
ISharedChatManager _chat
Убедитесь, что эти зависимости корректно инициализированы и используются для управления ограничением скорости взаимодействий и отправки сообщений администраторам.
92-92
: Определена константа RateLimitKey
Добавлена константа public const string RateLimitKey = "Interaction";
для использования в системе ограничения скорости взаимодействий.
134-141
: Регистрация ограничения скорости взаимодействий
В методе Initialize
зарегистрировано ограничение скорости взаимодействий с помощью _rateLimit.Register
:
_rateLimit.Register(RateLimitKey,
new RateLimitRegistration(CCVars.InteractionRateLimitPeriod,
CCVars.InteractionRateLimitCount,
null,
CCVars.InteractionRateLimitAnnounceAdminsDelay,
RateLimitAlertAdmins)
);
Убедитесь, что параметры ограничения скорости настроены корректно и соответствуют требованиям для предотвращения злоупотреблений взаимодействиями.
145-148
: Реализован метод оповещения администраторов о нарушениях ограничения скорости
Добавлен метод RateLimitAlertAdmins
, который отправляет сообщение администраторам при превышении игроком лимита взаимодействий:
private void RateLimitAlertAdmins(ICommonSession session)
{
_chat.SendAdminAlert(Loc.GetString("interaction-rate-limit-admin-announcement", ("player", session.Name)));
}
Убедитесь, что сообщение локализации "interaction-rate-limit-admin-announcement"
определено и отображается корректно.
Line range hint 1241-1275
: Добавлена проверка ограничения скорости в ValidateClientInput
В метод ValidateClientInput
добавлена проверка ограничения скорости взаимодействий:
return _rateLimit.CountAction(session!, RateLimitKey) == RateLimitStatus.Allowed;
Убедитесь, что это изменение эффективно предотвращает злоупотребления взаимодействиями без негативного влияния на честных игроков, особенно тех, у кого могут быть проблемы с сетью.
Content.Shared/CCVar/CCVars.cs (6)
959-965
: Добавлен CVar AdminBypassMaxPlayers
Добавлен новый конфигурационный параметр AdminBypassMaxPlayers
, позволяющий администраторам подключаться к серверу даже при достижении максимального количества игроков.
966-974
: Добавлен CVar AdminUseCustomNamesAdminRank
Добавлен новый конфигурационный параметр AdminUseCustomNamesAdminRank
, определяющий, будут ли использоваться настраиваемые названия рангов для администраторов. Если установлено значение false
, будет использоваться фактическое название ранга независимо от пользовательского титула.
979-993
: Добавлены параметры ограничения скорости AHELP сообщений
Введены новые конфигурационные параметры для управления ограничением скорости AHELP сообщений:
AhelpRateLimitPeriod
: период времени для подсчета сообщений (секунды).AhelpRateLimitCount
: максимальное количество сообщений в рамках периода.
Убедитесь, что эти параметры настроены в соответствии с требованиями сервера для предотвращения спама в AHELP.
994-1011
: Добавлены параметры отображения префиксов администраторов в AHELP
Введены новые конфигурационные параметры:
AhelpAdminPrefix
: определяет, отображается ли позиция администратора в AHELP сообщениях.AhelpAdminPrefixWebhook
: определяет, отображается ли позиция администратора в вебхуках AHELP.
Убедитесь, что эти настройки соответствуют политикам приватности и требованиям отображения информации об администраторах.
1946-1947
: Изменен тип CVar ChatRateLimitPeriod
Тип конфигурационного параметра ChatRateLimitPeriod
изменен с int
на float
для поддержки более точных значений периода ограничения скорости чата.
2188-2211
: Добавлены параметры ограничения скорости взаимодействий
Введены новые конфигурационные параметры для ограничения скорости взаимодействий игроков:
InteractionRateLimitCount
: максимальное количество взаимодействий в заданный период.InteractionRateLimitPeriod
: период времени для подсчета взаимодействий (в секундах).InteractionRateLimitAnnounceAdminsDelay
: минимальная задержка между оповещениями администраторов о превышении лимита взаимодействий.
Убедитесь, что эти параметры настроены корректно для эффективного предотвращения злоупотреблений взаимодействиями без негативного влияния на честных игроков.
Resources/Locale/en-US/interaction/interaction-system.ftl (1)
2-3
: Добавлены новые строки локализации для системы взаимодействий
Добавлены следующие строки локализации:
interaction-system-user-interaction-cannot-reach
: "You can't reach there!"interaction-rate-limit-admin-announcement
: сообщение для оповещения администраторов о превышении игроком лимита взаимодействий.
Убедитесь, что переводы на другие языки актуальны и сообщения отображаются корректно в игре.
private void RegisterRateLimits() | ||
{ | ||
ref var datum = ref CollectionsMarshal.GetValueRefOrAddDefault(_rateLimitData, player, out _); | ||
var time = _gameTiming.RealTime; | ||
if (datum.CountExpires < time) | ||
{ | ||
// Period expired, reset it. | ||
var periodLength = _configurationManager.GetCVar(CCVars.ChatRateLimitPeriod); | ||
datum.CountExpires = time + TimeSpan.FromSeconds(periodLength); | ||
datum.Count = 0; | ||
datum.Announced = false; | ||
} | ||
|
||
var maxCount = _configurationManager.GetCVar(CCVars.ChatRateLimitCount); | ||
datum.Count += 1; | ||
|
||
if (datum.Count <= maxCount) | ||
return true; | ||
|
||
// Breached rate limits, inform admins if configured. | ||
if (_configurationManager.GetCVar(CCVars.ChatRateLimitAnnounceAdmins)) | ||
{ | ||
if (datum.NextAdminAnnounce < time) | ||
{ | ||
SendAdminAlert(Loc.GetString("chat-manager-rate-limit-admin-announcement", ("player", player.Name))); | ||
var delay = _configurationManager.GetCVar(CCVars.ChatRateLimitAnnounceAdminsDelay); | ||
datum.NextAdminAnnounce = time + TimeSpan.FromSeconds(delay); | ||
} | ||
} | ||
|
||
if (!datum.Announced) | ||
{ | ||
DispatchServerMessage(player, Loc.GetString("chat-manager-rate-limited"), suppressLog: true); | ||
_adminLogger.Add(LogType.ChatRateLimited, LogImpact.Medium, $"Player {player} breached chat rate limits"); | ||
|
||
datum.Announced = true; | ||
} | ||
|
||
return false; | ||
_rateLimitManager.Register(RateLimitKey, | ||
new RateLimitRegistration(CCVars.ChatRateLimitPeriod, | ||
CCVars.ChatRateLimitCount, | ||
RateLimitPlayerLimited, | ||
CCVars.ChatRateLimitAnnounceAdminsDelay, | ||
RateLimitAlertAdmins, | ||
LogType.ChatRateLimited) | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо вызвать метод RegisterRateLimits() для регистрации ограничений скорости.
Метод RegisterRateLimits()
определен, но его вызов не обнаружен. Чтобы система ограничения скорости чата работала корректно, вызовите этот метод в конструкторе или методе инициализации класса ChatManager
.
public RateLimitStatus HandleRateLimit(ICommonSession player) | ||
{ | ||
return _rateLimitManager.CountAction(player, RateLimitKey); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Обнаружены места, требующие исправления в ChatSystem.cs
В файле ChatSystem.cs найдены два места, где метод HandleRateLimit используется некорректно с устаревшей логикой булевого значения:
if (player != null && !_chatManager.HandleRateLimit(player))
Эти проверки должны быть обновлены для работы с RateLimitStatus, как в TTSSystem.Preview.cs:
if (HandleRateLimit(player) != RateLimitStatus.Allowed)
🔗 Analysis chain
Убедитесь, что все обращения к HandleRateLimit учитывают новый тип возвращаемого значения.
Метод HandleRateLimit
теперь возвращает RateLimitStatus
вместо bool
. Проверьте, что все места в кодовой базе, где вызывается этот метод, обновлены для корректной обработки нового возвращаемого типа.
Запустите следующий скрипт для поиска всех вызовов HandleRateLimit
и проверки их использования:
Let me check the usage context of these calls to verify if they handle the return type correctly.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск всех вызовов метода HandleRateLimit в кодовой базе
rg 'HandleRateLimit\(' -t cs
Length of output: 828
Script:
#!/bin/bash
# Get context for ChatSystem.cs calls
rg 'HandleRateLimit\(' Content.Server/Chat/Systems/ChatSystem.cs -B 2 -A 2
# Get the definition of RateLimitStatus enum
rg -g '*.cs' 'enum RateLimitStatus'
Length of output: 425
Script:
#!/bin/bash
# Get the definition of RateLimitStatus enum values
rg -g '*.cs' -A 5 'enum RateLimitStatus'
# Get more context around the TTSSystem preview usage
rg 'HandleRateLimit\(' Content.Server/_White/TTS/TTSSystem.Preview.cs -B 2 -A 2
Length of output: 739
try | ||
{ | ||
isDoNext = _currentlyPlaying == null || | ||
(_currentlyPlaying.AudioStream != null && TerminatingOrDeleted(_currentlyPlaying.AudioStream!.Value)) | ||
|| !(_currentlyPlaying.AudioStream?.Comp.Playing ?? false); | ||
} | ||
catch (Exception err) | ||
{ | ||
isDoNext = true; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Необходимо логировать исключения в блоке catch для улучшения отладки.
В блоке catch
исключение перехватывается, но не обрабатывается и не логируется, что затрудняет выявление потенциальных проблем.
Предлагаемое изменение для логирования исключения:
catch (Exception err)
{
isDoNext = true;
+ _sawmill.Error($"Ошибка при проверке состояния аудиопотока: {err}");
}
Committable suggestion skipped: line range outside the PR's diff.
// ReSharper disable once InconsistentNaming | ||
public readonly Dictionary<string, byte[]> _cache = new(); | ||
// ReSharper disable once InconsistentNaming | ||
public readonly HashSet<string> _cacheKeysSeq = new(); | ||
// ReSharper disable once InconsistentNaming | ||
public int _maxCachedCount = 200; | ||
private string _apiUrl = string.Empty; | ||
private string _apiToken = string.Empty; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Используйте свойства вместо публичных полей с подчеркиванием
Объявление публичных полей _cache
, _cacheKeysSeq
и _maxCachedCount
с подчеркиванием нарушает конвенции именования в C#. Рекомендуется сделать их приватными и предоставить доступ через свойства. Это улучшит инкапсуляцию и поддерживаемость кода.
if (_cache.Count > _maxCachedCount) | ||
{ | ||
var firstKey = _cacheKeysSeq.First(); | ||
_cache.Remove(firstKey); | ||
_cacheKeysSeq.Remove(firstKey); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Исправьте логику удаления устаревших элементов кеша
Использование HashSet
для хранения последовательности ключей _cacheKeysSeq
может привести к непредсказуемому порядку элементов, так как HashSet
не гарантирует сохранение порядка добавления. Рекомендуется заменить HashSet
на Queue
или LinkedList
для обеспечения корректного порядка удаления устаревших элементов из кеша.
Примените следующий дифф для исправления:
-public readonly HashSet<string> _cacheKeysSeq = new();
+public readonly Queue<string> _cacheKeysSeq = new();
...
_cacheKeysSeq.Enqueue(cacheKey);
...
var firstKey = _cacheKeysSeq.Dequeue();
_cache.Remove(firstKey);
Committable suggestion skipped: line range outside the PR's diff.
private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId) | ||
{ | ||
var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{cacheId}.ogg").ToRootedPath(); | ||
_resourceManager.UserData.CreateDir(resPath.Directory); | ||
return resPath.ToRootedPath(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Улучшите безопасность работы с путями файлов
В методе GetCacheId
отсутствует санитизация входных параметров и проверка безопасности пути.
Рекомендуемые изменения:
private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId)
{
+ if (voicePrototype == null)
+ throw new ArgumentNullException(nameof(voicePrototype));
+
+ if (string.IsNullOrEmpty(cacheId))
+ throw new ArgumentException("Cache ID cannot be empty", nameof(cacheId));
+
+ // Санитизация входных параметров
+ var sanitizedId = string.Join("_", cacheId.Split(Path.GetInvalidFileNameChars()));
+
- var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{cacheId}.ogg").ToRootedPath();
+ var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{sanitizedId}.ogg").ToRootedPath();
_resourceManager.UserData.CreateDir(resPath.Directory);
return resPath.ToRootedPath();
}
📝 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.
private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId) | |
{ | |
var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{cacheId}.ogg").ToRootedPath(); | |
_resourceManager.UserData.CreateDir(resPath.Directory); | |
return resPath.ToRootedPath(); | |
} | |
private ResPath GetCacheId(TTSVoicePrototype voicePrototype, string cacheId) | |
{ | |
if (voicePrototype == null) | |
throw new ArgumentNullException(nameof(voicePrototype)); | |
if (string.IsNullOrEmpty(cacheId)) | |
throw new ArgumentException("Cache ID cannot be empty", nameof(cacheId)); | |
// Санитизация входных параметров | |
var sanitizedId = string.Join("_", cacheId.Split(Path.GetInvalidFileNameChars())); | |
var resPath = new ResPath($"voicecache/{voicePrototype.ID}/{sanitizedId}.ogg").ToRootedPath(); | |
_resourceManager.UserData.CreateDir(resPath.Directory); | |
return resPath.ToRootedPath(); | |
} |
catch (Exception) | ||
{ | ||
// skip! | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Пустой блок catch может скрыть важные ошибки
Пустой блок catch может привести к тому, что важные ошибки останутся незамеченными. Рекомендуется добавить логирование ошибок для облегчения отладки.
catch (Exception)
{
- // skip!
+ _sawmill.Error($"Не удалось сгенерировать TTS для объявления");
}
Committable suggestion skipped: line range outside the PR's diff.
private readonly List<string> _sampleText = new() // TODO: Локализация? | ||
{ | ||
"Съешь же ещё этих мягких французских булок, да выпей чаю.", | ||
"Клоун, прекрати разбрасывать банановые кожурки офицерам под ноги!", | ||
"Капитан, вы уверены что хотите назначить клоуна на должность главы персонала?", | ||
"Эс Бэ! Тут человек в сером костюме, с тулбоксом и в маске! Помогите!!", | ||
"Учёные, тут странная аномалия в баре! Она уже съела мима!", | ||
"Я надеюсь что инженеры внимательно следят за сингулярностью...", | ||
"Вы слышали эти странные крики в техах? Мне кажется туда ходить небезопасно.", | ||
"Вы не видели Гамлета? Мне кажется он забегал к вам на кухню.", | ||
"Здесь есть доктор? Человек умирает от отравленного пончика! Нужна помощь!", | ||
"Вам нужно согласие и печать квартирмейстера, если вы хотите сделать заказ на партию дробовиков.", | ||
"Возле эвакуационного шаттла разгерметизация! Инженеры, нам срочно нужна ваша помощь!", | ||
"Бармен, налей мне самого крепкого вина, которое есть в твоих запасах!" | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Необходима локализация примеров текста
Примеры текста жёстко закодированы на русском языке. Следует перенести их в систему локализации для поддержки многоязычности.
Хотите, чтобы я помог с реализацией локализации для этих текстов?
var cached = await GetFromCache(cacheId); | ||
if (cached != null) | ||
{ | ||
RaiseNetworkEvent(new PlayTTSEvent(cached), Filter.SinglePlayer(args.SenderSession)); | ||
return; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Based on the search results, I can now provide a final response regarding the caching mechanism in TTSSystem:
Механизм кэширования требует улучшений
В текущей реализации кэширования TTS обнаружены следующие проблемы:
- Отсутствует явное ограничение размера кэша на диске (в
TTSSystem.Cache.cs
) - Нет механизма очистки устаревших файлов кэша
- Отсутствует синхронизация при конкурентном доступе к файловому кэшу
Рекомендации:
- Добавить ограничение на общий размер кэш-файлов и удаление старых файлов при превышении лимита
- Реализовать периодическую очистку неиспользуемых кэш-файлов
- Использовать блокировки при работе с файловым кэшем для предотвращения race conditions
🔗 Analysis chain
Проверьте механизм кэширования
Убедитесь, что механизм кэширования имеет:
- Ограничение размера кэша
- Стратегию очистки устаревших данных
- Обработку конкурентного доступа
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск реализации кэширования
ast-grep --pattern 'GetFromCache($_) {
$$$
}'
Length of output: 49
Script:
#!/bin/bash
# Поиск реализации GetFromCache с учетом возможного async
rg -A 10 "GetFromCache"
# Поиск использования кэша и связанных структур данных
rg -A 5 "cache" -i
# Поиск конкурентных примитивов
rg -A 3 "(SemaphoreSlim|lock|Mutex|ConcurrentDictionary)"
Length of output: 66742
@@ -66,7 +69,9 @@ public static void Register() | |||
IoCManager.Register<DiscordAuthManager>(); | |||
IoCManager.Register<ISharedPlaytimeManager, PlayTimeTrackingManager>(); | |||
IoCManager.Register<ServerApi>(); | |||
IoCManager.Register<TTSManager>(); // WD EDIT | |||
IoCManager.Register<JobWhitelistManager>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Обнаружена дублирующаяся регистрация JobWhitelistManager
JobWhitelistManager уже зарегистрирован выше в строке 69. Необходимо удалить дублирующуюся регистрацию.
- IoCManager.Register<JobWhitelistManager>();
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Outside diff range and nitpick comments (1)
Content.Shared.Database/LogType.cs (1)
Line range hint
420-421
: Несогласованность в стиле документацииДля новых значений
BagOfHolding
иPsionics
используются однострочные комментарии, в то время как дляRateLimited
используется XML-документация. Рекомендуется придерживаться единого стиля документации.Предлагаемое решение:
- BagOfHolding = 420, //Nyano - Summary: adds bag of holding. - Psionics = 421, //Nyano - Summary: ads psionic as a log type. + /// <summary> + /// Adds bag of holding functionality. + /// </summary> + BagOfHolding = 420, + /// <summary> + /// Adds psionic as a log type. + /// </summary> + Psionics = 421,
Content.Shared.Database/LogType.cs
Outdated
/// <summary> | ||
/// User was rate-limited for some spam action. | ||
/// </summary> | ||
/// <remarks> | ||
/// This is a default value used by <c>PlayerRateLimitManager</c>, though users can use different log types. | ||
/// </remarks> | ||
RateLimited = 87, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Критическая ошибка: Дублирование значения перечисления
Обнаружено дублирование значения 87 для RateLimited
и ChatRateLimited
. Это может привести к неоднозначности при логировании и нарушает принцип уникальности значений перечисления.
Рекомендации:
- Выберите одно из двух значений для логирования ограничения частоты
- Присвойте второму значению уникальный идентификатор
Предлагаемое решение:
- RateLimited = 87,
+ RateLimited = 422, // Using next available value
или объедините оба значения в одно, если они представляют схожую функциональность.
Also applies to: 420-421
…minor rewrite on respawn command and new erase command (#30433) * Localize respawn command, allow for it to use userids, and make it use [Dependency] attributes * Make respawn verb available for offline players * Make erase available for offline players A thousand admins rejoice * Reorder verbs in code * Add erase command * Fix localisation for erase command * Address reviews and add completion to respawn command * Complete reviews which I forgor (cherry picked from commit 9a63144636f9ef272d955f1e131b17233c6ec5da)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 11
🧹 Outside diff range and nitpick comments (13)
Resources/Locale/en-US/administration/bwoink.ftl (1)
18-20
: Новые строки локализации выглядят корректноДобавленные сообщения соответствуют общему стилю файла локализации и правильно описывают новую функциональность ограничения частоты сообщений.
Рекомендуется добавить комментарии для переводчиков, объясняющие контекст использования этих сообщений.
Resources/Locale/en-US/administration/commands/respawn.ftl (4)
1-2
: Проверьте согласованность описания команды!Описание команды и формат справки соответствуют стандартам, но рекомендуется добавить примеры использования для большей ясности.
Предлагаю добавить примеры:
cmd-respawn-desc = Respawns a player, kicking them back to the lobby. cmd-respawn-help = respawn [player or UserId] +cmd-respawn-help-examples = Examples: + respawn John + respawn 12345
4-7
: Улучшите информативность сообщений об ошибках!Текущие сообщения об ошибках могут быть более информативными для пользователя.
Предлагаю следующие изменения:
-cmd-respawn-invalid-args = Must provide <= 1 argument. +cmd-respawn-invalid-args = Error: Command accepts only 0 or 1 argument. -cmd-respawn-no-player = If not a player, an argument must be given. +cmd-respawn-no-player = Error: Player name or UserId required when executing from console. -cmd-respawn-unknown-player = Unknown player +cmd-respawn-unknown-player = Error: Player not found in the system.
8-8
: Уточните сообщение о статусе игрока!Сообщение о статусе оффлайн игрока корректно, но может быть более точным.
Предлагаю уточнить формулировку:
-cmd-respawn-player-not-online = Player is not currently online, but they will respawn if they come back online +cmd-respawn-player-not-online = Player is offline. Respawn will be triggered automatically upon their next login.
9-9
: Дополните подсказку автозаполнения!Текущая подсказка автозаполнения слишком лаконична.
Предлагаю расширить подсказку:
-cmd-respawn-player-completion = <Username> +cmd-respawn-player-completion = <Username or UserId>Content.Server/GameTicking/Commands/RespawnCommand.cs (1)
46-47
: Уточните сообщения об ошибках для разных ситуацийСообщение об ошибке
cmd-respawn-unknown-player
используется в двух разных случаях: когда игрок не найден по имени или ID (строки 46-47) и когда не удалось получить данные игрока (строка 57). Рекомендуется использовать разные сообщения об ошибках для этих ситуаций, чтобы предоставить более точную информацию пользователю.Also applies to: 57-57
Content.Server/Administration/Systems/AdminSystem.cs (1)
65-65
: Предложение по улучшению: Инкапсулировать полеPanicBunker
Поле
PanicBunker
объявлено какpublic readonly
, что позволяет внешним классам получать к нему доступ напрямую. Рекомендуется предоставить ограниченный доступ через свойство или методы, чтобы улучшить инкапсуляцию и предотвратить непреднамеренные изменения извне.Resources/Locale/en-US/administration/commands/erase.ftl (1)
3-3
: Нитпик: Исправьте опечатку в тексте помощи командыВ строке 3 в описании параметров команды возможно допущена опечатка. Вместо "erase " лучше использовать "erase " для ясности и корректности.
Content.Server/Administration/BanPanelEui.cs (1)
135-140
: Улучшена обработка ошибок при удалении игрока!Изменения делают код более надежным, но можно улучшить обработку ошибок.
Предлагаю добавить информирование игрока об ошибке:
try { if (_entities.TrySystem(out AdminSystem? adminSystem)) adminSystem.Erase(targetUid.Value); } catch (Exception e) { _sawmill.Error($"Error while erasing banned player:\n{e}"); + _chat.DispatchServerMessage(Player, Loc.GetString("ban-panel-erase-error")); }
Content.Server/Chat/Managers/ChatManager.cs (2)
196-197
: Добавить логирование для ограничения частоты сообщений!Реализация ограничения частоты сообщений работает корректно, но стоит добавить логирование для отладки и мониторинга.
Предлагаю добавить логирование:
+ private const string LoggerSawmill = "chat.ratelimit"; + [Dependency] private readonly ILogManager _logManager = default!; + private ISawmill _sawmill = default!; + + public override void Initialize() + { + base.Initialize(); + _sawmill = _logManager.GetSawmill(LoggerSawmill); + } if (player != null && _chatManager.HandleRateLimit(player) != RateLimitStatus.Allowed) + { + _sawmill.Debug($"Rate limit exceeded for player {player.Name}"); return; + }Also applies to: 295-296
169-182
: Добавить проверку входных параметров в SendAdminAlert!Реализация хорошая, но стоит добавить проверку входных параметров для большей надежности.
Предлагаю добавить проверки:
public void SendAdminAlert(EntityUid player, string message) { + if (string.IsNullOrEmpty(message)) + { + _sawmill.Warning($"Attempted to send empty admin alert for player {player}"); + return; + } + var mindSystem = _entityManager.System<SharedMindSystem>(); if (!mindSystem.TryGetMind(player, out var mindId, out var mind)) { SendAdminAlert(message); return; }Content.Server/Chat/Systems/ChatSystem.cs (1)
196-197
: Добавить документацию для телепатического чата!Реализация телепатического чата работает корректно, но требуется документация для лучшего понимания функциональности.
Предлагаю добавить XML-документацию:
+ /// <summary> + /// Обрабатывает телепатические сообщения между игроками. + /// </summary> + /// <param name="source">Сущность-отправитель</param> + /// <param name="message">Текст сообщения</param> + /// <param name="hideChat">Флаг скрытия сообщения в чате</param> public void SendTelepathicChat(EntityUid source, string message, bool hideChat) { // ... existing implementation }Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (1)
Line range hint
5-6
: Рассмотрите добавление документации для DefaultSexVoiceСловарь
DefaultSexVoice
играет важную роль в системе, но не имеет XML-документации, объясняющей его назначение и использование.Предлагаемые изменения:
+ /// <summary> + /// Сопоставляет пол персонажа с голосом по умолчанию. + /// Используется при создании нового персонажа или сбросе настроек голоса. + /// </summary> public static readonly Dictionary<Sex, string> DefaultSexVoice = new()
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (18)
Content.Client/Entry/EntryPoint.cs
(0 hunks)Content.Server/Administration/BanPanelEui.cs
(1 hunks)Content.Server/Administration/Commands/EraseCommand.cs
(1 hunks)Content.Server/Administration/Systems/AdminSystem.cs
(2 hunks)Content.Server/Administration/Systems/AdminVerbSystem.cs
(5 hunks)Content.Server/Chat/Managers/ChatManager.cs
(1 hunks)Content.Server/Chat/Managers/IChatManager.cs
(4 hunks)Content.Server/Chat/Systems/ChatSystem.cs
(3 hunks)Content.Server/Entry/EntryPoint.cs
(2 hunks)Content.Server/GameTicking/Commands/RespawnCommand.cs
(1 hunks)Content.Server/IoC/ServerContentIoC.cs
(3 hunks)Content.Server/Players/RateLimiting/PlayerRateLimitManager.cs
(1 hunks)Content.Shared.Database/LogType.cs
(1 hunks)Content.Shared/CCVar/CCVars.cs
(4 hunks)Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs
(1 hunks)Resources/Locale/en-US/administration/bwoink.ftl
(1 hunks)Resources/Locale/en-US/administration/commands/erase.ftl
(1 hunks)Resources/Locale/en-US/administration/commands/respawn.ftl
(1 hunks)
💤 Files with no reviewable changes (1)
- Content.Client/Entry/EntryPoint.cs
🚧 Files skipped from review as they are similar to previous changes (2)
- Content.Server/IoC/ServerContentIoC.cs
- Content.Shared.Database/LogType.cs
🔇 Additional comments (21)
Content.Server/Entry/EntryPoint.cs (1)
123-123
: Инициализация менеджера ограничения частоты действий выглядит корректно
Размещение инициализации PlayerRateLimitManager
после JobWhitelistManager
логично, так как они относятся к одной области функциональности.
Resources/Locale/en-US/administration/commands/respawn.ftl (1)
1-9
: Проверьте согласованность ключей локализации!
Необходимо убедиться, что названия ключей локализации соответствуют общему паттерну команд администратора.
✅ Verification successful
Let me check the naming patterns for other localization keys to ensure completeness.
Ключи локализации соответствуют общему паттерну
Проверка показала, что все ключи локализации в файле respawn.ftl
следуют единому паттерну именования, используемому в других командных файлах:
- Префикс
cmd-
для всех ключей - Суффиксы
-desc
и-help
для описания и справки - Дополнительные суффиксы для сообщений об ошибках и подсказок
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверяем паттерны именования в других файлах локализации команд
rg -g "*.ftl" "cmd-.*-desc|cmd-.*-help" "Resources/Locale/en-US/administration/commands/"
Length of output: 3649
Script:
#!/bin/bash
# Check for other command-related keys to ensure full pattern consistency
rg -g "*.ftl" "cmd-.*" "Resources/Locale/en-US/administration/commands/"
Length of output: 5529
Content.Shared/CCVar/CCVars.cs (3)
959-974
: Конфигурация для обхода ограничений администраторами выглядит правильно!
Новые CVar'ы для управления обходом ограничений администраторами и отображением пользовательских званий хорошо документированы и корректно настроены.
975-1011
: Конфигурация ограничений частоты AHELP реализована корректно!
CVar'ы для управления ограничениями частоты сообщений AHELP и отображением позиции администратора имеют правильную документацию и настройки.
2203-2230
: Конфигурация ограничений частоты взаимодействий реализована правильно!
CVar'ы для управления ограничениями частоты взаимодействий хорошо документированы и включают подробное обоснование выбранных значений по умолчанию.
Content.Server/GameTicking/Commands/RespawnCommand.cs (2)
11-11
: Изменение базового класса на LocalizedEntityCommands
выглядит корректным
Переход от IConsoleCommand
к LocalizedEntityCommands
позволяет использовать локализованные команды и улучшает структуру кода.
53-62
: Проверьте корректность стирания разума офлайн игрока
В случае отсутствия сессии игрока и успешного получения данных вызывается _mind.WipeMind(data.ContentData()?.Mind);
. Убедитесь, что стирание разума офлайн игрока является ожидаемым поведением и не приведёт к неожиданным последствиям для игрока при следующем входе в игру.
Content.Server/Administration/Systems/AdminVerbSystem.cs (9)
37-40
: Добавлены новые зависимости для законов силиконов и управления игроками
Добавлены using
директивы для Content.Server.Silicons.Laws
, Content.Shared.Silicons.Laws
, Content.Shared.Silicons.Laws.Components
и Robust.Server.Player
, что обеспечит необходимые зависимости для новых функциональностей.
74-76
: Корректное внедрение зависимостей через атрибуты [Dependency]
Поля _freeze
, _playerManager
и _siliconLawSystem
правильно объявлены с атрибутом [Dependency]
и инициализированы как default!
, что соответствует стандартам внедрения зависимостей.
161-161
: Проверьте корректность использования дополнительного аргумента в _mindSystem.TransferTo
В вызове _mindSystem.TransferTo(targetMind.Value, mobUid, true);
добавлен аргумент true
. Убедитесь, что метод TransferTo
принимает этот аргумент и что использование дополнительного параметра соответствует ожидаемому поведению системы (например, перезапись существующего носителя сознания).
191-198
: Добавлен новый верб для открытия панели игрока
Реализация верба для открытия панели игрока (playerpanel
) корректна. Команда вызывается правильно с использованием идентификатора пользователя targetActor.PlayerSession.UserId
.
200-230
: Добавлены вербы 'Erase' и 'Respawn' с использованием UserId
Вербы для удаления (Erase
) и возрождения (Respawn
) игрока правильно добавлены. Использование mind.UserId
после проверки на null
обеспечивает безопасное выполнение действий.
225-225
: Убедитесь, что mind.UserId
корректно форматируется в команде respawn
Вызов _console.ExecuteCommand(player, $"respawn \"{mind.UserId}\"");
использует интерполяцию строки с mind.UserId
. Убедитесь, что идентификатор пользователя правильно форматируется в строку и что команда respawn
принимает ожидаемый формат идентификатора.
232-282
: Реализованы вербы 'Freeze', 'Freeze and Mute' и 'Unfreeze' с корректной логикой
Логика определения состояния заморозки игрока и добавления соответствующих вербов реализована правильно. Учитываются различные состояния: когда игрок не заморожен, заморожен или заморожен с запрещением чата.
351-369
: Добавлен верб для доступа к интерфейсу законов силиконов
Верб для открытия интерфейса законов силиконов (Silicon Law UI
) добавлен корректно. Проверяется наличие компонента SiliconLawBoundComponent
, и осуществляется безопасное получение сессии игрока через _playerManager.TryGetSessionByEntity
.
360-363
: Убедитесь, что args.User
всегда соответствует активной сессии игрока
В методе используется _playerManager.TryGetSessionByEntity(args.User, out var session)
. Необходимо удостовериться, что args.User
всегда связан с активной сессией игрока, чтобы избежать потенциальных ситуаций, когда сессия не будет получена и метод вернёт выполнение без действий.
Content.Server/Administration/Systems/AdminSystem.cs (1)
338-399
: Код соответствует требованиям
Метод Erase
реализован корректно, логика удаления игрока и связанных с ним данных выполнена аккуратно и эффективно.
Content.Server/Administration/Commands/EraseCommand.cs (1)
38-46
: Код соответствует требованиям
Реализация команды EraseCommand
выглядит корректной, и методы Execute
и GetCompletion
работают ожидаемым образом.
Content.Server/Chat/Managers/IChatManager.cs (1)
Line range hint 27-55
: Код соответствует требованиям
Изменения в интерфейсе IChatManager
обоснованы и соответствуют современной архитектуре приложения. Обновленные сигнатуры методов улучшают согласованность и расширяют функциональность.
Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (2)
333-333
:
Проверьте обработку ошибок при установке голоса
Присвоение VoicePrototypeId
выполняется без проверки существования прототипа голоса. Это может привести к ошибкам во время выполнения.
Предлагаемые изменения:
- comp.VoicePrototypeId = voiceId;
+ if (_proto.HasIndex<TTSVoicePrototype>(voiceId))
+ {
+ comp.VoicePrototypeId = voiceId;
+ }
+ else
+ {
+ comp.VoicePrototypeId = DefaultVoice;
+ Log.Warning($"Attempted to set invalid voice ID {voiceId}, falling back to default");
+ }
Line range hint 4-4
: Проверьте валидность значения DefaultVoice
Убедитесь, что значение "Eugene" существует в прототипах голосов.
✅ Verification successful
Голос Eugene существует в прототипах
Проверка показала, что голос "Eugene" определен в файле прототипов Resources/Prototypes/_White/Voice/tts_voices.yml
как действительный TTS-голос со следующими параметрами:
- type: ttsVoice
id: Eugene
name: tts-voice-name-eugene
sex: Male
speaker: eugene
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверяем наличие прототипа голоса Eugene
rg -l "id: Eugene" Resources/Prototypes/Voice
Length of output: 47
Script:
#!/bin/bash
# Поиск файлов с прототипами голосов
fd . Resources/Prototypes -t f -e yml -e yaml | xargs cat
# Поиск использования DefaultVoice
ast-grep --pattern 'DefaultVoice = "$_"'
Length of output: 68722
Script:
#!/bin/bash
# Поиск файлов с прототипами голосов в директории Resources
fd . Resources -t f -e yml -e yaml | grep -i voice | xargs cat
# Поиск всех упоминаний Eugene в коде
rg "Eugene" -l
Length of output: 56631
<<<<<<< HEAD | ||
======= | ||
|
||
bwoink-title-none-selected = None selected | ||
|
||
bwoink-system-rate-limited = System: you are sending messages too quickly. | ||
>>>>>>> c33644532d (Rate limit ahelps (#29219)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо разрешить конфликт слияния
В файле присутствуют маркеры конфликта слияния Git (<<<<<<< HEAD, =======, >>>>>>), которые необходимо удалить перед слиянием изменений.
Примените следующие изменения для разрешения конфликта:
-<<<<<<< HEAD
-=======
-
bwoink-title-none-selected = None selected
bwoink-system-rate-limited = System: you are sending messages too quickly.
->>>>>>> c33644532d (Rate limit ahelps (#29219))
📝 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.
<<<<<<< HEAD | |
======= | |
bwoink-title-none-selected = None selected | |
bwoink-system-rate-limited = System: you are sending messages too quickly. | |
>>>>>>> c33644532d (Rate limit ahelps (#29219)) | |
bwoink-title-none-selected = None selected | |
bwoink-system-rate-limited = System: you are sending messages too quickly. |
<<<<<<< HEAD | ||
======= | ||
using Content.Server.Players; | ||
using Content.Server.Players.JobWhitelist; | ||
>>>>>>> c33644532d (Rate limit ahelps (#29219)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо разрешить конфликт слияния
В коде присутствуют маркеры конфликта слияния (<<<<<<< HEAD
, =======
, >>>>>>>
), которые необходимо удалить. Также присутствует дублирование директивы using Content.Server.Players.JobWhitelist
.
Примените следующие изменения:
-<<<<<<< HEAD
-
-=======
using Content.Server.Players;
-using Content.Server.Players.JobWhitelist;
->>>>>>> c33644532d (Rate limit ahelps (#29219))
Committable suggestion skipped: line range outside the PR's diff.
Content.Shared/CCVar/CCVars.cs
Outdated
/* | ||
* AHELP | ||
*/ | ||
|
||
/// <summary> | ||
/// Ahelp rate limit values are accounted in periods of this size (seconds). | ||
/// After the period has passed, the count resets. | ||
/// </summary> | ||
/// <seealso cref="AhelpRateLimitCount"/> | ||
public static readonly CVarDef<int> AhelpRateLimitPeriod = | ||
CVarDef.Create("ahelp.rate_limit_period", 2, CVar.SERVERONLY); | ||
|
||
/// <summary> | ||
/// How many ahelp messages are allowed in a single rate limit period. | ||
/// </summary> | ||
/// <seealso cref="AhelpRateLimitPeriod"/> | ||
public static readonly CVarDef<int> AhelpRateLimitCount = | ||
CVarDef.Create("ahelp.rate_limit_count", 10, CVar.SERVERONLY); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Обнаружено дублирование секции AHELP!
Этот блок кода является точной копией предыдущей секции AHELP (строки 975-1011) с небольшими отличиями в типах. Необходимо удалить дублирование.
Примените следующие изменения:
- /*
- * AHELP
- */
-
- /// <summary>
- /// Ahelp rate limit values are accounted in periods of this size (seconds).
- /// After the period has passed, the count resets.
- /// </summary>
- /// <seealso cref="AhelpRateLimitCount"/>
- public static readonly CVarDef<int> AhelpRateLimitPeriod =
- CVarDef.Create("ahelp.rate_limit_period", 2, CVar.SERVERONLY);
-
- /// <summary>
- /// How many ahelp messages are allowed in a single rate limit period.
- /// </summary>
- /// <seealso cref="AhelpRateLimitPeriod"/>
- public static readonly CVarDef<int> AhelpRateLimitCount =
- CVarDef.Create("ahelp.rate_limit_count", 10, CVar.SERVERONLY);
Committable suggestion skipped: line range outside the PR's diff.
public void Execute(IConsoleShell shell, string argStr, string[] args) | ||
public override string Command => "respawn"; | ||
|
||
public override async void Execute(IConsoleShell shell, string argStr, string[] args) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Избегайте использования async void
в методе Execute
Использование async void
может привести к тому, что исключения не будут правильно обработаны и могут вызвать неожиданное завершение программы. Рекомендуется изменить сигнатуру метода на public override async Task Execute(...)
и соответствующим образом изменить вызывающий код.
Примените следующий дифф для исправления сигнатуры метода:
-public override async void Execute(IConsoleShell shell, string argStr, string[] args)
+public override async Task Execute(IConsoleShell shell, string argStr, string[] args)
📝 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.
public override async void Execute(IConsoleShell shell, string argStr, string[] args) | |
public override async Task Execute(IConsoleShell shell, string argStr, string[] args) |
<<<<<<< HEAD | ||
using Content.Shared.Players.RateLimiting; | ||
======= | ||
>>>>>>> c33644532d (Rate limit ahelps (#29219)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Критическая ошибка: Неразрешенные конфликты слияния в коде
В строках 4-7 обнаружены маркеры конфликтов слияния Git (<<<<<< HEAD
, =======
, >>>>>> c33644532d
). Это указывает на неразрешенные конфликты в коде, которые необходимо решить. Пожалуйста, разрешите конфликты и удалите эти маркеры для обеспечения корректной компиляции и работы приложения.
public override RateLimitStatus CountAction(ICommonSession player, string key) | ||
======= | ||
/// <summary> | ||
/// Count and validate an action performed by a player against rate limits. | ||
/// </summary> | ||
/// <param name="player">The player performing the action.</param> | ||
/// <param name="key">The key string that was previously used to register a rate limit category.</param> | ||
/// <returns>Whether the action counted should be blocked due to surpassing rate limits or not.</returns> | ||
/// <exception cref="ArgumentException"> | ||
/// <paramref name="player"/> is not a connected player | ||
/// OR <paramref name="key"/> is not a registered rate limit category. | ||
/// </exception> | ||
/// <seealso cref="Register"/> | ||
public RateLimitStatus CountAction(ICommonSession player, string key) | ||
>>>>>>> c33644532d (Rate limit ahelps (#29219)) | ||
{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Критическая ошибка: Неразрешенный конфликт слияния в методе CountAction
В методе CountAction
(строки 51-66) обнаружены маркеры конфликтов слияния Git. Это указывает на неразрешенные конфликты в коде метода. Пожалуйста, разрешите конфликты и удалите соответствующие маркеры.
public override void Register(string key, RateLimitRegistration registration) | ||
======= | ||
/// <summary> | ||
/// Register a new rate limit category. | ||
/// </summary> | ||
/// <param name="key"> | ||
/// The key string that will be referred to later with <see cref="CountAction"/>. | ||
/// Must be unique and should probably just be a constant somewhere. | ||
/// </param> | ||
/// <param name="registration">The data specifying the rate limit's parameters.</param> | ||
/// <exception cref="InvalidOperationException"><paramref name="key"/> has already been registered.</exception> | ||
/// <exception cref="ArgumentException"><paramref name="registration"/> is invalid.</exception> | ||
public void Register(string key, RateLimitRegistration registration) | ||
>>>>>>> c33644532d (Rate limit ahelps (#29219)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Критическая ошибка: Неразрешенный конфликт слияния в методе Register
В строках 122-135 присутствуют маркеры конфликтов слияния Git в методе Register
. Необходимо решить конфликт и удалить маркеры, чтобы обеспечить корректную работу метода.
public override void Initialize() | ||
======= | ||
/// <summary> | ||
/// Initialize the manager's functionality at game startup. | ||
/// </summary> | ||
public void Initialize() | ||
>>>>>>> c33644532d (Rate limit ahelps (#29219)) | ||
{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Критическая ошибка: Неразрешенный конфликт слияния в методе Initialize
В методе Initialize
(строки 176-183) обнаружен маркер конфликта слияния Git. Это свидетельствует о неразрешенном конфликте в коде. Пожалуйста, разрешите конфликт и удалите маркеры.
======= | ||
|
||
/// <summary> | ||
/// Contains all data necessary to register a rate limit with <see cref="PlayerRateLimitManager.Register"/>. | ||
/// </summary> | ||
public sealed class RateLimitRegistration | ||
{ | ||
/// <summary> | ||
/// CVar that controls the period over which the rate limit is counted, measured in seconds. | ||
/// </summary> | ||
public required CVarDef<int> CVarLimitPeriodLength { get; init; } | ||
|
||
/// <summary> | ||
/// CVar that controls how many actions are allowed in a single rate limit period. | ||
/// </summary> | ||
public required CVarDef<int> CVarLimitCount { get; init; } | ||
|
||
/// <summary> | ||
/// An action that gets invoked when this rate limit has been breached by a player. | ||
/// </summary> | ||
/// <remarks> | ||
/// This can be used for informing players or taking administrative action. | ||
/// </remarks> | ||
public required Action<ICommonSession> PlayerLimitedAction { get; init; } | ||
|
||
/// <summary> | ||
/// CVar that controls the minimum delay between admin notifications, measured in seconds. | ||
/// This can be omitted to have no admin notification system. | ||
/// </summary> | ||
/// <remarks> | ||
/// If set, <see cref="AdminAnnounceAction"/> must be set too. | ||
/// </remarks> | ||
public CVarDef<int>? CVarAdminAnnounceDelay { get; init; } | ||
|
||
/// <summary> | ||
/// An action that gets invoked when a rate limit was breached and admins should be notified. | ||
/// </summary> | ||
/// <remarks> | ||
/// If set, <see cref="CVarAdminAnnounceDelay"/> must be set too. | ||
/// </remarks> | ||
public Action<ICommonSession>? AdminAnnounceAction { get; init; } | ||
|
||
/// <summary> | ||
/// Log type used to log rate limit violations to the admin logs system. | ||
/// </summary> | ||
public LogType AdminLogType { get; init; } = LogType.RateLimited; | ||
} | ||
|
||
/// <summary> | ||
/// Result of a rate-limited operation. | ||
/// </summary> | ||
/// <seealso cref="PlayerRateLimitManager.CountAction"/> | ||
public enum RateLimitStatus : byte | ||
{ | ||
/// <summary> | ||
/// The action was not blocked by the rate limit. | ||
/// </summary> | ||
Allowed, | ||
|
||
/// <summary> | ||
/// The action was blocked by the rate limit. | ||
/// </summary> | ||
Blocked, | ||
} | ||
>>>>>>> c33644532d (Rate limit ahelps (#29219)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Критическая ошибка: Неразрешенные конфликты слияния в конце файла
В строках 226-290 имеются маркеры конфликтов слияния Git, что указывает на неразрешенные конфликты в конце файла. Пожалуйста, разрешите эти конфликты и удалите маркеры для обеспечения корректной компиляции.
private static readonly Dictionary<string, string> PatronOocColors = new() | ||
{ | ||
// I had plans for multiple colors and those went nowhere so... | ||
{ "nuclear_operative", "#aa00ff" }, | ||
{ "syndicate_agent", "#aa00ff" }, | ||
{ "revolutionary", "#aa00ff" } | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Требуется улучшение реализации цветов для патронов!
Текущая реализация имеет несколько проблем:
- Жестко закодированные цвета лучше вынести в конфигурацию
- Все типы патронов используют один и тот же цвет
- Комментарий указывает на незавершенность реализации
Предлагаю следующие изменения:
- private static readonly Dictionary<string, string> PatronOocColors = new()
- {
- // I had plans for multiple colors and those went nowhere so...
- { "nuclear_operative", "#aa00ff" },
- { "syndicate_agent", "#aa00ff" },
- { "revolutionary", "#aa00ff" }
- };
+ [Dependency] private readonly IConfigurationManager _config = default!;
+
+ private Dictionary<string, string> PatronOocColors => new()
+ {
+ { "nuclear_operative", _config.GetCVar(CCVars.PatronColorNuclearOperative) },
+ { "syndicate_agent", _config.GetCVar(CCVars.PatronColorSyndicateAgent) },
+ { "revolutionary", _config.GetCVar(CCVars.PatronColorRevolutionary) }
+ };
Committable suggestion skipped: line range outside the PR's diff.
Описание PR
Удалил наш ТТС. Добавил ТТС бэкмена. Портировал один ПР с виздена для работы кода
Изменения
no cl